118 lines
3.3 KiB
Bash
118 lines
3.3 KiB
Bash
#!/bin/bash
|
||
|
||
# 在服务器上直接执行的同步脚本
|
||
# 使用方法:先SSH到服务器,然后执行此脚本
|
||
|
||
PROD_DB_NAME="lobechat"
|
||
SHADOW_DB_NAME="lobechat_stage"
|
||
DB_USER="gongxiangpan"
|
||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||
|
||
echo "========================================"
|
||
echo "同步正式环境数据库到影子系统"
|
||
echo "========================================"
|
||
echo ""
|
||
echo "数据库信息:"
|
||
echo " 正式环境:$PROD_DB_NAME"
|
||
echo " 影子系统:$SHADOW_DB_NAME"
|
||
echo ""
|
||
|
||
# 确认操作
|
||
read -p "⚠️ 此操作将覆盖影子系统的数据,是否继续?(y/N) " confirm
|
||
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
|
||
echo "❌ 操作已取消"
|
||
exit 0
|
||
fi
|
||
|
||
echo ""
|
||
echo "📦 步骤 1: 备份影子系统数据库..."
|
||
docker exec gongxiangpan-postgres-1 pg_dump -U $DB_USER -d $SHADOW_DB_NAME -Fc -f /tmp/lobechat_stage_backup_${TIMESTAMP}.dump
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo "✅ 备份成功:/tmp/lobechat_stage_backup_${TIMESTAMP}.dump"
|
||
else
|
||
echo "⚠️ 备份失败,但继续执行..."
|
||
fi
|
||
|
||
echo ""
|
||
echo "📥 步骤 2: 从正式环境导出数据..."
|
||
EXPORT_FILE="lobechat_export_${TIMESTAMP}.dump"
|
||
docker exec gongxiangpan-postgres-1 pg_dump -U $DB_USER -d $PROD_DB_NAME -Fc -f /tmp/$EXPORT_FILE
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo "✅ 导出成功:/tmp/$EXPORT_FILE"
|
||
else
|
||
echo "❌ 导出失败!"
|
||
exit 1
|
||
fi
|
||
|
||
echo ""
|
||
echo "📤 步骤 3: 导入数据到影子系统(会清空现有数据)..."
|
||
docker exec gongxiangpan-postgres-1 pg_restore -U $DB_USER -d $SHADOW_DB_NAME --clean --if-exists /tmp/$EXPORT_FILE
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo "✅ 导入成功!"
|
||
else
|
||
echo "⚠️ 导入可能有问题,请检查输出..."
|
||
fi
|
||
|
||
echo ""
|
||
echo "🔍 步骤 4: 验证同步结果..."
|
||
docker exec gongxiangpan-postgres-1 psql -U $DB_USER -d $SHADOW_DB_NAME -c "SELECT (SELECT COUNT(*) FROM users) as users_count, (SELECT COUNT(*) FROM materials) as materials_count, (SELECT COUNT(*) FROM material_skus) as skus_count;"
|
||
|
||
echo ""
|
||
echo "🔧 步骤 5: 确保影子系统有最新字段..."
|
||
cat > /tmp/add-sku-fields.sql << 'EOF'
|
||
-- 添加 preview_url 字段
|
||
DO $$
|
||
BEGIN
|
||
IF NOT EXISTS (
|
||
SELECT 1
|
||
FROM information_schema.columns
|
||
WHERE table_name = 'material_skus'
|
||
AND column_name = 'preview_url'
|
||
) THEN
|
||
ALTER TABLE material_skus ADD COLUMN preview_url TEXT;
|
||
END IF;
|
||
END $$;
|
||
|
||
-- 添加 file_name 字段
|
||
DO $$
|
||
BEGIN
|
||
IF NOT EXISTS (
|
||
SELECT 1
|
||
FROM information_schema.columns
|
||
WHERE table_name = 'material_skus'
|
||
AND column_name = 'file_name'
|
||
) THEN
|
||
ALTER TABLE material_skus ADD COLUMN file_name TEXT;
|
||
END IF;
|
||
END $$;
|
||
EOF
|
||
|
||
cat /tmp/add-sku-fields.sql | docker exec -i gongxiangpan-postgres-1 psql -U $DB_USER -d $SHADOW_DB_NAME
|
||
rm -f /tmp/add-sku-fields.sql
|
||
|
||
if [ $? -eq 0 ]; then
|
||
echo "✅ 字段检查/添加完成"
|
||
else
|
||
echo "⚠️ 字段添加可能有问题"
|
||
fi
|
||
|
||
echo ""
|
||
echo "🧹 步骤 6: 清理临时文件..."
|
||
rm -f /tmp/$EXPORT_FILE
|
||
|
||
echo ""
|
||
echo "========================================"
|
||
echo "✅ 同步完成!"
|
||
echo "========================================"
|
||
echo ""
|
||
echo "影子系统已更新,可以访问:"
|
||
echo " http://192.168.58.20:5320"
|
||
echo ""
|
||
echo "备份文件位置:"
|
||
echo " /tmp/lobechat_stage_backup_${TIMESTAMP}.dump"
|
||
echo ""
|
||
|