存储引擎之必知必会 -- 检查点机制
檢查點(diǎn)機(jī)制
圓滿事務(wù):日志中記錄了事務(wù)的開始和commit提交事務(wù),這說明日志已經(jīng)完整地記錄了事務(wù)的所有更新活動。??
??
中止事務(wù):日志中記錄了事務(wù)的開始記錄,但沒有日志的提交記錄,這說明日志記錄的事務(wù)沒有最后提交。
數(shù)據(jù)庫的故障及恢復(fù)機(jī)制都離不開日志文件。每次恢復(fù)過程都需要從頭到尾掃描日志文件以確定哪些事務(wù)是圓滿事務(wù),哪些事務(wù)是中止事務(wù),才能分別進(jìn)行Redo或Undo操作。
設(shè)想一下,如果日志文件的內(nèi)容很大,這樣的掃描和恢復(fù)操作將耗費(fèi)大量的資源。而且盡管一些圓滿事務(wù)的結(jié)果已經(jīng)寫入數(shù)據(jù)庫(不需要Redo),但從頭到尾的掃描仍然會Redo這些事務(wù),盡管這樣的操作并不會導(dǎo)致數(shù)據(jù)庫一致性的改變,但無謂的Redo操作仍然顯得多余。
有沒有盡量減少在恢復(fù)時必須前滾的修改量的機(jī)制呢?這就是檢查點(diǎn)機(jī)制。目前的主流數(shù)據(jù)庫產(chǎn)品都支持日志的檢查點(diǎn)機(jī)制。
??? SQL Server 系統(tǒng)按照設(shè)置在日志文件中設(shè)置一個一個的檢查點(diǎn)(checkpoint),這里的檢查點(diǎn)就好比是日志文件的一個一個驛站。檢查點(diǎn)從當(dāng)前數(shù)據(jù)庫的內(nèi)存的緩沖區(qū)中刷新臟數(shù)據(jù)和日志頁面,以盡量減少在恢復(fù)時必須重做(Redo)的修改量。
??? 1.檢查點(diǎn)的操作
??? SQL Server 生成檢查點(diǎn)的過程如下:
???
①將標(biāo)記檢查點(diǎn)起點(diǎn)的日志記錄寫入日志文件。 ? ?
②將為檢查點(diǎn)記錄的信息存儲在檢查點(diǎn)日志記錄鏈中,鏈起點(diǎn)的LSN將寫入數(shù)據(jù)庫根頁面中。 ? ?
③將最小恢復(fù)LSN(MinLSN)保存在檢查點(diǎn)記錄中。 ? ?
④在檢查點(diǎn)記錄中記錄所有的未完成的活動事務(wù)。 ? ?
⑤如果數(shù)據(jù)庫工作在【簡單恢復(fù)模式】,刪除新的MinLSN之前的所有日志記錄。 ? ?
⑥將所有修改后的日志寫入磁盤。 ? ?
⑦將所有修改后的數(shù)據(jù)寫入磁盤。 ? ?
⑧將標(biāo)記檢查點(diǎn)記錄末端的記錄寫入日志文件。
??? 2.檢查點(diǎn)與恢復(fù)效率的關(guān)系
在日志文件中設(shè)置了檢查點(diǎn)之后,為什么基于日志的恢復(fù)機(jī)制就可以提高效率了呢?如圖所示為檢查點(diǎn)發(fā)生時可能的事務(wù)的狀態(tài)。
① 事務(wù)1 ? ??
其start和commit日志記錄都發(fā)生在檢查點(diǎn)之前,這樣的事務(wù)其結(jié)果已經(jīng)反映到物理介質(zhì)上去了(因?yàn)闄z查點(diǎn)會保證WAL協(xié)議,確保數(shù)據(jù)被寫入),所以在恢復(fù)時無須對該事務(wù)做Redo操作。 ? ?
② 事務(wù)2 ? ??
其start日志記錄在檢查點(diǎn)之前發(fā)生,其commit記錄在故障點(diǎn)之前發(fā)生,說明日志中事務(wù)已經(jīng)完美提交,但數(shù)據(jù)不一定已經(jīng)寫入,所以屬于圓滿事務(wù),需要Redo操作。 ? ?
③ 事務(wù)3 ? ??
其start日志記錄在檢查點(diǎn)之后發(fā)生,其commit記錄在故障點(diǎn)之前發(fā)生,說明日志中事務(wù)已經(jīng)完美提交,但數(shù)據(jù)不一定已經(jīng)寫入,所以屬于圓滿事務(wù),需要Redo操作。 ? ?
④ 事務(wù)4 ? ??
其start日志記錄在檢查點(diǎn)之后發(fā)生,其commit記錄在故障點(diǎn)之前尚未發(fā)生,說明日志中事務(wù)為中止事務(wù),需要Undo操作。 ? ?
⑤ 事務(wù)5 ? ??
其start日志記錄在檢查點(diǎn)之前發(fā)生,其commit記錄在故障點(diǎn)之前尚未發(fā)生,說明日志中事務(wù)為中止事務(wù),需要Undo操作。
由于在檢查點(diǎn)完成之前的所有事務(wù)不需要再執(zhí)行Redo操作,所以可以大大提高數(shù)據(jù)庫系統(tǒng)恢復(fù)的效率。
3.MinLSN的選擇
MinLSN實(shí)際上代表了數(shù)據(jù)庫從檢查點(diǎn)恢復(fù)時,具體從哪個LSN號開始掃描并進(jìn)行恢復(fù)。所以MinLSN的選擇是檢查點(diǎn)時的LSN和最早的活動事務(wù)起點(diǎn)LSN兩者比較的最小值。
如圖,事務(wù)2為檢查點(diǎn)時的唯一活動事務(wù),其起點(diǎn)的LSN1小于檢查點(diǎn)發(fā)生時的LSN2,所以MinLSN取LSN1就可以。
本文轉(zhuǎn)自UltraSQL51CTO博客,原文鏈接:http://blog.51cto.com/ultrasql/1591632 ,如需轉(zhuǎn)載請自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的存储引擎之必知必会 -- 检查点机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android111 java中调用c代
- 下一篇: 如何制作证件照