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) 問題の分析と解決

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

推薦する

CSS3のtransform属性で実装される4つの機能

CSS3 では、transform 関数を使用して、テキストや画像の回転、拡大縮小、傾斜、移動という...

ボリュームを使用してホストと Docker コンテナ間でファイルを転送する方法

以前、Docker コンテナとローカル マシン間のファイル転送に関する記事を書きました。しかし、この...

Baidu サイト検索が https をサポートしていない問題の解決策 (テスト済み)

最近、携帯電話で https が有効になりました。緑色のロックを取得するには、次の問題を解決する必要...

LinuxでIPを表示する方法の例

ネットワークの問題のトラブルシューティング、新しい接続のセットアップ、ファイアウォールの構成を行うと...

ウェブ上の模倣と盗作に関する議論

2005年に業界に入ってから数か月後、労働者の日休みの期間中、1か月以上毎日12時まで残業をしました...

MySQLステートメントを監視する方法の詳細な説明

クイックリーディングSQL ステートメントを監視する必要があるのはなぜか、監視方法と監視手段について...

Dockerを使用してブログサイトを素早く構築する方法の詳細な説明

目次1. 準備2. 展開プロセス3. アクセステストHalo は、ブログに慣れている学生に追加のオプ...

CentOS8 ネットワークカード設定ファイル

1. はじめにCentOS8 システムの更新、新しいバージョンは人々に非常に快適に感じさせます。 こ...

MySQLチュートリアルではストアドプロシージャを徹底的に理解します

目次1. ストアドプロシージャに関連する概念2. ストアドプロシージャの使用1) ストアドプロシージ...

Reactイベントメカニズムソースコード分析

目次原理ソースコード分析委任されたイベントバインディングすべてのサポートされているイベントを聴くネイ...

JavaScript の async と await のシンプルで詳細な学習

目次1. はじめに2. 詳しい説明2.1、非同期2.1.1. 関数はPromise以外のオブジェクト...

レアタグフィールドセットと凡例の使用方法の詳細な説明

<fieldset>と<legend>については、ほとんどの人はおそらく馴染...

HTMLページ埋め込み動画とJSコントロール切り替え動画例の詳しい説明

まず、ページにビデオを埋め込むための HTML コードは次のとおりです。コードをコピーコードは次のと...

Linux デバイスに空き容量がありません inode の満杯により 500 エラーが発生します

iノードとは何ですか? inode を理解するには、まずファイル ストレージから始める必要があります...

Tencent Cloud Serverをゼロから導入する方法

初めての投稿ですので、間違いや問題点などありましたら、コメント欄で指摘していただければ、今後改善させ...