122 lines
3.3 KiB
Bash
122 lines
3.3 KiB
Bash
#!/bin/bash
|
|
# PostgreSQL 数据导出脚本
|
|
# 使用方法:在服务器上执行 bash export-postgresql-data.sh
|
|
|
|
set -e
|
|
|
|
echo "=========================================="
|
|
echo " PostgreSQL 数据导出工具"
|
|
echo "=========================================="
|
|
echo ""
|
|
|
|
# 配置信息
|
|
CONTAINER_NAME="flnxi-material"
|
|
DB_HOST="192.168.58.20"
|
|
DB_USER="gongxiangpan"
|
|
DB_PASS="gongxiangpan123"
|
|
DB_NAME="lobechat"
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
BACKUP_FILE="lobechat_backup_${TIMESTAMP}.sql"
|
|
BACKUP_DIR="/tmp/db_backups"
|
|
|
|
# 创建备份目录
|
|
mkdir -p $BACKUP_DIR
|
|
|
|
echo "[1/6] 检查容器状态..."
|
|
if ! docker ps | grep -q $CONTAINER_NAME; then
|
|
echo "❌ 错误: 容器 $CONTAINER_NAME 未运行"
|
|
echo ""
|
|
echo "运行中的容器:"
|
|
docker ps --format "table {{.Names}}\t{{.Status}}"
|
|
exit 1
|
|
fi
|
|
echo "✅ 容器运行中"
|
|
|
|
echo ""
|
|
echo "[2/6] 检查 PostgreSQL 客户端..."
|
|
if docker exec -u root $CONTAINER_NAME which pg_dump > /dev/null 2>&1; then
|
|
echo "✅ PostgreSQL 客户端已安装"
|
|
else
|
|
echo "📦 正在安装 PostgreSQL 客户端..."
|
|
docker exec -u root $CONTAINER_NAME apk add --no-cache postgresql-client
|
|
if [ $? -eq 0 ]; then
|
|
echo "✅ 安装成功"
|
|
else
|
|
echo "❌ 安装失败"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "[3/6] 测试数据库连接..."
|
|
if docker exec -u root -e PGPASSWORD=$DB_PASS $CONTAINER_NAME \
|
|
psql -h $DB_HOST -U $DB_USER -d $DB_NAME -c "SELECT 1" > /dev/null 2>&1; then
|
|
echo "✅ 数据库连接成功"
|
|
else
|
|
echo "❌ 数据库连接失败,请检查:"
|
|
echo " - 数据库服务器: $DB_HOST"
|
|
echo " - 用户名: $DB_USER"
|
|
echo " - 密码: $DB_PASS"
|
|
echo " - 数据库: $DB_NAME"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "[4/6] 导出数据库..."
|
|
docker exec -u root -e PGPASSWORD=$DB_PASS $CONTAINER_NAME \
|
|
pg_dump -h $DB_HOST -U $DB_USER -d $DB_NAME \
|
|
> $BACKUP_DIR/$BACKUP_FILE
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo "✅ 数据库导出成功"
|
|
else
|
|
echo "❌ 导出失败"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "[5/6] 检查备份文件..."
|
|
if [ -f "$BACKUP_DIR/$BACKUP_FILE" ]; then
|
|
FILE_SIZE=$(ls -lh $BACKUP_DIR/$BACKUP_FILE | awk '{print $5}')
|
|
LINE_COUNT=$(wc -l < $BACKUP_DIR/$BACKUP_FILE)
|
|
echo "✅ 文件大小: $FILE_SIZE"
|
|
echo "✅ 行数: $LINE_COUNT"
|
|
else
|
|
echo "❌ 备份文件不存在"
|
|
exit 1
|
|
fi
|
|
|
|
echo ""
|
|
echo "[6/6] 压缩备份文件..."
|
|
gzip $BACKUP_DIR/$BACKUP_FILE
|
|
COMPRESSED_FILE="${BACKUP_FILE}.gz"
|
|
COMPRESSED_SIZE=$(ls -lh $BACKUP_DIR/$COMPRESSED_FILE | awk '{print $5}')
|
|
echo "✅ 压缩完成"
|
|
|
|
echo ""
|
|
echo "=========================================="
|
|
echo " ✅ 导出完成!"
|
|
echo "=========================================="
|
|
echo ""
|
|
echo "📁 备份文件信息:"
|
|
echo " 路径: $BACKUP_DIR/$COMPRESSED_FILE"
|
|
echo " 大小: $COMPRESSED_SIZE"
|
|
echo ""
|
|
echo "📥 下载到本地:"
|
|
echo " scp root@$(hostname -I | awk '{print $1}'):$BACKUP_DIR/$COMPRESSED_FILE ./"
|
|
echo ""
|
|
echo "📊 查看备份内容(解压后):"
|
|
echo " gunzip -c $BACKUP_DIR/$COMPRESSED_FILE | less"
|
|
echo ""
|
|
echo "🔄 恢复数据库:"
|
|
echo " gunzip -c $BACKUP_DIR/$COMPRESSED_FILE | psql -h $DB_HOST -U $DB_USER -d $DB_NAME"
|
|
echo ""
|
|
|
|
# 列出所有备份文件
|
|
echo "📋 历史备份文件:"
|
|
ls -lh $BACKUP_DIR/*.gz 2>/dev/null | awk '{print " " $9 " (" $5 ")"}'
|
|
echo ""
|
|
|
|
|
|
|