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