數(shù)據(jù)庫(kù)數(shù)據(jù)更新:從內(nèi)存到磁盤,一步步揭開(kāi)數(shù)據(jù)的神秘面紗!

大家好,我是小米!今天我要和大家分享一下數(shù)據(jù)庫(kù)數(shù)據(jù)更新的流程。作為一名熱衷于技術(shù)分享的小伙伴,我希望通過(guò)本篇文章,幫助大家更好地理解數(shù)據(jù)庫(kù)數(shù)據(jù)更新的過(guò)程。廢話不多說(shuō),讓我們開(kāi)始吧!

獲取數(shù)據(jù)
在數(shù)據(jù)庫(kù)的數(shù)據(jù)更新過(guò)程中,首先,執(zhí)行器會(huì)從引擎中查找需要更新的數(shù)據(jù)。如果這些數(shù)據(jù)在內(nèi)存中已經(jīng)存在,那么執(zhí)行器會(huì)直接返回它們。這是因?yàn)閮?nèi)存的讀取速度非???,可以快速響應(yīng)查詢請(qǐng)求,提高數(shù)據(jù)訪問(wèn)效率。但是,如果數(shù)據(jù)不在內(nèi)存中,執(zhí)行器就需要進(jìn)行查詢操作,從磁盤或其他存儲(chǔ)介質(zhì)中讀取數(shù)據(jù),然后將查詢結(jié)果返回給執(zhí)行器。
更改數(shù)據(jù)寫入新數(shù)據(jù)
在拿到數(shù)據(jù)后,執(zhí)行器會(huì)先對(duì)數(shù)據(jù)進(jìn)行修改。例如,可以更新數(shù)據(jù)的某個(gè)字段、添加新的記錄或者刪除現(xiàn)有的記錄。修改完成后,執(zhí)行器會(huì)調(diào)用引擎接口,將修改后的數(shù)據(jù)重新寫入數(shù)據(jù)庫(kù)中。引擎接口會(huì)負(fù)責(zé)將數(shù)據(jù)寫入對(duì)應(yīng)的存儲(chǔ)介質(zhì),如磁盤或者固態(tài)硬盤,以保證數(shù)據(jù)的持久性。
prepare階段
當(dāng)執(zhí)行器調(diào)用引擎接口后,引擎會(huì)將數(shù)據(jù)更新到內(nèi)存中,以提供更快的數(shù)據(jù)訪問(wèn)速度。同時(shí),引擎還會(huì)將數(shù)據(jù)寫入 redo log(重做日志)中。redo log 記錄了數(shù)據(jù)庫(kù)發(fā)生的每個(gè)修改操作,包括插入、更新和刪除等,它起到了數(shù)據(jù)恢復(fù)的關(guān)鍵作用。在這個(gè)階段,數(shù)據(jù)處于 prepare(準(zhǔn)備)階段,引擎會(huì)通知執(zhí)行器操作已完成,可以隨時(shí)對(duì)數(shù)據(jù)進(jìn)行操作。
生成binlog
在數(shù)據(jù)更新過(guò)程中,執(zhí)行器會(huì)生成 binlog(二進(jìn)制日志)。binlog 記錄了數(shù)據(jù)庫(kù)的邏輯操作,如增刪改等,它可以用于數(shù)據(jù)恢復(fù)、主從復(fù)制以及故障恢復(fù)等場(chǎng)景。執(zhí)行器生成 binlog 的目的是為了保留數(shù)據(jù)修改的歷史記錄,以便后續(xù)需要進(jìn)行數(shù)據(jù)恢復(fù)或者復(fù)制操作時(shí)使用。
commit階段
當(dāng)所有操作都執(zhí)行完畢后,執(zhí)行器會(huì)調(diào)用引擎的事務(wù)提交接口。引擎接收到提交請(qǐng)求后,將之前寫入 redo log 的數(shù)據(jù)狀態(tài)從 prepare 改成 commit,表示數(shù)據(jù)更新已完成。這個(gè)過(guò)程保證了數(shù)據(jù)的一致性和持久性,確保了事務(wù)的原子性。
二階段提交
二階段提交是一種保證分布式事務(wù)的一致性的協(xié)議。在分布式環(huán)境中,事務(wù)涉及多個(gè)節(jié)點(diǎn),為了保證所有節(jié)點(diǎn)的數(shù)據(jù)操作能夠一致地提交或者回滾,需要引入二階段提交。它分為兩個(gè)階段:準(zhǔn)備階段和提交階段。
在準(zhǔn)備階段,各個(gè)參與者節(jié)點(diǎn)準(zhǔn)備好提交的數(shù)據(jù),并向協(xié)調(diào)者節(jié)點(diǎn)發(fā)送準(zhǔn)備就緒的消息。
在提交階段,協(xié)調(diào)者節(jié)點(diǎn)向各個(gè)參與者節(jié)點(diǎn)發(fā)送提交請(qǐng)求,并等待參與者節(jié)點(diǎn)的響應(yīng)。只有當(dāng)所有參與者節(jié)點(diǎn)都準(zhǔn)備就緒并響應(yīng)提交請(qǐng)求時(shí),協(xié)調(diào)者節(jié)點(diǎn)才會(huì)發(fā)出最終的提交指令。
redo log 的二階段提交
在數(shù)據(jù)庫(kù)數(shù)據(jù)更新過(guò)程中,redo log 也遵循二階段提交的原則。
為了保證數(shù)據(jù)的一致性和持久性,redo log 的寫入操作先于 binlog。這樣做的好處是,即使系統(tǒng)在寫入 binlog 時(shí)出現(xiàn)異常,通過(guò) redo log 的回滾操作,可以將數(shù)據(jù)庫(kù)恢復(fù)到更新前的狀態(tài),避免數(shù)據(jù)丟失或損壞。redo log 的先寫操作可以提供更高的事務(wù)安全性。
與上述情況相反,有時(shí)也會(huì)先寫入 binlog,再寫入 redo log。這種方式可以在數(shù)據(jù)恢復(fù)和備份過(guò)程中提供更多的靈活性和選擇性,但需要特別小心,確保在寫入 binlog 后能夠正確地將數(shù)據(jù)同步到 redo log,以保持?jǐn)?shù)據(jù)的一致性。
總結(jié)
通過(guò)今天的分享,我們對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)更新的流程有了更深入的了解。這個(gè)過(guò)程中涉及到執(zhí)行器、引擎、redo log、binlog 等多個(gè)環(huán)節(jié),每個(gè)環(huán)節(jié)都承擔(dān)著重要的責(zé)任,保證數(shù)據(jù)的正確性和一致性。希望這篇文章對(duì)你有所幫助,如果有任何問(wèn)題或者想法,歡迎在下方留言與我討論。
END
如有疑問(wèn)或者更多的技術(shù)分享,歡迎關(guān)注我的微信公眾號(hào)“知其然亦知其所以然”!
