#!/bin/bash # ========================================== # 1. 本地 WSL 数据库配置 # ========================================== LOCAL_CONTAINER="inventory_db" LOCAL_DB_USER="test" LOCAL_DB_NAME="inventory_system" # ========================================== # 2. 远程服务器 SSH 配置 # ========================================== REMOTE_USER="dxc" REMOTE_HOST="172.16.0.198" REMOTE_PORT="22" REMOTE_DIR="/opt/inventory-app" # 用于存放备份 # ========================================== # 3. 远程服务器 Docker 配置 # ========================================== 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}" REMOTE_BACKUP_FILE="${REMOTE_DIR}/data_copy/DB_BACKUP_${TIMESTAMP}.sql.gz" echo "========================================================" echo " 🔄 开始同步 WSL 数据库到远程服务器 (${REMOTE_HOST})" echo " ⚠️ 注意:线上旧数据将被完全覆盖!" echo "========================================================" # --- 新增:步骤 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 # --- 步骤 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 "🎉 数据库全量替换成功!快去刷新你的线上系统看看吧!" echo "========================================================"