MySQLのREDOログ(リドゥログ)とロールバックログ(アンドゥログ)の詳しい説明

MySQLのREDOログ(リドゥログ)とロールバックログ(アンドゥログ)の詳しい説明

序文:

前回の記事では、MySQL システムでよく使用されるログをいくつか説明しました。実は、トランザクション関連のログ、REDO ログ、UNDO ログがありますが、これらはまだ紹介されていません。他のログと比較すると、REDO ログと UNDO ログはより神秘的で観察が困難です。本稿では、主にこれら2種類のトランザクションログの機能と運用・保守方法について紹介します。

1. ログの再実行

トランザクションの 4 つの主要な特性の 1 つが永続性であることは誰もが知っています。具体的には、トランザクションが正常に送信される限り、データベースに加えられた変更は永続的に保存され、いかなる理由でも元の状態に戻すことはできません。では、MySQL はどのようにして一貫性を確保するのでしょうか?最も簡単な方法は、トランザクションがコミットされるたびに、トランザクションに関係するすべての変更されたデータ ページをディスクに更新することです。ただし、そうすると、主に次の 2 つの点で重大なパフォーマンス上の問題が発生します。

  • Innodb はページ単位でディスクとやり取りし、トランザクションではデータ ページ内の数バイトしか変更されない可能性があるため、この時点でデータ ページ全体をディスクにフラッシュするとリソースの無駄になります。
  • トランザクションでは複数のデータ ページの変更が必要になる場合がありますが、これらのデータ ページは物理的に連続していないため、ランダム IO 書き込みを使用するとパフォーマンスが低下します。

そのため、MySQL は、トランザクションによってデータ ページに加えられた変更のみを記録する redo ログを設計しました。これにより、パフォーマンスの問題を完全に解決できます (相対的に言えば、ファイルは小さくなり、シーケンシャル IO になります)。

REDO ログは、メモリ内のログ バッファ (REDO ログ バッファ) と、ディスク上のログ ファイル (REDO ログ ファイル) の 2 つの部分で構成されます。 MySQL は DML ステートメントを実行するたびに、まずレコードを REDO ログ バッファに書き込み、次に特定の時点で複数の操作レコードを REDO ログ ファイルに書き込みます。

デフォルトでは、REDO ログはディスク上で ib_logfile0 と ib_logfile1 という名前の 2 つの物理ファイルによって表されます。 REDO ログ関連のパラメータについて簡単に説明します。

  • innodb_log_files_in_group: ib_logfile0、iblogfile1...iblogfilen という名前が付けられた REDO ログ ファイルの数。デフォルトは 2 で、最大値は 100 です。
  • innodb_log_file_size: 単一の REDO ログ ファイルのサイズを設定します。デフォルト値は 48 MB で、最大値は 512 GB です。最大値は REDO ログ ファイル シリーズ全体の合計を指すことに注意してください。つまり、(innodb_log_files_in_group * innodb_log_file_size) は最大値の 512 GB を超えることはできません。
  • innodb_log_group_home_dir: REDO ログ ファイル グループが配置されているパスを指定します。デフォルト値は ./ で、データベース データ ディレクトリ内にあることを意味します。
  • innodb_log_buffer_size: REDO ログ バッファ サイズ、デフォルトは 16M。トランザクション ログのディスクへの書き込みを遅延し、REDO ログをバッファーに格納してから、innodb_flush_log_at_trx_commit パラメーターの設定に従ってバッファーからディスクにログをフラッシュします。
  • innodb_flush_log_at_trx_commit: REDO ログをディスクにフラッシュする戦略を制御します。デフォルト値は 1 です。値が 1 の場合、各コミットは REDO ログ バッファからシステムに REDO ログを書き込み、それをディスク ファイルに fsync します。値が 2 の場合、MySQL はトランザクションがコミットされるたびに、REDO ログ バッファーからシステムにログを書き込みますが、書き込み先はシステム自体によってディスク ファイルに fsync されるファイル システム バッファーのみです。データベース インスタンスがクラッシュしても、REDO ログは失われません。ただし、サーバーがクラッシュすると、ファイル システム バッファはディスク ファイルに fsync する時間がないため、この部分のデータは失われます。値が 0 の場合、トランザクションがコミットされたときに redo ログが書き込まれないことを示します。この操作はマスター スレッドでのみ完了し、マスター スレッドでは redo ログの fsync 操作が 1 秒ごとに 1 回実行されます。そのため、インスタンスがクラッシュした場合、最大で 1 秒以内のトランザクションが失われます。

REDO ログとそのバッファ サイズを変更するには、データベース インスタンスを再起動する必要があります。初期化中に評価を行うことをお勧めします。特にデータベース インスタンスが頻繁に更新される場合は、REDO ログ グループの数とサイズを適切に増やすことができます。ただし、REDO ログ サイズを大きくしすぎることはお勧めしません。

2. 元に戻すログ

UNDO ログは主にデータの原子性を保証するために使用されます。トランザクションが発生する前のデータのバージョンを保存し、ロールバックに使用できます。たとえば、INSERT ステートメントには対応する DELETE の UNDO ログがあり、各 UPDATE ステートメントには反対の UPDATE の対応する UNDO ログがあるため、エラーが発生した場合に、データをトランザクション前の状態にロールバックできます。同時に、UNDO ログは MVCC (マルチバージョン同時実行制御) の実装の鍵でもあります。

