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

PolarDB:PolarDB for MySQL から PolarSearch へのデータ同期

最終更新日:Mar 26, 2026

PolarDB for MySQL のビジネスデータに対して全文検索や複雑な分析を実行すると、コアサービスの安定性に影響を与える可能性があります。PolarDB AutoETL 機能は、読み書きノードから同じクラスター内の PolarSearch ノード へデータを自動的かつ継続的に同期し、ワンストップデータサービスを提供します。検索ビューまたは ETL ストアドプロシージャを使用することで、データ同期リンクを迅速に作成できます。これにより、外部 ETL ツールをデプロイまたは保守することなく、データを同期し、検索および分析ワークロードをオンライントランザクション処理 (OLTP) ワークロードから分離できます。

説明

この機能は現在、段階的リリース中です。この機能を使用するには、チケットを送信 してアクセスをリクエストしてください。

概要

AutoETL は、PolarDB for MySQL の組み込みデータ同期機能であり、クラスター内の異なる種類のノード間でデータを自動的に流すことができます。現在のバージョンでは、PolarDB for MySQL から同じクラスター内の PolarSearch ノードへのデータ同期のみをサポートしており、パフォーマンス専有型の検索と分析を提供します。

AutoETL は、データ同期リンクを作成するための 2 つのメソッドを提供します。

  • 検索ビュー: CREATE SEARCH VIEW 構文を使用して、標準 SQL でデータ同期ロジックを定義します。これは、ほとんどの単一テーブル同期および複数テーブル集約シナリオに最適であり、システムが基盤となる接続の詳細を自動的に処理します。

  • ETL ストアドプロシージャ (dbms_etl.sync_by_sql): Flink SQL 互換の構文を持つストアドプロシージャを使用して、複雑なデータクレンジング、変換、および集約ロジックを定義します。

適用範囲

AutoETL 機能を使用する前に、環境が次の条件を満たしていることを確認してください。

  • クラスターバージョン:

    • 検索ビュー:

      • MySQL 8.0.1 (リビジョン 8.0.1.1.54 以降)。

      • MySQL 8.0.2 (リビジョン 8.0.2.2.34 以降)。

    • ETL ストアドプロシージャ (sync_by_sql):

      • MySQL 8.0.1 (リビジョン 8.0.1.1.52 以降)。

      • MySQL 8.0.2 (リビジョン 8.0.2.2.33 以降)。

  • Binlog: クラスターで Binlog が有効 になっている必要があります。

  • 同期方向: PolarDB for MySQL から同じクラスター内の PolarSearch ノード へのデータ同期のみがサポートされています。

  • DDL 制限事項: データ同期の中断を避けるため、アクティブな検索ビューまたは ETL ストアドプロシージャを持つソーステーブルに対して DDL 操作を実行する際は、特定のルールに従う必要があります。互換性のない変更の一部では、検索ビューを再作成する必要があります。詳細については、「DDL 変更ルールと実践」をご参照ください。

  • データ型: BIT データ型および GEOMETRYPOINTLINESTRINGPOLYGONMULTIPOINTMULTILINESTRINGMULTIPOLYGONGEOMETRYCOLLECTION などの空間データ型の同期はサポートされていません。

  • 検索ビュークエリの制限事項: 検索ビューは同期セマンティクスを定義するだけであり、直接データクエリには使用できません。データをクエリするには、PolarSearch ノード に直接接続し、クエリを実行してください。

検索ビュー

検索ビューは、AutoETL が提供する宣言型データ同期メカニズムです。標準 SQL 構文を使用して検索ビューを作成でき、システムはソーステーブルから PolarSearch ノード への継続的なデータ同期リンクを自動的に確立します。

検索ビューの作成

構文

CREATE SEARCH VIEW view_name [(column_list, PRIMARY KEY (pk_column_list))] AS select_statement;

パラメーター

パラメーター

必須

説明

view_name

はい

検索ビューの名前。これは、PolarSearch ノード 上のターゲットインデックスの名前でもあります。

column_list

いいえ

検索ビューの列を手動で定義します。複数の列を区切るには、コンマ (,) を使用します。

説明

単一テーブル同期の場合、column_list を指定する必要はありません。デフォルトでは、システムはソーステーブルの元の列名を使用します。

pk_column_list

いいえ

検索ビューのプライマリキー列を指定します。検索ビューの構造は、PolarSearch ノード 上のインデックスにマッピングされます。pk_column_list は、PolarSearch ノード 上のインデックスドキュメント ID を指定します。

