MySQL 一貫性ログMySQL データベースの電源が切れた場合、コミットされていないトランザクションはどうなりますか? 回答: ログに頼ります。 操作を実行する前に、データベースはまず操作の内容をファイル システム ログに書き込み、その後操作を実行するためです。システムがクラッシュしたり、電源が落ちたりした場合、操作が完了していなくても、操作前にログが書き込まれているため、ログの内容に基づいて復旧することができます。 MySQL InnoDB エンジンでは、REDO ログ、ロールバック ログ、バイナリ ログが一貫性に関係します。 再実行ログ操作が実行されるたびに、データが実際に変更される前に、関連する操作が REDO ログに書き込まれます。これにより、予期せぬ停電やその他の事故が発生し、後続のタスクを完了できなくなった場合でも、システムの復旧後にこれらの変更を続行できます。 元に戻すログREDO ログ (UNDO ログとも呼ばれます) に対応し、トランザクションが開始する前のデータの状態を記録します。 予期しない状況により一部の変更が完了できなかった場合、元に戻すログに基づいて変更前の状態を復元できます。 たとえば、トランザクション T1 はデータ X を更新し、X に対して更新操作を実行して、データを 10 から 20 に更新します。対応する Redo ログは <T1, X, 20> で、Undo ログは <T1, X, 10> です。 バイナリログMySQL サーバー層で保持されるバイナリ ログです。MySQL の最も重要なログの 1 つです。select や show などのデータ クエリ ステートメントに加えて、ステートメントの実行時間を含むすべての DDL および DML ステートメントが記録されます。 Binlog は、InnoDB エンジンの redo/undo ログとは異なります。主な目的はレプリケーションとリカバリです。MySQL データを更新する、または更新する可能性のある SQL ステートメントを記録し、トランザクション ログの形式でディスクに保存するために使用されます。 Binlog は主に MySQL のマスター スレーブ レプリケーション プロセスで使用されます。MySQL クラスターはマスター側で Binlog を開始します。マスターはバイナリ ログをスレーブ ノードに渡し、スレーブ ノードはそれを再生してマスター スレーブ間のデータ整合性を実現します。 次のコマンドを使用して、MySQL サーバーに接続し、実際の binlog データを表示できます。 // binlog ファイルの内容を表示します。show binlog events; // 指定された binlog ファイルの内容を表示します。show binlog events in 'MySQL-bin.000001'; //書き込まれているバイナリログファイルを表示する show master status\G // バイナリログファイルリストを取得します。バイナリログを表示します。 XA仕様の定義方法XA は、X/Open 組織によって提案された分散トランザクション仕様です。XA 仕様は、主にトランザクション コーディネータ (トランザクション マネージャ) とリソース マネージャ (リソース マネージャ) 間のインターフェイスを定義します。 トランザクションマネージャーXA トランザクションは 2 フェーズ コミット プロトコルに基づいているため、コーディネーターはすべてのトランザクション参加者が 2PC の最初のフェーズである準備作業を完了したことを確認する必要があります。 トランザクション コーディネーターは、すべての参加者が準備完了であるというメッセージを受信すると、すべてのトランザクションにコミット可能であることを通知します。これが 2PC の第 2 フェーズです。 トランザクション コーディネーターを導入する必要がある理由は、分散システムでは、2 台のマシンが理論上一貫した状態に到達できず、調整のために単一のポイントを導入する必要があるためです。 リソース マネージャーデータベースや JMS キューなどの実際のリソースの制御と管理を担当します。 現在、主流のデータベースはすべて XA をサポートしています。JMS 仕様、つまり Java Message Service では、XA に基づくトランザクションのサポートも定義されています。 XAトランザクション実行プロセスXA トランザクションは、2 フェーズ コミットの実装です。2PC 仕様によれば、XA はトランザクションを準備とコミットの 2 つのフェーズに分割します。 準備段階TM はすべての RM に準備指示を送信します。指示を受け取った RM は、データの変更やログ記録などの操作を実行し、タスクを送信できるかどうかを示すメッセージを TM に返します。 トランザクション コーディネーター TM は、すべての参加者が準備完了したというメッセージを受信すると、すべてのトランザクションにコミットするように通知し、第 2 フェーズに入ります。 コミットフェーズTM はすべての RM から準備結果を受信します。RM が結果を送信できないかタイムアウトしたと返した場合、TM はすべての RM にロールバック コマンドを送信します。 すべての RM がトランザクションを送信できると返した場合、トランザクション操作を完了するためにすべての RM にコミット コマンドが送信されます。 MySQL が XA 仕様を実装する方法MySQL には、内部 XA と外部 XA の 2 種類の XA トランザクションがあります。違いは、トランザクションが単一の MySQL サーバー上で発生するか、複数の外部ノード間で発生するかです。 内部 XAMySQL の InnoDB ストレージ エンジンでは、binlog が有効になっている場合、MySQL は binlog ログと InnoDB の redo ログの両方を維持します。2 つのログの一貫性を確保するために、MySQL は XA トランザクションを使用します。これは単一の MySQL マシンで動作するため、内部 XA と呼ばれます。 内部 XA トランザクションは、バイナリ ログのコーディネーターです。トランザクションがコミットされると、コミット情報がバイナリ ログに書き込まれる必要があります。つまり、バイナリ ログの参加者は MySQL 自身です。 外部XA外部 XA は典型的な分散トランザクションです。MySQL は XA START/END/PREPARE/Commit などの SQL ステートメントをサポートしています。これらのコマンドを使用することで分散トランザクションを完了できます。 その他の XA コマンドについては、MySQL の公式ドキュメントも参照してください。 MySQL 外部 XA は主にデータベース プロキシ層で使用され、Taobao の TDDL、Alibaba B2B の Cobar などのオープン ソース データベース中間層などの MySQL データベースの分散トランザクション サポートを実装します。 外部 XA は一般に、複数の MySQL インスタンスにわたる分散トランザクションに使用され、アプリケーション層がコーディネーターとして機能する必要があります。たとえば、ビジネス コードを記述する場合、コード内でコミットするかロールバックするかを決定し、クラッシュが発生した場合に回復します。 binlog 内の Xidトランザクションがコミットされると、バイナリログが依存する内部 XA に追加の Xid 構造が追加されます。バイナリログには複数のデータ型があります。
ステートメントや行の形式に関係なく、binlog はトランザクションの終了時に XID_EVENT を追加します。このイベントはトランザクション ID、つまり Xid を記録します。MySQL がクラッシュ リカバリを実行する場合、binlog 内のコミットのステータスに基づいてリカバリ方法を決定します。 Binlog同期プロセスbinlog でのトランザクション送信プロセスを見てみましょう。全体的なプロセスは、最初に redo ログを書き込み、次に binlog を書き込むというもので、binlog の書き込みが成功すれば、トランザクション送信が成功したことの印として使用されます。 トランザクションがコミットされると、次のようになります。
最初のステップと 2 番目のステップが失敗した場合、トランザクション全体がロールバックされます。 3 番目のステップが失敗した場合、MySQL は再起動後に xid がコミットされたかどうかを確認します。コミットされていない場合、つまりトランザクションを再実行する必要がある場合は、ストレージ エンジンで別のコミット操作を実行して、REDO ログと binlog データの一貫性を確保し、データ損失を防ぎます。 実際の実行には、オペレーティング システムのキャッシュ バッファーがファイル システムに同期されるタイミングも含まれるため、MySQL では、コミット時にログ バッファー内のログをログ ファイルにフラッシュする方法をユーザーがカスタマイズできるようにサポートされています。これは、変数 innodb_flush_log_at_trx_Commit の値によって決まります。 ログ バッファの内容はダーティ ログと呼ばれます。興味のある方は、詳細情報を確認してください。 上記は、MySQL データベースが XA 仕様を実装する方法の詳細です。MySQL データベース XA 仕様の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Docker に MySQL と Redis をインストールする方法
>>: XHTML 入門チュートリアル: Web ページのヘッダーと DTD
目次リナックス1. SWAPとは2. swappiness は何を調節しますか? 3. スワップ操作...
目次序文1. 問題の原因2. 解決策VueはelementUIテーブルtr thの高さと背景色を変更...
この便利なツールでプログラムをより効率的に実行およびコンパイルしますMakefile は自動コンパイ...
数年前、Taobaoのモバイル版の左下隅に面白い丸いボタンがあったことを覚えています。それをクリック...
MySQL で使用される自動インクリメント ID には多くの種類があり、各自動インクリメント ID ...
1. Docker とは何ですか? (1)DockerはLinuxコンテナ内でアプリケーションを実行...
まず、例を見てみましょう。記事テーブルにはタイプフィールドがあり、1 見出し、2 おすすめ、3 ホッ...
目次1. デザインパターンとは何ですか? 2. デザインパターンの5つの設計原則(SOLID) 3....
この記事の例では、カスタムスクロールバーコンポーネントを実装するためのjsの具体的なコードを参考まで...
目次1. プロジェクト環境: 2: DNSサーバーの設定i: 前方解析を構成する: ii: 逆解像度...
序文この記事は主にMySQLメタデータ生成Hiveテーブル作成ステートメントコメントスクリプトに関す...
目次概要延長は必要ですか?スロットJavaScript ユーティリティ関数拡張コンポーネントの複数の...
今日、Nginxを使っていたら500エラーが発生しました。エラーコードを検索してみんなに共有しました...
目次総合的な比較アクティブの観点から機能的な観点から詳細な比較1. エース2. コードミラー3. モ...
目次JSON は次の 2 つの構造に基づいて構築されます。 2. JSON形式1. オブジェクト2....