MySQL是怎么保證數(shù)據(jù)不丟的?

只要 redo log 和 binlog 保證持久化到磁盤(pán)巍实,就能確保 MySQL 異常重啟后,數(shù)據(jù)可以恢復(fù)哩牍。

binlog 的寫(xiě)入機(jī)制

binlog 的寫(xiě)入邏輯比較簡(jiǎn)單:事務(wù)執(zhí)行過(guò)程中棚潦,先把日志寫(xiě)到 binlog cache,事務(wù)提交的時(shí)候膝昆,再把 binlog cache 寫(xiě)到 binlog 文件中丸边。

系統(tǒng)給 binlog cache 分配了一片內(nèi)存,每個(gè)線(xiàn)程一個(gè)外潜,但是共用同一份 binlog 文件原环。


image.png

分兩步

  1. write,指的就是指把日志寫(xiě)入到文件系統(tǒng)的 page cache处窥,并沒(méi)有把數(shù)據(jù)持久化到磁盤(pán)嘱吗,所以速度比較快。
  2. fsync滔驾,才是將數(shù)據(jù)持久化到磁盤(pán)的操作谒麦。一般情況下,我們認(rèn)為 fsync 才占磁盤(pán)的 IOPS哆致。

write 和 fsync 的時(shí)機(jī)绕德,是由參數(shù) sync_binlog 控制的:

  1. sync_binlog=0 的時(shí)候,表示每次提交事務(wù)都只 write摊阀,不 fsync耻蛇;
  2. sync_binlog=1 的時(shí)候,表示每次提交事務(wù)都會(huì)執(zhí)行 fsync胞此;
  3. sync_binlog=N(N>1) 的時(shí)候臣咖,表示每次提交事務(wù)都 write,但累積 N 個(gè)事務(wù)后才 fsync漱牵。

因此夺蛇,在出現(xiàn) IO 瓶頸的場(chǎng)景里,將 sync_binlog 設(shè)置成一個(gè)比較大的值酣胀,可以提升性能刁赦。

但是娶聘,將 sync_binlog 設(shè)置為 N,對(duì)應(yīng)的風(fēng)險(xiǎn)是:如果主機(jī)發(fā)生異常重啟甚脉,會(huì)丟失最近 N 個(gè)事務(wù)的 binlog 日志丸升。

redo log 的寫(xiě)入機(jī)制

image.png

redo log 可能存在的三種狀態(tài)

  1. 存在 redo log buffer,是在MySQL進(jìn)程內(nèi)存
  2. 存在文件系統(tǒng)的 page cache 宦焦,寫(xiě)到磁盤(pán) (write)发钝,但是沒(méi)有持久化(fsync)
  3. 存在hard disk顿涣,已持久化到磁盤(pán)

為了控制 redo log 的寫(xiě)入策略波闹,InnoDB 提供了 innodb_flush_log_at_trx_commit 參數(shù),它有三種可能取值:

  1. 設(shè)置為 0 的時(shí)候涛碑,表示每次事務(wù)提交時(shí)都只是把 redo log 留在 redo log buffer 中 ;
  2. 設(shè)置為 1 的時(shí)候精堕,表示每次事務(wù)提交時(shí)都將 redo log 直接持久化到磁盤(pán);
  3. 設(shè)置為 2 的時(shí)候蒲障,表示每次事務(wù)提交時(shí)都只是把 redo log 寫(xiě)到 page cache歹篓。

如果把 innodb_flush_log_at_trx_commit 設(shè)置成 1,那么 redo log 在 prepare 階段就要持久化一次揉阎,因?yàn)橛幸粋€(gè)崩潰恢復(fù)邏輯是要依賴(lài)于 prepare 的 redo log庄撮,再加上 binlog 來(lái)恢復(fù)的。

兩種場(chǎng)景會(huì)讓redo log 寫(xiě)入到磁盤(pán)中

  1. redo log buffer 占用的空間即將達(dá)到 innodb_log_buffer_size 一半的時(shí)候毙籽,后臺(tái)線(xiàn)程會(huì)主動(dòng)寫(xiě)盤(pán)洞斯。
  2. 并行的事務(wù)提交的時(shí)候,順帶將這個(gè)事務(wù)的 redo log buffer 持久化到磁盤(pán)

