MySQL 內建複製功能是構建高可用、高效能架構的基石。透過將主庫資料同步至一或多個從庫,解決:
| 類型 | 說明 | 版本 |
|---|---|---|
| Statement-Based (SBR) | 記錄 SQL 語句,預設模式,Binlog 體積小,但某些非確定性函數(如 NOW(), UUID())可能導致主從不一致 | MySQL 3.23+ |
| Row-Based (RBR) | 記錄行級變更,精確無歧義,支援所有語句,但 Binlog 較大,mysqlbinlog 不易閱讀 | MySQL 5.0+ |
| Mixed (MBR) | 預設 SBR,遇無法精確複製自動切換 RBR,折衷方案 | MySQL 5.1+ |
可透過 SET SESSION binlog_format = 'ROW|STATEMENT|MIXED'; 動態切換。
關鍵點:
GRANT REPLICATION SLAVE, RELOAD, SUPER ON *.*
TO 'backup'@'10.100.0.200' IDENTIFIED BY '1234';
-- 若密碼演算法衝突:
SET PASSWORD FOR 'backup'@'10.100.0.200' = OLD_PASSWORD('1234');
停止主庫,複製資料目錄至從庫,確保**同步期間雙方均無寫入操作**,保證起始資料一致。
[mysqld]
server-id = 1
log-bin = mysql-bin
重啟後驗證:SHOW MASTER STATUS; 記錄 File 與 Position。
[mysqld]
server-id = 2
log-bin = mysql-bin # 可選,但鏈式複製需開啟
relay-log = mysql-relay-bin
log-slave-updates = 1 # 寫入自身 Binlog,支援鏈式
read-only = 1 # 防止誤寫入(超級用戶除外)
CHANGE MASTER TO
MASTER_HOST = '10.100.0.100',
MASTER_USER = 'backup',
MASTER_PASSWORD = '1234',
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 4; -- 4 為首個事件位置(非 0)
啟動並驗證:
START SLAVE;
SHOW SLAVE STATUS\G
-- 關鍵指標:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
| 檔案 | 用途 |
|---|---|
mysql-bin.index | 追蹤現有 Binlog 檔案列表 |
mysql-relay-bin.index | 追蹤 Relay Log 檔案列表 |
master.info | 記錄主庫連線資訊、當前讀取位點(I/O 執行緒更新) |
relay-log.info | 記錄 SQL 執行緒當前執行位點 |
警告: 切勿手動刪除 master.info,否則 Slave 重啟後無法連接 Master。
讀多寫少場景最適用。建議:不同從庫掛載不同索引/引擎分擔專用查詢;指定一從庫為備用主庫(不對外服務);異地從庫做災備。
雙寫入,**核心問題:寫入衝突**。例:同一行 col=1,A 執行 col=col+1,B 執行 col=col*2,結果 A=3, B=4,不報錯但數據不一致。真正多主需用 MySQL Cluster (NDB) 或應用層協調。
一寫一備,避免衝突,提供高可用故障轉移。推薦生產環境採用此模式替代雙寫。
地理分散多活,無單點故障,讀請求分流至各從庫。
可在主庫過濾 Binlog (binlog-do-db, binlog-ignore-db) 或從庫過濾 Relay Log (replicate-do-db, replicate-ignore-db 等)。建議**從庫端過濾**,避免主庫 Binlog 遺漏導致其他從庫異常。
mysqlhotcopy (僅 MyISAM) 或 xtrabackup (InnoDB 熱備)FLUSH TABLES WITH READ LOCK; mysqldump --all-databases --lock-all-tables > dump.sql; UNLOCK TABLES; 需記錄 SHOW MASTER STATUS 位點掌握複製原理與多種拓撲,能根據業務體量與可用性需求,設計出最適合的 MySQL 高可用架構。