MySQL の undo、redo、binlog の違いを簡単に分析します

MySQL の undo、redo、binlog の違いを簡単に分析します

序文

MySQL には、REDO ログ、UNDO ログ、バイナリ ログ、エラー ログ、スロー クエリ ログ、一般ログ、リレー ログの 6 種類のログ ファイルがあります。

その中で、REDO ログとロールバック ログはトランザクション操作と密接な関係があり、バイナリ ログもトランザクション操作と一定の関係があります。これら 3 つのログは、MySQL でのトランザクション操作を理解する上で非常に重要です。

異なるエンジンとの関係中核的な役割ライフサイクルログタイプ
元に戻すログInnoDBエンジンに固有のものロールバック、トランザクションの「アトミック性」の確保、トランザクションログ取引が始まる前に、「スナップショット」と同様の方法でシーンを記録します論理ログ
再実行ログInnoDBエンジンに固有のものやり直し、トランザクションの「耐久性」の確保、トランザクションログトランザクションの開始後に記録され、準備フェーズ中にディスクに書き込まれます。物理ログ
バイナリログ使用されるエンジンに関係なく、MySQL サーバー レベルで動作します。マスタースレーブノードデータの複製を実現するトランザクション実行中に記録され、コミットフェーズが完了する前にディスクに書き込まれます。論理ログ

【ログ取り消し】

トランザクションが開始する前に、現在のトランザクション バージョンの UNDO ログを生成します (ヒント: UNDO ログは、UNDO ログの信頼性を確保するために REDO ログも生成します)。

トランザクションがコミットされた後、UNDO ログはすぐに削除されず、リンク リストに格納されてクリーンアップされます。パージ スレッドは、UNDO セグメント内のテーブルで前のトランザクションより前のバージョン情報を他のトランザクションが使用しているかどうかを判断し、UNDO ログのログ領域をクリーンアップできるかどうかを決定します。

データベース トランザクションの 4 つの主要な特性の 1 つは、原子性です。具体的には、原子性とは、データベースに対する一連の操作が完全に成功するか、完全に失敗するかのいずれかであることを意味します。部分的な成功はあり得ません。

実際、基礎となるアトミック性は、UNDO ログを通じて実現されます。 UNDO ログは主にデータの論理的な変更を記録します。たとえば、INSERT ステートメントの場合、対応する DELETE UNDO ログがあります。各 UPDATE ステートメントには、対応する反対の UPDATE UNDO ログがあります。このようにして、エラーが発生した場合、トランザクション前のデータ状態をロールバックできます。たとえば、ユーザー テーブルの元のレコードは次のようになります。

id名前
1シャオミン

sql update user set name = 'xiaohong' where id = 1;を実行すると、生成される undo ログはおそらくupdate user set name = 'xiaoming' where id = 1;なります。

同時に、UNDO ログは MVCC (マルチバージョン同時実行制御) の実装の鍵でもあります。

【REDOログ】

MySQL はどのようにしてトランザクションの永続性を確保するのでしょうか?最も簡単な方法は、トランザクションがコミットされるたびに、トランザクションに関係するすべての変更されたデータ ページをディスクに更新することです。ただし、そうすると、主に次の 2 つの点で重大なパフォーマンス上の問題が発生します。

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

そのため、MySQL は REDO ログ メカニズムを設計し、WAL (Write-Ahead Logging) テクノロジを通じてパフォーマンスを最適化しました。 WAL の中核は、最初にシーケンシャル IO でログ ディスクに書き込み、次にランダム IO でデータ ディスクに書き込むことで、ランダム ディスク書き込みの IO 消費を節約します。 MySQL は、DML ステートメントを実行するたびに、まずレコードを順番に REDO ログ バッファに追加し、メモリ内のデータを更新します。次に、アイドル スレッドがある場合、メモリが不足している場合、または REDO ログがいっぱいの場合、永続性を保つためにレコードをバッチでディスクに書き込みます。

【バイナリログ】

Binlog は MySQL の論理ログであり、サーバー層によって記録されます。任意のデータベース エンジンの書き込み操作 (クエリを除く) 情報を記録し、バイナリ形式でディスクに保存されます。

実際のアプリケーションでは、binlog は主にマスター スレーブ レプリケーションとデータ回復の 2 つのシナリオで使用されます。

  • マスタースレーブレプリケーション: マスター側でバイナリログを開き、各スレーブ側にバイナリログを送信します。スレーブ側はバイナリログを再生して、マスタースレーブデータの一貫性を実現します。
  • データ復旧: mysqlbinlog ツールを使用してデータを復旧します。

