www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]本文讀完需7分鐘,速讀僅需4分鐘。前言上篇阿星詳細(xì)聊了redolog(重做日志),但是在MySQL數(shù)據(jù)庫(kù)中還有一種二進(jìn)制日志叫binlog(歸檔日志)。redolog它是物理日志,記錄內(nèi)容是“在某個(gè)數(shù)據(jù)頁(yè)上做了什么修改”,屬于InnoDB存儲(chǔ)引擎。而binlog是邏輯日志,記錄內(nèi)...

本文讀完需7分鐘,速讀僅需4分鐘。

不會(huì)吧,不會(huì)吧,還有人不知道?binlog??

前言

上篇阿星詳細(xì)聊了redo log(重做日志),但是在MySQL數(shù)據(jù)庫(kù)中還有一種二進(jìn)制日志叫binlog(歸檔日志)。

不會(huì)吧,不會(huì)吧,還有人不知道?binlog??
redo log它是物理日志,記錄內(nèi)容是“在某個(gè)數(shù)據(jù)頁(yè)上做了什么修改”,屬于InnoDB存儲(chǔ)引擎。

binlog是邏輯日志,記錄內(nèi)容是語(yǔ)句的原始邏輯,類似于“給ID=2這一行的c字段加1”,屬于MySQL Server層。

binlog

不管用什么存儲(chǔ)引擎,只要發(fā)生了表數(shù)據(jù)更新,都會(huì)產(chǎn)生binlog日志。

binlog到底是用來(lái)干嘛的?

可以說(shuō)MySQL數(shù)據(jù)庫(kù)的數(shù)據(jù)備份、主備、主主、主從都離不開binlog,需要依靠binlog來(lái)同步數(shù)據(jù),保證數(shù)據(jù)一致性。

不會(huì)吧,不會(huì)吧,還有人不知道?binlog??
binlog會(huì)記錄所有涉及更新數(shù)據(jù)的邏輯操作,并且是順序?qū)憽?/p>

記錄格式

binlog日志有三種格式,可以通過(guò)binlog_format參數(shù)指定。

  • statement
  • row
  • mixed
指定statement,記錄的內(nèi)容是SQL語(yǔ)句原文,比如執(zhí)行一條update T set update_time=now() where id=1,記錄的內(nèi)容如下。

不會(huì)吧,不會(huì)吧,還有人不知道?binlog??
同步數(shù)據(jù)時(shí),會(huì)執(zhí)行記錄的SQL語(yǔ)句,但是有個(gè)問(wèn)題,update_time=now()這里會(huì)獲取當(dāng)前系統(tǒng)時(shí)間,直接執(zhí)行會(huì)導(dǎo)致與原庫(kù)的數(shù)據(jù)不一致。

為了解決這種問(wèn)題,我們需要指定為row,記錄的內(nèi)容不再是簡(jiǎn)單的SQL語(yǔ)句了,還包含操作的具體數(shù)據(jù),記錄內(nèi)容如下。

不會(huì)吧,不會(huì)吧,還有人不知道?binlog??
row格式記錄的內(nèi)容看不到詳細(xì)信息,要通過(guò)mysqlbinlog工具解析出來(lái)。

update_time=now()變成了具體的時(shí)間update_time=1627112756247,條件后面的@1、@2、@3都是該行數(shù)據(jù)第1個(gè)~3個(gè)字段的原始值(假設(shè)這張表只有3個(gè)字段)。

這樣就能保證同步數(shù)據(jù)的一致性,通常情況下都是指定為row,這樣可以為數(shù)據(jù)庫(kù)的恢復(fù)與同步帶來(lái)更好的可靠性。

但是這種格式,需要更大的容量來(lái)記錄,比較占用空間,恢復(fù)與同步時(shí)會(huì)更消耗IO資源,影響執(zhí)行速度。

所以就有了一種折中的方案,指定為mixed,記錄的內(nèi)容是前兩者的混合。

MySQL會(huì)判斷這條SQL語(yǔ)句是否可能引起數(shù)據(jù)不一致,如果是,就用row格式,否則就用statement格式。

寫入機(jī)制

binlog的寫入時(shí)機(jī)也非常簡(jiǎn)單,事務(wù)執(zhí)行過(guò)程中,先把日志寫到binlog cache,事務(wù)提交的時(shí)候,再把binlog cache寫到binlog文件中。

因?yàn)橐粋€(gè)事務(wù)的binlog不能被拆開,無(wú)論這個(gè)事務(wù)多大,也要確保一次性寫入,所以系統(tǒng)會(huì)給每個(gè)線程分配一個(gè)塊內(nèi)存作為binlog cache。

我們可以通過(guò)binlog_cache_size參數(shù)控制單個(gè)線程binlog cache大小,如果存儲(chǔ)內(nèi)容超過(guò)了這個(gè)參數(shù),就要暫存到磁盤(Swap)。

binlog日志刷盤流程如下

不會(huì)吧,不會(huì)吧,還有人不知道?binlog??
  • 上圖的write,是指把日志寫入到文件系統(tǒng)的page cache,并沒有把數(shù)據(jù)持久化到磁盤,所以速度比較快
  • 上圖的fsync,才是將數(shù)據(jù)持久化到磁盤的操作
writefsync的時(shí)機(jī),可以由參數(shù)sync_binlog控制,默認(rèn)是0

0的時(shí)候,表示每次提交事務(wù)都只write,由系統(tǒng)自行判斷什么時(shí)候執(zhí)行fsync。

不會(huì)吧,不會(huì)吧,還有人不知道?binlog??
雖然性能得到提升,但是機(jī)器宕機(jī),page cache里面的binglog會(huì)丟失。

為了安全起見,可以設(shè)置為1,表示每次提交事務(wù)都會(huì)執(zhí)行fsync,就如同binlog日志刷盤流程一樣。

最后還有一種折中方式,可以設(shè)置為N(N>1),表示每次提交事務(wù)都write,但累積N個(gè)事務(wù)后才fsync。

不會(huì)吧,不會(huì)吧,還有人不知道?binlog??
在出現(xiàn)IO瓶頸的場(chǎng)景里,將sync_binlog設(shè)置成一個(gè)比較大的值,可以提升性能。

同樣的,如果機(jī)器宕機(jī),會(huì)丟失最近N個(gè)事務(wù)的binlog日志。

站在巨人的肩膀上

  • 《MySQL實(shí)戰(zhàn)45講》
  • 《從零開始帶你成為MySQL實(shí)戰(zhàn)優(yōu)化高手》
  • 《MySQL技術(shù)Innodb存儲(chǔ)引擎》

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