MySQL 複制較 NoSQL 更複雜,但功能強大。本文系統梳理複制原理、搭建步驟、故障處理、進階技巧與常用工具。

SHOW SLAVE STATUS 輸出三組關鍵坐標:
| 坐標對 | 含義 |
|---|---|
| Master_Log_File / Read_Master_Log_Pos | I/O 線程下一個讀取位置 |
| Relay_Master_Log_File / Exec_Master_Log_Pos | SQL 線程下一個執行位置 |
| Relay_Log_File / Relay_Log_Pos | 中繼日志下一個執行位置 |
理解這三組坐標是故障排查的基石。
[mysqld]
server_id = 100
log_bin = mysql-bin
log_bin_index = mysql-bin.index
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
innodb_support_xa = 1
創建複制賬號:
GRANT REPLICATION SLAVE ON *.*
TO 'slave_user'@'slave_host'
IDENTIFIED BY 'password';
[mysqld]
server_id = 200
log_bin = mysql-bin
relay_log = mysql-relay-bin
read_only = 1
skip_slave_start = 1
log_slave_updates = 1
mysqldump 熱備份(適合中小數據量):
# MyISAM
mysqldump --all-databases --master-data=1 > data.sql
# InnoDB(推薦單事務一致性)
mysqldump --all-databases --single-transaction --master-data=1 > data.sql
物理文件拷貝(大數據量):
# 主庫鎖表獲取位置
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
# 拷貝數據目錄(InnoDB 需停庫)
# 從庫恢復後執行 CHANGE MASTER TO 指定位置
CHANGE MASTER TO
MASTER_HOST='...', MASTER_USER='...', MASTER_PASSWORD='...',
MASTER_LOG_FILE='...', MASTER_LOG_POS=...;
START SLAVE;
SHOW SLAVE STATUS;
確認 Slave_IO_Running=Yes 且 Slave_SQL_Running=Yes。
mysqlbinlog master-bin.000001 > /dev/null # 檢測主庫
mysqlbinlog relay-bin.000001 > /dev/null # 檢測從庫
主庫錯誤:SET GLOBAL sql_slave_skip_counter = 1; START SLAVE;
中繼日志錯誤:重新 CHANGE MASTER TO 指向 Relay_Master_Log_File / Exec_Master_Log_Pos。
選擇數據最新的從庫(比較 Master_Log_File / Read_Master_Log_Pos)。其他從庫重新指向新主庫,位置計算:新主庫 Exec_Master_Log_Pos - (舊主庫位置差值)。