指定しない場合、システムはデフォルトで column_list の最初の列をドキュメント ID として使用します。単一テーブル同期の場合、ソーステーブルのプライマリキーがデフォルトでドキュメント ID として使用されます。

select_statement

はい

データソースと同期ロジックを定義する SELECT ステートメントです。ソーステーブルからデータを取得し、結果を PolarSearch に保存します。単一テーブルクエリと、JOINUNION ALLGROUP BY などの操作をサポートします。

制限事項と注意事項

  • ソーステーブルには、プライマリキーまたは一意キーが含まれている必要があります。

  • 検索ビューで使用されるすべてのソーステーブルに対する ALTER 権限、および関連する列またはテーブル全体に対する SELECT 権限が必要です。

  • 検索ビューの作成後、ソーステーブルに追加された新しい列は、デフォルトでは自動的に同期されません。新しい列を同期するには、「検索ビューの変更」をご参照ください。

  • カスタムターゲットインデックスを使用するには、まず PolarSearch ノード で作成および構成し、次に検索ビューを作成します。ビューの作成時にターゲットインデックスが存在しない場合、システムは自動的に作成します。

  • 複数テーブル集約や複雑なクエリの場合、JSON フィールド変換やルートフィールドなどの高度な同期パラメーターを構成するには、「AutoETL パラメーター構成と実践例」をご参照ください。

データ準備

以下の例ではテストデータを使用します。PolarDB for MySQL で以下の SQL ステートメントを実行して、このデータを作成できます。

CREATE DATABASE IF NOT EXISTS db1;
CREATE DATABASE IF NOT EXISTS db2;

USE db1;
CREATE TABLE IF NOT EXISTS t1 (
    id INT PRIMARY KEY,
    c1 VARCHAR(100),
    c2 VARCHAR(100)
);
INSERT INTO t1(id, c1, c2) VALUES
(1, 'apple', 'red'),
(2, 'banana', 'yellow'),
(3, 'grape', 'purple');

USE db2;
CREATE TABLE IF NOT EXISTS t2 (id INT PRIMARY KEY, c2 INT);
INSERT INTO t2(id, c2) VALUES (1, 111), (2, 222), (4, 444);

  • テーブル全体の同期: db1.t1 のすべてのデータを PolarSearch に同期します。ビュー名 view_test は、PolarSearch のターゲットインデックスの名前でもあります。

    CREATE SEARCH VIEW view_test AS SELECT * FROM db1.t1;
  • 指定された列の同期: c1 および c2 列のみを同期し、列の型とプライマリキーを手動で定義します。

    CREATE SEARCH VIEW view_test1 AS SELECT c1, c2 FROM db1.t1;
  • 条件付きフィルタリング: WHERE 条件を満たすデータのみを同期します。

    CREATE SEARCH VIEW view_test2 AS SELECT id, c1, c2 FROM db1.t1 WHERE c1 > 10;
  • 複数テーブル JOIN: db1.t1db2.t2id フィールドで結合し、結果を PolarSearch に同期します。

    CREATE SEARCH VIEW view_test3(id, c1, c2) AS SELECT t1.id, t1.c1, t2.c2 FROM db1.t1 AS t1 LEFT JOIN db2.t2 AS t2 ON t1.id = t2.id;
  • 複数テーブル UNION: 同一の構造を持つ複数のテーブルをマージして同期します。SELECT ステートメントは、同じ数と型の列を持つ必要があります。

    CREATE SEARCH VIEW view_test4(id, c2) AS SELECT id, c2 FROM db1.t1 UNION ALL SELECT id, c2 FROM db2.t2;
  • グループ化された集約: 同期前にデータをグループ化および集約します。GROUP BY を使用する場合、列とプライマリキーを手動で定義する必要があります。

    CREATE SEARCH VIEW view_test5 (id, max_c) AS SELECT t1.id, MAX(t1.c1) AS max_c FROM db1.t1 GROUP BY t1.id;

データ検証

検索ビューの同期ステータスを確認します。

SHOW SEARCH VIEW STATUS;

ステータスが active の場合、検索ビューがデータを正常に同期していることを示します。PolarSearch ノード に接続し、Elasticsearch 互換の REST API を使用してデータを検証します。

# Replace <user>:<password> with the credentials for the PolarSearch node and <polarsearch_endpoint> with the endpoint and port of the PolarSearch node.
curl -u <user>:<password> -X GET "http://<polarsearch_endpoint>/view_test/_search"

