データベースがデータを変更すると、データ ページは、ディスクからバッファ プールに読み取られてから、バッファ プール内で変更される必要があります。この時点では、バッファ プール内のデータ ページは、ディスク上のデータ ページの内容と不一致になります。バッファ プール内のデータはダーティ ページと呼ばれます。この時点で DB サービスの異常な再起動が発生した場合、データはまだメモリ内になく、ディスク ファイルと同期されていません (ディスク ファイルとの同期はファイルが存在する場合、バッファ プール内のデータ ページが変更されると、対応する変更レコードがこのファイルに記録される可能性があります (ログの記録は行われないことに注意してください)。シーケンシャル IO) を実行すると、DB サービスがクラッシュして DB が復元されたときに、このファイルの記録内容に基づいてディスク ファイルに再適用することもでき、データの一貫性が維持されます。
tba テーブルの id=2 の行データが次のとおりであると仮定します。変更され、Name='B' が Name = 'B2' に変更されると、REDO ログが Name='B2' のレコードを保存するために使用されます。この変更がディスク ファイルにフラッシュされるときに例外が発生した場合、REDO ログはログを使用してやり直し操作を実装し、トランザクションの耐久性を確保できます。
#Id | 名前 |
1 | A |
2 | B |
#3 | C |
4 |
D
|
REDO ログとバイナリ ログの違いに注意してください。REDO ログはストレージ エンジン層によって生成され、バイナリ ログはデータベース層によって生成されます。大規模なトランザクションが 100,000 行のレコードを tba に挿入するとします。このプロセス中、レコードは REDO ログに連続して連続して記録されますが、バイナリ ログには記録されません。トランザクションがコミットされた場合にのみ、トランザクションはバイナリ ログ ファイルに書き込まれます。一度、真ん中。バイナリログにはロウログ、ステートメントログ、混合ログの 3 種類の記録形式があり、それぞれ記録形式が異なります。
#2.2 redo パラメータ
innodb_log_file_size
innodb_log_group_home_dir
innodb_log_buffer_size
innodb_flush_log_at_trx_commit-
#innodb_flush_log_at_trx_commit=1、各コミットは REDO ログを REDO ログから変更しますバッファはシステムに書き込まれ、fsync 経由でディスク ファイルにフラッシュされます。
- innodb_flush_log_at_trx_commit=2、トランザクションが送信されるたびに、MySQL はログを REDO ログ バッファからシステムに書き込みますが、それをファイル システム バッファに書き込み、fsync するだけです。システム内からディスクにコピーします。データベース インスタンスがクラッシュしても、REDO ログは失われませんが、サーバーがクラッシュすると、ファイル システム バッファがディスク ファイルと fsync する時間がないため、データのこの部分は失われます。
- innodb_flush_log_at_trx_commit=0、トランザクション プロセス中、ログは他の設定と同様に常に REDO ログ バッファーにありますが、トランザクションがコミットされると、REDO 書き込み操作は発生しません。 MySQL 内で 1 秒に 1 回動作して、REDO ログ バッファからシステムにデータを書き込みます。クラッシュが発生すると、1 秒以内のトランザクション変更操作は失われます。
-
注: プロセス スケジューリング ポリシーの問題により、この「フラッシュ (ディスクへのフラッシュ) 操作を 1 秒に 1 回実行する」は 100% の「1 秒あたり」を保証するものではありません。 。
redo
スペース管理
やり直しログ ファイルの名前は ib_logfile[number] です。REDO ログは順次ファイルに書き込みます。いっぱいになると、最初のファイルに戻って上書きします。 (ただし、REDO チェックポイントを実行すると、最初のログ ファイルのヘッダー チェックポイント マークも更新されるため、厳密にはシーケンシャル書き込みとしてカウントされません)。 実際、REDO ログは、REDO ログ バッファと REDO ログ ファイルの 2 つの部分で構成されています。バッファ プールでは、データの変更は REDO ログ バッファに記録されます。次の状況が発生した場合、REDO ログは REDO ログ ファイルにフラッシュされます:
REDO ログ バッファの領域が不十分です
トランザクションの送信 (innodb_flush_log_at_trx_commit パラメーターの設定に依存します) バックグラウンド スレッド チェックポイントを実行します シャットダウンの例 binlog 切り替え ##3 元に戻すトランザクションとやり直しトランザクションを記録する方法 3.1 Undo Redo トランザクションの簡略化されたプロセス
2 つのデータ A と B があり、それぞれ値 1 と 2 があると仮定します。トランザクションの操作内容は、modify 1 を 3、2 を 4 に変更すると、実際のレコードは次のようになります (簡略化):
A. トランザクション開始. B. A=1 を記録してログを元に戻します。
C. A=3 を変更します。 D. A=3 を記録してログをやり直します。 E. レコード B= 2 を元に戻します。 F. B= 4 を変更します。 G. B=4 をやり直しログに記録します。 H. REDO ログをディスクに書き込みます。 I. トランザクションの送信
3.2 IO への影響
Undo Redo を設計する主な目的は、入出力のパフォーマンスを向上させ、処理能力を向上させることです。データベースの。 B D E G H はすべて新しい操作であることがわかりますが、B D E G はバッファ領域にバッファリングされています。G のみ IO 操作が追加されています。Redo ログの IO パフォーマンスを向上させるために、InnoDB の Redo ログの設計には次の機能があります。 B. REDO ログが連続した領域に保存されるようにしてください。したがって、システムの初回起動時には、ログ ファイルのスペースが完全に割り当てられます。パフォーマンスを向上させるために、Redo ログはシーケンシャル IO 方式で記録され、段階的に完了します。
B. ログをバッチで書き込みます。ログはファイルに直接書き込まれず、最初に REDO ログ バッファに書き込まれます。ログをディスクにフラッシュする必要がある場合 (トランザクションの送信など)、多くのログがまとめてディスクに書き込まれます。
C. 同時トランザクション REDO ログの記憶領域を共有し、文の実行順序に従って交互に REDO ログをまとめて記録し、ログが占有する領域を削減します。たとえば、REDO ログのレコードの内容は次のようになります。
レコード 1:
Record 2:
レコード 3:
レコード 4:
レコード 5:
# D. C のため、トランザクションが REDO ログをディスクに書き込むと、コミットされていない他のトランザクションのログもディスクに書き込まれます。 E. REDO ログでは順次追加操作のみが実行されます。トランザクションをロールバックする必要がある場合、その REDO ログ レコードは REDO ログから削除されません。
3.3 リカバリ
前述したように、コミットされていないトランザクションとロールバックされたトランザクションもREDOログに記録されるため、リカバリする場合、これらのトランザクションは特別に処理する必要があります。加工の。 2 つの異なるリカバリ戦略があります。 A. リカバリするときは、コミットされたトランザクションのみをやり直します。 リカバリを実行する場合、コミットされていないトランザクションやロールバックされたトランザクションを含むすべてのトランザクションを再実行する必要があります。次に、コミットされていないトランザクションを、Undo Log を通じてロールバックします。 MySQL データベース InnoDB ストレージ エンジンは戦略 B を使用します。
InnoDB ストレージ エンジンの回復メカニズムにはいくつかの特徴があります: A. Redo ログを再実行するとき、および トランザクション性は気にしないでください
。リカバリ中は、BEGIN、COMMIT、ROLLBACK の動作は行われません。各ログがどのトランザクションに属しているかは関係ありません。 REDOログにはトランザクションIDなどのトランザクションに関する内容が記録されますが、これらの内容は操作対象となるデータの一部としてのみ扱われます。 B. 戦略 B を使用する場合は、Undo ログを永続化し、REDO ログを書き込む前に、対応する Undo ログをディスクに書き込む必要があります。 Undo と Redo Log のこの関係により、永続性が複雑になります。複雑さを軽減するために、InnoDB は Undo ログをデータとして扱うため、Undo ログを記録する操作も REDO ログに記録されます。 UNDO ログをメモリにキャッシュすることにより、REDO ログを書き込む前にディスクに書き込む必要がなくなります。
Undo ログ操作を含む Redo ログは次のようになります:
Record 1: Undo log insert > ;
レコード 2: レコード 3: 元に戻すログの挿入
>
レコード 4: レコード 5:
元に戻すログの挿入
> レコード 6: < ;trx3 、削除 …>
C. 現時点では、まだ不明な点が残っています。 Redoはトランザクションではないので、ロールバックしたトランザクションを再実行することはできないのでしょうか?
確かにその通りです。同時に、Innodb はトランザクションのロールバック中の操作を REDO ログに記録します。ロールバック操作は基本的にデータも変更するため、ロールバック操作を実行すると、データへの変更が REDO ログに記録されます。 ロールバックされたトランザクションの Redo ログは次のようになります:
レコード 1: >
レコード 2: insert A…>
レコード 3: > レコード 4: < ;trx1, update B
…>
レコード 5: > レコード 6: delete C
…>
レコード 7: insert C>
レコード 8: B を古い値に更新>
レコード 9: delete A>
ロールバックされたトランザクションの回復操作は、最初にやり直してから元に戻すことなので、データの整合性は破壊されません。 。