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

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

推薦する

Win 8 以降での最新の MySQL バージョン 5.7.17 (64 ビット ZIP グリーン バージョン) のインストールと展開のチュートリアル

まず、ブロガーはコミュニティ バージョンをプレイしていますが、学習とテストにはこれで十分です。 Bl...

Element PlusはAffixを実装します

目次1. コンポーネントの紹介2. ソースコード分析2.1 テンプレート2.2 スクリプト2.3 実...

MySQL 百万レベルのデータページングクエリ最適化ソリューション

データベースからクエリする必要があるテーブルに数万件のレコードがある場合、すべての結果を一度にクエリ...

12個のJavascriptテーブルコントロール(DataGrid)が整理されています

DataGrid コントロールの DataSource プロパティがデザイン時に設定されている場合、...

MySQLのROUND関数の丸め演算における落とし穴の分析

この記事では、MySQL の ROUND 関数を使用した丸め操作の落とし穴を例を使って説明します。ご...

jQuery プロジェクトで重複送信を防ぐ方法

新しいプロジェクトでは、axios によって重複した送信を防ぐことができますが、古いプロジェクト (...

Dockerの一般的なコマンドとヒントのまとめ

インストールスクリプトUbuntu / CentOS Debian のインストールに問題があるようで...

Vue で video.js を使用して m3u8 形式のビデオを再生する方法

目次1. インストール2. videojsの紹介3. コンポーネントでのテストと使用1. 基本的な自...

色の16進数カラーコード表表示と16進値の比較表示で簡単に検索できます

さまざまな色の16進コード表[パート1] 赤とピンク、およびそれらの 16 進コード。 #99003...

SSHのssh-keygenコマンドの基本的な使い方の詳細な説明

SSH 公開鍵認証は、SSH 認証方式の 1 つです。 SSH パスワードフリーのログインは公開鍵認...

Vueのコンポーネントの詳細な説明

目次1. コンポーネントの登録2. コンポーネントの使用3. 父から息子へ4. 息子から父へ5. ス...

MySql インデックスを表示および最適化する方法

MySQL はハッシュ インデックスと Btree インデックスをサポートしています。 InnoDB...

ElementUI el-select の過剰なデータに対する解決策についての簡単な説明

目次1. シナリオの説明2. 解決策オプションが多すぎる el-select コンポーネントの解決策...

HTML に基づいてページを更新せずにフォーム送信を実装する

ページを更新せずにフォーム送信を実装するために Ajax を使用することは、プロジェクトでよく使用さ...