圖文結合帶你搞懂MySQL日志之relay log(中繼日志)
什么是中繼日志(relay log)
中繼日志(relay log)?只在主從服務器架構的從服務器上存在。從服務器(slave)?為了與主服務器(Master)保持一致,要從主服務器讀取二進制日志的內容,并且把讀取到的信息寫入本地的日志文件中,這個從服務器本地的日志文件就叫中繼日志。然后,從服務器讀取中繼日志,并根據中繼日志的內容對從服務器的數據進行更新,完成主從服務器的數據同步。
搭建好主從服務器之后,中繼日志默認會保存在從服務器的數據目錄下。
文件名的格式是:從服務器名 - relay-bin.序號?。中繼日志還有一個索引文件:從服務器名 - relay-bin.index,用來定位當前正在使用的中繼日志。
(主從復制原理圖)
從服務器I/O線程將主服務器的二進制日志(binlog)讀取過來記錄到從服務器本地文件,然后從服務器SQL線程會讀取中繼日志的內容并應用到從服務器,從而使從服務器和主服務器的數據保持一致。
中繼日志的作用
中繼日志用于主從服務器架構中,從服務器用來存放主服務器二進制日志內容的一個中間文件。從服務器通過讀取中繼日志的內容,來同步主服務器上的操作。
中繼日志是連接mastert(主服務器)和slave(從服務器)的信息,它是復制的核心,I/O線程將來自master的binlog存儲到中繼日志中,中繼日志充當緩沖,這樣master不必等待slave執行完成就可以發送下一個binlog。
查看中繼日志
中繼日志文件的格式與二進制日志文件相同,并且可以 使用 mysqlbinlog 進行讀取
這一段的意思是,主服務器(“server id 1”)對表 kaito.test 進行了 2 步操作:
定位到表 kaito.test 編號是 91 的記錄,日志位置是 832
刪除編號是 91 的記錄,日志位置是 872
相關參數解析
通過語句:show variables like '%relay%' 查看先骨干的relay的所有相關參數如下:
- max_relay_log_size:標記relay log 允許的最大值,如果該值為0,則默認值為max_binlog_size(1G);如果不為0,則max_relay_log_size則為最大的relay_log文件大小;
- relay_log:定義relay_log的位置和名稱,如果值為空,則默認位置在數據文件的目錄(datadir),文件名默認為host_name-relay-bin.nnnnnn
- relay_log_index:同relay_log,定義relay_log的位置和名稱;一般和relay-log在同一目錄
- relay_log_info_file:設置relay-log.info的位置和名稱(relay-log.info記錄MASTER的binary_log的恢復位置和relay_log的位置)
- relay_log_purge:是否自動清空不再需要中繼日志時。默認值為1(啟用)。
- relay_log_recovery:?當slave從庫宕機后,假如relay-log損壞了,導致一部分中繼日志沒有處理,則自動放棄所有未執行的relay-log,并且重新從master上獲取日志,這樣就保證了relay-log的完整性。默認情況下該功能是關閉的,將relay_log_recovery的值設置為 1時,可在slave從庫上開啟該功能,建議開啟。
- relay_log_space_limit:防止中繼日志寫滿磁盤,這里設置中繼日志最大限額。
- 注意!但此設置存在主庫崩潰,從庫中繼日志不全的情況,不到萬不得已,不推薦使用!
- sync_relay_log:?這個參數和sync_binlog?是一樣的,當設置為1時,slave的I/O線程每次接收到master發送過來的binlog日志都要寫入系統緩沖區,然后刷入relay log中繼日志里,這樣是最安全的,因為在崩潰的時候,你最多會丟失一個事務,但會造成磁盤的大量I/O當設置為0時,并不是馬上就刷入中繼日志里,而是由操作系統決定何時來寫入,雖然安全性降低了,但減少了大量的磁盤I/O操作。這個值默認是0,可動態修改,建議采用默認值。
- sync_relay_log_info:這個參數和sync_relay_log參數一樣,當設置為1時,slave的I/O線程每次接收到master發送過來的binlog日志都要寫入系統緩沖區,然后刷入relay-log.info里,這樣是最安全的,因為在崩潰的時候,你最多會丟失一個事務,但會造成磁盤的大量I/O。當設置為0時,并不是馬上就刷入relay-log.info里,而是由操作系統決定何時來寫入,雖然安全性降低了,但減少了大量的磁盤I/O操作。這個值默認是0,可動態修改,建議采用默認值。
以上只是簡單的介紹了每個參數的作用,這些參數具體的設置還是需要根據每個用戶的實際系統情況進行設置的;
參考文章
《MySQL是怎樣運行的--從根兒上理解MySQL》—小孩子4919(https://juejin.cn/book/6844733769996304392)