174 lines
4.6 KiB
Bash
174 lines
4.6 KiB
Bash
#!/bin/bash
|
||
# PostgreSQL 数据导入脚本
|
||
# 使用方法:bash import-backup.sh [backup_file]
|
||
|
||
set -e
|
||
|
||
echo "=========================================="
|
||
echo " PostgreSQL 数据导入工具"
|
||
echo "=========================================="
|
||
echo ""
|
||
|
||
# 配置信息
|
||
DB_HOST="192.168.58.20"
|
||
DB_USER="gongxiangpan"
|
||
DB_PASS="gongxiangpan123"
|
||
DB_NAME="lobechat"
|
||
CONTAINER_NAME="flnxi-material"
|
||
|
||
# 获取备份文件路径
|
||
if [ -z "$1" ]; then
|
||
echo "请指定备份文件路径"
|
||
echo "用法: bash $0 <backup_file>"
|
||
echo ""
|
||
echo "示例:"
|
||
echo " bash $0 /tmp/backup.sql"
|
||
echo " bash $0 /tmp/backup.sql.gz"
|
||
exit 1
|
||
fi
|
||
|
||
BACKUP_FILE="$1"
|
||
|
||
# 检查文件是否存在
|
||
if [ ! -f "$BACKUP_FILE" ]; then
|
||
echo "❌ 错误: 文件不存在: $BACKUP_FILE"
|
||
exit 1
|
||
fi
|
||
|
||
echo "📁 备份文件: $BACKUP_FILE"
|
||
FILE_SIZE=$(ls -lh "$BACKUP_FILE" | awk '{print $5}')
|
||
echo "📊 文件大小: $FILE_SIZE"
|
||
echo ""
|
||
|
||
# 处理压缩文件
|
||
IMPORT_FILE="$BACKUP_FILE"
|
||
if [[ "$BACKUP_FILE" == *.gz ]]; then
|
||
echo "[1/6] 解压文件..."
|
||
IMPORT_FILE="${BACKUP_FILE%.gz}"
|
||
gunzip -c "$BACKUP_FILE" > "$IMPORT_FILE"
|
||
echo "✅ 解压完成"
|
||
CLEANUP_TEMP=true
|
||
else
|
||
echo "[1/6] 文件已准备就绪"
|
||
CLEANUP_TEMP=false
|
||
fi
|
||
|
||
echo ""
|
||
echo "[2/6] 测试数据库连接..."
|
||
if PGPASSWORD=$DB_PASS psql -h $DB_HOST -U $DB_USER -d $DB_NAME -c "SELECT 1" > /dev/null 2>&1; then
|
||
echo "✅ 数据库连接成功"
|
||
else
|
||
echo "❌ 数据库连接失败"
|
||
echo ""
|
||
echo "请检查:"
|
||
echo " - 数据库服务器: $DB_HOST"
|
||
echo " - 用户名: $DB_USER"
|
||
echo " - 密码: $DB_PASS"
|
||
echo " - 数据库: $DB_NAME"
|
||
exit 1
|
||
fi
|
||
|
||
echo ""
|
||
echo "[3/6] 备份当前数据库(安全措施)..."
|
||
SAFETY_BACKUP="/tmp/safety_backup_$(date +%Y%m%d_%H%M%S).sql"
|
||
PGPASSWORD=$DB_PASS pg_dump -h $DB_HOST -U $DB_USER -d $DB_NAME > "$SAFETY_BACKUP" 2>/dev/null
|
||
if [ $? -eq 0 ]; then
|
||
gzip "$SAFETY_BACKUP"
|
||
echo "✅ 安全备份已创建: ${SAFETY_BACKUP}.gz"
|
||
else
|
||
echo "⚠️ 安全备份创建失败(继续导入)"
|
||
fi
|
||
|
||
echo ""
|
||
echo "[4/6] 检查导入文件..."
|
||
LINE_COUNT=$(wc -l < "$IMPORT_FILE")
|
||
echo "✅ 文件行数: $LINE_COUNT"
|
||
|
||
# 显示文件前几行
|
||
echo ""
|
||
echo "文件预览(前5行):"
|
||
head -5 "$IMPORT_FILE" | sed 's/^/ /'
|
||
echo " ..."
|
||
echo ""
|
||
|
||
# 确认导入
|
||
read -p "⚠️ 确认要导入吗?这将覆盖现有数据!(yes/no): " CONFIRM
|
||
if [ "$CONFIRM" != "yes" ]; then
|
||
echo "❌ 导入已取消"
|
||
[ "$CLEANUP_TEMP" = true ] && rm -f "$IMPORT_FILE"
|
||
exit 0
|
||
fi
|
||
|
||
echo ""
|
||
echo "[5/6] 开始导入数据..."
|
||
echo "⏳ 这可能需要几分钟,请耐心等待..."
|
||
echo ""
|
||
|
||
START_TIME=$(date +%s)
|
||
|
||
# 导入数据
|
||
PGPASSWORD=$DB_PASS psql -h $DB_HOST -U $DB_USER -d $DB_NAME -f "$IMPORT_FILE" 2>&1 | tee /tmp/import.log
|
||
|
||
if [ ${PIPESTATUS[0]} -eq 0 ]; then
|
||
END_TIME=$(date +%s)
|
||
DURATION=$((END_TIME - START_TIME))
|
||
echo ""
|
||
echo "✅ 导入成功"
|
||
echo "⏱️ 耗时: ${DURATION} 秒"
|
||
else
|
||
echo ""
|
||
echo "❌ 导入失败"
|
||
echo ""
|
||
echo "错误日志已保存到: /tmp/import.log"
|
||
echo ""
|
||
echo "如需恢复,使用安全备份:"
|
||
echo " gunzip -c ${SAFETY_BACKUP}.gz | PGPASSWORD=$DB_PASS psql -h $DB_HOST -U $DB_USER -d $DB_NAME"
|
||
[ "$CLEANUP_TEMP" = true ] && rm -f "$IMPORT_FILE"
|
||
exit 1
|
||
fi
|
||
|
||
echo ""
|
||
echo "[6/6] 验证导入结果..."
|
||
|
||
# 检查表数量
|
||
TABLE_COUNT=$(PGPASSWORD=$DB_PASS psql -h $DB_HOST -U $DB_USER -d $DB_NAME -t -c "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = 'public';" | xargs)
|
||
echo "✅ 表数量: $TABLE_COUNT"
|
||
|
||
# 检查主要表的记录数
|
||
echo ""
|
||
echo "主要表记录数:"
|
||
for table in users materials categories scenes; do
|
||
if PGPASSWORD=$DB_PASS psql -h $DB_HOST -U $DB_USER -d $DB_NAME -t -c "SELECT 1 FROM information_schema.tables WHERE table_name='$table'" | grep -q 1; then
|
||
COUNT=$(PGPASSWORD=$DB_PASS psql -h $DB_HOST -U $DB_USER -d $DB_NAME -t -c "SELECT COUNT(*) FROM $table" 2>/dev/null | xargs)
|
||
if [ ! -z "$COUNT" ]; then
|
||
echo " - $table: $COUNT 条记录"
|
||
fi
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo "[清理] 删除临时文件..."
|
||
[ "$CLEANUP_TEMP" = true ] && rm -f "$IMPORT_FILE"
|
||
echo "✅ 清理完成"
|
||
|
||
echo ""
|
||
echo "=========================================="
|
||
echo " ✅ 导入完成!"
|
||
echo "=========================================="
|
||
echo ""
|
||
echo "📊 导入统计:"
|
||
echo " 文件: $BACKUP_FILE"
|
||
echo " 大小: $FILE_SIZE"
|
||
echo " 耗时: ${DURATION} 秒"
|
||
echo " 表数: $TABLE_COUNT"
|
||
echo ""
|
||
echo "🔐 安全备份: ${SAFETY_BACKUP}.gz"
|
||
echo " (如需恢复旧数据,使用此备份)"
|
||
echo ""
|
||
echo "📝 导入日志: /tmp/import.log"
|
||
echo ""
|
||
|
||
|
||
|
||
|