MySQL?數(shù)據(jù)持久化過程講解
1. 過程簡述
理解MySQL數(shù)據(jù)的持久化過程,能很好的幫助我們加深對于MySQL底層的理解,在本文,我們以一種通俗的方式梳理一下這個(gè)過程,幫助大家建立起初步的認(rèn)識,如果大家感興趣,可以去深入學(xué)習(xí)與研究這個(gè)過程。
MySQL數(shù)據(jù)的存儲(chǔ)總體上可以分為兩部分,內(nèi)存中的存儲(chǔ)過程以及硬盤的持久化存儲(chǔ),這里,就涉及到了內(nèi)存中buffer poll
和redo log
以及磁盤上的事務(wù)日志
和表結(jié)構(gòu)
,在本文中,我們不具體解釋每一部分的具體設(shè)計(jì),只是給大家一個(gè)概念型的認(rèn)識:
buffer poll
是InnoDB引擎緩存池的一部分,我們這里可以簡單理解為數(shù)據(jù)庫從磁盤讀進(jìn)內(nèi)存的內(nèi)存塊的緩存;redo log
是內(nèi)存中的邏輯日志,記錄了事務(wù)的變更操作事務(wù)日志
是磁盤上的食物邏輯日志表結(jié)構(gòu)
是真正存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu)
2. 內(nèi)存中的操作
buffer poll
中有對于讀入內(nèi)存的數(shù)據(jù)的緩存,在查詢命令執(zhí)行時(shí),會(huì)優(yōu)先在緩存中查看是否命中,未命中就會(huì)從磁盤中將需要的數(shù)據(jù)讀進(jìn)來,緩存的管理使用的是改良的LRU算法,這里不做深入地介紹了。
當(dāng)一條修改指令運(yùn)行的時(shí)候,首先進(jìn)行的是對于buffer poll
中緩存的修改,被修改后的數(shù)據(jù)會(huì)被標(biāo)記為臟頁
,同時(shí),修改的操作也會(huì)記錄在redo log
中,我們常說的MVCC中的版本鏈就是借助redo log
實(shí)現(xiàn)的。
需要注意的是,臟頁不是立刻落到磁盤的,而是有可以設(shè)置的刷盤控制機(jī)制,例如,一個(gè)事務(wù)執(zhí)行結(jié)算后立刻落盤,按照一定時(shí)間定期落盤等等。
在內(nèi)存中的操作都是非持久化的,如果這時(shí)發(fā)生了意料之外的問題導(dǎo)致系統(tǒng)宕機(jī),數(shù)據(jù)是還沒有持久化的,所以理論上也不會(huì)對數(shù)據(jù)庫造成破壞性的影響。
3. 磁盤的持久化
3.1 事務(wù)日志的作用
InnoDB在磁盤的持久化分為兩步,第一步是邏輯日志的存儲(chǔ),之后再將日志中的數(shù)據(jù)刷進(jìn)磁盤空間。
在討論為什么要使用邏輯日志之前,我們需要簡單理解隨機(jī)IO
與順序IO
的區(qū)別:
在讀取磁盤數(shù)據(jù)的時(shí)候,有一個(gè)尋址的過程,即將探針移動(dòng)到需要的位置,這個(gè)過程是磁盤IO的重要瓶頸之一。
順序IO
是指尋址的空間是連續(xù)的,移動(dòng)距離很短,隨機(jī)IO
是指我們需要尋找的地址分布在各處,需要移動(dòng)很長的距離。
所以,我們能很明晰的得出結(jié)論:將隨機(jī)IO
替換為順序IO
能有效的提高磁盤IO的效率,邏輯日志的作用正是如此,由于日志文件在磁盤上是連續(xù)的,相比于分布在各處的數(shù)據(jù)表信息,IO效率能高出很多。
只要我們在事務(wù)日志中完整更新了操作,那么這個(gè)事務(wù)就已經(jīng)持久化成功了,后續(xù)會(huì)有專門負(fù)責(zé)的線程將日志信息存儲(chǔ)到表結(jié)構(gòu)中。
3.2 表結(jié)構(gòu)的兩步存儲(chǔ)
日志信息存儲(chǔ)到表結(jié)構(gòu)的過程是分為兩步進(jìn)行的,首先,會(huì)在表頭的緩存區(qū)域內(nèi)進(jìn)行數(shù)據(jù)更新,更新完成后,才會(huì)在對應(yīng)的表結(jié)構(gòu)中刷新。
兩步存儲(chǔ)的目的是保證數(shù)據(jù)存儲(chǔ)的強(qiáng)一致性,防止在刷入磁盤的過程中,數(shù)據(jù)庫宕機(jī)導(dǎo)致數(shù)據(jù)不完整。
表頭的緩存區(qū)域以及表結(jié)構(gòu)的存儲(chǔ)塊都有校驗(yàn)碼來檢驗(yàn)數(shù)據(jù)的完整性,如果前者完整,后者不完整,直接講前者數(shù)據(jù)在后者中重新刷一份即可解決,如果前者不完整,說明從日志刷取的過程失敗,重新刷取即可。
到此這篇關(guān)于MySQL 數(shù)據(jù)持久化過程講解的文章就介紹到這了,更多相關(guān)MySQL 數(shù)據(jù)持久化 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
手把手教你使用Navicat查詢表的詳細(xì)結(jié)構(gòu)
在使用Navicat時(shí),我們可以通過執(zhí)行一些SQL語句來查看表結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于如何使用Navicat查詢表的詳細(xì)結(jié)構(gòu),文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05php mysql連接數(shù)據(jù)庫實(shí)例
這篇文章主要介紹了php mysql連接數(shù)據(jù)庫實(shí)例,需要的朋友可以參考下2016-09-09mysql存儲(chǔ)過程多層游標(biāo)循環(huán)嵌套的寫法分享
這篇文章主要介紹了mysql存儲(chǔ)過程多層游標(biāo)循環(huán)嵌套的寫法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07