数据库事务的实现-故障恢复(二)(undo日志检查点)_MySQL
bitsCN.com
在上一篇文章数据库事务的实现(一) 故障恢复 (undo日志)中,我们介绍了undolog在数据恢复中的应用,这一篇文章仍会继续介绍undolog,但会深入介绍使用undolog进行数据恢复。
上一章的结尾我们留下了一个问题,就是在上一章所介绍的模型中,恢复管理器必须要通过全篇扫描整个undolog进行日志恢复,这样做显然是没有太大必要的,因为系统中断肯定是在最后几个事务受到影响,前面的事务应该已经完成commit或者rollback了,不会出现abort的情况,那我们如何知道哪些事务受到了影响呢,如果我们知道了哪一些事务受到了影响,那我们就可以不用全篇进行扫描,而仅仅扫描很小的一部分就可以了。下面就介绍下,数据库如何知道哪些事务受到了影响,数据库为了得到这个目的,引入了检查点(checkpoint)这个概念。
checkpoint 检查点
checkpoint,即检查点。在undolog中写入检查点,表示在checkpoint前的事务都已经完成commit或者rollback了,也就是检查点前面的事务已经不存在数据一致性的问题了。那这个checkpoint如何去实现呢。其实实现的机制很简单,就是周期性的往undolog里面写入。当然这个写入肯定不是随随便便的往里写,在往里写的时候,肯定要检查前面的事务是否完成。
这个时候就会带来一个问题,因为数据库是一直在运行的,也就是事务是在不断启动的,同时可能有n个事务已经处于开始状态。而在检查点往里写的时候,可能又有新的事务启动了,如果让检查点一直等到没有新的事务启动而且前面所有的事务又都提交过了估计很难,那基本检查点就不用往里写了。所以,在这种情况下,只能是在检查点往里写的时候,停止接受新事务,等待已启动的事务提交完毕,然后检查点写入完毕。然后继续接受新事务。类似于这样: 例如,现在有T1 T2两个事务,则undolog中写入:
undolog |
---|
start T1 |
start T2 |
这时到了检查点的周期,要往里写入检查点了,就得等到T1,T2全部提交完毕,然后写入检查点chkpoint。也就是如果现在有一个T3要开启,是无法开启的。系统处于夯住状态。写入完后,开启T3,日志记录如下:
undolog |
---|
start T1 |
start T2 |
end T1 |
end T2 |
chkpoint |
start T3 |
这时候,如果系统挂掉了,故障恢复管理器会从undolog的尾部向前进行扫描,扫描到checkpoint后,就不会往前扫描了,因为前面的事务都已经提交过了,不存在数据一致性问题。所以只需要从checkpoint开始重做即可。
这样固然是好,省掉了需要undolog从头开始扫描的麻烦,但是这样做的缺点也很明显,那就是在写入checkpoint的过程中,系统是出于夯住状态的,所有的写入都要暂停。那能否有一种更好的方法既可以写入checkpoint又不需要系统暂停呢,必须的,当然有,这就是下面要讲的非静态检查点。
非静态检查点
非静态检查点是相对于静态检查点而来的,上文中所提到的就属于静态检查点,因为在检查点写入的同时,系统是不能写入的。而非静态检查点的引入,就是要解决这个问题。
非静态检查点的策略是在写入chkpoint的同时,会记录下当前活跃的事务。比如,当前状态下,T1和T2都是活跃状态,那么undolog中会被写入start checkpoint(T1,T2),这时整体系统仍然是正常写入的,也就是说在这条log写入后,仍然可以继续开启其他事务。当T1,T2完成后,会写入end checkpoint的记录。例如如下记录:
undolog |
---|
start T1 |
start T2 |
start checkpoint(T1,T2) |
start T3 |
end T1 |
end T2 |
end chkpoint |
start checkpoint(T3) |
end T3 |
end chkpoint |
上面这个日志记录就是,在T1,T2开始后,undolog中写入了start checkpoint(T1,T2)的检查点,而这时仍然是可以接受其他事务的开始的,这时有了T3事务的开启。
通过这种机制,可以有效避免在检查点写入时需要停掉服务的弊端,但现在问题又来了,这样写检查点固然是好,但恢复管理器如何通过这样的undolog去进行数据恢复操作呢?因为,如果检查点是静止的,那找到checkpoint后,就不必再往前找了,而现在不一样了,因为找到end checkpoint后,前面仍可能有未完成的事务,那这时数据恢复是如何恢复的呢?
在这种情况下,数据库宕机后,恢复管理器仍然会从尾往前进行扫描undolog,如果遇到了“end chkpoint”,这时并不代表checkpoint前所有的事务都已经提交了,但我们可以知道,所有未提交的事务都是在上一个start checkpoint之后,所以会继续往前找,一直找到start checkpoint,找到start checkpoint后,比如是start checkpoint(T1,T2),因为先前已经找到了end chkpoint,所以T1,T2这两个事务已经可以保证数据一致性了,需要重做的就是在start checpoint(T1,T2)到end chkpoint间的这一些非T1,T2事务,这些是需要重做的,所以要把这些进行重做。
还有另外一种情况,就是恢复管理器在扫描时,先遇到了start checkpoint(T1,T2)的日志,在这种情况下,我们首先知道了T1,T2或许是未完成的事务,那这时需要在start checkpoint之后找到是否有某个事务的end语句,如果有,说明这个事务是完成了,如果没有,就说明没有完成,那就要从check point再往后寻找,找到这个事务的start,然后从start之后往后重做。说得比较罗嗦,我们上个例子来说明下这种情况。
例如,数据库宕机后,开始扫描undolog,得到以下片段:
undolog |
---|
start T1 |
start T2 |
start checkpoint(T1,T2) |
start T3 |
end T1 |
这时,恢复管理器拿到这个片段后进行扫描,在遇到end chkpoint前遇到了start checkpoint(T1,T2),这说明了,T1,T2是可能未完成事务的,而且在这之前还遇到了T3的start,没有end T3,也没有任何T3的检查点的开始,这说明了T3一定是未完成事务的,所以T3一定是要重做的。先前为什么说T1,T2是可能未完成事务的呢?因为遇到了start checkpoint(T1,T2),没有遇到end chkpoint,并不代表T1和T2就一定是未完成的,可能有一个已经commit过了,因为两个都没有commit,所以才导致了没有end chkpoint,所以这时找start下面的日志,发现了“end T1”,说明了T1的事务是已经完成了的。那只需要找T2的开启然后开始重做就可以了,然后就通过start checkpoint(T1,T2)再往上找,找到了start T2,然后开始重做T2,也就是这个日志里,T2和T3是需要重做的,然后重做掉。 (注:刚才先说了做T3,然后有说了重做T2,并不代表真正的顺序就是这样,实际上恢复管理器是先分析出需要重做的事务,然后一块做掉的。)
好了,文章写到这,该结束了,对于undolog的叙述也就到这了。希望可以对大家有所帮助。
下一篇文章,我们来描述redolog,undolog和redolog都是数据库故障恢复的机制,但和undolog的实现及原理不太一样。下一篇我们将介绍到。
本文来自于我的个人博客 http://www.log4myself.info/archives/293
bitsCN.com
熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

