MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么

這篇文章給大家介紹MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

專注于為中小企業(yè)提供網(wǎng)站制作、成都做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)衛(wèi)濱免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了近1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

binlog作用

binlog的主要作用是記錄數(shù)據(jù)庫(kù)中表的更改,它只記錄改變數(shù)據(jù)的sql,不改變數(shù)據(jù)的sql不會(huì)寫入,比如select語(yǔ)句一般不會(huì)被記錄,因?yàn)樗麄儾粫?huì)對(duì)數(shù)據(jù)產(chǎn)生任何改動(dòng)。

用一個(gè)實(shí)際的場(chǎng)景看下binlog產(chǎn)生的過(guò)程,準(zhǔn)備sql:

create table test(text varchar(20));  insert into test values ('test_text'); select * from test;  flush logs;

查看binlog

show binlog events in 'binlog.000029';

顯示的結(jié)果如下:

MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么

binlog

另外,也可以使用mysqlbinlog工具來(lái)查看binlog的內(nèi)容:

show variables like 'log_%'; #查看日志目錄  mysqlbinlog --short-form --force-if-open --base64-output=never /usr/local/var/mysql/binlog.000029

MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么

MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么

從日志我們可以看到執(zhí)行了創(chuàng)建表的語(yǔ)句以及一個(gè)Format_desc頭和Ratate輪換事件,這個(gè)我們會(huì)在后面講到,先看幾個(gè)字段代表的含義。

Log_name代表日志文件的名稱,比如我這里的查詢是直接查詢binlog.000029,默認(rèn)的寫法是show binlog events,但是這樣只會(huì)查詢到第一個(gè)binlog,并不是當(dāng)前激活狀態(tài)的binlog,如果你不知道binlog有哪些,可以用命令:

show binary logs; #查看binlog列表  show master status; #查看最新的binlog

MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么

Pos代表文件開始的位置。

Event_type代表事件的類型。

Server_id是創(chuàng)建事件的服務(wù)器ID。

End_log_pos代表事件在文件中的結(jié)束位置,以上面為例,第一次查詢的結(jié)束位置是723,第二次insert之后文件的開始位置就是從723開始。

Info代表事件信息,是一段可讀的文本內(nèi)容。

binlog日志結(jié)構(gòu)

binlog日志的結(jié)構(gòu)大概是長(zhǎng)這樣的,它由索引文件和binlog文件組成,其中binlog事件又包含通用頭、提交頭和事件體3個(gè)部分組成。

MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么

首先說(shuō)說(shuō)索引文件,索引文件的每一行都包含了一個(gè)binlog文件的完整文件名(類似host-bin.001),一些命令比如flush logs將所有日志寫入磁盤會(huì)影響到索引文件。

每個(gè)binlog文件以若干個(gè)binlog事件組成,以格式描述事件(Format_description)作為文件頭(上面的binlog圖片F(xiàn)ormat_desc事件),以日志輪換事件(rotate)作為文件尾。

Format_description包含binlog文件的服務(wù)器信息、文件狀態(tài)的關(guān)鍵信息等。如果服務(wù)器關(guān)閉或者重啟,則會(huì)創(chuàng)建一個(gè)新的binlog文件,同時(shí)寫入一個(gè)新的format_description。他的格式大致如下。

2                binlog-version  string[50]       mysql-server version  4                create timestamp  1                event header length  string[p]        event type header lengths

日志輪換事件則包含下一個(gè)binlog的文件名以及開始讀取的位置,它由服務(wù)器寫完binlog后添加到文件尾,輪換事件并不會(huì)每次都存在,格式如下。

if binlog-version > 1 {  8              position  }  string[p]      name of the next binlog

binlog事件包含若干個(gè)事務(wù)組成的組(group),每個(gè)組對(duì)應(yīng)一個(gè)事務(wù),如果是create alter語(yǔ)句不屬于事務(wù)語(yǔ)句的話,則他們本身就是一個(gè)組,每個(gè)組要么全部執(zhí)行,要么都不執(zhí)行。

MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么

binlog事件結(jié)構(gòu)

