RELAY LOG相關參數
設置如何保存從節點接收到的主庫BINLOG
sync_relay_log : 設置如何同步中繼日志到中繼日志文件。 當sync_relay_log = 0時,則MySQL服務不會對中繼日志文件進行同步操作,依賴於操作系統來定期進行同步。 當sync_relay_log = N(N>0),則每N個sync_relay_log事件后對中繼日志文件執行一次同步(調用fdatasync())。
設置如何保存從節點接收主庫BINLOG的進度信息
master_info_repository: 用於設置如何保存從節點接收到主庫BINLOG的位點信息,可選參數可選參數值FILE|TABLE,默認參數為FILE。 sync_master_info: 參數值N(int),用於設置當N次sync_master_info事件后將信息同步到文件或同步到表中,默認參數值為1000 當master_info_repository = FILE時,如果sync_master_info=0,則MySQL服務不會對master.info文件進行同步操作,依賴於操作系統來定期進行同步。 當master_info_repository = TABLE時,如果sync_master_info=0,則MySQL服務不會更新mysql.slave_master_info的數據。 修改sync_master_info參數值不需要關閉復制進程,修改即時生效。
設置如何保存從節點上應用RELAYLOG的進度信息
relay_log_info_repository : 用於設置如何保存從節點上應用中繼日志的位置信息,可選參數可選參數值FILE|TABLE,默認參數為FILE。 如果設置為FILE,信息存放到relay-log.info文件中,如果設置為TABLE,信息存放到mysql.slave_relay_log_info中。 如果使用多源復制,必須使用TABLE參數值。 修改relay_log_info_repository 參數的值需先關閉復制進程再修改然后重啟復制線程。 sync_relay_log_info : 用於設置如何將應用中繼日志的位置信息同步到文件和表中,默認參數為10000 當sync_relay_log_info = FILE時: 如果sync_relay_log_info=0,則MySQL服務不會對relay-log.info文件進行同步操作,依賴於操作系統來定期進行同步。 如果sync_relay_log_info=N(N>0),則每執行N個事務后將信息使用fdatasync()同步到relay-log.info文件。 當sync_relay_log_info = TABLE 且表mysql.slave_relay_log_info使用事務存儲引擎如Innodb: 在每次事務后都會更新mysql.slave_relay_log_info表的數據,忽略sync_relay_log_info的設置。 當sync_relay_log_info = TABLE 且表mysql.slave_relay_log_info不使用存儲引擎如MyISAM: 如果sync_relay_log_info=0,則不更新表mysql.slave_relay_log_info的數據。 如果sync_relay_log_info=N(N>0),則每執行N個事務后更新表mysql.slave_relay_log_info的數據。
設置如何恢復RELAY LOG
relay_log_recovery 用於設置在relay-log出現問題時如何修復,默認值為0(不開啟) 當slave從庫宕機后,假如relay-log損壞了,導致一部分中繼日志沒有處理,則自動放棄所有未執行的relay-log,並且重新從master上獲取日志,這樣就保證了relay-log的完整性 當MTS開啟后,如果設置relay_log_recovery=1,從節點意外重啟或被強制kill后重啟,會有如下錯誤: relay-log-recovery cannot be executed when the slave was stopped with an error or killed in MTS mode
如果從節點上relay_log_info_repository= file 或sync_relay_log_info<>1時,如果從節點發生故障重啟,就可能出現從節點已應用第XXX條日志,但relay_log_info中記錄的還是第XXX-N的位置,從節點從第XXX-N條日志進行重做,這部分relay log被重復執行,報1032和1062的錯誤,導致同步失敗。因此推薦進行如下設置:
master_info_repository=TABLE relay_log_info_repository=TABLE relay_log_recovery=1
1、由於設置relay_log_recovery=1,當Relay Log出現異常時,能自動恢復,因此無需每次同步RALAY LOG都刷新進度信息(sync_master_info)和每次將RALAY LOG刷新到磁盤(sync_relay_log)
2、由於設置relay_log_info_repository=TABLE,且表mysql.slave_relay_log_info默認使用InnoDB存儲引擎,因為每次應用RALAY LOG中的事件都會刷新mysql.slave_relay_log_info表數據,忽略參數sync_master_info的設置。
RELAY LOG文件生成與刪除
Relaylog的生成: 寫入一個從Master端得到的event后,會判斷當前文件是否超過max_relay_log_size,如果超過則生成一個新的relaylog Relaylog的刪除: 1>當SQL線程執行完該Relaylog最后一個event后,會判斷該文件是否還需要保留,如果不需要保留,則刪除 2>在實例啟動和flush logs時,判斷relay log是否超過expire-log-days的限制,如果超過,則刪除