すべてのプロダクト
Search
ドキュメントセンター

PolarDB:PolarDB-X から MySQL へのデータのレプリケート

最終更新日:Jun 18, 2025

このトピックでは、PolarDB-X から MySQL にデータをレプリケートする方法について説明します。

概要

  • PolarDB-X は MySQL レプリケーションプロトコルと互換性があります。そのため、PolarDB-X から MySQL にデータをレプリケートできます。 PolarDB-X と MySQL 間のレプリケーションリンクを管理するために、MySQL で次の SQL 文を実行できます。データレプリケーションの SQL 文の詳細については、MySQL の公式ドキュメントをご参照ください。

  • PolarDB-X インスタンスが MySQL 5.7 と互換性がある場合は、PolarDB-X のセカンダリデータベースとして MySQL 5.7 データベースを使用します。 PolarDB-X インスタンスが MySQL 8.0 と互換性がある場合は、PolarDB-X のセカンダリデータベースとして MySQL 8.0 データベースを使用します。 MySQL 8.0.27 以降を使用することをお勧めします。

  • マルチストリームバイナリロギング機能を有効にする場合は、PolarDB-X のセカンダリデータベースとして MySQL データベースを構成する際に、バイナリログストリームごとにレプリケーションリンクを作成する必要があります。単一の MySQL インスタンスで複数のレプリケーションリンクを構成するか、バイナリログストリームごとに個別の MySQL セカンダリインスタンスを構成できます。単一の MySQL インスタンスで複数のレプリケーションリンクを構成する場合、DDL 文を使用したブロードキャストレプリケーションは困難です。

使用上の注意

バージョン 5.4.12 以降、PolarDB-X は、グローバルセカンダリインデックス (GSI) を持つテーブルに対する INSERT IGNORE 文に対して、デフォルトで RETURNING 最適化を有効にします。ただし、PolarDB-X がプライマリデータベースで MySQL がセカンダリデータベースである PolarDB-X から MySQL データベースへのレプリケーションシナリオでは、この最適化により、MySQL がバイナリログを消費するときにデータの不整合の問題が発生する可能性があります。このリスクを軽減するために、SET GLOBAL DML_USE_RETURNING = FALSE 文を実行することで、最適化を無効にできます。最適化を無効にすると、GSI を持つテーブルに対する INSERT IGNORE 文のパフォーマンスが低下し、データインポートタスクに影響を与える可能性があります。最適化を無効にするかどうかを決定する前に、ビジネス要件とワークロードを評価してください。

問題の再現

  1. 一意のグローバルセカンダリインデックス (UGSI) を使用して、t という名前のテーブルを作成します。

    CREATE TABLE t(
      pk INT,
      sk INT,
      uk INT,
      PRIMARY KEY(pk),
      UNIQUE GLOBAL INDEX g_i_k(uk) PARTITION BY uk
    ) PARTITION BY sk;
  2. INSERT INTO および INSERT IGNORE を使用して、テーブルにデータを挿入します。

    INSERT INTO t VALUES (1,1,1),(2,2,2);
    INSERT IGNORE INTO t VALUES (1,2,2);
  3. RETURNING 最適化が有効になっている INSERT IGNORE の実行プロセスは、最初に一意性をチェックせずにテーブルにデータを挿入します。重複が検出されると、重複行に対して DELETE 操作を実行します。これにより、次のバイナリログエントリが生成されます。

    INSERT INTO t VALUES(1,2,2);
    DELETE FROM t WHERE pk = 1 AND sk = 2;
    説明

    MySQL データベースがこれらのバイナリログエントリを消費すると、INSERT 文が実行され、uk 列で一意キーの競合が発生します。

手順