每個(gè)binlog事件由3個(gè)部分組成:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2.  通用頭,包含binlog中所有事件具備的基本信息。

  3.  提交頭,對(duì)于不同類型的事件來(lái)說(shuō),提交頭的內(nèi)容也不盡相同

  4.  事件體,存儲(chǔ)事件的主要數(shù)據(jù),同樣對(duì)于不同類型事件也不同。

binlog輪換和清理

從上面的例子我們也可以看出來(lái),binlog并非只有一個(gè),而基于真實(shí)的場(chǎng)景來(lái)說(shuō),始終寫一個(gè)binlog文件肯定也是不可取的,而binlog輪換主要有3個(gè)場(chǎng)景:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2.  服務(wù)器啟動(dòng),每次服務(wù)器啟動(dòng)都會(huì)生成一個(gè)新的binlog文件。

  3.  達(dá)到最大大小,可以通過(guò)binlog-cache-size控制大小,達(dá)到最大大小后將更換。

  4.  顯示刷新,flush logs將所有日志寫入磁盤,這時(shí)候會(huì)創(chuàng)建一個(gè)新的文件寫入,從第一個(gè)例子也能看出來(lái)執(zhí)行完之后生成了一個(gè)新的日志binlog.000030的文件并且開始的位置是4。

MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么

隨著時(shí)間的推移,我們的binlog文件會(huì)越來(lái)越多,這時(shí)候有兩種方式可以清除binlog:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2.  通過(guò)設(shè)置expire-logs-days控制想保留的binlog日志文件天數(shù),系統(tǒng)將會(huì)自動(dòng)清理。

  3.  通過(guò)PURGE BINARY LOGS手動(dòng)清理

relay-log結(jié)構(gòu)

relay-log中繼日志是連接master和slave的核心,我們來(lái)深入了解一下它的結(jié)構(gòu)和使用。

MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么

image-20200909161115718

relay-log的結(jié)構(gòu)和binlog非常相似,只不過(guò)他多了一個(gè)master.info和relay-log.info的文件。

master.info記錄了上一次讀取到master同步過(guò)來(lái)的binlog的位置,以及連接master和啟動(dòng)復(fù)制必須的所有信息。

relay-log.info記錄了文件復(fù)制的進(jìn)度,下一個(gè)事件從什么位置開始,由sql線程負(fù)責(zé)更新。

上一篇文章我們提到了整個(gè)復(fù)制流程的過(guò)程大概是這個(gè)樣子:

MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么

知道binlog和relay-log的結(jié)構(gòu)之后,我們重新梳理一下整個(gè)鏈路的流程,這里我們假定master.info和relay-log.info都是存在的情況:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2.  Master收到客戶端請(qǐng)求語(yǔ)句,在語(yǔ)句結(jié)束之前向二進(jìn)制日志寫入一條記錄,可能包含多個(gè)事件。

  3.  此時(shí),一個(gè)Slave連接到Master,Master的dump線程從binlog讀取日志并發(fā)送到Slave的IO線程。

  4.  IO線程從master.info讀取到上一次寫入的最后的位置。

  5.  IO線程寫入日志到relay-log中繼日志,如果超過(guò)指定的relay-log大小,寫入輪換事件,創(chuàng)建一個(gè)新的relay-log。

  6.  更新master.info的最后位置

  7.  SQL線程從relay-log.info讀取進(jìn)上一次讀取的位置

  8.  SQL線程讀取日志事件

  9.  在數(shù)據(jù)庫(kù)中執(zhí)行sql

  10.  更新relay-log.info的最后位置

  11.  Slave記錄自己的binlog日志

MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么

但是在這里IO和SQL線程有會(huì)產(chǎn)生重復(fù)事件的問(wèn)題,舉一個(gè)場(chǎng)景:

  1.  先記錄中繼日志,然后更新master.info位置

  2.  此時(shí)服務(wù)器崩潰,寫入master.info失敗

  3.  服務(wù)器恢復(fù),再次同步從master.info獲取到的是上一次的位置,會(huì)導(dǎo)致事件重復(fù)執(zhí)行

關(guān)于MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

文章標(biāo)題:MySQL中binlog和relay-log結(jié)構(gòu)的作用是什么
當(dāng)前鏈接:http://muchs.cn/article22/jpisjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣服務(wù)器托管、網(wǎng)站排名、移動(dòng)網(wǎng)站建設(shè)企業(yè)建站、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)