データ更新プロセス中に、システムに障害が発生して異常再起動した場合、トランザクションの永続性とアトミック性をどのように保証できますか?概要は次のとおりです。

  1. この更新前のデータレコードのスナップショットサイトを記録する(つまり、UNDOログを書き込む)
  2. この更新に必要なデータをメモリに読み込みます
  3. メモリ内のデータを更新する(高効率)
  4. REDOログを書き込み、REDOログのステータスを準備に設定します。
  5. binlog の書き込み
  6. REDOログのステータスをコミットに設定する

上記の簡略化された UNDO ログ、REDO ログ、および binlog 書き込みプロセスに基づいて、原子性、永続性、一貫性の信頼性保証を整理してみましょう。

A) ステップ 1/2/3 のいずれかで障害が発生した場合、リカバリ後に、REDO ログに未完了のレコードがないことがわかります。リカバリ後は、シーンを復元するために UNDO ログをロールバックするだけで済みます。

B) ステップ 4 または 5 のいずれかのステップで障害が発生し、障害回復後に REDO ログが準備状態にあることが判明した場合は、さらにそれが binlog に書き込まれているかどうかを判断します。

  1. データがバイナリログに書き込まれている場合は、コミット状態が正常に達成されるまで(マスタースレーブ一貫性)、REDO ログの関連レコードを再実行します。
  2. binlog が書き込まれていない場合は、undo ログをロールバックしてシーンを復元します (アトミック性)。

C) ステップ 6 で障害が発生した場合、リカバリ後に、REDO ログがコミットされた状態になっていることが確認され、プロセスが正常に完了したことが示されるため、何もする必要はありません。

要約する

これで、MySQL の undo、redo、binlog の違いに関するこの記事は終了です。MySQL の undo、redo、binlog の違いの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

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

<<:  IE6/7 における a.getAttribute(href,2) 問題の分析と解決

>>:  フレックスレイアウトは、上下固定、中間スライドのレイアウトモードを実現します。

推薦する

図を使ってWeb2.0とは何かを説明する

最近はWeb2.0という言葉をよく耳にしますが、Web2.0とは何でしょうか? Web 1.0 とど...

MySQL 外部キー制約とテーブル関係の概要

目次外部キーテーブルの関係を決定する方法テーブル関係を作成する方法1対多の関係 - 従業員テーブルと...

Windows サーバー管理におけるセキュリティの考慮事項

ウェブサーバー1. Webサーバーは、wev、cgi、asp機能を無効にするなど、不要なIISコンポ...

HTMLテーブルタグの詳しい解説(初心者向け)

表> <TR> <TD> <TH> <キャプション&...

MySQL の制限ページング最適化ソリューションの実装に関する簡単な説明

MySQL のページングステートメントの使用制限Oracle や MS SqlServer と比較す...

MySQL 5.7 のキーワードと予約語の詳細な説明

序文MySQL と Oracle のキーワードはまったく同じではありません。Oracle データベー...

MySQL無料インストール版のパスワードの設定と変更に関するチュートリアル

ステップ 1: 環境変数を構成する (解凍パス: G:\mysql\mysql-5.7.21-win...

CSS3 メディアクエリにおけるデバイス幅と幅の違いの詳細な説明

1.デバイス幅定義: 出力デバイスの画面表示幅を定義します。 Web ページが Safari で開か...

CSS3 画像の境界線を学ぶのに役立つ記事

CSS3 border-image プロパティを使用すると、要素の周囲に画像の境界線を設定できます。...

きれいなJavaScriptコードの書き方を教える記事

目次1. 変数意味のある名前を使う不必要なコンテキストを追加しないようにするハードコードされた値を避...

WMLタグの概要

構造関連タグ--------------------------------------------...

js で下線とキャメルケースの変換を実装する (複数の方法)

目次適用シナリオ:方法 1: 正規表現 (推奨)方法2: 配列のreduceメソッドを使用する方法3...

CentOS7でパーティションのサイズを変更する方法

昨日、ある人のシステムのインストールを手伝ったのですが、自動パーティション分割をクリックするのを忘れ...

MySQL は、現在のデータ テーブル内のすべての時間に対して指定された時間間隔を増加または減少させます (推奨)

DATE_ADD() 関数は、指定された時間間隔を日付に追加します。現在のテーブル内のすべてのデー...