目次
checkpoint 检查点
非静态检查点
ホームページ データベース mysql チュートリアル 数据库事务的实现-故障恢复(二)(undo日志检查点)_MySQL

数据库事务的实现-故障恢复(二)(undo日志检查点)_MySQL

Jun 01, 2016 pm 01:48 PM
データ復旧 記事

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
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

今すぐ Toutiao の記事を公開してお金を稼ぐにはどうすればよいですか?今すぐ Toutiao で記事を公開して収入を増やす方法! 今すぐ Toutiao の記事を公開してお金を稼ぐにはどうすればよいですか?今すぐ Toutiao で記事を公開して収入を増やす方法! Mar 15, 2024 pm 04:13 PM

1. 今すぐ Toutiao の記事を公開してどうやってお金を稼ぐことができますか?今すぐ Toutiao で記事を公開して収入を増やす方法! 1. 基本的な権利と利益の有効化: オリジナルの記事は広告によって利益を得ることができますが、利益を得るにはビデオが横画面モードでオリジナルである必要があります。 2. ファン100人の権利を有効化:ファン数が100人以上に達すると、マイクロヘッドライン、オリジナルQ&A作成、Q&Aから利益を得ることができます。 3. オリジナル作品にこだわる: オリジナル作品には記事、小見出し、質問などが含まれ、300 ワード以上であることが求められます。違法に盗用された作品をオリジナル作品として出版した場合、クレジットポイントが減点され、利益も差し引かれますのでご注意ください。 4. 垂直性:専門分野の記事を書く場合、分野を超えて自由に記事を書くことができず、適切な推薦が得られず、専門性や洗練度が得られず、ファンもつきにくいそして読者たち。 5. 活動: 高活動、

Windows 7のシステムレジストリファイルが紛失または破損した場合の対処方法 Windows 7のシステムレジストリファイルが紛失または破損した場合の対処方法 Jul 08, 2023 pm 05:29 PM

Windows 7 を使用している場合、起動時にシステム レジストリ ファイルが見つからない、または破損しているという現象が発生します。この状況を解決するにはどうすればよいですか?まずコンピュータを強制的に再起動し、次に F8 キーを押し、開いたページでセーフ モードを選択します。次に、メニュー バーでコマンド プロンプトを見つけて開き、SFC/SCANNOW コマンドを入力して Enter キーを押すと、システムが自動的にコンピューター 欠落または破損したインストール ファイルを修復します。 Windows 7 システム レジストリ ファイルが紛失または破損した場合の対処方法 1. 最初の電源投入セルフテスト後、すぐに F8 キーを押したまま、矢印キーを使用してセーフ モードを選択し、Enter キーを押します。 2. [スタート] ボタンをクリックし、[コマンド プロンプト] を選択して、管理者として実行します。 3. 最後に、ポップアップ プロンプトに「SFC/」と入力します。

Diskgenius データを回復する方法-diskgenius データ回復チュートリアル Diskgenius データを回復する方法-diskgenius データ回復チュートリアル Mar 06, 2024 am 09:34 AM

多くの友人は、diskgenius データを回復する方法を知りません。そのため、編集者は、diskgenius データ回復に関する関連チュートリアルを共有します。見てみましょう。誰にとっても役に立つと思います。まず、DiskGenius のメイン インターフェイスの上にあるハードディスク パーティション図で、ターゲット パーティションを直接選択して右クリックします。次に、図に示すように、ポップアップ表示されるショートカット メニューで、[削除またはフォーマットされたファイルの回復] メニュー項目を見つけてクリックします。 2 番目のステップでは、回復オプション ウィンドウが表示され、「削除されたファイルの回復」、「完全な回復」、「既知のファイル タイプの追加スキャン」の 3 つのオプションを必ずチェックしてください。ステップ 3: 右側の「ファイルの種類を選択」ボタンをクリックし、ポップアップ ウィンドウで回復する必要があるファイルを指定します。

PHPパラメータ欠落問題の解決策 PHPパラメータ欠落問題の解決策 Mar 11, 2024 am 09:27 AM

