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
windows7用户在启动时遇到了系统注册表文件遗失或损坏的现象,像这种情况要怎么解决呢?你先强制重启电脑,以后按F8键,在打开的页面中选择安全模式进到,之后在菜单栏找到命令提示符开启,输入SFC/SCANNOW指令并回车实行,这时候系统就会自动对电脑缺失或已损坏的安装文件进行修复。windows7系统注册表文件遗失或损坏怎么办1、最先开机自检之后,立刻按住F8键,应用方向键挑选安全模式,敲打回车即可。2、以后点击开始按钮,挑选命令提示符,以管理员的身份运作。3、最后在弹出的提示符中输入SFC/

ThinkPHP6数据备份与恢复:保障数据的安全性随着互联网的快速发展,数据已成为一项极其重要的资产。因此,数据的安全性备受关注。在Web应用开发中,数据备份与恢复是确保数据安全的重要一环。在本文中,我们将介绍如何使用ThinkPHP6框架进行数据备份与恢复,以保障数据的安全性。一、数据备份数据备份是指将数据库中的数据以某种方式进行复制或存储。这样即使在数据

Laravel是一个流行的PHPWeb应用程序框架,提供了许多快速而又简单的方式来构建高效、安全和可扩展的Web应用程序。在开发Laravel应用程序时,我们经常需要考虑数据恢复的问题,即如何在数据丢失或损坏的情况下恢复数据并保证应用程序的正常运行。在本文中,我们将介绍如何使用Laravel中间件来实现数据恢复功能,并提供具体的代码示例。一、什么是Lara

如何快速恢复MySQL数据库遭遇的故障和错误?MySQL是一种广泛使用的开源关系型数据库管理系统,许多应用程序和网站都依赖于它来存储和管理数据。然而,数据库故障和错误是不可避免的,这可能导致数据丢失或应用程序无法正常运行。在遭遇MySQL数据库故障或错误时,快速而有效地恢复数据库非常重要。本文将介绍一些快速恢复MySQL数据库的方法。确定故障和错误的类型在开

标题:如何应对Linux系统中的文件损坏和丢失问题引言:在使用Linux系统的过程中,文件损坏和丢失是一个不容忽视的问题。由于各种原因,我们可能会面临文件丢失、文件损坏或无法访问文件的情况。然而,幸运的是,Linux系统提供了一些实用工具和技术,帮助我们有效地应对文件损坏和丢失问题。本文将介绍一些常见的解决方法和技巧。一、备份数据备份是最重要的应对文件损坏和

华为电脑数据恢复的方法:1、从回收站恢复;2、使用数据恢复软件;3、从备份中恢复;4、使用华为云服务。详细介绍:1、从回收站恢复,如果华为电脑的数据被删除后,这些数据并没有被新的文件覆盖,那么可以从回收站中恢复这些数据;2、使用数据恢复软件,如果回收站中没有需要恢复的数据,或者数据被覆盖了,可以使用数据恢复软件来恢复华为电脑中的数据;3、从备份中恢复,如果华为电脑等等。
![Windows媒体创建工具删除了我的文件 [恢复指南]](https://img.php.cn/upload/article/000/887/227/168239259339851.png)
WindowsPC上的媒体创建工具是一个实用工具,允许用户将其计算机升级到最新的Windows版本。此外,它还有助于创建Windows安装USB驱动器光盘,可用于执行全新安装或修复有问题的WindowsPC。但是,用户抱怨Windows媒体创建工具在运行时删除了其PC上的文件。此外,我们还有一个详细的指南来修复0x80072f8f-0x20000升级操作系统时出现的媒体创建工具错误。为什么Windows媒体创建工具删除了我的文件?Windows媒体创建工具删除PC上的文件发生在下载软件开始下载时

PHP表单处理:表单数据备份与恢复引言在网站开发过程中,表单是非常常见的交互方式,用户通过填写表单将数据提交给服务器端处理。然而,有时候用户可能会因为网络问题、浏览器崩溃或其他意外情况导致表单数据丢失,这会给用户的使用体验带来困扰。因此,为了提升用户体验,我们可以通过PHP实现表单数据的自动备份与恢复功能,以确保用户填写的数据不会丢失。表单数据备份当用户在表


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

Dreamweaver Mac版
시각적 웹 개발 도구
