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