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

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 ""