首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 雙主同步實戰部署指南(Linux 環境)

     編輯:MySQL 資料庫相關知識

架構目標

兩台異地 Linux 伺服器互為 Master/Slave,實現雙向同步,單點故障自動切換。

ServA (10.240.136.9)  <--->  ServB (10.240.136.149)
   Master/Slave              Master/Slave

環境資訊

  • OS:RedHat Enterprise Linux 5
  • MySQL:5.0.22
  • 同步庫:umsdb
  • 忽略表:boco_tb_menu、boco_tb_connect_log、boco_tb_data_stat、boco_tb_log_record、boco_tb_workorder_record

步驟 1:建立互信複制帳號

-- ServA 執行
GRANT ALL PRIVILEGES ON *.* TO 'tongbu'@'10.240.136.149' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

-- ServB 執行
GRANT ALL PRIVILEGES ON *.* TO 'tongbu'@'10.240.136.9' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

步驟 2:配置 my.cnf(雙邊對稱)

[mysqld]
default-character-set = utf8
log-bin = mysql-bin
relay-log = relay-bin
relay-log-index = relay-bin-index
server-id = 1                    # ServA=1, ServB=2
master-host = 10.240.136.149     # 對方 IP
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
slave-net-timeout = 60           # 關鍵:網路中斷 60 秒後重連,防假死

步驟 3:初始化同步(以 ServA 為基準)

  1. ServB 重啟 MySQL:service mysqld restart
  2. ServB 登入 MySQL 執行:
STOP SLAVE;
LOAD DATA FROM MASTER;   -- 僅 MyISAM、需 SUPER/RELOAD 權限
START SLAVE;
  1. ServA 重啟 MySQL:service mysqld restart
  2. ServA 同樣執行 STOP SLAVE; LOAD DATA FROM MASTER; START SLAVE;

步驟 4:驗證同步狀態

SHOW SLAVE STATUS\G

關鍵指標:

  • Slave_IO_Running: Yes
  • Slave_SQL_Running: Yes
  • Seconds_Behind_Master: 0
  • Slave_IO_State: Waiting for master to send event

步驟 5:網路中斷測試與 slave-net-timeout

問題:拔網線後恢復,Slave_IO_Running 長時間為 No,同步延遲極大。

原因:預設網路超時過長,Slave 未及時偵測斷線。

解決:my.cnf 加入 slave-net-timeout = 60,重啟生效。測試恢復正常。

步驟 6:同步失效修復標準流程

  1. Slave 執行 SHOW SLAVE STATUS\G 記錄 Master_Log_File、Read_Master_Log_Pos。
  2. Master 執行 SHOW MASTER LOGS; 確認該 binlog 是否存在。
  3. 存在:Slave START SLAVE; 即可追上。
  4. 不存在(已清理):需重新全量同步:
-- 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 --single-transaction 完整備份導入。
  • 雙主環境必須設定 auto_increment_offset、auto_increment_increment 避免主鍵衝突(本案例未啟用,僅單向寫入)。

常用監控指令

指令用途
SHOW SLAVE STATUS\G完整狀態
SHOW MASTER STATUSMaster binlog 位置
SHOW MASTER LOGSMaster binlog 列表
SHOW SLAVE HOSTSMaster 端看 Slave 列表
STOP/START SLAVE [IO_THREAD|SQL_THREAD]精細控制執行緒
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n跳過 n 個錯誤事件
CHANGE MASTER TO ...動態變更 Master 連線資訊

生產環境建議

  1. 啟用 sync_binlog=1、innodb_flush_log_at_trx_commit=1 雙 1 保證不丟資料。
  2. 監控 Seconds_Behind_Master 告警閾值(如 > 30 秒)。
  3. 定期演練故障切換與全量重建流程。
  4. 考慮引入 ProxySQL/MHA/Orchestrator 實現自動故障轉移。

依此流程部署,可在 Linux 環境建立穩定可維運的 MySQL 雙主同步架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved