MySQL 8.0 リファレンスマニュアル


17.1.4.1 レプリケーションモードの概念

オンラインサーバーのレプリケーションモードを安全に構成できるようにするには、レプリケーションのいくつかの重要な概念を理解することが重要です。 このセクションでは、オンラインサーバーのレプリケーションモードを変更する前に、これらの概念について説明し、不可欠な読み取り値を示します。

MySQL で使用可能なレプリケーションのモードは、ログに記録されるトランザクションを識別するための様々な手法に依存します。 レプリケーションで使用されるトランザクションのタイプは次のとおりです:

  • GTID トランザクションは、UUID:NUMBER 形式のグローバルトランザクション識別子 (GTID) によって識別されます。 ログ内の GTID トランザクションはすべて、常に Gtid_log_event で始まります。 GTID トランザクションは GTID を使用するか、ファイル名とポジションを使用して対処できます。

  • 匿名トランザクションに GTID が割り当てられておらず、MySQL はログ内のすべての匿名トランザクションの前に Anonymous_gtid_log_event があることを確認します。 以前のバージョンでは、匿名トランザクションの前に特定のイベントはありませんでした。 匿名トランザクションは、ファイル名と位置を使用してのみ処理できます。

GTID を使用する場合は、GTID 自動配置および自動フェイルオーバーを利用したり、WAIT_FOR_EXECUTED_GTID_SET()session_track_gtids を使用したり、「パフォーマンススキーマ」テーブルを使用してレプリケートされたトランザクションをモニターしたりできます。

以前のバージョンの MySQL を実行しているソースから受信されたリレーログ内のトランザクションの前には、特定のイベントがまったく表示されない場合がありますが、リプレイされてレプリカバイナリログに記録されたあとは、それらのトランザクションの前に Anonymous_gtid_log_event が付きます。

レプリケーションモードをオンラインで構成する機能は、gtid_mode 変数と enforce_gtid_consistency 変数の両方が動的になり、グローバルシステム変数の設定に十分な権限を持つアカウントによって最上位レベルのステートメントから設定できることを意味します。 セクション5.1.9.1「システム変数権限」を参照してください。 MySQL 5.6 以前では、これらの変数は両方とも、サーバーの起動時に適切なオプションを使用してのみ構成できました。つまり、レプリケーションモードへの変更にはサーバーの再起動が必要でした。 すべてのバージョンで、gtid_modeON または OFF に設定でき、GTID がトランザクションの識別に使用されたかどうかに対応します。 gtid_mode=ON で匿名トランザクションをレプリケートできない場合、および gtid_mode=OFF でレプリケートできるのは匿名トランザクションのみです。 gtid_mode=OFF_PERMISSIVE の場合、new トランザクションは匿名ですが、レプリケートされたトランザクションを GTID または匿名トランザクションにすることを許可します。 gtid_mode=ON_PERMISSIVE の場合、new トランザクションは GTID を使用しますが、レプリケートされたトランザクションを GTID または匿名トランザクションにすることを許可します。 つまり、匿名トランザクションと GTID トランザクションの両方を使用するサーバーを持つレプリケーショントポロジを使用できます。 たとえば、gtid_mode=ON を含むソースは、gtid_mode=ON_PERMISSIVE を使用してレプリカにレプリケートできます。 gtid_mode の有効な値は次のとおりで、順序は次のとおりです:

  • OFF

  • OFF_PERMISSIVE

  • ON_PERMISSIVE

  • ON

gtid_mode の状態は、前述の順序に基づいて一度に 1 つのステップでのみ変更できることに注意してください。 たとえば、gtid_mode が現在 OFF_PERMISSIVE に設定されている場合、OFF または ON_PERMISSIVE に変更できますが、ON には変更できません。 これは、匿名トランザクションから GTID トランザクションへの変更プロセスがサーバーによって正しく処理されるようにするためです。 gtid_mode=ONgtid_mode=OFF を切り替えると、GTID 状態 (つまり、gtid_executed の値) は永続的になります。 これにより、gtid_mode のタイプ間の変更に関係なく、サーバーによって適用された GTID セットが常に保持されます。

GTID に関連するフィールドには、現在選択されている gtid_mode に関係なく、正しい情報が表示されます。 つまり、GTID セットを表示するフィールド (replication_connection_status「パフォーマンススキーマ」テーブルの gtid_executed, gtid_purged, RECEIVED_TRANSACTION_SET など) および SHOW REPLICA | SLAVE STATUS の GTID 関連の結果は、GTID が存在しない場合に空の文字列を返すようになりました。 GTID トランザクションが使用されていないときに、パフォーマンススキーマ replication_applier_status_by_worker テーブル内の CURRENT_TRANSACTION などの単一 GTID を表示するフィールドに ANONYMOUS が表示されるようになりました。

gtid_mode=ON を使用するソースからのレプリケーションでは、CHANGE REPLICATION SOURCE TO ステートメント (MySQL 8.0.23 から) の SOURCE_AUTO_POSITION、または CHANGE MASTER TO ステートメント (MySQL 8.0.23 より前) の MASTER_AUTO_POSITION を使用して構成された GTID 自動配置を使用できます。 使用されるレプリケーショントポロジは、自動配置を有効にできるかどうかに影響します。この機能は GTID に依存し、匿名トランザクションと互換性がないためです。 自動配置を有効にする前に、トポロジに匿名トランザクションが残っていないことを確認することを強くお薦めします。セクション17.1.4.2「GTID トランザクションのオンラインでの有効化」 を参照してください。

次のテーブルに、gtid_mode とソースおよびレプリカでの自動配置の有効な組合せを示します。ここで、ソース gtid_mode は水平方向に、レプリカ gtid_mode は垂直方向に表示されます。 各エントリの意味は次のとおりです:

  • Y: ソースとレプリカの gtid_mode に互換性があります

  • N: ソースとレプリカの gtid_mode に互換性がありません

  • *: この組合せでは自動配置を使用できます

表 17.1 ソースとレプリカ gtid_mode の有効な組合せ

gtid_mode

ソース OFF

ソース OFF_PERMISSIVE

ソース ON_PERMISSIVE

ソース ON

レプリカ OFF

Y

Y

N

N

レプリカ OFF_PERMISSIVE

Y

Y

Y

Y*

レプリカ ON_PERMISSIVE

Y

Y

Y

Y*

レプリカ ON

N

N

Y

Y*


現在選択されている gtid_mode は、gtid_next 変数にも影響します。 次のテーブルに、gtid_mode および gtid_next の様々な値に対するサーバーの動作を示します。 各エントリの意味は次のとおりです:

  • ANONYMOUS: 匿名トランザクションを生成します。

  • Error: エラーを生成し、SET GTID_NEXT の実行に失敗します。

  • UUID:NUMBER : 指定された UUID:NUMBER の GTID を生成します。

  • New GTID: 自動生成された番号を使用して GTID を生成します。

表 17.2 gtid_mode と gtid_next の有効な組合せ

gtid_next AUTOMATIC

バイナリログオン

gtid_next AUTOMATIC

バイナリログオフ

gtid_next ANONYMOUS

gtid_next UUID:NUMBER

gtid_mode OFF

ANONYMOUS

ANONYMOUS

ANONYMOUS

エラー

gtid_mode OFF_PERMISSIVE

ANONYMOUS

ANONYMOUS

ANONYMOUS

UUID:NUMBER

gtid_mode ON_PERMISSIVE

新規 GTID

ANONYMOUS

ANONYMOUS

UUID:NUMBER

gtid_mode ON

新規 GTID

ANONYMOUS

エラー

UUID:NUMBER


バイナリログがオフで、gtid_nextAUTOMATIC に設定されている場合、GTID は生成されません。 これは、以前のバージョンの動作と一貫性があります。


関連キーワード:  gtid, トランザクション, GTID, mode, ソース, 匿名, サーバー, 変数, PERMISSIVE, 構成