自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

被面試官問(wèn)住了,MySQL兩階段提交是什么鬼?

數(shù)據(jù)庫(kù) MySQL
MySQL中既存在redo log,又存在bin log,這是因?yàn)锽in Log是MySQL Server提供的一種歸檔日志,其本身并不具備Crash-Safe能力。而Redo Log本身不具備歸檔能力,他是一種循環(huán)寫(xiě)的日志。

前言

MySQL通過(guò)兩階段提交的機(jī)制,保證了redo log和bin log的邏輯一致性,進(jìn)而保證了數(shù)據(jù)的不丟失以及主從庫(kù)的數(shù)據(jù)一致。

而說(shuō)起兩階段提交,就不得不先介紹一下redo log和bin log。

redo log

redo log即重做日志,是InnoDB引擎特有的一種日志(有的面試官經(jīng)常問(wèn)到這一點(diǎn))。

redo log主要做什么呢?

以更新數(shù)據(jù)為例,我們知道,MySQL的數(shù)據(jù)是存儲(chǔ)在磁盤(pán)上的,如果每一次更新數(shù)據(jù),都去磁盤(pán)尋址找到要更新的數(shù)據(jù),進(jìn)行更新操作的話,這個(gè)IO成本是非常高的。

如果是固態(tài)硬盤(pán)還好,如果是機(jī)械硬盤(pán),那么MySQL的更新性能根本無(wú)法滿足我們的業(yè)務(wù)需要。

所以,MySQL采用了一種叫做WAL的技術(shù),Write-Ahead Logging。

當(dāng)更新數(shù)據(jù)時(shí),將更新操作(即某個(gè)數(shù)據(jù)頁(yè)上做了什么修改)先寫(xiě)到redo log里面,然后更新內(nèi)存,這個(gè)更新操作就算完成了。MySQL會(huì)在服務(wù)器空閑的時(shí)候,把redo log的操作記錄刷新到磁盤(pán)里,以保持?jǐn)?shù)據(jù)的一致性。

需要注意的是,redo log雖然也是磁盤(pán)上的一個(gè)文件,但是由于操作是順序?qū)?,所以性能是非常高的?/p>

當(dāng)然了,redo log也是有大小上限的,不可能無(wú)限制的寫(xiě)入。

以上圖為例,配置了4個(gè)redo log,write pos就是代表當(dāng)前記錄寫(xiě)到什么位置了,而check point表示一個(gè)推進(jìn)點(diǎn),它會(huì)不斷的前移,做擦除數(shù)據(jù)的操作,以保證redo log可以不斷的寫(xiě)入。

當(dāng)然,擦除數(shù)據(jù)之前,會(huì)把redo log的記錄刷新到磁盤(pán)。

通過(guò)redo log,可以保證即使MySQL發(fā)生異常重啟,數(shù)據(jù)也不會(huì)丟失(因?yàn)閞edo log是物理日志,可以進(jìn)行重放),這個(gè)特性就叫做crash-safe。

bin log

bin log是MySQL Server提供的一種日志,叫做歸檔日志,所有引擎都可以使用bin log。

那bin log和redo log的區(qū)別是什么呢?

1,這兩種日志的提供者不同:bin log是由MySQL Server提供的,redo log是InnoDB引擎特有的。

2,redo log主要記錄的是某個(gè)數(shù)據(jù)頁(yè)做了什么修改,bin log記錄的是語(yǔ)句的原始邏輯,比如更新了某一行的某個(gè)字段。

3,redo log是循環(huán)寫(xiě)的,數(shù)據(jù)會(huì)被覆蓋。bin log是追加寫(xiě),一個(gè)文件寫(xiě)滿,就寫(xiě)下一個(gè)文件。

兩階段提交

介紹完了redo log和bin log,我們?cè)倏匆幌滤麄儍烧呤侨绾闻浜贤瓿蓛呻A段提交的。

上圖就是一個(gè)更新數(shù)據(jù)的流程,可以看到,在更新一條數(shù)據(jù)之前,MySQL會(huì)先將數(shù)據(jù)加載到內(nèi)存,然后更新內(nèi)存,開(kāi)始寫(xiě)redo log。

此時(shí),redo log處于prepare狀態(tài),等到bin log寫(xiě)完之后,再提交事務(wù),這一條記錄的更新操作就算完成了。

redo log prepare -> 寫(xiě)bin log -> redo log commit,這個(gè)流程就叫做兩階段提交。

下面我們分析一下,采用兩階段提交的好處。

情景一,redo log處于prepare狀態(tài)時(shí),如果寫(xiě)bin log失敗了,那么更新失敗,此時(shí)redo log沒(méi)有commit,bin log也沒(méi)有記錄,兩者的狀態(tài)是一致的,沒(méi)有問(wèn)題。

情景二,redo log處于prepare狀態(tài)時(shí),寫(xiě)bin log成功,但是宕機(jī)導(dǎo)致commit失敗了。此時(shí)bin log產(chǎn)生了記錄,redo log沒(méi)有寫(xiě)入成功,數(shù)據(jù)暫時(shí)不一致。

但是不用擔(dān)心,當(dāng)MySQL重啟時(shí),會(huì)檢查redo log中處于prepare狀態(tài)的記錄。在redo log中,記錄了一個(gè)叫做XID的字段,這個(gè)字段在bin log中也有記錄,MySQL會(huì)通過(guò)這個(gè)XID,如果在bin log中找到了,那么就commit這個(gè)redo log,如果沒(méi)有找到,說(shuō)明bin log其實(shí)沒(méi)有寫(xiě)成功,就放棄提交。

通過(guò)這樣的機(jī)制,保證了redo log和bin log的一致性。

總結(jié)

之所以MySQL中既存在redo log,又存在bin log,這是因?yàn)閎in log是MySQL Server提供的一種歸檔日志,其本身并不具備crash-safe能力。而redo log本身不具備歸檔能力,他是一種循環(huán)寫(xiě)的日志。

MySQL通過(guò)將這兩種日志整合起來(lái),并通過(guò)兩階段提交的機(jī)制,保證了數(shù)據(jù)的一致性。

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2023-12-05 09:33:08

分布式事務(wù)

2022-03-28 10:44:51

MySQL日志存儲(chǔ)

2024-12-06 07:10:00

2024-05-21 14:12:07

2020-06-22 07:47:46

提交面試官訂單

2020-08-03 07:04:54

測(cè)試面試官應(yīng)用程序

2023-11-22 09:30:50

e簽寶面試企業(yè)面經(jīng)

2023-07-26 09:24:03

分布式事務(wù)分布式系統(tǒng)

2020-05-12 11:05:54

MySQL索引數(shù)據(jù)庫(kù)

2017-08-30 18:15:54

MySql

2025-03-05 00:01:00

ReduxReact

2018-10-29 08:44:29

分布式兩階段提交事務(wù)

2023-11-29 07:47:58

DDIA兩階段提交

2019-10-21 09:56:37

MySQLCOUNTInnoDB

2021-06-03 08:55:54

分布式事務(wù)ACID

2024-02-20 08:13:35

類(lèi)加載引用Class

2022-12-21 19:04:35

InnoDBMySQL

2021-03-17 08:39:24

作用域作用域鏈JavaScript

2021-03-16 22:25:06

作用域鏈作用域JavaScript

2024-04-19 08:23:06

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)