MySQL 無增量備份機制,大數據量下全量備份耗時長、影響業務。主從複製(基於 Binlog 異步重放)實現準實時熱備。本文覆蓋版本要求、主庫配置、從庫搭建、狀態監控、Binlog 清理、故障切換全生命周期。
/etc/my.cnf 核心參數[mysqld]
server-id=1 # 全局唯一
log-bin=mysql-bin # 必須啟用,複製基礎
binlog-do-db=business_db # 只記錄業務庫(可選,減少日志量)
binlog-ignore-db=mysql,test,tmp # 忽略系統/臨時庫(可選)
sync_binlog=1 # 每次提交刷盤,防數據丟失(性能略降)
innodb_flush_log_at_trx_commit=1 # InnoDB ACID 保障
重啟主庫生效。
-- MySQL 4.0.2+ 標準語法
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
FLUSH PRIVILEGES;
-- 4.0.2 以前版本(無 REPLICATION 權限)
GRANT FILE ON *.* TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
FLUSH TABLES WITH READ LOCK;SHOW MASTER STATUS\G; 記下 File (如 mysql-bin.003) 和 Position (如 73)tar czf /backup/mysql_snapshot.tar.gz /var/lib/mysql/(需鎖表期間完成)mysqldump --single-transaction --master-data=2 --all-databases > /backup/full.sqlUNLOCK TABLES;/etc/my.cnf[mysqld]
server-id=2 # 唯一,≠1
master-host=192.168.1.100 # 主庫 IP/域名
master-port=3306
master-user=repl
master-password=slavepass
master-connect-retry=60 # 斷線重試間隔(秒)
report-host=slave1.mydomain.com # 向主庫報告的從庫標識
# replicate-do-db=business_db # 可選:只同步業務庫
# replicate-ignore-db=test,tmp # 可選:忽略庫
relay-log=relay-bin # 中繼日志文件名
relay-log-index=relay-bin.index
log-slave-updates=1 # 從庫也寫 Binlog,支持鏈式複製 A→B→C
read-only=1 # 從庫只讀,防止誤寫入
mysql < full.sql)--skip-slave-start 會自動嘗試連接,建議手動控制)SLAVE STOP;
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='slavepass',
MASTER_LOG_FILE='mysql-bin.003', -- 主庫 SHOW MASTER STATUS 記錄的 File
MASTER_LOG_POS=73; -- 主庫記錄的 Position
SLAVE START;
SHOW SLAVE STATUS\G; 確認 Slave_IO_Running=Yes、Slave_SQL_Running=Yes、Seconds_Behind_Master=0| 指標 | 命令 | 告警閾值 |
|---|---|---|
| IO 線程狀態 | SHOW SLAVE STATUS\G → Slave_IO_Running | ≠ Yes 立即告警 |
| SQL 線程狀態 | Slave_SQL_Running | ≠ Yes 立即告警 |
| 複製延遲 | Seconds_Behind_Master | > 300 秒告警,> 3600 秒嚴重 |
| 主庫 Binlog 增長 | SHOW MASTER STATUS | 磁盤剩餘 < 20% 告警 |
| 錯誤信息 | Last_IO_Error, Last_SQL_Error | 非空即告警 |
FLUSH TABLES WITH READ LOCK;SLAVE STOP;SHOW MASTER STATUS; 記錄 File、PositionUNLOCK TABLES;CHANGE MASTER TO
MASTER_LOG_FILE='mysql-bin.005', -- 新文件名
MASTER_LOG_POS=120; -- 新位置
SLAVE START;PURGE MASTER LOGS TO 'mysql-bin.005';(保留當前正在寫入及從庫未處理的日志)SLAVE STOP;
RESET MASTER; -- 清空舊 Binlog,重新開始
-- 修改 my.cnf:移除 master-* 參數,添加 server-id=1, log-bin=mysql-bin
-- 重啟服務
auto_increment_offset/increment 避免主鍵衝突,需應用層路由寫入單一主庫rpl_semi_sync_master=1 至少一個從庫收到日志才提交,平衡性能與數據安全