検索ビューの管理

作成した検索ビューを表示するには、次のコマンドを使用します。

  • すべての検索ビューのステータスを表示します。

    SHOW SEARCH VIEW STATUS;

    このコマンドは次の出力を返します。ステータスが active の場合、検索ビューがデータを正常に同期していることを示します。

    +------------+--------+----------+---------+---------------------+---------------------+
    | View Name  | Type   | Status   | Message | Created_at          | Updated_at          |
    +------------+--------+----------+---------+---------------------+---------------------+
    | view_test  | search | active   |         | 2026-03-18 18:44:12 | 2026-03-18 18:51:37 |
    +------------+--------+----------+---------+---------------------+---------------------+
  • 特定の検索ビューの CREATE 文を表示します:

    SHOW CREATE SEARCH VIEW view_test;

    以下の結果が返されます。

    +-----------+------------------------------------------------------+
    | View Name | Create Search View                                   |
    +-----------+------------------------------------------------------+
    | view_test | CREATE SEARCH VIEW view_test AS SELECT * FROM db1.t1 |
    +-----------+------------------------------------------------------+

検索ビューの削除

重要

検索ビューの削除は高リスク操作です。続行する前に、結果を理解していることを確認してください。この操作は、検索ビューのデータ同期を停止し、関連リソースをクリーンアップしますが、PolarSearch のインデックスデータは削除しません

DROP SEARCH VIEW view_name;

検索ビューを削除する際のシステムの動作は、そのステータスによって異なります。

  • active 状態の検索ビューは、まず dropping に変わります。システムがリソースをクリーンアップし、ターゲットインデックスデータを削除した後、その状態は dropped に変わります。

  • dropped 状態の検索ビュー: システムは、そのすべての情報を完全に削除します。

  • その他の状態: その他の状態の検索ビューの削除はサポートされていません。

検索ビューの変更

新しいフィールドの同期やクエリ条件の変更など、検索ビューの同期ロジックを変更する必要がある場合は、「新しいインデックス + 新しい検索ビュー」のアプローチを使用して変更を適用することを推奨します。この方法は、ビジネスクエリに影響を与えないことを保証します。

  1. 新しい PolarSearch インデックスにデータを同期する新しい検索ビューを作成します。

  2. SHOW SEARCH VIEW STATUS を実行して、新しい検索ビューのステータスを確認します。新しいビューの同期遅延が 0~1 秒に低下したら、ビジネスクエリを古いインデックスから新しいインデックスに切り替えます。

  3. 古い検索ビューを削除します。

ソーステーブルへの DDL 変更が検索ビューに与える影響、および詳細な変更方法については、「DDL 変更ルールと実践」をご参照ください。

ETL ストアドプロシージャ (sync_by_sql)

複雑な変換、集約、または計算の場合、dbms_etl.sync_by_sql ストアドプロシージャを使用して、Flink SQL 互換の構文でデータ同期ロジックを定義します。

同期リンクの作成

重要

セキュリティ警告: SQL ステートメントにパスワードをハードコードしないでください。以下の例は構文構造のみを示しています。この例の WITH 句にはプレーンテキストパスワードが含まれており、これは重大なセキュリティリスクです。本番環境では、より安全な方法で認証情報を管理する必要があります。

構文

CALL dbms_etl.sync_by_sql("search", "<sync_sql>");

説明
  • システムは、SQL ステートメント内のプレースホルダー {mysql_host}{mysql_port}{mysql_user}{mysql_password}{search_host}{search_port}{search_user}、および {search_password} を自動的に置き換えます。これらの固定プレースホルダーを使用して SQL ステートメントを記述するだけで済みます。

  • 複数の Flink SQL 同期リンクがある場合、リンクを区別し、競合を回避するために、すべての一時テーブルの WITH 句で一意の server-id を指定する必要があります。

