千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > mysql group commit為什么要保證binlog和redo log提交的順序一致?

mysql group commit為什么要保證binlog和redo log提交的順序一致?

來(lái)源:千鋒教育
發(fā)布人:xqq
時(shí)間: 2023-10-13 08:25:24 1697156724

一、為什么要保證binlog和redo log提交的順序一致

MySQL為了保證master和slave的數(shù)據(jù)一致性,就必須保證binlog和InnoDB redo日志的一致性(因?yàn)閭鋷?kù)通過(guò)二進(jìn)制日志重放主庫(kù)提交的事務(wù),而主庫(kù)binlog寫入在commit之前,如果寫完binlog主庫(kù)crash,再次啟動(dòng)時(shí)會(huì)回滾事務(wù)。但此時(shí)從庫(kù)已經(jīng)執(zhí)行,則會(huì)造成主備數(shù)據(jù)不一致)。所以在開(kāi)啟Binlog后,如何保證binlog和InnoDB redo日志的一致性呢?為此,MySQL引入二階段提交(two phase commit or 2pc),MySQL內(nèi)部會(huì)自動(dòng)將普通事務(wù)當(dāng)做一個(gè)XA事務(wù)(內(nèi)部分布式事物)來(lái)處理:

– 自動(dòng)為每個(gè)事務(wù)分配一個(gè)少數(shù)的ID(XID)。

– COMMIT會(huì)被自動(dòng)的分成Prepare和Commit兩個(gè)階段。

– Binlog會(huì)被當(dāng)做事務(wù)協(xié)調(diào)者(Transaction Coordinator),Binlog Event會(huì)被當(dāng)做協(xié)調(diào)者日志。

Binlog在2PC中充當(dāng)了事務(wù)的協(xié)調(diào)者(Transaction Coordinator)。由Binlog來(lái)通知InnoDB引擎來(lái)執(zhí)行prepare,commit或者rollback的步驟。

事務(wù)的提交主要分為兩個(gè)主要步驟:

1. 準(zhǔn)備階段(Storage Engine(InnoDB) Transaction Prepare Phase)

此時(shí)SQL已經(jīng)成功執(zhí)行,并生成xid信息及redo和undo的內(nèi)存日志。然后調(diào)用prepare方法完成名列前茅階段,papare方法實(shí)際上什么也沒(méi)做,將事務(wù)狀態(tài)設(shè)為TRX_PREPARED,并將redo log刷磁盤。

2. 提交階段(Storage Engine(InnoDB)Commit Phase)

2.1 記錄協(xié)調(diào)者日志,即Binlog日志。

如果事務(wù)涉及的所有存儲(chǔ)引擎的prepare都執(zhí)行成功,則調(diào)用TC_LOG_BINLOG::log_xid方法將SQL語(yǔ)句寫到binlog(write()將binary log內(nèi)存日志數(shù)據(jù)寫入文件系統(tǒng)緩存,fsync()將binary log文件系統(tǒng)緩存日志數(shù)據(jù)永久寫入磁盤)。此時(shí),事務(wù)已經(jīng)鐵定要提交了。否則,調(diào)用ha_rollback_trans方法回滾事務(wù),而SQL語(yǔ)句實(shí)際上也不會(huì)寫到binlog。

2.2 告訴引擎做commit。

最后,調(diào)用引擎的commit完成事務(wù)的提交。會(huì)清除undo信息,刷redo日志,將事務(wù)設(shè)為TRX_NOT_STARTED狀態(tài)。

PS:記錄Binlog是在InnoDB引擎Prepare(即Redo Log寫入磁盤)之后,這點(diǎn)至關(guān)重要。

