2026-03-19 09:49:21 +08:00
#!/bin/bash
# ==========================================
2026-04-14 08:56:47 +08:00
# 1. 本地 WSL 数据库配置
2026-03-19 09:49:21 +08:00
# ==========================================
LOCAL_CONTAINER = "inventory_db"
LOCAL_DB_USER = "test"
LOCAL_DB_NAME = "inventory_system"
# ==========================================
2026-04-14 08:56:47 +08:00
# 2. 远程服务器 SSH 配置
2026-03-19 09:49:21 +08:00
# ==========================================
REMOTE_USER = "dxc"
REMOTE_HOST = "172.16.0.198"
REMOTE_PORT = "22"
2026-04-14 08:56:47 +08:00
REMOTE_DIR = "/opt/inventory-app" # 用于存放备份
2026-03-19 09:49:21 +08:00
# ==========================================
2026-04-14 08:56:47 +08:00
# 3. 远程服务器 Docker 配置
2026-03-19 09:49:21 +08:00
# ==========================================
REMOTE_CONTAINER = "inventory_db_prod"
REMOTE_DB_USER = "prod_user"
REMOTE_DB_PASS = "StrongPassword123!"
REMOTE_DB_NAME = "inventory_system"
# --- 临时文件变量 ---
TIMESTAMP = $( date +%Y%m%d_%H%M%S)
DUMP_FILE = " db_sync_ ${ TIMESTAMP } .sql.gz "
LOCAL_DUMP_PATH = " /tmp/ ${ DUMP_FILE } "
2026-04-14 08:56:47 +08:00
REMOTE_BACKUP_FILE = " ${ REMOTE_DIR } /data_copy/DB_BACKUP_ ${ TIMESTAMP } .sql.gz "
2026-03-19 09:49:21 +08:00
echo "========================================================"
echo " 🔄 开始同步 WSL 数据库到远程服务器 ( ${ REMOTE_HOST } ) "
2026-04-14 08:56:47 +08:00
echo " ⚠️ 注意:线上旧数据将被完全覆盖!"
2026-03-19 09:49:21 +08:00
echo "========================================================"
2026-04-14 08:56:47 +08:00
# --- 新增:步骤 0: 远程服务器数据备份 ---
echo -e "\n[0/4] 🛡️ 正在备份线上服务器数据库..."
ssh -p ${ REMOTE_PORT } ${ REMOTE_USER } @${ REMOTE_HOST } << EOF
mkdir -p ${ REMOTE_DIR } /data_copy
# 导出线上数据作为备份
docker exec -e PGPASSWORD = " ${ REMOTE_DB_PASS } " ${ REMOTE_CONTAINER } pg_dump -U ${ REMOTE_DB_USER } -d ${ REMOTE_DB_NAME } -O -x | gzip > ${ REMOTE_BACKUP_FILE }
echo " -> 线上备份已保存至: ${ REMOTE_BACKUP_FILE } "
EOF
if [ $? -ne 0 ] ; then
echo "❌ 线上备份失败!为保证数据安全,同步已终止!"
exit 1
fi
2026-03-19 09:49:21 +08:00
# --- 步骤 1: 本地导出 ---
echo -e "\n[1/4] 📦 正在本地打包数据库..."
docker exec ${ LOCAL_CONTAINER } pg_dump -U ${ LOCAL_DB_USER } -d ${ LOCAL_DB_NAME } -O -x | gzip > ${ LOCAL_DUMP_PATH }
if [ $? -ne 0 ] ; then
echo "❌ 本地数据库导出失败!请检查本地 inventory_db 容器是否正常运行。"
exit 1
fi
echo " ✅ 本地打包完成: ${ DUMP_FILE } "
# --- 步骤 2: 传输文件 ---
echo -e "\n[2/4] 🚀 正在通过 SCP 传输文件到服务器..."
scp -P ${ REMOTE_PORT } ${ LOCAL_DUMP_PATH } ${ REMOTE_USER } @${ REMOTE_HOST } :/tmp/${ DUMP_FILE }
if [ $? -ne 0 ] ; then
echo "❌ 文件传输失败!请检查网络或密码。"
exit 1
fi
echo "✅ 传输成功!"
# --- 步骤 3: 远程服务器执行替换 ---
echo -e "\n[3/4] ⚠️ 正在服务器上清空旧数据并导入新数据..."
ssh -p ${ REMOTE_PORT } ${ REMOTE_USER } @${ REMOTE_HOST } << EOF
echo " -> 将备份文件复制进服务器容器 [ ${ REMOTE_CONTAINER } ]... "
docker cp /tmp/${ DUMP_FILE } ${ REMOTE_CONTAINER } :/tmp/${ DUMP_FILE }
echo " -> 危险操作:清空服务器旧数据环境..."
docker exec -e PGPASSWORD = " ${ REMOTE_DB_PASS } " ${ REMOTE_CONTAINER } psql -U ${ REMOTE_DB_USER } -d ${ REMOTE_DB_NAME } -c " DROP SCHEMA public CASCADE; CREATE SCHEMA public; GRANT ALL ON SCHEMA public TO ${ REMOTE_DB_USER } ; "
echo " -> 正在导入最新数据..."
docker exec -e PGPASSWORD = " ${ REMOTE_DB_PASS } " ${ REMOTE_CONTAINER } sh -c " gunzip -c /tmp/ ${ DUMP_FILE } | psql -U ${ REMOTE_DB_USER } -d ${ REMOTE_DB_NAME } "
echo " -> 清理服务器端临时文件..."
docker exec ${ REMOTE_CONTAINER } rm /tmp/${ DUMP_FILE }
rm /tmp/${ DUMP_FILE }
EOF
# --- 步骤 4: 清理本地 ---
echo -e "\n[4/4] 🧹 清理本地临时文件..."
rm ${ LOCAL_DUMP_PATH }
echo -e "\n========================================================"
echo "🎉 数据库全量替换成功!快去刷新你的线上系统看看吧!"
2026-04-14 08:56:47 +08:00
echo "========================================================"