windows7用戶在啟動時遇到了系統登錄檔遺失或損壞的現象,像這種情況該怎麼解決呢?你先強制重啟電腦,以後按F8鍵,在開啟的頁面中選擇安全模式進到,之後在選單列找到命令提示字元開啟,輸入SFC/SCANNOW指令並回車實行,這時候系統就會自動對電腦缺少或已損壞的安裝檔進行修復。 windows7系統登錄檔遺失或損壞怎麼辦1、最先開機自檢之後,立刻按住F8鍵,應用方向鍵挑選安全模式,敲打回車即可。 2.以後點選開始按鈕,挑選指令提示符,以管理者的身分運作。 3.最後在彈出的提示符號中輸入SFC/

一、今日頭條發布文章怎麼有收益?今日頭條發布文章獲得更多收益方法! 1.開通基礎權益:原創文章選擇投放廣告可獲得收益,影片必須原創橫屏才會有收益。 2.開通百粉權益:粉絲量達百粉以上,微頭條、原創問答創作及問答均可獲得收益。 3.堅持原創作品:原創作品包含文章、微標題及問題等,要求300字以上。注意違規抄襲作品作為原創發布,會被扣信用分,即使有收益也會被扣除。 4.垂直度:做專業領域一類的文章,不能隨意跨領域寫文章,會得不到合適的推薦,達不到作品的專和精,難以吸引粉絲讀者。 5.活躍度:活躍度高,

