数据库事务的实现-故障恢复(二)(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 기반 앱

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

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

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











1. 오늘 Toutiao에 기사를 게시하여 어떻게 돈을 벌 수 있습니까? 오늘 Toutiao에 기사를 게시하여 더 많은 수입을 얻는 방법! 1. 기본 권익 활성화: 기사의 원본은 광고를 통해 수익을 얻을 수 있으며, 동영상은 가로 화면 모드에서 원본이어야 수익을 얻을 수 있습니다. 2. 팬 100명 권리 활성화: 팬 수가 100명 이상에 도달하면 마이크로 헤드라인, 오리지널 Q&A 작성, Q&A 수익을 얻을 수 있습니다. 3. 독창적인 작품을 고집하라: 독창적인 작품에는 기사, 마이크로 헤드라인, 질문 등이 포함되며, 300단어 이상이어야 합니다. 불법 표절 저작물을 원작으로 출판할 경우 크레딧 점수가 차감되며, 수익금도 차감되므로 주의하시기 바랍니다. 4. 수직성: 전문 분야에서 기사를 작성할 때 분야를 넘나들며 마음대로 기사를 작성할 수 없으며 적절한 추천을 받을 수 없으며, 작품의 전문성과 정확성을 확보할 수 없으며 팬을 유치하기가 어렵습니다. 그리고 독자들. 5. 활동: 높은 활동,

Windows 7 사용자는 시작할 때 시스템 레지스트리 파일이 누락되거나 손상되는 현상이 발생합니다. 이 상황을 해결하는 방법은 무엇입니까? 먼저 컴퓨터를 강제로 다시 시작한 다음 F8 키를 누르고 열린 페이지에서 안전 모드를 선택한 다음 메뉴 표시줄에서 명령 프롬프트를 찾아 열고 SFC/SCANNOW 명령을 입력하고 Enter를 눌러 실행하면 시스템이 자동으로 실행됩니다. 컴퓨터를 시작하십시오. 누락되거나 손상된 설치 파일을 복구하십시오. Windows 7 시스템 레지스트리 파일이 손실되거나 손상된 경우 수행할 작업 1. 첫 번째 전원 공급 자가 테스트 후 즉시 F8 키를 누른 상태에서 화살표 키를 사용하여 안전 모드를 선택한 다음 Enter 키를 누릅니다. 2. 그런 다음 시작 버튼을 클릭하고 명령 프롬프트를 선택한 후 관리자 권한으로 실행합니다. 3. 마지막으로 팝업창에 SFC/를 입력하세요.

많은 친구들이 diskgenius 데이터를 복구하는 방법을 모르므로 아래 편집자가 diskgenius 데이터 복구에 대한 관련 튜토리얼을 공유해 보겠습니다. 모두에게 도움이 될 것입니다. 먼저 DiskGenius 메인 인터페이스 위의 하드 디스크 파티션 다이어그램에서 대상 파티션을 직접 선택하고 마우스 오른쪽 버튼을 클릭할 수 있습니다. 그런 다음 나타나는 바로가기 메뉴에서 그림과 같이 "삭제 또는 포맷된 파일 복구" 메뉴 항목을 찾아 클릭하세요. 두 번째 단계에서는 복구 옵션 창이 나타나고 "삭제된 파일 복구", "전체 복구" 및 "알려진 파일 형식에 대한 추가 검사"의 세 가지 옵션을 확인하십시오. 3단계: 오른쪽의 "파일 형식 선택" 버튼을 클릭하고 팝업 창에서 복구해야 하는 파일을 지정합니다.

PHP 매개변수 손실 문제에 대한 해결 방법 PHP 프로그램을 개발하는 과정에서 매개변수 손실 문제가 종종 발생합니다. 이는 프런트엔드에서 전달된 불완전한 매개변수, 백엔드에서 매개변수를 받는 잘못된 방법 등으로 인해 발생할 수 있습니다. 이 기사에서는 특정 코드 예제와 함께 PHP에서 매개변수 누락 문제에 대한 몇 가지 솔루션을 제공합니다. 1. 프런트엔드 매개변수 전달 문제 GET 메소드를 사용하여 매개변수를 전달하는 경우 매개변수가 URL 매개변수 형식으로 요청된 URL에 추가됩니다. 백엔드에서 매개변수를 수신할 때

ThinkPHP6 데이터 백업 및 복구: 데이터 보안 보장 인터넷의 급속한 발전으로 인해 데이터는 매우 중요한 자산이 되었습니다. 따라서 데이터 보안이 매우 중요합니다. 웹 애플리케이션 개발에서 데이터 백업 및 복구는 데이터 보안을 보장하는 중요한 부분입니다. 이 기사에서는 데이터 보안을 보장하기 위해 데이터 백업 및 복구에 ThinkPHP6 프레임워크를 사용하는 방법을 소개합니다. 1. 데이터 백업 데이터 백업은 어떤 방식으로든 데이터베이스에 데이터를 복사하거나 저장하는 것을 말합니다. 이렇게 하면 데이터가

깨진 하드 디스크 섹터를 해결하는 방법 깨진 하드 디스크 섹터는 데이터 손실을 일으키고 컴퓨터 성능에 영향을 미칠 수 있는 일반적인 하드웨어 오류입니다. 불량 하드 드라이브 섹터의 문제를 이해하고 해결하는 것은 매우 중요합니다. 이 기사에서는 하드 디스크 섹터의 개념을 소개하고 하드 디스크 섹터 불량의 일반적인 원인과 해결 방법에 대해 논의합니다. 1. 하드디스크 섹터란 무엇입니까? 불량 하드디스크 섹터 문제를 해결하는 방법을 소개하기 전에 먼저 하드디스크 섹터가 무엇인지부터 알아보겠습니다. 하드 디스크 섹터는 하드 드라이브에서 읽고 쓸 수 있는 가장 작은 공간입니다.

Laravel은 효율적이고 안전하며 확장 가능한 웹 애플리케이션을 구축할 수 있는 빠르고 쉬운 방법을 제공하는 인기 있는 PHP 웹 애플리케이션 프레임워크입니다. Laravel 애플리케이션을 개발할 때 데이터 복구 문제, 즉 데이터 손실이나 손상이 발생한 경우 데이터를 복구하고 애플리케이션의 정상적인 작동을 보장하는 방법을 고려해야 하는 경우가 많습니다. 이 글에서는 Laravel 미들웨어를 사용하여 데이터 복구 기능을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. 라라란 무엇인가?

MySQL 데이터베이스에서 발생한 실패 및 오류를 신속하게 복구하는 방법은 무엇입니까? MySQL은 많은 애플리케이션과 웹사이트가 데이터를 저장하고 관리하는 데 사용하는 널리 사용되는 오픈 소스 관계형 데이터베이스 관리 시스템입니다. 그러나 데이터베이스 장애 및 오류는 불가피하며, 이로 인해 데이터가 손실되거나 애플리케이션이 제대로 작동하지 않을 수 있습니다. MySQL 데이터베이스 오류나 오류가 발생하면 데이터베이스를 빠르고 효과적으로 복구하는 것이 매우 중요합니다. 이 문서에서는 MySQL 데이터베이스를 신속하게 복원하는 몇 가지 방법을 소개합니다. 시작하기 전에 결함 및 오류 유형을 결정하십시오.