CALL dbms_etl.sync_by_sql("search", "
-- Step 1: Define the PolarDB source table
CREATE TEMPORARY TABLE `db1`.`sbtest1` (
  `id`   BIGINT,
  `c1`   STRING,
  `c2`   STRING,
  PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
  'connector' = 'mysql',
  'hostname' = '{mysql_host}',
  'port' = '{mysql_port}',
  'username' = '{mysql_user}',       -- Do not use a plaintext password in production.
  'password' = '{mysql_password}',   -- Do not use a plaintext password in production.
  'database-name' = 'db1',
  'table-name' = 't1',
  'server-id' = '10000-11000'        -- Link identifier
);

-- Step 2: Define the PolarSearch target table
CREATE TEMPORARY TABLE `dest` (
  `id`  BIGINT,
  `max_c` STRING,
  PRIMARY KEY (`k`) NOT ENFORCED
) WITH (
  'connector' = 'opensearch',
  'hosts' = '{search_host}:{search_port}',   
  'index' = 'dest',
  'username' = '{search_user}',     -- Do not use a plaintext password in production.
  'password' = '{search_password}'  -- Do not use a plaintext password in production.
);

-- Step 3: Define the computation and insertion logic
INSERT INTO `dest`
SELECT
    `t1`.`id`,
    MAX(`t1`.`c1`)
FROM `db1`.`t1` AS `t1`
GROUP BY `t1`.`id`;
");

データ検証

PolarSearch ノード に接続し、Elasticsearch 互換の REST API を使用してデータをクエリし、同期されていることを確認します。

# Replace <polarsearch_endpoint> with the endpoint of the PolarSearch node.
curl -u <user>:<password> -X GET "http://<polarsearch_endpoint>/dest/_search"

同期リンクの管理

作成したデータ同期リンクを表示するには、次のコマンドを使用します。

  • すべてのリンクを表示します。

    CALL dbms_etl.show_sync_link();
  • ID で特定のリンクを表示します。<sync_id> を、リンク作成時に返された ID に置き換えます。

    CALL dbms_etl.show_sync_link_by_id('<sync_id>')\G

    フィールドの説明:

    *************************** 1. row ***************************
            SYNC_ID: crb5rmv8rttsg
               NAME: crb5rmv8rttsg
             SYSTEM: search
    SYNC_DEFINITION: db1.t1 -> dest
      SOURCE_TABLES: db1.t1
        SINK_TABLES: dest
             STATUS: active  -- Link status; `active` indicates normal operation.
            MESSAGE:         -- Displays an error message if an error occurs.
         CREATED_AT: 2024-05-20 11:55:06
         UPDATED_AT: 2024-05-20 17:28:04
            OPTIONS: ...

同期リンクの削除

この操作は、データ同期を停止し、関連リソースをクリーンアップします。

重要

データ同期リンクの削除は高リスク操作です。続行する前に、結果を理解していることを確認してください。この操作は、リンクのデータ同期を停止し、関連リソースをクリーンアップしますが、PolarSearch のインデックスデータは削除しません

CALL dbms_etl.drop_sync_link('<sync_id>');

drop_sync_link を使用して異なる状態のリンクを削除する場合、システムの処理ロジックは異なります。

  • active 状態のリンクは、まず dropping に変わります。システムがリンクのリソースのクリーンアップとターゲットインデックスデータの削除を完了した後、その状態は dropped に変わります。

  • dropped 状態のリンク: システムは、その情報を完全に削除します。

  • その他の状態: その他の状態のリンクの削除はサポートされていません。

同期リンクの変更

データ同期リンクを変更する必要がある場合は、検索ビューの場合と同様に「新しいインデックス + 新しいリンク」のアプローチを使用します。

  1. 新しい PolarSearch インデックスにデータを同期する新しいデータ同期リンクを作成します。

  2. CALL dbms_etl.show_sync_link_by_id('<sync_id>') を実行して、新しいリンクのステータスを確認します。新しいリンクの同期遅延が 0~1 秒に低下したら、ビジネスクエリを古いインデックスから新しいインデックスに切り替えます。

  3. 古いデータ同期リンクを削除します。

よくある質問

検索ビューと ETL ストアドプロシージャ (sync_by_sql) の違いは何ですか?

核となる違いは、ユースケースと複雑さにあります。

  • 検索ビュー: 標準 SQL 構文 (CREATE SEARCH VIEW) を使用します。システムが基盤となる接続と同期の詳細を自動的に処理するため、Flink SQL を記述する必要がありません。このメソッドは、ほとんどの単一テーブル同期および複数テーブル集約シナリオに適しています。

  • ETL ストアドプロシージャ: Flink SQL と互換性のある構文 (CALL dbms_etl.sync_by_sql) を使用します。ソーステーブルとターゲットテーブルの接続構成を手動で定義する必要があります。このメソッドは、複雑なデータクレンジング、変換、および集約シナリオに適しており、Flink SQL を介して完全な制御を提供します。