由上面的二階段提交流程可以看出,一旦步驟2中的操作完成,就確保了事務(wù)的提交,即使在執(zhí)行步驟3時(shí)數(shù)據(jù)庫(kù)發(fā)送了宕機(jī)。此外需要注意的是,每個(gè)步驟都需要進(jìn)行一次fsync操作才能保證上下兩層數(shù)據(jù)的一致性。步驟2的fsync參數(shù)由sync_binlog=1控制,步驟3的fsync由參數(shù)innodb_flush_log_at_trx_commit=1控制,俗稱“雙1”,是保證CrashSAFe的根本。

延伸閱讀:

二、關(guān)系型數(shù)據(jù)庫(kù)中的數(shù)據(jù)組織

關(guān)系型數(shù)據(jù)庫(kù)中,數(shù)據(jù)組織涉及到兩個(gè)最基本的結(jié)構(gòu):表與索引。表中存儲(chǔ)的是完整記錄,一般有兩種組織形式:堆表(所有的記錄無(wú)序存儲(chǔ)),或者是聚簇索引表(所有的記錄,按照記錄主鍵進(jìn)行排序存儲(chǔ))。索引中存儲(chǔ)的是完整記錄的一個(gè)子集,用于加速記錄的查詢速度,索引的組織形式,一般均為B+樹(shù)結(jié)構(gòu)。

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
app的啟動(dòng)流程都包括哪些步驟?

一、app的啟動(dòng)流程包括的步驟1、創(chuàng)建進(jìn)程App發(fā)起進(jìn)程:當(dāng)從桌面啟動(dòng)應(yīng)用,則發(fā)起進(jìn)程便是Launcher所在進(jìn)程;當(dāng)從某App內(nèi)啟動(dòng)遠(yuǎn)程進(jìn)程,則發(fā)送進(jìn)...詳情>>

2023-10-13 10:03:27
怎么理解Mongodb是介于關(guān)系型和非關(guān)系型的數(shù)據(jù)庫(kù)?

一、怎么理解Mongodb是介于關(guān)系型和非關(guān)系型的數(shù)據(jù)庫(kù)MongoDB被稱為介于關(guān)系型數(shù)據(jù)庫(kù)(RDBMS)和非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL)之間,這是因?yàn)樗谝韵?..詳情>>

2023-10-13 09:55:50
DBeaver怎么保持?jǐn)?shù)據(jù)庫(kù)連接?

一、DBeaver保持?jǐn)?shù)據(jù)庫(kù)連接的方法1、連接到數(shù)據(jù)庫(kù)打開(kāi)DBeaver并選擇連接到您的目標(biāo)數(shù)據(jù)庫(kù)。選擇適當(dāng)?shù)臄?shù)據(jù)庫(kù)類型,輸入必要的連接信息,如主機(jī)...詳情>>

2023-10-13 09:05:04
Kettle連接MySQL為什么會(huì)報(bào)錯(cuò)?

一、Kettle連接MySQL會(huì)報(bào)錯(cuò)的原因1、驅(qū)動(dòng)程序缺失Kettle需要使用MySQL的JDBC驅(qū)動(dòng)程序來(lái)連接MySQL數(shù)據(jù)庫(kù)。如果沒(méi)有正確配置或提供JDBC驅(qū)動(dòng)程序,...詳情>>

2023-10-13 08:53:41
wait()、sleep()、join()和yield()區(qū)別是什么?

一、wait()wait()方法是Object類中的方法,主要用于線程間的同步和協(xié)作。當(dāng)一個(gè)線程調(diào)用某個(gè)對(duì)象的wait()方法時(shí),它會(huì)釋放該對(duì)象的鎖,并進(jìn)入等...詳情>>

2023-10-13 08:45:29
快速通道
久久亚洲中文字幕精品一区四,亚洲日本另类欧美一区二区,久久久久久久这里只有免费费精品,高清国产激情视频在线观看
在线观看国产小视频网站 | 欧洲一区二区免费视频在线观看网站 | 亚洲日本97视频在线 | 中文字幕久久久久久久免费 | 在线播放国产不卡视频 | 欧美日韩一区日本道 |