[MySQLスタディノート(16)] REDOログの非常に詳細な説明

この記事は公式アカウント[DevelopingPigeon]から公開されています!フォローへようこそ!


古いルール-姉妹都市都市:

1。やり直しログ

(I.概要

       トランザクションがコミットされると、メモリのバッファプールでページのみが変更されます。この時点で障害が発生し、メモリ内のデータが無効になると、コミットされたトランザクションが失われます。これは許容範囲を超えています。簡単な方法は、トランザクションが送信される前に、トランザクションによって変更されたすべてのページをディスクにフラッシュすることですが、ページ内の1バイトしか変更できず、ランダムI / Oリフレッシュも非常に遅いため、これはリソースの浪費です。 1つのトランザクションが複数のステートメントに対応する可能性があり、1つのステートメントが複数のページを変更する可能性があるため、ランダムなI / Oが発生します。

       REDOログは、このような問題を解決することを目的としています。コミットされたトランザクションによってデータベース内のデータに加えられた変更を永続的に有効にすることを目的としています。システムがクラッシュした場合でも、再起動後に変更を復元できます。したがって、トランザクションが送信されるたびに、トランザクションによってメモリに変更されたページのコンテンツをREDOログに記録するだけで済み、耐久性の要件を満たします。この種のログは、システムクラッシュがデータベースを再起動および更新するために使用されるため、REDOログと呼ばれます。

(2)REDOログの利点

       その利点は、占有するスペースが非常に小さく、表スペースID、ページ番号、オフセット、および更新する値のみが格納されることです。同時に、REDOログがディスクに順次書き込まれます。トランザクションの実行時、ステートメントが実行されるたびに、複数のREDOログが生成され、それらが生成された順序、つまり順次I / Oでディスクに書き込まれる可能性があります。

(3)REDOログ形式

1.一般的な形式

       InnoDBには多くの種類のREDOログがあります。ほとんどのREDORZHIは共通の構造を持ち、ログの種類、テーブルスペースID、ページ番号、およびこのREDOログの特定のコンテンツを格納します。

2.単純なやり直しログ

       単純なログタイプは、特定のページのオフセットで変更された数バイトの値と、特定の変更されたコンテンツを記録するだけで済みます。この単純なREDOログは物理ログと呼ばれ、ページに基づいています。データの量書かれているものは多くの種類に分けられます。

3.複雑なREDOログ

       ステートメントが実行されると、システムデータページやユーザーデータページなど、多くのページが変更されることがあります。たとえば、INSERTステートメントは、テーブル内のインデックスと同じ数のB +ツリーを更新する場合があります。特定のB +ツリーの場合、リーフノードページまたは内部ノードページを更新する場合があります。

(4)ミニトランザクション

1.グループの形式でREDOログに書き込みます

       ステートメントの実行中に生成されるREDOログは、いくつかの分割できないグループに分割されます。たとえば、クラスター化されたインデックスに対応するB +ツリーのページにレコードが挿入されたときに生成されるREDOログはグループであり、分割できません。セカンダリインデックスに対応するB +ツリーのページにレコードを挿入することによって生成されたREDOログも分割できません。レコードを挿入するときに、対応するリーフノードページを見つけるため、このページには挿入(楽観的挿入)のための十分なスペースがあるか、悲観的挿入のための十分なスペース(悲観的挿入)がない可能性があるため、新しいデータページの適用、統計の変更情報など。これらの操作はアトミックである必要があり、切断できないため、REDOログはグループの形式で記録されます。

       これらのREDOログをグループに分割するにはどうすればよいですか?再編成の最後のREDOログの後に、特別なタイプのREDOログが追加されます。ログのグループの終わりを表すタイプフィールドは1つだけです。システムがクラッシュして再起動し、このタイプのログに解決されると、REDOログの完全なセットが解析されたことがわかります。そうでない場合、以前に解析されたREDOログは破棄されます。REDOログのみを生成する一部の操作では、REDOログの1バイトのタイプフィールドを直接使用します。最初のビットは単一ログかどうかを表し、次の7ビットはREDOログのタイプを表します。

2.ミニトランザクション

       基になるページにアトミックにアクセスするプロセスは、ミニトランザクション(MTR)と呼ばれます。トランザクションには複数のステートメントを含めることができ、ステートメントには複数のMTRを含めることができます。各MTRには一連のREDOログを含めることができます。


二。ログ書き込みプロセスをやり直す

(1)REDOログが保存されているページ

       InnoDBは、REDOログを管理するために、MTRによって生成されたREDOログを512バイトのサイズのページに配置します。ページの構造は、ログブロックヘッダー、ログブロック本体、およびログブロックトレーラーです。本体は実際のREDOログを格納し、他の格納は管理情報です。

       ヘッダーの属性の説明:

no: 每个页的编号;
data_len: 表示页中已经使用了多少字节,初始值为12字节,填满时为512;
checkpoint_no: checkpoint的序号;

(2)REDOログバッファ

       バッファプールと同様に、REDOログをディスクに直接書き込むことはできません。サーバーが起動すると、REDOログバッファと呼ばれる連続メモリスペース、つまり、複数の連続REDOログページに分割されるログバッファが適用されます。 、デフォルトは16MBです。


(3)REDOログをログバッファに書き込む

       ログバッファへのREDOログの書き込みは順番に書き込まれ、グローバル変数buf_freeを使用して、ログバッファのどこに後で書き込むREDOログを書き込む必要があるかを示します。すべてのREDOログが生成されてログバッファに挿入されるわけではありませんが、各MTRの操作中に生成されたログは一時的に1か所に保存されます。MTRが終了すると、プロセスで生成された一連のREDOログは次のようになります。すべてログバッファにコピーします。異なるトランザクションが同時に実行される可能性があるため、異なるトランザクションのMTRに対応するREDOログがログバッファに交互に書き込まれる場合があります。


第三に、REDOログファイル

(1)REDOログをフラッシュするタイミング

       ログバッファ内のREDOログは、場合によってはディスクにフラッシュされます。


1.ログバッファスペースが不足しています

       容量の50%に達すると、ディスクにフラッシュされます。


2.トランザクションがコミットされたとき

       トランザクションがコミットされるとき、永続性を維持するために、ディスクへのページ変更に対応するREDOログに精通している必要があります。

3.サーバーが正常にシャットダウンされたとき


4.チェックポイントを行うとき


(2)REDOログファイルグループ

       MySQLデータディレクトリにはデフォルトで2つのib_logfile0ファイルとib_logfile1ファイルがあり、ログバッファのログはデフォルトでこれら2つのディスクファイルにフラッシュされます。もちろん、起動オプションで指定したディスクファイルを変更できます。ログの更新は、最初に最初のファイルに更新されます。いっぱいになると、次のファイルが書き込み用に選択されます。最後のファイルがいっぱいになると、最初のファイルに戻って書き込みが行われます。この問題は発生しませんか?書き込む最初のファイルに戻っても、以前のREDOログは上書きされません。ここでは、この問題を解決するためにチェックポイントが提案されています。

(3)REDOログファイル形式

       ログバッファ内のREDOログをディスクにフラッシュすることの本質は、REDOログページのミラーイメージをディスクファイルに書き込むことです。したがって、REDOログディスクファイルは、実際にはいくつかの512バイトのページで構成されます。REDOログファイルグループでは、各ファイルのサイズと形式は同じです。最初の4ページには管理情報が格納され、次のページにはREDOログページが格納されます。


三。ログシーケンス番号(lsn)

(I.概要

       InnoDBには、現在ログバッファーに書き込まれているREDOログの量を記録するために使用されるlsnのグローバル変数が含まれます。初期値は8704です。lsnの増加をカウントする場合、実際に書き込まれたログの量に、占有されたログブロックヘッダーとログブロックトレーラーを加えたものに基づいて計算されます。つまり、REDOログは1つのMTRに従ってログバッファーに書き込まれます。各ページで、占有されているヘッダーとトレーラーはlsnの増加と見なす必要があります。MTRによって生成されたREDOログの各セットには、それに対応する一意のlsn値があります。値が小さいほど、早く生成されます。

(二)flushed_to_disk_lsn

       同じことがグローバル変数にも当てはまります。Flushed_to_disk_lsnは、現在のログバッファ内のどのログがディスクにフラッシュされたかをマークするために使用されます。lsnは、現在のシステムのログバッファに書き込まれたが、ディスクにフラッシュされていないREDOログを表します。両方同じことは、ログバッファ内のすべてのREDOログがディスクにフラッシュされたことを意味します。

(3)フラッシュリストのlsn

       MTRが終了した後、MTRの実行中に変更されたページをバッファプールのフラッシュリストに追加する必要があります。バッファプールにロードされたページが初めて変更された場合、対応するコントロールはブロックはフラッシュリンクリストの先頭に挿入され、後でページが変更された場合、すでにフラッシュリンクリストに含まれているため、再度挿入されることはありません。つまり、すべてのダーティページは、フラッシュリンクリスト、つまりデータベースに更新されていない変更済みページに格納されます。ダーティページは、ページの最初の変更時刻に従って、各挿入がヘッダーであるため、並べ替えられます。補間、前のダーティページ変更時間は遅く、後のページは早いです。

       ページがいつ変更されるかに関する2つの属性が制御ブロックに記録されます。

       oldest_modification:バッファプール内のバッファページが初めて変更されると、ページのMTR変更の開始時に対応するlsn値がこの属性に書き込まれます。

       newest_modification:ページが変更されるたびに、ページのMTR変更の最後に対応するlsn値がこの属性に書き込まれます。


四。チェックポイント

(I.概要

       REDOログファイルグループの容量には限りがあります。REDOログファイルグループ内のファイルをリサイクルする必要があります。これには、一部のREDOログが占めるディスク領域を上書きできるかどうか、つまり、対応するダーティページが上書きされているかどうかを判断する必要があります。ディスクにフラッシュされます。グローバル変数checkpoint_lsnは、現在のシステムで上書きできるREDOログの合計量を示すために使用されます。初期値は8704です。ページがディスクにフラッシュされると、対応するREDOログは役に立たず、上書きできます。 checkpoint_lsn + 1の場合、このプロセスはチェックポイント操作の実行と呼ばれます。


(2)チェックポイント操作の手順

1.現在のシステムで上書きできるREDOログに対応する最大lsn値を計算しますか?

       現在のシステムで最も早く変更されたダーティページに対応するoldest_modification値が計算されている限り、lsn値がノードのoldest_modification値よりも小さいときにシステムによって生成されたREDOログは上書きされ、ダーティのoldest_modificationは上書きされます。ページはcheckpoint_lsnに割り当てられます。つまり、checkpoint_lsnよりも小さいスペースは上書きできます。

2. checkpoint_lsnのオフセットを対応するREDOログファイルグループに書き込み、このチェックポイントの番号をログファイルの管理情報に書き込みます。


(2)汚れたページを磨く

       通常、バックグラウンドスレッドは、LRUリンクリストとフラッシュリンクリストに対してダーティ操作を実行します。lsn値の増加が速すぎる場合、ユーザースレッドは、最も早く変更されたダーティページをフラッシュリンクリストからディスクに同期的にフラッシュする必要があります。実行できます。

おすすめ

転載: blog.csdn.net/Mrwxxxx/article/details/113948546