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 はローカル検索機能付きのドロップダウン メニューを実装します

推薦する

Node.jsミドルウェアの仕組みの詳細な説明

目次Express ミドルウェアとは何ですか? Expressミドルウェアを作成するための要件Exp...

React で遅延読み込みを使用して最初の画面の読み込み時間を短縮する方法

目次使用インストールルーティングでどのように使用しますか?読み込み速度の比較最近、中間およびバックエ...

Windows 10 インストール vmware14 チュートリアル図

ソフトウェアのダウンロードソフトウェアのダウンロード リンク: https://pan.baidu....

ReactでのsetStateの使用と同期と非同期の使用

React では、this.state を使用して状態を直接変更しても、コンポーネントは再レンダリン...

IDEA で Docker を WSL2 にデプロイする詳細なプロセス

ローカル環境はWindows10+WSL2(Ubuntu)です。サーバーにDockerをインストール...

Vue プロジェクトで mock を使用する方法をご存知ですか?

目次最初のステップ: 2 番目のステップは、request.js で関連する構成を行うことです。re...

MySQLのインデックス設計の原則と一般的なインデックスの違いについて簡単に説明します。

インデックス定義: ディスク上に保存される個別のデータベース構造であり、データ テーブル内のすべての...

MySQLインデックスが使用されない状況のまとめ

MySQL のインデックスの種類一般的に、次の 4 つのカテゴリに分類できます。通常のインデックス:...

2008 年の Web デザインにおける 10 の経験

<br />インターネットは絶えず変化しており、BusinessWeek.com は専門...

Angularプロジェクトにおける共有モジュールの実装の詳細な説明

目次1. 共有共通モジュール2. 共有マテリアルモジュール3. 共有確認ダイアログ1. 共有共通モジ...

ウェブページの読み込み速度を上げる簡単なヒント

Web ページの読み込み速度は、Web サイトの品質を評価するための重要な指標です。その理由は、ほと...

Docker5フル機能の港湾倉庫構築プロセス

Harbor は、Docker イメージを保存および配布するためのエンタープライズ レベルのレジスト...

CSS3で実装されたスライドメニュー

結果:実装コード: <!DOCTYPE html><html class=&quo...

HTML で複数のクラス属性を定義する場合の無効な解決策

HTML を記述する過程で、クラス属性に複数の値を定義することがよくありますが、定義した値が無効であ...

MySQL のユニークインデックスと通常のインデックスのどちらを選択すればよいでしょうか?

ユーザー テーブルを設計するときに、各人の ID 番号が一意であり、検索する必要があるシナリオを想像...