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