MySQL 主從複製基於 二進制日志,三線程協作:

| 格式 | 記錄內容 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| STATEMENT | SQL 語句原文 | binlog 體積小 | 非確定性函數(NOW、UUID)導致主從不一致 | 簡單確定性 SQL 為主 |
| ROW | 行級變更(每行前後值) | 絕對一致性,無歧義 | 大批量更新 binlog 膨脹 | 數據一致性要求極高、複雜 SQL |
| MIXED | 自動切換 | 折中 | 不可控 | 不確定場景,建議顯式指定 ROW |
生產建議:binlog_format=ROW + binlog_row_image=MINIMAL(僅記錄變更列)。
[mysqld] server-id=1 log-bin=mysql-bin binlog_format=ROW binlog_row_image=MINIMAL gtid_mode=ON enforce_gtid_consistency=ON
重啟後創建複製帳號:
CREATE USER 'repl'@'%' IDENTIFIED BY 'strong_password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
[mysqld] server-id=2 relay-log=relay-bin read-only=ON # 防止誤寫入 gtid_mode=ON enforce_gtid_consistency=ON
-- 在 Slave 執行 CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_USER='repl', MASTER_PASSWORD='strong_password', MASTER_AUTO_POSITION=1; -- GTID 模式無需指定文件/位置 START SLAVE;
SHOW SLAVE STATUS\G -- 關鍵指標 Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0

Seconds_Behind_Master、SHOW SLAVE STATUS 定時告警。| 現象 | 可能原因 | 處理 |
|---|---|---|
| IO_Running=No | 網絡/權限/防火牆/MASTER_HOST 錯誤 | 檢查連通性、帳號權限、錯誤日誌 |
| SQL_Running=No | 主鍵衝突/外鍵約束/非確定性 SQL | 跳過錯誤 SET GLOBAL sql_slave_skip_counter=1 或修正數據 |
| 延遲大 | Slave 機能弱/大事務/長 SQL/鎖爭用 | 升級硬件、拆分大事務、優化慢 SQL、並行複製 |