PHP パラメータ消失の問題の解決策 PHP プログラムの開発過程では、フロントエンドから渡されたパラメータが不完全であったり、バックエンドからパラメータを受け取る方法が間違っていたりすることが原因で、パラメータ消失の問題が頻繁に発生します。この記事では、PHP でパラメーターが欠落している問題に対するいくつかの解決策と、具体的なコード例を紹介します。 1. フロントエンドパラメータの受け渡しの問題 GET メソッドを使用してパラメータを渡す GET メソッドを使用してパラメータを渡すと、パラメータは URL パラメータの形式で要求された URL に追加されます。バックエンドでパラメータを受信する場合

ThinkPHP6 データのバックアップとリカバリ: データのセキュリティの確保 ThinkPHP6 データのバックアップとリカバリ: データのセキュリティの確保 Aug 13, 2023 am 08:28 AM

ThinkPHP6 データのバックアップとリカバリ: データのセキュリティの確保 インターネットの急速な発展に伴い、データは非常に重要な資産になりました。したがって、データのセキュリティは非常に重要です。 Web アプリケーション開発では、データのバックアップとリカバリはデータのセキュリティを確保するための重要な部分です。この記事では、ThinkPHP6 フレームワークを使用してデータのバックアップと復元を行い、データのセキュリティを確保する方法を紹介します。 1. データのバックアップ データのバックアップとは、データベース内のデータを何らかの方法でコピーまたは保存することを指します。この方法では、データが

Laravelでデータ復元用のミドルウェアを使用する方法 Laravelでデータ復元用のミドルウェアを使用する方法 Nov 02, 2023 pm 02:12 PM

Laravel は、効率的で安全かつスケーラブルな Web アプリケーションを構築するための多くの高速かつ簡単な方法を提供する、人気のある PHP Web アプリケーション フレームワークです。 Laravel アプリケーションを開発する場合、多くの場合、データ回復の問題、つまり、データの損失または損傷が発生した場合にデータを回復し、アプリケーションの通常の動作を保証する方法を考慮する必要があります。この記事では、Laravelミドルウェアを使用してデータ回復機能を実装する方法と、具体的なコード例を紹介します。 1. ララとは何ですか?

ハードドライブのセクター破損の問題に対処する方法 ハードドライブのセクター破損の問題に対処する方法 Feb 19, 2024 am 11:03 AM

壊れたハードディスク セクタを解決するにはどうすればよいですか? 壊れたハードディスク セクタは一般的なハードウェア障害であり、データ損失を引き起こし、コンピュータのパフォーマンスに影響を与える可能性があります。不良ハードドライブセクターの問題を理解し、解決することは非常に重要です。この記事では、ハードディスク セクタの概念を紹介し、不良ハードディスク セクタの一般的な原因と解決策について説明します。 1. ハードディスクのセクターとは何ですか?ハードディスクの不良セクタの問題を解決する方法を紹介する前に、まずハードディスクのセクタとは何かを理解しましょう。ハードディスク セクタは、ハード ドライブ上で読み取りおよび書き込み可能な最小単位であり、ハード ドライブ上のスペースの小さなセクションです。

MySQL データベースで発生した障害やエラーから迅速に回復するにはどうすればよいですか? MySQL データベースで発生した障害やエラーから迅速に回復するにはどうすればよいですか? Sep 10, 2023 pm 03:45 PM

MySQL データベースで発生した障害やエラーから迅速に回復するにはどうすればよいですか? MySQL は、広く使用されているオープンソースのリレーショナル データベース管理システムであり、多くのアプリケーションや Web サイトがデータの保存と管理に依存しています。ただし、データベースの障害やエラーは避けられず、データの損失やアプリケーションの正常な機能障害が発生する可能性があります。 MySQL データベースの障害またはエラーが発生した場合、データベースを迅速かつ効果的に回復することが非常に重要です。この記事では、MySQL データベースを迅速に復元する方法をいくつか紹介します。開始する前に障害とエラーの種類を判断する

See all articles