MySQL 主從復制是讀寫分離、災備、零停機遷移的基石。本文記錄基於 Binlog 位點與 GTID 兩種模式的部署步驟、關鍵參數、驗證方法,並深度剖析 Slave_IO_Running: No、1236 錯誤、主從延遲、數據不一致等高頻故障的根因與修復方案。
| 優勢 | 說明 |
|---|---|
| 讀寫分離 | 主庫寫、從庫讀,降低主庫壓力 60%+ |
| 備份無影響 | 從庫執行 mysqldump/xtrabackup,主庫零干擾 |
| 故障切換 | 主庫故障秒級提升從庫為主(配合 MHA/Orchestrator) |
| 異構環境 | 跨版本、跨存儲引擎、跨雲廠商同步 |
風險提示:主庫誤操作(DROP/TRUNCATE/錯誤 UPDATE)會同步到從庫,**主從 ≠ 備份**,必須配合延遲從庫或定期全量備份
| 角色 | IP | Server ID | MySQL 版本 |
|---|---|---|---|
| Master | 10.1.1.45 | 45 | 5.7+ (支援 GTID) |
| Slave | 10.1.1.43 | 43 | 5.7+ |
/etc/my.cnf[mysqld] server-id=45 log-bin=/opt/log.bin/45 binlog-format=ROW gtid-mode=ON enforce-gtid-consistency=ON log-slave-updates=1 sync_binlog=1 innodb_flush_log_at_trx_commit=1 expire_logs_days=7 max_binlog_size=1G
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.1.1.43' IDENTIFIED BY 'StrongReplPass'; FLUSH PRIVILEGES;
# Master 導出(單事務、刷新日誌、記錄位點) mysqldump -uroot -p --single-transaction --flush-logs --master-data=2 --all-databases > all.sql # 檢查位點信息 head -40 all.sql | grep "CHANGE MASTER TO" # 輸出: CHANGE MASTER TO MASTER_LOG_FILE='45.000064', MASTER_LOG_POS=98;
[mysqld] server-id=43 relay-log=relay-bin log-slave-updates=1 gtid-mode=ON enforce-gtid-consistency=ON skip-slave-start # 防止啟動前誤啟動 read-only=1 # 防止誤寫入
# 導入基線數據
mysql -uroot -p < all.sql
# 配置復制 (GTID 模式無需指定文件/位點)
CHANGE MASTER TO
MASTER_HOST='10.1.1.45',
MASTER_USER='repl',
MASTER_PASSWORD='StrongReplPass',
MASTER_AUTO_POSITION=1;
START SLAVE;
SHOW SLAVE STATUS\G # 關鍵指標 Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0 Retrieved_Gtid_Set: xxxx:1-100 Executed_Gtid_Set: xxxx:1-100 Auto_Position: 1
Error: Client requested master to start replication from impossible position
根因:sync_binlog=0 導致 Master 宕機時 Binlog Cache 未刷盤,Slave 記錄的位點大於實際文件大小
修復:跳過至下一個 Binlog 文件
STOP SLAVE; CHANGE MASTER TO MASTER_LOG_FILE='45.000065', MASTER_LOG_POS=4, MASTER_AUTO_POSITION=0; START SLAVE;
預防:Master 強制 sync_binlog=1、innodb_flush_log_at_trx_commit=1
檢測工具:pt-table-checksum (Percona Toolkit)
pt-table-checksum --replicate=percona.checksums h=master,u=repl,p=pass --databases=db1
修復工具:pt-table-sync(謹慎使用,建議從庫重建)
| 原因 | 解決 |
|---|---|
| 從庫硬件較弱 | 升級配置、啟用多線程復制 slave_parallel_workers=4 |
| 大事務阻塞 | 業務拆分小事務、避免長事務 |
| 慢查詢回放 | 優化從庫索引、log_slow_slave_statements=1 |
| 網絡延遲 | 專線/同可用區部署、壓縮協議 slave_compressed_protocol=1 |
原因:從庫誤執行寫入、手動注入 GTID、RESET MASTER
修復:重新搭建從庫,或使用 SET GTID_PURGED 修正(高風險)
slave_parallel_workers=4 slave_parallel_type=LOGICAL_CLOCK master_info_repository=TABLE relay_log_info_repository=TABLE relay_log_recovery=ON
Slave_IO_Running、Slave_SQL_Running、Seconds_Behind_Master、Relay_Log_SpaceSHOW SLAVE STATUS 解析入 PrometheusMASTER_DELAY=3600 從庫,防誤操作回滾