flnxi-Wu/scripts/tools/import-backup.sh
WuYongJie d1c6efc79d
Some checks failed
CI Check / check (push) Has been cancelled
feat: NAS 部署与 Harbor 推送流程
2025-12-03 14:39:06 +08:00

174 lines
4.6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 ""