本文實作兩台異地 Linux 伺服器互為主從的 MySQL 雙主同步複寫架構,實現資料即時一致與故障自動切換。涵蓋帳號建立、參數配置、手動同步、狀態監控、網路中斷恢復與同步失效修復完整流程。
| 角色 | IP | Server ID | 同步帳號 |
|---|---|---|---|
| ServA (主/從) | 10.240.136.9 | 1 | tongbu / 123456 |
| ServB (主/從) | 10.240.136.149 | 2 |
同步資料庫:umsdb,忽略特定日誌表減少同步負擔。
-- ServA 執行,允許 ServB 連線
GRANT ALL PRIVILEGES ON *.* TO 'tongbu'@'10.240.136.149' IDENTIFIED BY '123456';
-- ServB 執行,允許 ServA 連線
GRANT ALL PRIVILEGES ON *.* TO 'tongbu'@'10.240.136.9' IDENTIFIED BY '123456';
[mysqld]
default-character-set=utf8
log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=relay-bin-index
server-id=1
master-host=10.240.136.149
master-user=tongbu
master-password=123456
master-port=3306
master-connect-retry=30
binlog-do-db=umsdb
replicate-do-db=umsdb
replicate-ignore-table=umsdb.boco_tb_menu
replicate-ignore-table=umsdb.boco_tb_connect_log
replicate-ignore-table=umsdb.boco_tb_data_stat
replicate-ignore-table=umsdb.boco_tb_log_record
replicate-ignore-table=umsdb.boco_tb_workorder_record
[mysqld]
default-character-set=utf8
log-bin=mysql-bin
relay-log=relay-bin
relay-log-index=relay-bin-index
server-id=2
master-host=10.240.136.9
master-user=tongbu
master-password=123456
master-port=3306
master-connect-retry=30
binlog-do-db=umsdb
replicate-do-db=umsdb
replicate-ignore-table=umsdb.boco_tb_menu
replicate-ignore-table=umsdb.boco_tb_connect_log
replicate-ignore-table=umsdb.boco_tb_data_stat
replicate-ignore-table=umsdb.boco_tb_log_record
replicate-ignore-table=umsdb.boco_tb_workorder_record
# 以 ServA 為主,ServB 為從
# ServB 重啟後登入 MySQL
STOP SLAVE;
LOAD DATA FROM MASTER; -- 僅支援 MyISAM 表
START SLAVE;
# ServA 重啟完成雙向同步
SHOW SLAVE STATUS\G
關鍵指標:
Slave_IO_Running: Yes — I/O 執行緒正常Slave_SQL_Running: Yes — SQL 執行緒正常Seconds_Behind_Master: 0 — 無延遲Last_Error 為空 — 無錯誤問題:網路斷線後恢復,Slave_IO_Running 長時間為 No,同步嚴重延遲。
原因:預設 slave-net-timeout 過長(預設 3600 秒),Slave 等待超時才重連。
解決:在 my.cnf [mysqld] 區段加入:
slave-net-timeout=60
重啟 MySQL 後,斷線 60 秒即自動重連同步。
# Slave 執行
STOP SLAVE;
START SLAVE; -- 自動追上
# Slave
STOP SLAVE;
LOAD DATA FROM MASTER;
RESET MASTER;
START SLAVE;
# Master
STOP SLAVE;
RESET SLAVE;
START SLAVE;
注意: LOAD DATA FROM MASTER 僅支援 MyISAM 表。InnoDB 請用 mysqldump --master-data=2 方案。
sync_binlog=1、innodb_flush_log_at_trx_commit=1 確保資料不丟失auto_increment_offset/auto_increment_increment 避免主鍵衝突pt-table-checksum 驗證資料一致性