プライマリ/セカンダリレプリケーションリンクを作成する

  • 構文

    CHANGE MASTER TO option [, option] ... [ channel_option ]
    
    option: {
        MASTER_HOST = 'host_name'
      | MASTER_USER = 'user_name'
      | MASTER_PASSWORD = 'password'
      | MASTER_PORT = port_num
      | MASTER_LOG_FILE = 'source_log_name'
      | MASTER_LOG_POS = source_log_pos
      | MASTER_LOG_TIME_SECOND = source_log_time
      | SOURCE_HOST_TYPE = {RDS|POLARDBX|MYSQL}
      | STREAM_GROUP = 'stream_group_name'
      | WRITE_SERVER_ID = write_server_id
      | TRIGGER_AUTO_POSITION = {FALSE|TRUE}
      | WRITE_TYPE = {SPLIT|SERIAL|TRANSACTION}
      | MODE = {INCREMENTAL|IMAGE}
      | CONFLICT_STRATEGY = {OVERWRITE|INTERRUPT|IGNORE|DIRECT_OVERWRITE}
      | IGNORE_SERVER_IDS = (server_id_list)
    }
    
    channel_option:
        FOR CHANNEL channel
    
    server_id_list:
        [server_id [, server_id] ... ]
  • パラメーター

    • MASTER_HOST: プライマリインスタンスのアドレス。

    • MASTER_USER: プライマリインスタンスに接続するために使用するユーザー名。

    • MASTER_PASSWORD: プライマリインスタンスに接続するために使用するパスワード。

    • MASTER_PORT: プライマリインスタンスに接続するために使用するポート番号。

    • MASTER_LOG_FILE: プライマリインスタンス上のログファイルの名前。

    • MASTER_LOG_POS: プライマリインスタンス上のログファイル内の、バイナリログレプリケーションを開始するオフセット。

    • MASTER_LOG_TIME_SECOND: プライマリインスタンスの時間オフセット。この値は、1970 年 1 月 1 日 00:00:00 UTC から経過した秒数を表す UNIX タイムスタンプです。 MASTER_LOG_FILE パラメーターと MASTER_LOG_POS パラメーターが正確なオフセットを指定するように構成されている場合、MASTER_LOG_TIME_SECOND パラメーターは無視されます。

    • SOURCE_HOST_TYPE: プライマリインスタンスのタイプ。デフォルト値: MYSQL。プライマリインスタンスが PolarDB-X 2.0 インスタンスの場合は、このパラメーターを明示的に POLARDBX に設定する必要があります。

    • STREAM_GROUP: マルチストリームグループが作成されている場合のストリームグループの名前。プライマリインスタンスが PolarDB-X 2.0 インスタンスで、プライマリインスタンスのマルチストリームバイナリログサービスを使用する場合は、このパラメーターを指定する必要があります。

    • WRITE_SERVER_ID: 書き込みサーバーの ID。

    • TRIGGER_AUTO_POSITION: プライマリインスタンスの最新のオフセットを自動的に使用するかどうかを指定します。デフォルト値: FALSE。

    • WRITE_TYPE: 書き込みモード。デフォルト値は SPLIT で、非トランザクショナルな並列レプリケーションを示します。値 SERIAL は非トランザクショナルなシリアルレプリケーションを示し、値 TRANSACTION はトランザクショナルなシリアルレプリケーションを示します。

    • MODE: 同期モード。値 INCREMENTAL は増分データ同期を示し、値 IMAGE はスキーマ同期、完全データ同期、および増分データ同期を示します。

    • CONFLICT_STRATEGY: 競合ポリシー。デフォルト値は OVERWRITE で、制約違反のあるデータが REPLACE INTO 文を実行することで上書きされることを示します。値 INTERRUPT はレプリケーションが中断されることを示し、値 IGNORE は競合が無視されることを示します。

    • IGNORE_SERVER_IDS: 無視するサーバーの ID。

    • channel_option: リンクの名前。既存のリンク名とは異なる必要があります。

  • 例 1

    次の文を実行してレプリケーションリンクを作成し、ログファイル内の 1713159938 (2024-04-15 13:45:38) から同期を開始します。

    CHANGE MASTER TO 
    MASTER_HOST='pxc-YOURENDPOINT.com', 
    MASTER_PORT=3306, 
    MASTER_USER='polardbx', 
    MASTER_PASSWORD='123456', 
    SOURCE_HOST_TYPE=polardbx, 
    MASTER_LOG_TIME_SECOND=1713159938, 
    write_server_id=1944903859
    FOR CHANNEL 'pxc-bjrcsnbyagcdxh';
  • 例 2

    次の文を実行してレプリケーションリンクを作成し、プライマリインスタンス上の binlog.000001 ファイルのオフセット 4 から同期を開始します。

    CHANGE MASTER TO 
    MASTER_HOST='pxc-YOURENDPOINT.com', 
    MASTER_PORT=3306, 
    MASTER_USER='polardbx', 
    MASTER_PASSWORD='123456', 
    SOURCE_HOST_TYPE=polardbx, 
    MASTER_LOG_FILE='binlog.000001', 
    MASTER_LOG_POS=4, 
    write_server_id=1944903859
    FOR CHANNEL 'pxc-bjrcsnbyagcdxh';
説明

詳細については、「CHANGE MASTER TO」をご参照ください。

プライマリ/セカンダリレプリケーションリンクを開始する

  • 構文

    START SLAVE [ channel_option ]
    
    channel_option:
        FOR CHANNEL channel
  • 例 1

    次の文を実行して、CHANGE MASTER TO 文を実行することで作成されたすべてのプライマリ/セカンダリレプリケーションリンクを有効にします。

    START SLAVE;
  • 例 2

    次の文を実行して、名前が TEST のプライマリ/セカンダリレプリケーションリンクを有効にします。

    START SLAVE for channel 'TEST';
説明

詳細については、「START SLAVE」をご参照ください。

プライマリ/セカンダリレプリケーションリンクを停止する

  • 構文

    STOP SLAVE [ channel_option ]
    
    channel_option:
        FOR CHANNEL channel
  • 例 1

    次の文を実行して、CHANGE MASTER TO 文を実行することで作成されたすべてのプライマリ/セカンダリレプリケーションリンクを無効にします。

    STOP SLAVE;
  • 例 2

    次の文を実行して、名前が TEST のプライマリ/セカンダリレプリケーションリンクを無効にします。

    STOP SLAVE for channel 'TEST';
説明

詳細については、「STOP SLAVE」をご参照ください。

プライマリ/セカンダリレプリケーションリンクを削除する

重要

プライマリ/セカンダリレプリケーションリンクを削除する前に、データレプリケーションプロセスを停止します。

  • 構文

    RESET SLAVE ALL [ channel_option ]
    
    channel_option:
        FOR CHANNEL channel
  • 例 1

    次の文を実行して、`CHANGE MASTER TO` 文を実行することで確立されたすべてのプライマリ/セカンダリレプリケーションリンクを削除します。

    RESET SLAVE ALL;
  • 例 2

    次の文を実行して、TEST という名前のチャンネルを持つプライマリ/セカンダリレプリケーションリンクを削除します。

    RESET SLAVE ALL for channel 'TEST';
説明

詳細については、「RESET SLAVE ALL」をご参照ください。