新聞中心
Binlog是mysql以二進(jìn)制形式打印的日志,它默認(rèn)不加密,不壓縮。每個(gè)正常的binlog文件頭部,有4個(gè)字節(jié)的標(biāo)記,值為0xfe 0x62 0x69 0x6e。LOG_EVENT是binlog里的單位,即正常情況下binlog按照逐LOG_EVENT的形式增長(zhǎng)。除去頭部的標(biāo)記,binlog就是一個(gè)LOG_EVENT的序列。每個(gè)LOG_EVENT都獨(dú)立單元,沒(méi)有互相引用的關(guān)系,它也有自己的二進(jìn)制頭部,主要是記錄了時(shí)間戳、類型標(biāo)記等描述信息。

創(chuàng)新互聯(lián)專注于靖邊企業(yè)網(wǎng)站建設(shè),自適應(yīng)網(wǎng)站建設(shè),成都商城網(wǎng)站開(kāi)發(fā)。靖邊網(wǎng)站建設(shè)公司,為靖邊等地區(qū)提供建站服務(wù)。全流程按需搭建網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
Mysql把磁盤操作的實(shí)現(xiàn)封裝在IO_CACHE結(jié)構(gòu)里,這也方便了我們對(duì)binlog的研究和描述,后文如果沒(méi)有特別說(shuō)明,讀寫binlog與讀寫IO_CACHE的含義相同。為了解mysql寫入binlog的過(guò)程,可以找一個(gè)sql語(yǔ)句的處理過(guò)程進(jìn)行跟蹤。以u(píng)pdate為例,在最簡(jiǎn)單的情況下,mysql會(huì)先調(diào)用為存儲(chǔ)引擎開(kāi)放的接口ha_update_row,然而執(zhí)行binlog_query對(duì)binlog進(jìn)行寫操作。
這樣處理的原因是,在主從備份的場(chǎng)景下,如果主庫(kù)先寫入binlog成功、在執(zhí)行update的過(guò)程中crash,從庫(kù)有可能執(zhí)行update成功,此時(shí)主庫(kù)重啟之后,與從庫(kù)的數(shù)據(jù)不一致。如果update操作發(fā)生在事務(wù)性的表上,在寫入binlog之后會(huì)執(zhí)行開(kāi)放接口ha_autocommit_or_rollback,由存儲(chǔ)引擎判斷操作結(jié)果。
在主從備份的場(chǎng)景下,主庫(kù)相當(dāng)于server,從庫(kù)相當(dāng)于client,雙方采用tcp短連接。從庫(kù)發(fā)出讀取日志的請(qǐng)求,主庫(kù)接收請(qǐng)求、讀取本地binlog、然后發(fā)送給從庫(kù)。從庫(kù)接收日志,進(jìn)行簡(jiǎn)單校驗(yàn)后寫本地日志,稱為relay log。此處從庫(kù)的流程專門由一個(gè)線程負(fù)責(zé),稱為同步io線程。從庫(kù)還有一個(gè)線程,稱為同步sql線程。它的行為是,定期讀取relay log,解析并執(zhí)行同步過(guò)來(lái)的sql語(yǔ)句。
下面回答幾個(gè)問(wèn)題:
1.binlog的格式?
二進(jìn)制順序存儲(chǔ),不加密,不壓縮。
2.binlog使用WAL嗎?
No。
3.主庫(kù)發(fā)送binlog,是使用內(nèi)存里的copy嗎?
無(wú)法確定,很有可能是先從磁盤上讀一份,然后發(fā)送。
4.relaylog使用WAL嗎?
Yes。從庫(kù)接收到日志后,會(huì)先寫relay log。
5.binlog和relaylog的SQL是否一致?
在網(wǎng)絡(luò)傳輸正確性可靠的前提下,yes。
#p#
提一個(gè)問(wèn)題:既然binlog不使用WAL,那么在主從場(chǎng)景下,mysql異常之后,主庫(kù)和從庫(kù)是否會(huì)不一致呢?
之前有個(gè)問(wèn)題一直沒(méi)弄明白:既然mysql是先做數(shù)據(jù)操作、再寫binlog,如果寫binlog的時(shí)候失敗,mysql又crash,數(shù)據(jù)怎么辦?
答案是由存儲(chǔ)引擎決定數(shù)據(jù)??梢园裮ysql和它的存儲(chǔ)引擎分開(kāi)看,因?yàn)閙ysql只是一個(gè)框架,而不是一個(gè)實(shí)現(xiàn)。binlog是mysql自己的日志,而事務(wù)是由存儲(chǔ)引擎本身保證的。
以u(píng)pdate為例,mysql做的事情簡(jiǎn)單分為:
1. 修改數(shù)據(jù)update。
2. 寫binlog。
3. 如果當(dāng)前處理的表是一個(gè)事務(wù)性的表,則commit或rollback。
注意此處的update和commit/rollback都由存儲(chǔ)引擎實(shí)現(xiàn),mysql只是站在邏輯的高度上理解這些操作。
對(duì)于事務(wù)型的引擎innodb,它本身有日志保證數(shù)據(jù)的一致性。在innodb的實(shí)現(xiàn)中,update修改數(shù)據(jù)之前,會(huì)新建一個(gè)事務(wù),并建立一個(gè)回滾點(diǎn)。而在innodb提供的commit/rollback接口會(huì)提交/回滾事務(wù)。
因此對(duì)innodb而言,每條SQL語(yǔ)句的事務(wù),其實(shí)包含了binlog的寫操作。然而即使是這樣,innodb仍然無(wú)法保證binlog和數(shù)據(jù)的一致性,因?yàn)閕nnodb在寫commit成功后crash,回滾操作不會(huì)回滾binlog。按照手冊(cè)上的說(shuō)法,把--innodb-support-xa設(shè)置為1,同時(shí)保證sync_binlog=1,才能保證innodb的binlog和數(shù)據(jù)一致。
對(duì)于非事務(wù)型的引擎myisam,沒(méi)有commit/rollback的機(jī)會(huì),因此在異常情況下,數(shù)據(jù)會(huì)和binlog不一致。
本文就介紹到這里,更多Mysql的操作就參考:http://database./col/484/,謝謝大家的支持!
網(wǎng)站名稱:mysql數(shù)據(jù)庫(kù)對(duì)binlog日志的處理
URL網(wǎng)址:http://fisionsoft.com.cn/article/djiesis.html


咨詢
建站咨詢