MySQL 5.7 では、UNDO ログはデフォルトで共有テーブルスペース ibdata に保存されます。初期化中にパラメータを設定することで、別のファイルに変更することもできます。次に、UNDO ログに関連するパラメータをいくつか示します。

  • innodb_max_undo_log_size: UNDO テーブルスペース ファイルの最大サイズを制御します。innodb_undo_log_truncate が有効な場合、UNDO テーブルスペースが innodb_max_undo_log_size しきい値を超えた場合にのみ切り捨てが試行されます。デフォルト値は 1G で、切り捨て後のデフォルト値は 10M です。
  • innodb_undo_tablespaces: 独立した UNDO 表領域の数を 0 から 128 の範囲で設定します。バージョン 5.7 のデフォルト値は 0 で、独立した UNDO 表領域が有効になっていないことを意味します。このパラメータは、MySQL インスタンスを最初に初期化するときにのみ指定できます。
  • innodb_undo_directory: UNDO 表領域のストレージ ディレクトリ (デフォルトのデータ ディレクトリ) を設定します。
  • innodb_undo_log_truncate: UNDO テーブルスペースが自動的に切り捨てられ、リサイクルされるかどうかを設定します。このパラメータが有効になるための前提は、独立した表領域が設定されており、独立した表領域の数が 2 以上であることです。

UNDO ログ関連のパラメータはほとんど変更されません。 MySQL 8.0 では、デフォルトで独立した表領域が有効になっているため、UNDO ログ表領域のサイズ設定がより柔軟になる可能性があります。

要約:

この記事は主にREDOログとUNDOログの役割と関連するパラメータ設定について紹介します。この記事は急いで書いたものです。間違いがあれば、メッセージを残して指摘してください。これら 2 種類のログのより深い内容については、おそらく著者はまだ、より徹底的に書く能力が十分ではないのでしょう。さて、MySQL関連のログについての記事を2つ書きました。何か参考になれば幸いです。

以下もご興味があるかもしれません:
  • MySQL の redo ログと binlog の違いを 1 つの記事で理解する
  • MySQL における redo ログと binlog の違い
  • MySQL の undo、redo、binlog の違いを簡単に分析します
  • Redo ログと Undo ログに基づく MySQL クラッシュ回復の分析
  • MySQLのREDOログとUNDOログの詳細な説明
  • MySQL Undo ログと Redo ログの概要
  • MySQL 8.0 redo ログの詳細な分析
  • MySQL シリーズ: redo ログ、undo ログ、binlog の詳細な説明
  • MySQL redo logの詳細な理解 redo log

<<:  Linux sar コマンドの使用方法とコード例の分析

>>:  Vue+element はローカル検索機能付きのドロップダウン メニューを実装します

推薦する

今日、私は非常に奇妙なクリックの問題に遭遇し、自分で解決しました

...こんな感じで、今日はポップアップウィンドウを作ろうと思ったのですが、バックエンド PHP によ...

ウェブデザインには目的、アイデア、思考、そして粘り強さがなければならない

<br />はじめに:このアイデアは、数日前に上級ウェブデザインの次の記事を考えていると...

HTML ページでコンテンツの選択、コピー、右クリックを防止する方法の詳細な説明

時には、Web ページに掲載されているコンテンツが悪意のある人物に盗用されるのを望まないため、Web...

Firefox または IE でスパン幅が決定されない場合の解決策

コードをコピーコードは次のとおりです。 <html xmlns="http://ww...

Vueのvue-tree-colorコンポーネントの組織構造図の事例を詳しく解説

目次ネプローダーをインストールするプラグインのインポート始める配置折りたたみディスプレイノードをクリ...

js+ca​​nvas でコードレイン効果を実現

この記事では、js+ca​​nvasコードの雨効果の具体的なコードを参考までに共有します。具体的な内...

HTMLで下線を設定するには?HTMLでテキストに下線を付ける方法

HTML で下線を引くには、以前はテキストを <u></u> タグで囲む必要...

JavaScript ベースのランダム点呼システムの実装

この記事では、ランダムロールコーラーを実装するためのJavaScriptの具体的なコードを参考までに...

Linux でコマンドまたはプロセスの実行時間を調べる方法

Unix ライクなシステムでは、コマンドまたはプロセスの実行がいつ開始されたか、またプロセスがどのく...

TypeScriptはvscodeを使用してコードのコンパイルプロセスを監視します

インストールtsコマンドをグローバルにインストールする npm install -g typescr...

MySQLの構文、特殊記号、正規表現の詳細な説明

Mysql でよく使用される表示コマンド1. 現在のデータベース サーバー内のデータベースの一覧を表...

UDP DUP タイムアウト UPD ポート状態検出コード例

以前、単純な UDP サーバーとクライアントの例を書きましたが、その中で、自分自身をクライアントと見...

Docker を使用した war パッケージ プロジェクトのデプロイの実装

Docker で war をデプロイするには、コンテナを使用する必要があります。ここでは tomca...

スキニングを実現するネイティブJavaScript

ネイティブJavaScriptでスキニングを実装するための具体的なコードは参考までに。具体的な内容は...

MySQLデータベースで列を追加、削除、変更する方法

この記事では、例を使用して、MySQL データベースの列を追加、削除、および変更する方法について説明...