從數(shù)據(jù)庫Slave服務(wù)的I/O線程從主數(shù)據(jù)庫Master服務(wù)的二進(jìn)制日志中讀取數(shù)據(jù)庫的更改記錄并寫入到中繼日志中载萌,然后在Slave數(shù)據(jù)庫執(zhí)行修改操作惧财。這就是中繼日志Relay Log。
RELAY LOG相關(guān)參數(shù)
max_relay_log_size
relay log 允許的最大值炒考,如果該值為0可缚,則默認(rèn)值為 max_binlog_size (1G);
如果不為0斋枢,則 max_relay_log_size 則為最大的relay_log文件大辛泵摇;
relay_log
定義 relay_log 的位置和名稱瓤帚,如果值為空描姚,則默認(rèn)位置在數(shù)據(jù)文件的目錄;
relay_log_index
定義 relay_log 索引的位置和名稱戈次,記錄有幾個(gè) relay_log 文件轩勘,默認(rèn)為2個(gè)
relay_log_info_file
定義 relay-log.info 的位置和名稱
relay_log_purge
是否自動(dòng)清空中繼日志,默認(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從庫上開啟該功能,建議開啟梯皿;
sync_relay_log
設(shè)置如何同步中繼日志到中繼日志文件仇箱。
當(dāng)sync_relay_log = 0時(shí),則MySQL服務(wù)不會(huì)對(duì)中繼日志文件進(jìn)行同步操作东羹,依賴于操作系統(tǒng)來定期進(jìn)行同步剂桥。
當(dāng)sync_relay_log = N(N>0),slave的I/O線程每次接收到master發(fā)送過來的binlog日志都要寫入系統(tǒng)緩沖區(qū)属提,每N個(gè)sync_relay_log事件后對(duì)中繼日志文件執(zhí)行一次同步(調(diào)用fdatasync())渊额。
sync_relay_log_info
用于設(shè)置如何將應(yīng)用中繼日志的位置信息同步到文件和表中,默認(rèn)參數(shù)為10000
當(dāng)sync_relay_log_info = FILE時(shí):
如果sync_relay_log_info=0垒拢,則MySQL服務(wù)不會(huì)對(duì)relay-log.info文件進(jìn)行同步操作,依賴于操作系統(tǒng)來定期進(jìn)行同步火惊。
如果sync_relay_log_info=N(N>0)求类,則每執(zhí)行N個(gè)事務(wù)后將信息使用fdatasync()同步到relay-log.info文件。
當(dāng)sync_relay_log_info = TABLE 且表mysql.slave_relay_log_info使用事務(wù)存儲(chǔ)引擎如Innodb:
在每次事務(wù)后都會(huì)更新mysql.slave_relay_log_info表的數(shù)據(jù)屹耐,忽略sync_relay_log_info的設(shè)置尸疆。
當(dāng)sync_relay_log_info = TABLE 且表mysql.slave_relay_log_info不使用存儲(chǔ)引擎如MyISAM:
如果sync_relay_log_info=0,則不更新表mysql.slave_relay_log_info的數(shù)據(jù)。
如果sync_relay_log_info=N(N>0)惶岭,則每執(zhí)行N個(gè)事務(wù)后更新表mysql.slave_relay_log_info的數(shù)據(jù)寿弱。
elay_log.info內(nèi)容同步至磁盤
設(shè)置如何保存從節(jié)點(diǎn)接收到的主庫BINLOG
sync_relay_log
設(shè)置如何同步中繼日志到中繼日志文件。
當(dāng)sync_relay_log = 0時(shí)按灶,則MySQL服務(wù)不會(huì)對(duì)中繼日志文件進(jìn)行同步操作症革,依賴于操作系統(tǒng)來定期進(jìn)行同步。
當(dāng)sync_relay_log = N(N>0)鸯旁,則每N個(gè)sync_relay_log事件后對(duì)中繼日志文件執(zhí)行一次同步(調(diào)用fdatasync())噪矛。
設(shè)置如何保存從節(jié)點(diǎn)接收主庫BINLOG的進(jìn)度信息
master_info_repository
用于設(shè)置如何保存從節(jié)點(diǎn)接收到主庫BINLOG的位點(diǎn)信息,可選參數(shù)可選參數(shù)值FILE|TABLE铺罢,默認(rèn)參數(shù)為FILE艇挨。
sync_master_info
參數(shù)值N(int),用于設(shè)置當(dāng)N次sync_master_info事件后將信息同步到文件或同步到表中,默認(rèn)參數(shù)值為1000
當(dāng)master_info_repository = FILE時(shí)韭赘,如果sync_master_info=0缩滨,則MySQL服務(wù)不會(huì)對(duì)master.info文件進(jìn)行同步操作,依賴于操作系統(tǒng)來定期進(jìn)行同步。
當(dāng)master_info_repository = TABLE時(shí)脉漏,如果sync_master_info=0苞冯,則MySQL服務(wù)不會(huì)更新mysql.slave_master_info的數(shù)據(jù)。
修改sync_master_info參數(shù)值不需要關(guān)閉復(fù)制進(jìn)程鸠删,修改即時(shí)生效抱完。
設(shè)置如何保存從節(jié)點(diǎn)上應(yīng)用RELAYLOG的進(jìn)度信息
relay_log_info_repository
用于設(shè)置如何保存從節(jié)點(diǎn)上應(yīng)用中繼日志的位置信息,可選參數(shù)可選參數(shù)值FILE|TABLE刃泡,默認(rèn)參數(shù)為FILE巧娱。
如果設(shè)置為FILE,信息存放到relay-log.info文件中烘贴,如果設(shè)置為TABLE禁添,信息存放到mysql.slave_relay_log_info中。
如果使用多源復(fù)制桨踪,必須使用TABLE參數(shù)值老翘。
修改relay_log_info_repository 參數(shù)的值需先關(guān)閉復(fù)制進(jìn)程再修改然后重啟復(fù)制線程。
sync_relay_log_info
用于設(shè)置如何將應(yīng)用中繼日志的位置信息同步到文件和表中锻离,默認(rèn)參數(shù)為10000
當(dāng)sync_relay_log_info = FILE時(shí):
如果sync_relay_log_info=0铺峭,則MySQL服務(wù)不會(huì)對(duì)relay-log.info文件進(jìn)行同步操作,依賴于操作系統(tǒng)來定期進(jìn)行同步汽纠。
如果sync_relay_log_info=N(N>0)卫键,則每執(zhí)行N個(gè)事務(wù)后將信息使用fdatasync()同步到relay-log.info文件。
當(dāng)sync_relay_log_info = TABLE 且表mysql.slave_relay_log_info使用事務(wù)存儲(chǔ)引擎如Innodb:
在每次事務(wù)后都會(huì)更新mysql.slave_relay_log_info表的數(shù)據(jù)虱朵,忽略sync_relay_log_info的設(shè)置莉炉。
當(dāng)sync_relay_log_info = TABLE 且表mysql.slave_relay_log_info不使用存儲(chǔ)引擎如MyISAM:
如果sync_relay_log_info=0,則不更新表mysql.slave_relay_log_info的數(shù)據(jù)。
如果sync_relay_log_info=N(N>0)碴犬,則每執(zhí)行N個(gè)事務(wù)后更新表mysql.slave_relay_log_info的數(shù)據(jù)絮宁。
設(shè)置如何恢復(fù)RELAY LOG
relay_log_recovery
用于設(shè)置在relay-log出現(xiàn)問題時(shí)如何修復(fù),默認(rèn)值為0(不開啟)
當(dāng)slave從庫宕機(jī)后服协,假如relay-log損壞了绍昂,導(dǎo)致一部分中繼日志沒有處理,則自動(dòng)放棄所有未執(zhí)行的relay-log偿荷,并且重新從master上獲取日志治专,這樣就保證了relay-log的完整性
當(dāng)MTS開啟后,如果設(shè)置relay_log_recovery=1遭顶,從節(jié)點(diǎn)意外重啟或被強(qiáng)制kill后重啟张峰,會(huì)有如下錯(cuò)誤:
relay-log-recovery cannot be executed when the slave was stopped with an error or killed in MTS mode
如果從節(jié)點(diǎn)上relay_log_info_repository= file 或sync_relay_log_info<>1時(shí),如果從節(jié)點(diǎn)發(fā)生故障重啟棒旗,就可能出現(xiàn)從節(jié)點(diǎn)已應(yīng)用第XXX條日志喘批,但relay_log_info中記錄的還是第XXX-N的位置撩荣,從節(jié)點(diǎn)從第XXX-N條日志進(jìn)行重做,這部分relay log被重復(fù)執(zhí)行饶深,報(bào)1032和1062的錯(cuò)誤餐曹,導(dǎo)致同步失敗。因此推薦進(jìn)行如下設(shè)置:
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=1
1敌厘、由于設(shè)置relay_log_recovery=1台猴,當(dāng)Relay Log出現(xiàn)異常時(shí),能自動(dòng)恢復(fù)俱两,因此無需每次同步RALAY LOG都刷新進(jìn)度信息(sync_master_info)和每次將RALAY LOG刷新到磁盤(sync_relay_log)
2饱狂、由于設(shè)置relay_log_info_repository=TABLE,且表mysql.slave_relay_log_info默認(rèn)使用InnoDB存儲(chǔ)引擎宪彩,因?yàn)槊看螒?yīng)用RALAY LOG中的事件都會(huì)刷新mysql.slave_relay_log_info表數(shù)據(jù)休讳,忽略參數(shù)sync_master_info的設(shè)置。
RELAY LOG文件生成與刪除
Relaylog的生成:
寫入一個(gè)從Master端得到的event后尿孔,會(huì)判斷當(dāng)前文件是否超過max_relay_log_size俊柔,如果超過則生成一個(gè)新的relaylog
Relaylog的刪除:
當(dāng)SQL線程執(zhí)行完該Relaylog最后一個(gè)event后,會(huì)判斷該文件是否還需要保留活合,如果不需要保留雏婶,則刪除
在實(shí)例啟動(dòng)和flush logs時(shí),判斷relay log是否超過expire-log-days的限制白指,如果超過尚骄,則刪除
————————————————
版權(quán)聲明:本文為CSDN博主「FerryJC」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議侵续,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jinhf10/article/details/110479269