上一篇《刷盤(pán),還是不刷盤(pán),是一個(gè)問(wèn)題》中我們遇到了哪些問(wèn)題?
(1) 已提交事務(wù)+未提交事務(wù)的ACID特性怎么保證?
畫(huà)外音:上一篇中遇到的問(wèn)題,主要是原子性與持久性。
(2) 數(shù)據(jù)庫(kù)崩潰,怎么實(shí)施故障恢復(fù)?
(3) 每次都刷盤(pán)隨機(jī)寫(xiě),性能低,怎么提高數(shù)據(jù)庫(kù)性能?
畫(huà)外音:正常情況下,不需要每個(gè)事務(wù)提交,都進(jìn)行刷盤(pán)。
要提升隨機(jī)寫(xiě)性能,最容易想到的,就是利用高性能的順序?qū)懭罩荆涗浭聞?wù)中的一些信息,來(lái)實(shí)現(xiàn)已提交事務(wù)的數(shù)據(jù)“要刷盤(pán)”,未提交事務(wù)的數(shù)據(jù)“不刷盤(pán)”,以及實(shí)現(xiàn)故障恢復(fù)。
事務(wù)中,對(duì)數(shù)據(jù)庫(kù)的寫(xiě)操作。
每條日志記錄會(huì)有一個(gè)遞增的日志序列號(hào)(log sequence number,LSN),唯一標(biāo)識(shí)一條日志記錄。
還有一種特殊的日志記錄,叫檢查點(diǎn)(checkpoint)。
檢查點(diǎn)記錄了某一個(gè)時(shí)刻,緩沖池(buffer pool)中所有數(shù)據(jù)頁(yè)(page)的狀態(tài)信息。
有了檢查點(diǎn)和順序?qū)懭罩荆覀兙涂梢酝ㄟ^(guò):
來(lái)解決,上面提到的三大難題。
這,就是我們今天要聊的核心技術(shù),預(yù)寫(xiě)日志(write-ahead logging,WAL)。
預(yù)寫(xiě)日志不僅僅是一種日志,更像是一種模式,一種協(xié)議,它要求在進(jìn)行數(shù)據(jù)寫(xiě)入操作時(shí),必須先寫(xiě)入操作日志。
如同數(shù)據(jù)的內(nèi)存-磁盤(pán)兩層結(jié)構(gòu)一樣,為了提升性能,預(yù)寫(xiě)日志也分為內(nèi)存-磁盤(pán)兩層結(jié)構(gòu):
還是之前那個(gè)事務(wù)T1:
開(kāi)始事務(wù)
預(yù)寫(xiě)日志首先會(huì)記錄,T1事務(wù)開(kāi)始:
LSN=0:<T1, BEGIN>
讀取A的值是一個(gè)讀操作,不需要進(jìn)行記錄。
修改記錄A的值是一個(gè)寫(xiě)操作,需要進(jìn)行記錄,而且要記錄修改前的值,與修改后的值,類似于:
LSN=1:<T1, A, 1, 2>
以方便未來(lái)進(jìn)行redo與undo(如上圖中的屎黃色1)。
接下來(lái),事務(wù)會(huì)對(duì)緩沖池中的數(shù)據(jù)進(jìn)行修改(如上圖中的屎黃色2)。
到目前為止,預(yù)寫(xiě)日志都還是寫(xiě)在buffer中,并沒(méi)有刷到磁盤(pán)上。
首先,T1事務(wù)提交,也會(huì)記錄到buffer中:
LSN=2:<T1, COMMIT>
但這樣,還遠(yuǎn)遠(yuǎn)不夠。
預(yù)寫(xiě)日志,必須全部從buffer里刷到磁盤(pán)上,也就是日志文件中,事務(wù)才能標(biāo)記上“已提交”,并返回給應(yīng)用程序。
沒(méi)錯(cuò),只要預(yù)寫(xiě)日志從buffer刷到磁盤(pán),而不需要數(shù)據(jù)從buffer刷到磁盤(pán),就能返回應(yīng)用程序,事務(wù)提交成功。
至于數(shù)據(jù)什么時(shí)候從buffer刷回磁盤(pán),這取決于緩沖池刷盤(pán)策略,例如:隔一段時(shí)間異步刷盤(pán)(如上圖中的屎黃色便簽)。
這,就是預(yù)寫(xiě)日志的核心思路。
(1) 日志序列號(hào)(log sequence number,LSN),唯一標(biāo)識(shí)一條日志記錄,遞增;
(2) 檢查點(diǎn)(checkpoint),記錄了某一個(gè)時(shí)刻,緩沖池(buffer pool)中所有數(shù)據(jù)頁(yè)(page)的狀態(tài)信息。
(3) 預(yù)寫(xiě)日志記錄什么核心信息?
(4) 數(shù)據(jù)庫(kù)何時(shí)能向應(yīng)用程序返回“事務(wù)成功”?
預(yù)寫(xiě)日志刷盤(pán)成功之后。
(5) 上一篇《刷盤(pán),還是不刷盤(pán),是一個(gè)問(wèn)題》結(jié)尾的問(wèn)題:在數(shù)據(jù)庫(kù)返回應(yīng)用程序事務(wù)成功之前,要不要將數(shù)據(jù)刷回磁盤(pán)?
只要有預(yù)寫(xiě)日志機(jī)制,只需要預(yù)寫(xiě)日志刷盤(pán),不需要數(shù)據(jù)刷盤(pán)。
新的場(chǎng)景出現(xiàn)了:如果數(shù)據(jù)庫(kù)崩了,怎么利用檢查點(diǎn)(checkpoint)以及預(yù)寫(xiě)日志,來(lái)進(jìn)行刷盤(pán)和數(shù)據(jù)恢復(fù)呢?讓你來(lái)設(shè)計(jì),你會(huì)怎么做?
本文鏈接:http://www.www897cc.com/showinfo-26-98559-0.html一分鐘了解,預(yù)寫(xiě)日志 WAL 的核心思路...
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com