78 lines
3.2 KiB
Bash
78 lines
3.2 KiB
Bash
#!/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"
|
|
|
|
# ==========================================
|
|
# 3. 远程服务器 Docker 配置 (根据你的 docker-compose.prod.yml)
|
|
# ==========================================
|
|
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}"
|
|
|
|
echo "========================================================"
|
|
echo " 🔄 开始同步 WSL 数据库到远程服务器 (${REMOTE_HOST})"
|
|
echo "========================================================"
|
|
|
|
# --- 步骤 1: 本地导出 ---
|
|
echo -e "\n[1/4] 📦 正在本地打包数据库..."
|
|
# 注意:这里使用 pg_dump 导出,为了兼容性,排除可能引起冲突的权限所有者信息 (-O -x)
|
|
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 " -> 危险操作:清空服务器旧数据环境..."
|
|
# 传入 PGPASSWORD 环境变量以防密码拦截
|
|
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 "========================================================"
|