溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

MySQL數(shù)據(jù)持久化過(guò)程實(shí)例分析

發(fā)布時(shí)間:2022-08-01 11:15:14 來(lái)源:億速云 閱讀:108 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“MySQL數(shù)據(jù)持久化過(guò)程實(shí)例分析”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“MySQL數(shù)據(jù)持久化過(guò)程實(shí)例分析”文章能幫助大家解決問(wèn)題。

1. 過(guò)程簡(jiǎn)述

理解MySQL數(shù)據(jù)的持久化過(guò)程,能很好的幫助我們加深對(duì)于MySQL底層的理解,在本文,我們以一種通俗的方式梳理一下這個(gè)過(guò)程,幫助大家建立起初步的認(rèn)識(shí),如果大家感興趣,可以去深入學(xué)習(xí)與研究這個(gè)過(guò)程。

MySQL數(shù)據(jù)的存儲(chǔ)總體上可以分為兩部分,內(nèi)存中的存儲(chǔ)過(guò)程以及硬盤(pán)的持久化存儲(chǔ),這里,就涉及到了內(nèi)存中buffer pollredo log以及磁盤(pán)上的事務(wù)日志表結(jié)構(gòu),在本文中,我們不具體解釋每一部分的具體設(shè)計(jì),只是給大家一個(gè)概念型的認(rèn)識(shí):

  • buffer poll 是InnoDB引擎緩存池的一部分,我們這里可以簡(jiǎn)單理解為數(shù)據(jù)庫(kù)從磁盤(pán)讀進(jìn)內(nèi)存的內(nèi)存塊的緩存;

  • redo log是內(nèi)存中的邏輯日志,記錄了事務(wù)的變更操作

  • 事務(wù)日志是磁盤(pán)上的食物邏輯日志

  • 表結(jié)構(gòu)是真正存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu)

MySQL數(shù)據(jù)持久化過(guò)程實(shí)例分析

2. 內(nèi)存中的操作

buffer poll中有對(duì)于讀入內(nèi)存的數(shù)據(jù)的緩存,在查詢(xún)命令執(zhí)行時(shí),會(huì)優(yōu)先在緩存中查看是否命中,未命中就會(huì)從磁盤(pán)中將需要的數(shù)據(jù)讀進(jìn)來(lái),緩存的管理使用的是改良的LRU算法,這里不做深入地介紹了。

當(dāng)一條修改指令運(yùn)行的時(shí)候,首先進(jìn)行的是對(duì)于buffer poll中緩存的修改,被修改后的數(shù)據(jù)會(huì)被標(biāo)記為臟頁(yè),同時(shí),修改的操作也會(huì)記錄在redo log中,我們常說(shuō)的MVCC中的版本鏈就是借助redo log實(shí)現(xiàn)的。

需要注意的是,臟頁(yè)不是立刻落到磁盤(pán)的,而是有可以設(shè)置的刷盤(pán)控制機(jī)制,例如,一個(gè)事務(wù)執(zhí)行結(jié)算后立刻落盤(pán),按照一定時(shí)間定期落盤(pán)等等。

在內(nèi)存中的操作都是非持久化的,如果這時(shí)發(fā)生了意料之外的問(wèn)題導(dǎo)致系統(tǒng)宕機(jī),數(shù)據(jù)是還沒(méi)有持久化的,所以理論上也不會(huì)對(duì)數(shù)據(jù)庫(kù)造成破壞性的影響。

3. 磁盤(pán)的持久化

3.1 事務(wù)日志的作用

InnoDB在磁盤(pán)的持久化分為兩步,第一步是邏輯日志的存儲(chǔ),之后再將日志中的數(shù)據(jù)刷進(jìn)磁盤(pán)空間。

在討論為什么要使用邏輯日志之前,我們需要簡(jiǎn)單理解隨機(jī)IO順序IO區(qū)別:

在讀取磁盤(pán)數(shù)據(jù)的時(shí)候,有一個(gè)尋址的過(guò)程,即將探針移動(dòng)到需要的位置,這個(gè)過(guò)程是磁盤(pán)IO的重要瓶頸之一。

順序IO是指尋址的空間是連續(xù)的,移動(dòng)距離很短,隨機(jī)IO是指我們需要尋找的地址分布在各處,需要移動(dòng)很長(zhǎng)的距離。

所以,我們能很明晰的得出結(jié)論:將隨機(jī)IO替換為順序IO能有效的提高磁盤(pán)IO的效率,邏輯日志的作用正是如此,由于日志文件在磁盤(pán)上是連續(xù)的,相比于分布在各處的數(shù)據(jù)表信息,IO效率能高出很多。

只要我們?cè)谑聞?wù)日志中完整更新了操作,那么這個(gè)事務(wù)就已經(jīng)持久化成功了,后續(xù)會(huì)有專(zhuān)門(mén)負(fù)責(zé)的線(xiàn)程將日志信息存儲(chǔ)到表結(jié)構(gòu)中。

3.2 表結(jié)構(gòu)的兩步存儲(chǔ)

日志信息存儲(chǔ)到表結(jié)構(gòu)的過(guò)程是分為兩步進(jìn)行的,首先,會(huì)在表頭的緩存區(qū)域內(nèi)進(jìn)行數(shù)據(jù)更新,更新完成后,才會(huì)在對(duì)應(yīng)的表結(jié)構(gòu)中刷新。

兩步存儲(chǔ)的目的是保證數(shù)據(jù)存儲(chǔ)的強(qiáng)一致性,防止在刷入磁盤(pán)的過(guò)程中,數(shù)據(jù)庫(kù)宕機(jī)導(dǎo)致數(shù)據(jù)不完整。

表頭的緩存區(qū)域以及表結(jié)構(gòu)的存儲(chǔ)塊都有校驗(yàn)碼來(lái)檢驗(yàn)數(shù)據(jù)的完整性,如果前者完整,后者不完整,直接講前者數(shù)據(jù)在后者中重新刷一份即可解決,如果前者不完整,說(shuō)明從日志刷取的過(guò)程失敗,重新刷取即可。

關(guān)于“MySQL數(shù)據(jù)持久化過(guò)程實(shí)例分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI