MySQL データベースは XA 仕様をどのように実装しますか?

MySQL データベースは XA 仕様をどのように実装しますか?

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 サーバー上で発生するか、複数の外部ノード間で発生するかです。

内部 XA

MySQL の 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 構造が追加されます。バイナリログには複数のデータ型があります。

  1. ステートメント形式、レコードはコミットを含む基本ステートメントです
  2. 行形式、レコードは行に基づいています
  3. 混合形式、ログレコードは混合形式を使用します

ステートメントや行の形式に関係なく、binlog はトランザクションの終了時に XID_EVENT を追加します。このイベントはトランザクション ID、つまり Xid を記録します。MySQL がクラッシュ リカバリを実行する場合、binlog 内のコミットのステータスに基づいてリカバリ方法を決定します。

Binlog同期プロセス

binlog でのトランザクション送信プロセスを見てみましょう。全体的なプロセスは、最初に redo ログを書き込み、次に binlog を書き込むというもので、binlog の書き込みが成功すれば、トランザクション送信が成功したことの印として使用されます。

トランザクションがコミットされると、次のようになります。

  • InnoDB は準備フェーズに入り、REDO ログの書き込み/同期、REDO ログの書き込み、トランザクション xid の REDO ログへの書き込みを行いますが、バイナリログに対しては何も操作を実行しません。
  • binlog の書き込み/同期、binlog ログの書き込み、および xid の binlog への書き込み
  • InnoDBエンジンのコミットを呼び出してトランザクションを完了し、コミット情報をREDOログに書き込みます。

最初のステップと 2 番目のステップが失敗した場合、トランザクション全体がロールバックされます。

3 番目のステップが失敗した場合、MySQL は再起動後に xid がコミットされたかどうかを確認します。コミットされていない場合、つまりトランザクションを再実行する必要がある場合は、ストレージ エンジンで別のコミット操作を実行して、REDO ログと binlog データの一貫性を確保し、データ損失を防ぎます。

実際の実行には、オペレーティング システムのキャッシュ バッファーがファイル システムに同期されるタイミングも含まれるため、MySQL では、コミット時にログ バッファー内のログをログ ファイルにフラッシュする方法をユーザーがカスタマイズできるようにサポートされています。これは、変数 innodb_flush_log_at_trx_Commit の値によって決まります。

ログ バッファの内容はダーティ ログと呼ばれます。興味のある方は、詳細情報を確認してください。

上記は、MySQL データベースが XA 仕様を実装する方法の詳細です。MySQL データベース XA 仕様の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL クロスデータベーストランザクション XA 操作の例
  • MySQL に絵文字を保存するときに表示されるエラー メッセージ「java.sql.SQLException: 文字列値が正しくありません:'\xF0\x9F\x92\xA9\x0D\x0A...'」の解決方法
  • Xampp サーバーで MySQL パスワードを変更する方法 (画像付き)
  • Mac で XAMPP に付属する MySQL をターミナルを使って開く方法
  • xampp で MySQL のデフォルト パスワードを変更する方法
  • ThinkPHP フレームワークの構築とよくある問題 (XAMPP インストール失敗、Apache/MySQL 起動失敗)
  • xampp で MySQL のデフォルトの空のパスワード (ルート パスワード) を変更する方法
  • MySQLのXAトランザクションリカバリプロセスの詳細な説明
  • xampp のセルフスタートと mysql.sock の問題を解決する

<<:  Docker に MySQL と Redis をインストールする方法

>>:  XHTML 入門チュートリアル: Web ページのヘッダーと DTD

推薦する

Linux スワップ パーティション (詳細説明)

目次リナックス1. SWAPとは2. swappiness は何を調節しますか? 3. スワップ操作...

要素テーブルヘッダー行の高さの問題の解決

目次序文1. 問題の原因2. 解決策VueはelementUIテーブルtr thの高さと背景色を変更...

Linux の Makefile とは何ですか? どのように機能しますか?

この便利なツールでプログラムをより効率的に実行およびコンパイルしますMakefile は自動コンパイ...

CSSは2つの要素をブレンドする効果(スティッキー効果)を実現します。

数年前、Taobaoのモバイル版の左下隅に面白い丸いボタンがあったことを覚えています。それをクリック...

MySQL の自動増分 ID (主キー) が不足した場合の解決策

MySQL で使用される自動インクリメント ID には多くの種類があり、各自動インクリメント ID ...

Dockerコアとインストールの具体的な使い方

1. Docker とは何ですか? (1)DockerはLinuxコンテナ内でアプリケーションを実行...

MySQL での find_in_set() 関数の使用に関する詳細な説明

まず、例を見てみましょう。記事テーブルにはタイプフィールドがあり、1 見出し、2 おすすめ、3 ホッ...

JavaScript のシングルトン デザイン パターン

目次1. デザインパターンとは何ですか? 2. デザインパターンの5つの設計原則(SOLID) 3....

ネイティブ js はカスタム スクロール バー コンポーネントを実装します

この記事の例では、カスタムスクロールバーコンポーネントを実装するためのjsの具体的なコードを参考まで...

Centos7 での DNS サーバーの構築の概要

目次1. プロジェクト環境: 2: DNSサーバーの設定i: 前方解析を構成する: ii: 逆解像度...

MySQL メタデータで Hive テーブル作成ステートメントのコメント スクリプトを生成する方法

序文この記事は主にMySQLメタデータ生成Hiveテーブル作成ステートメントコメントスクリプトに関す...

Vueコンポーネントの再利用と拡張の詳細な説明

目次概要延長は必要ですか?スロットJavaScript ユーティリティ関数拡張コンポーネントの複数の...

Nginx 500 内部サーバーエラーの解決方法

今日、Nginxを使っていたら500エラーが発生しました。エラーコードを検索してみんなに共有しました...

Vue コード強調プラグインの総合的な比較と評価

目次総合的な比較アクティブの観点から機能的な観点から詳細な比較1. エース2. コードミラー3. モ...

Jsonフォーマットの詳細な説明

目次JSON は次の 2 つの構造に基づいて構築されます。 2. JSON形式1. オブジェクト2....