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

推薦する

IE6のバグと修正は予防戦略です

元記事:究極の IE6 チートシート: 25 以上の Internet Explorer 6 のバグ...

Nodejs と Socket.IO を組み合わせて Websocket の即時通信を実現

目次WebSocketを使用する理由ソケット.ioオープンソースプロジェクト効果プレビューアプリイン...

Linux コマンドを素早く習得する 4 つの方法

Linux マスターになりたいなら、いくつかの Linux コマンドを習得することが不可欠です。 L...

nginx ベースのブラウザネゴシエーションキャッシュプロセスの詳細な説明

この記事は主に、nginx に基づいてブラウザネゴシエーションキャッシュを設定する詳細なプロセスを紹...

MySQL 8.0 の降順インデックス

序文インデックスが順序付けられていることは誰もが知っていると思いますが、MySQL の以前のバージョ...

インターネットウェブデザインにおけるバイオニックデザインの簡単な紹介

バイオニックデザインといえば、飛行機の発明、ドバイのブルジュ・アル・アラブ、平泳ぎなどを思い浮かべる...

PXEを使用してLinuxシステムを自動的に展開する方法

目次背景DHCPの設定DHCP ファイル (動的ホスト構成プロトコル) の編集tftp 設定sysl...

MySQL マスタースレーブ同期の原理と応用

目次1. マスタースレーブ同期原理マスタースレーブ同期アーキテクチャ図(非同期同期)マスタースレーブ...

MySQL 起動エラーを解決する: エラー 2003 (HY000): 'localhost' の MySQL サーバーに接続できません (10061)

このエラーは初心者によく発生します。この記事では主に、エラー 2003 (HY000): '...

背景画像の配置におけるbackground-position属性の自己理解

最近、プロジェクトではラベルやボタンなどの断片的な画像をたくさん使用する必要があります。また、CSS...

Linux bzip2 コマンドの使用

1. コマンドの紹介bzip2 は、ファイルの圧縮と解凍に使用されます。これは、Linux システム...

DockerでGPUを使用するプロセスの詳細な説明

目次tf-gpu をダウンロード取得したtf-gpuイメージに基づいて独自のイメージを構築するイメー...

MySQLデータベースのトランザクションとロックの詳細な分析

目次1. 基本概念酸3.自動コミット4. トランザクション分離レベル5. 同時実行の一貫性の問題6....

ゲームの Node.JS バージョンを作成する方法

目次概要ビルドプロセス関連APIリードライン基本的な使い方チョーククリア手順に関する追加情報完全なコ...

大規模なウェブサイトアーキテクチャを設計・構築する際に考慮すべき10の課題

ここでは、PHP、JSP、または .NET 環境については説明しません。アーキテクチャの観点から問題...