記錄一次基於 GTID/傳統位點的主從搭建全過程,重點排查從庫延遲需 FLUSH LOGS 才同步的根因——sync_binlog=100 導致 Binlog 刷盤延遲。
mysqldump --all-databases --master-data=2 --single-transaction ... > backup.sqlCHANGE MASTER TO MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=529372。slow_query_log 避免報錯,導入備份。GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'slavepass';CHANGE MASTER TO MASTER_HOST='192.168.1.6', MASTER_USER='repl', MASTER_PASSWORD='slavepass', MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=529372;START SLAVE;SHOW SLAVE STATUS\G 確認 Slave_IO_Running: Yes, Slave_SQL_Running: Yes, Seconds_Behind_Master: 0。主庫 INSERT 後,從庫 SELECT 不見新數據;執行 FLUSH LOGS 後同步出現。
排查參數:
SHOW VARIABLES LIKE 'sync_binlog'; -- 100 SHOW VARIABLES LIKE 'innodb_flush_method'; -- O_DIRECT SHOW VARIABLES LIKE 'autocommit'; -- ON
根因:sync_binlog=100 表示每 100 次事務提交才 fsync Binlog 到磁盤。主庫崩潰或未刷盤時,從庫 IO 線程讀不到最新事件,導致可見延遲。
SET GLOBAL sync_binlog = 1; -- 即時生效 -- 永久生效寫入 my.cnf [mysqld] sync_binlog = 1
修改後主庫每次提交強制刷盤,從庫實時可見,零延遲(網絡延遟除外)。
RESET MASTER; SHOW MASTER STATUS\G; SHOW BINLOG EVENTS IN 'binlog.000001'; FLUSH LOGS;