在并發(fā)更新場(chǎng)景下坑赡,第一個(gè)事務(wù)寫(xiě)完 redo log buffer 以后烙如,接下來(lái)這個(gè) fsync 越晚調(diào)用,組員可能越多毅否,節(jié)約 IOPS 的效果就越好亚铁。

為了讓一次 fsync 帶的組員更多,MySQL 有一個(gè)很有趣的優(yōu)化:拖時(shí)間螟加。在介紹兩階段提交的時(shí)候徘溢,我曾經(jīng)給你畫(huà)了一個(gè)圖,現(xiàn)在我把它截過(guò)來(lái)捆探。


image.png

圖中然爆,我把“寫(xiě) binlog”當(dāng)成一個(gè)動(dòng)作。但實(shí)際上徐许,寫(xiě) binlog 是分成兩步的:

  1. 先把 binlog 從 binlog cache 中寫(xiě)到磁盤(pán)上的 binlog 文件施蜜;
  2. 調(diào)用 fsync 持久化。

MySQL 為了讓組提交的效果更好雌隅,把 redo log 做 fsync 的時(shí)間拖到了步驟 1 之后翻默。也就是說(shuō)缸沃,上面的圖變成了這樣:


image.png

如果有多個(gè)事務(wù)的 binlog 已經(jīng)寫(xiě)完了,也是一起持久化的修械,這樣也可以減少 IOPS 的消耗趾牧。

如何在IO瓶頸上提高性能?

可以考慮以下三種方法:

  1. 設(shè)置 binlog_group_commit_sync_delay 和 binlog_group_commit_sync_no_delay_count 參數(shù)肯污,減少 binlog 的寫(xiě)盤(pán)次數(shù)翘单。這個(gè)方法是基于“額外的故意等待”來(lái)實(shí)現(xiàn)的,因此可能會(huì)增加語(yǔ)句的響應(yīng)時(shí)間蹦渣,但沒(méi)有丟失數(shù)據(jù)的風(fēng)險(xiǎn)哄芜。
  2. 將 sync_binlog 設(shè)置為大于 1 的值(比較常見(jiàn)是 100~1000)。這樣做的風(fēng)險(xiǎn)是柬唯,主機(jī)掉電時(shí)會(huì)丟 binlog 日志认臊。
  3. 將 innodb_flush_log_at_trx_commit 設(shè)置為 2。這樣做的風(fēng)險(xiǎn)是锄奢,主機(jī)掉電的時(shí)候會(huì)丟數(shù)據(jù)失晴。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拘央,隨后出現(xiàn)的幾起案子涂屁,更是在濱河造成了極大的恐慌,老刑警劉巖灰伟,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拆又,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡袱箱,警方通過(guò)查閱死者的電腦和手機(jī)遏乔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)发笔,“玉大人盟萨,你說(shuō)我怎么就攤上這事×颂郑” “怎么了捻激?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)前计。 經(jīng)常有香客問(wèn)我胞谭,道長(zhǎng),這世上最難降的妖魔是什么男杈? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任丈屹,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘旺垒。我一直安慰自己彩库,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布先蒋。 她就那樣靜靜地躺著骇钦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竞漾。 梳的紋絲不亂的頭發(fā)上眯搭,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音业岁,去河邊找鬼鳞仙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛叨襟,可吹牛的內(nèi)容都是我干的繁扎。 我是一名探鬼主播幔荒,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼糊闽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了爹梁?” 一聲冷哼從身側(cè)響起右犹,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姚垃,沒(méi)想到半個(gè)月后念链,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡积糯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年掂墓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片看成。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡君编,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出川慌,到底是詐尸還是另有隱情吃嘿,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布梦重,位于F島的核電站兑燥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏琴拧。R本人自食惡果不足惜降瞳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚓胸。 院中可真熱鬧挣饥,春花似錦斗塘、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至茧吊,卻和暖如春贞岭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搓侄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工瞄桨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人讶踪。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓芯侥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親乳讥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柱查,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容