PHP參數遺失問題的解決方案在開發PHP程式的過程中,經常會遇到參數遺失的問題,這可能是由於前端傳遞的參數不完整、後端接收參數的方式不正確等原因造成的。在本文中,我們將針對PHP參數遺失問題提供一些解決方案,並附上具體的程式碼範例。一、前端傳參問題使用GET方法傳遞參數當使用GET方法傳遞參數時,參數會以URL參數的形式附加在請求的URL後面。在後端接收參數時

很多小夥伴不知道diskgenius資料怎麼恢復,所以下面小編就分享了diskgenius資料恢復的相關教程,一起去看看吧,相信對大家會有幫助。首先,在DiskGenius的主介面上方的硬碟分區圖中,可以直接選擇目標分區,右鍵點擊。接著,在彈出的快速選單中,找到並點選「已刪除或格式化的檔案復原」選單項,如圖所示。在第二步驟中,彈出恢復選項窗口,確保勾選「恢復已刪除的檔案」、「完整恢復」和「額外掃描已知檔案類型」這三個選項。第三步:點擊右側的「選擇檔案類型」按鈕,在彈出的視窗中指定您需要恢復的文件

Laravel是一個流行的PHPWeb應用程式框架,提供了許多快速且簡單的方式來建立高效、安全且可擴展的Web應用程式。在開發Laravel應用程式時,我們經常需要考慮資料恢復的問題,即如何在資料遺失或損壞的情況下恢復資料並保證應用程式的正常運作。在本文中,我們將介紹如何使用Laravel中間件來實現資料復原功能,並提供具體的程式碼範例。一、什麼是Lara

ThinkPHP6資料備份與復原:保障資料的安全性隨著網路的快速發展,資料已成為極為重要的資產。因此,資料的安全性備受關注。在Web應用開發中,資料備份與復原是確保資料安全的重要一環。在本文中,我們將介紹如何使用ThinkPHP6框架進行資料備份與恢復,以保障資料的安全性。一、資料備份資料備份是指將資料庫中的資料以某種方式複製或儲存。這樣即使在數據

如何快速恢復MySQL資料庫遭遇的故障和錯誤? MySQL是一種廣泛使用的開源關係型資料庫管理系統,許多應用程式和網站都依賴它來儲存和管理資料。然而,資料庫故障和錯誤是不可避免的,這可能導致資料遺失或應用程式無法正常運作。在遭遇MySQL資料庫故障或錯誤時,快速且有效地恢復資料庫非常重要。本文將介紹一些快速還原MySQL資料庫的方法。確定故障和錯誤的類型在開

硬碟磁區壞了怎麼解決硬碟磁區壞了是一個常見的硬體故障,它可能導致資料遺失,影響電腦的效能。了解和解決硬碟扇區壞了的問題是非常重要的。本文將介紹硬碟磁區的概念,討論常見的硬碟磁區壞了的原因以及解決方法。一、什麼是硬碟磁區?在介紹如何解決硬碟磁區壞了的問題之前,我們先來了解什麼是硬碟磁區。硬碟磁區是硬碟上最小的可讀寫單元,它是硬碟中的一小段空間,用
