場景:雙機房主備同步、測試環境數據刷新、異構遷移驗證。本文提供 **Shell 管道直連** 腳本,無中間文件落盤,延遲最低、佔用最小。
核心腳本
#!/bin/bash
# sync_mysql.sh - 源庫導出並直接導入目標庫
set -euo pipefail
# ==== 源庫配置 ====
SRC_USER="root"
SRC_HOST="10.10.10.12"
SRC_PASS="******"
SRC_DB="STATION"
# ==== 目標庫配置 ====
DST_USER="root"
DST_HOST="10.10.10.22"
DST_PASS="******"
DST_DB="STATION"
# ==== 同步表列表 (空格分隔) ====
TABLES="username files"
# ==== 執行同步 ====
for TBL in ${TABLES}; do
echo "[$(date)] Syncing ${TBL} ..."
mysqldump --add-drop-table --opt \
-u"${SRC_USER}" -h"${SRC_HOST}" -p"${SRC_PASS}" \
"${SRC_DB}" "${TBL}" | \
mysql -u"${DST_USER}" -h"${DST_HOST}" -p"${DST_PASS}" "${DST_DB}"
if [[ ${PIPESTATUS[0]} -eq 0 && ${PIPESTATUS[1]} -eq 0 ]]; then
echo "[$(date)] ${TBL} sync OK"
else
echo "[$(date)] ${TBL} sync FAILED" >&2
exit 1
fi
done
echo "[$(date)] All tables synced successfully."
關鍵參數說明
--add-drop-table:目標庫表存在時先 DROP,保冪等性。
--opt:包含 --quick --add-locks --extended-insert --lock-tables,平衡速度與一致性。
- 管道直連:
mysqldump ... | mysql ...,**無臨時文件、無磁盤 I/O、內存流式處理**,適合千萬行級表。
PIPESTATUS 數組檢查管道雙端退出碼,確保導出導入均成功。
進階增強
| 需求 | 實現 |
| 大表分批同步 | mysqldump --where="id BETWEEN 1 AND 100000" 循環分片 |
| 排除某些表 | --ignore-table=db.tbl (mysqldump 5.5+) |
| 異構同步 (MySQL->PostgreSQL) | 中間轉 CSV/Parquet,或用 pgloader / Debezium CDC |
| 斷點續傳 | 記錄同步位點 (主鍵/時間戳),下次從斷點續傳 |
| 並發同步多表 | xargs -P 4 -I {} sh -c 'sync_one_table {}' 控制並發度 |
生產環境替代方案對比
| 方案 | 延遲 | 一致性 | 維護成本 | 適用場景 |
| mysqldump 管道 | 分鐘級 | 最終一致性 | 低 | 小表、定時刷新、遷移驗證 |
| MySQL 原生複製 | 亞秒級 | 最終/半同步/全同步 | 中 | 核心業務 HA、讀寫分離 |
| GTID 複製 + 從庫提升 | 秒級 | 強一致性 (可配置) | 中高 | 金融核心、跨機房災備 |
| CDC (Debezium/Maxwell) | 毫秒級 | 最終一致性 | 高 | 實時數倉、微服務事件驅動 |
| XtraBackup 物理備份恢復 | 小時級 (TB級) | 崩潰一致性 | 中 | 超大庫初始化、災難恢復演練 |
總結
- **腳本同步** 適合「按需、定時、小規模、異構」場景,實現成本最低。
- **核心業務實時同步必上原生複製/GTID/CDC**,腳本僅作輔助/驗證/補數。
- 管道直連 +
PIPESTATUS 檢查是 Shell 同步腳本的**專業寫法**,拒絕落盤中轉。