この記事の内容は、MySQL トランザクションの redo と undo の分析 (写真とテキスト) です。必要な方は参考にしていただければ幸いです。
トランザクションには、アトミック性、一貫性、分離性、耐久性という 4 つの特性があることは誰もが知っています。これがトランザクションの目的です。トランザクションの分離はロック機構によって実現され、トランザクションのアトミック性、一貫性、耐久性はREDOログとUNDOログによって保証されます。したがって、この記事では、トランザクションにおけるやり直しと取り消しに関するいくつかの問題について説明します。
やり直しログと取り消しログとは何ですか?
redo トランザクションの耐久性を確保するにはどうすればよいですか?
UNDO ログは REDO ログの逆のプロセスですか?
redo ログ
Redo の種類
Redo ログ (REDO ログ) が使用されることを保証しますトランザクションの耐久性。これはトランザクション ACID の D です。実際には、次の 2 つのタイプに分類できます。
ほとんどの場合、Redo はデータ ページの物理的な変更を記録する物理ログです。論理 REDO ログは、ページの実際の変更を記録するのではなく、ページを変更する操作の種類を記録します。たとえば、新しいデータ ページを作成する場合、論理ログを記録する必要があります。論理 REDO ログに関しては、より低レベルのコンテンツが含まれます。ここで覚えておく必要があるのは、ほとんどの場合、ページ上の DML 変更操作は Redo を記録する必要があるということです。役割。 Redo の構成
Redo の構成
#aggregation インデックス、セカンダリ インデックス、および元に戻すページへの変更はすべて、REDO ログに記録する必要があります。
ステップ 1: まず、元のデータをディスクからメモリに読み取り、データのメモリ コピーを変更します。
Force Log at Commit メカニズム
を通じてトランザクションの耐久性を実現します。つまり、トランザクションがコミットされると、REDO ログ バッファーが最初に書き込まれます。 REDO ログ ファイルへの永続化は、トランザクションのコミット操作が完了するまで完了しません。このアプローチは、fsync を呼び出す必要があります。 Operation ,REDO ログは O_DIRECT オプションなしで開かれるため、REDO ログは最初にファイル システム キャッシュに書き込まれます。 REDO ログがディスクに確実に書き込まれるようにするには、fsync 操作を実行する必要があります。 fsync はシステム コール操作です。そのため、ディスクのパフォーマンスはトランザクションの実行、つまりデータベースのパフォーマンスにも影響します。 (O_DIRECT オプションは Linux システムのオプションです。このオプションを使用すると、ファイルは直接 IO 操作され、ファイル システム キャッシュを経由せずにディスクに直接書き込まれます)
上記の Force Log at Commit メカニズム は、InnoDB ストレージ エンジンによって提供されるパラメータ
innodb_flush_log_at_trx_commit によって制御されます。このパラメータは、ディスクへの REDO ログのフラッシュ設定を制御できます。パラメータ値も次のように、ユーザーが非永続性を設定できるようにすることができます。
設定パラメータが 1 の場合 (デフォルトは 1)、トランザクションが次のように設定されている必要があることを意味します。 fsync コミット時に 1 回呼び出される操作。耐久性を確保する最も安全な構成です。
パラメータを 2 に設定すると、トランザクションのコミット時に write 操作のみが実行され、REDO ログ バッファのみがシステムのページ キャッシュに書き込まれることが保証されます。 、fsync 操作は実行されないため、MySQL データベースがダウンしてもトランザクションは失われませんが、
パラメータが に設定されている場合、オペレーティング システムがダウンする可能性があります。 0 の場合、トランザクションの送信時に REDO が書き込まれないことを意味します。ログ操作はマスター スレッドでのみ完了し、REDO ログの fsync 操作はマスター スレッドで 1 秒ごとに実行されるため、インスタンスがクラッシュします。最大 1 秒以内にトランザクションが失われます。 (マスター スレッドは、データの一貫性を確保するために、バッファ プール内のデータをディスクに非同期的に更新する役割を担います)
fsync
および write
操作 これは実際にはシステム コール関数であり、多くの永続化シナリオで使用されます。たとえば、Redis の AOF 永続化でも 2 つの関数が使用されます。 fsync
操作はデータをハードディスクに送信し、ハードディスクへの書き込みが完了して戻るまでブロックされます。 ## 操作にはパフォーマンスのボトルネックがあり、write
操作はシステムのページ キャッシュにデータを書き込んだ直後に戻り、システムのスケジューリング メカニズムに依存してキャッシュされたデータをディスクにフラッシュします。ユーザーバッファ—>ページキャッシュ—>ディスクです。
トランザクションの耐久性を確保するための、上記のコミット時にログを強制するメカニズムに加えて、REDO ログの実際の実装も依存します。ミニトランザクション用にオンにします。
Redo は InnoDB にどのように実装されますか?ミニトランザクションとの関係?
ミニトランザクションがデータ ページ データの一貫性を確保するには、ミニトランザクションは次の 3 つのプロトコルに従う必要があります
:FIX ルール
#Write-Ahead Log
Force-log-at-commit
データ ページを変更する場合は、ページの x-latch (排他ロック) を取得する必要があります。データ ページを取得する場合は、s-latch (読み取り) が必要です。ページのロックまたは共有ロック) または x-latch。ページを変更またはアクセスする操作が完了するまでページのロックを保持します。
先行書き込みログ先行書き込みログについては、前の説明で説明しました。データ ページを永続化する前に、メモリ内の対応するログ ページをまず永続化する必要があります。各ページには、ログ シーケンス番号を表す LSN (ログ シーケンス番号) があります (LSN は 8 バイトを占め、単調増加します)。データ ページを永続デバイスに書き込む必要がある場合、必要なデータはページの LSN よりも少なくなります。ログは最初に永続化デバイスに書き込まれます。では、なぜ最初にログを書き込む必要があるのでしょうか。ログを書き込まずにデータをディスクに直接書き込むことは可能ですか?原理的には可能ですが、データ変更によりランダム IO が発生しますが、ログはシーケンシャル IO であるため、ディスクのパフォーマンスを最大限に発揮できます。活用されている。
Force-log-at-commitこれは、上記のトランザクションの耐久性を確保する方法の内容に相当します。トランザクション内で複数のページを変更できます。先行書き込みログは単一のデータ ページの一貫性を保証できますが、トランザクションのコミット時にすべてのページを生成する必要があるトランザクションの耐久性を保証することはできません。 mini - トランザクション ログをディスクにフラッシュする必要があります。ログのフラッシュが完了した後、バッファ プール内のページが永続ストレージ デバイスにフラッシュされる前にデータベースがクラッシュした場合、データベースの再起動時にデータの整合性が保たれる可能性があります。ログを通じて確認されます。
REDO ログの書き込みプロセス
上図は、各ミニの REDO ログの書き込みプロセスを示しています。 -transaction は、ミニトランザクションによって保証される更新ステートメントなどの各 DML 操作に対応します。データが変更された後、REDO1 が生成され、最初にミニトランザクションのプライベート バッファーに書き込まれ、更新されます。ステートメント 完了後、redo1 をプライベート バッファからパブリック ログ バッファにコピーします。外部トランザクション全体がコミットされると、REDO ログ バッファが REDO ログ ファイルにフラッシュされます。
undo ログundo ログの定義
undo ログは主に、データの論理的な変更を記録します。エラーが発生したときに前の操作をロールバックするには、以前の操作をすべて記録し、エラーが発生したときにロールバックする必要があります。
undo ログの役割undo は 2 つの機能を持つ論理ログです:
トランザクションの場合ロールバック
MVCC
ここでは MVCC (Multi-version Concurrency Control) については多くを述べませんが、トランザクション ロールバックの Undo ログに焦点を当てます。
undo ログは、ロールバック中にデータベースを論理的に元の状態に復元するだけです。たとえば、INSERT は DELETE に相当し、各 UPDATE は逆の UPDATE に相当します。変更前の行に戻ります。 UNDO ログは、トランザクションのアトミック性を確保するためにトランザクションのロールバック操作に使用されます。
#UNDO ログの書き込みタイミング
InnoDB ストレージ エンジンでは、アンドゥはロールバック セグメント (ロールバック) に保存されます。 セグメント)、各ロールバック セグメントは 1024 個のアンドゥ ログ セグメントを記録し、アンドゥは各アンドゥ ログ セグメントで実行されます。 5.6 より前では、ページを申請するには、ロールバック セグメントが共有テーブル スペースにありました。5.6.3 以降は、次の方法を使用できます。 innodb_undo_tablespace は、UNDO ストレージの場所を設定します。
アンドゥの種類InnoDB ストレージ エンジンでは、アンドゥ ログは次のように分割されます:
更新取り消しログには、削除および更新操作によって生成された取り消しログが記録されるため、トランザクションがコミットされたときに削除できないように、MVCC メカニズムを提供する必要がある場合があります。送信するときは、それを元に戻すログ リストに入れて、パージ スレッドが最終的な削除を実行するまで待ちます。
補足: パージ スレッドの 2 つの主な機能は、元に戻すページのクリーニングと、ページ内の Delete_Bit 識別子を持つデータ行のクリアです。 InnoDB では、トランザクションの Delete オペレーションは実際にはデータ行を削除しませんが、レコードを削除せずにレコードの Delete_Bit をマークする Delete Mark オペレーションです。これは一種の「偽の削除」であり、マークが付けられているだけであり、実際の削除作業はバックグラウンドのパージ スレッドによって完了する必要があります。
UNDO ログは REDO ログの逆のプロセスですか?アンドゥログ やり直しですか? ログの逆の処理?実際、その答えは前の記事から導き出すことができます。Undo ログは論理ログであり、トランザクションをロールバックする場合、データベースを元の状態に論理的に復元するだけです。一方、REDO ログは論理的なログです。 ログは、データ ページの物理的な変更を記録する物理ログです。明らかに、UNDO ログは REDO ログの逆のプロセスではありません。
redo と undo の概要次に、2 つのログ プロセスを理解しやすくするために、redo ログ undo ログのプロセスを簡略化して示します。実際、挿入/更新/削除操作では、やり直しと元に戻すでは異なる内容と量が記録されます。 InnoDB メモリでは、一般的なシーケンスは次のとおりです。
Write undo redo
Write undo
データの変更ページ
やり直しの書き込み
この記事では、やり直しの内容を分析します。およびアンドゥログは一部の情報書籍を参考にまとめており、明記されていない箇所があるかもしれません。何か間違っているところがあれば、ご指摘ください。
以上がMySQL トランザクションにおけるやり直しと元に戻すの分析 (画像とテキスト)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。