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

PolarDB:検索ビューと ETL ストアドプロシージャ

最終更新日:Aug 28, 2026

PolarDB for MySQL のビジネスデータに対して全文検索や複雑な分析を実行する必要がある場合、データベースを直接操作するとコアビジネスの安定性に影響を与える可能性があります。PolarDBPolarSearch ノードが提供する AutoETL 機能は、読み取り/書き込みノードからクラスター内の PolarSearch ノードへデータを継続的かつ自動的に同期し、ワンストップのデータサービスを提供します。検索ビューまたは ETL ストアドプロシージャを使用してデータ同期リンクを作成できます。これにより、追加の ETL ツールの導入や保守を行うことなく、データ同期を実現しながら検索・分析ワークロードをオンライントランザクション処理ワークロードから分離できます。

説明

AutoETL を使用してリンクを作成すると、データ同期のために PolarDB データへのアクセスを AutoETL エンジンに許可したことになります。

概要

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:クラスターでバイナリロギングを有効にする必要があります。

  • 同期方向PolarDB for MySQL から PolarSearch ノードへの同期のみをサポートします。

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

  • データ型BIT 型および GEOMETRYPOINTLINESTRINGPOLYGONMULTIPOINTMULTILINESTRINGMULTIPOLYGONGEOMETRYCOLLECTION などの空間データ型は、同期に対応していません。

  • 検索ビュークエリの制限:検索ビューは現在、同期セマンティクスの定義のみをサポートし、データクエリには対応していません。データをクエリするには、PolarSearch ノードに直接接続してください。

  • コンピューティングリソース:AutoETL はコンピューティングユニット (CU) を使用します。デフォルトでは、クラスター内の CU 数は、すべての PolarSearch ノードの CPU の合計の 2 倍です。クラスターの現在の CU 使用状況は、設定と管理 > 検索管理 ページの [AutoETL] タブで確認できます。

検索ビュー

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

検索ビューの作成

構文

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

パラメーター

パラメーター

必須

説明

view_name

はい

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

column_list

いいえ

検索ビューのカラムを手動で定義します。複数のカラムは , で区切ります。

説明

単一テーブル同期では、column_list を指定する必要はありません。デフォルトでソーステーブルの元のカラム名が使用されます。

pk_column_list

いいえ

検索ビューの主キーカラム。この構造は PolarSearch ノードのインデックスマッピングに対応するため、pk_column_listPolarSearch ノード上のインデックスドキュメント ID を指定します。

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

option_list

いいえ

検索ビューの作成時に明示的に指定する同期設定。同期並列度、同期ワーカーあたりのコンピューティングリソース使用量、宛先インデックス名などを指定します。複数の設定は , で区切ります。指定しない場合は、システムのデフォルト値が使用されます。設定可能なパラメーターと値については、「AutoETL パラメーター設定とベストプラクティス」をご参照ください。

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;
  • 同期パラメーターの指定: 検索ビューを作成する際に、WITH 句を使用して同期設定を指定します。 次の例では、db1.t1c1c2 の列を PolarSearch に同期し、同期並列度を 2 に設定します。

    CREATE SEARCH VIEW view_test6 WITH ('parallelism' = '2') 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 で JOIN し、その結果を 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 の場合、検索ビューのデータ同期は正常に実行されています。Elasticsearch 互換の REST API を使用して PolarSearch ノードに接続し、データを検証してください:

# <user>:<password> を PolarSearch ノードの認証情報に、<polarsearch_endpoint> を PolarSearch ノードのエンドポイントとポート番号に置き換えます
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 ノード上のターゲットインデックスを変更または再構築する必要がある場合、同期書き込みエラーを回避するために、まず検索ビューのデータ同期を停止できます。PolarSearch ノードでのインデックス変更が完了したら、検索ビューを再起動します。

ALTER SEARCH VIEW view_test STOP;

検索ビューの再起動

停止中または実行中の検索ビューを再起動します。

ALTER SEARCH VIEW view_test RESTART;

検索ビューの再構築

ソーステーブルからすべてのデータを再読み込みし、PolarSearch ノードに書き込みます。

重要
  • 再構築では、ソーステーブル内のすべてのデータを再スキャンします。データ量が多い場合、時間がかかる可能性があります。

  • 再構築では、PolarSearch ノード上の既存のインデックスデータはクリアされません。代わりに、データは直接上書きされます。

ALTER SEARCH VIEW view_test REBUILD;

検索ビューの削除

重要

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

DROP SEARCH VIEW view_name;

システムは、検索ビューのステータスに応じて、異なる方法で削除を処理します。

  • active の検索ビューの場合、ステータスはまず dropping に変更されます。システムがリソースのクリーンアップとターゲットインデックスデータの削除を完了すると、ステータスは dropped に変更されます。

  • dropped 検索ビュー:システムは検索ビュー情報を完全に削除します。

  • その他のステータスの検索ビュー:システムは削除をサポートしていません。

検索ビューの変更

検索ビューの作成後、ランタイムパラメーターを調整したり、同期ロジックを変更したりできます。たとえば、同期フィールドを追加したり、クエリ条件を変更したりできます。AutoETL は 3 つの変更方法を提供します。

  • 並列度やコンピューティングリソース使用量などのランタイムパラメーターのみを調整する場合は、パラメーター変更を使用します。同期 SQL の変更は不要です。

  • 同期ロジックを変更する場合は、インプレース SQL 変更を優先します。SQL 定義に互換性がある場合、元のチェックポイントから同期を継続し、完全な再同期は不要です。SQL 定義に互換性があるかどうかを判断するには、「DDL 変更ルールとベストプラクティス」をご参照ください。

  • SQL 定義に互換性がなく、インプレース変更ができない場合は、「新しいインデックス + 新しい検索ビュー」方式による変更を使用して再構築します。

パラメーター変更

実行中の検索ビューに対して、以下の構文を使用してランタイムパラメーターを変更できます。AutoETL は自動的に新しい設定を読み込み、検索ビューを再起動します。

構文

ALTER SEARCH VIEW view_name UPDATE WITH (new_option_list);

view_test 並列度を 8 に、ワーカーあたりの CPU を 4 に、ワーカーあたりの同時実行数を 8 に調整します。

ALTER SEARCH VIEW view_test UPDATE WITH ('parallelism' = '8', 'link.tm.cpu' = '4', 'link.tm.slots' = '8');

インプレース SQL 変更

インプレース SQL 変更は、新しい PolarSearch インデックスや検索ビューを作成したり、ビジネスクエリを切り替えたりすることなく、既存の検索ビューの同期 SQL を直接変更します。これにより、完全な同期時間を短縮できます。SQL 定義に互換性がある場合、元のチェックポイントから同期を継続します。互換性がない場合、変更は失敗し、システムは自動的に変更前の定義にロールバックして検索ビューを再起動します。

構文

ALTER SEARCH VIEW view_name UPDATE
 [TO (column_list, PRIMARY KEY (pk_column_list))]
 AS new_select_statement;

  • ソーステーブルの新しい列の同期: 全テーブル検索ビューでは、ビューの作成後にソーステーブルへ追加された新しい列は自動的に同期されません。ソーステーブル db1.t1 に新しい列を追加した後、次のステートメントを実行して、新しい列のデータを PolarSearch に同期します。

    ALTER SEARCH VIEW view_test UPDATE;
  • 同期する列の調整: 当初は c1c2 列を同期していましたが、c1 列のみを同期するように変更します。

    ALTER SEARCH VIEW view_test UPDATE AS SELECT c1 FROM db1.t1;
  • フィルター条件の調整: WHERE 条件を c1 > 10 から c1 > 20 に変更します。

    ALTER SEARCH VIEW view_test UPDATE AS SELECT id, c1, c2 FROM db1.t1 WHERE c1 > 20;

「新しいインデックス + 新しい検索ビュー」方式による変更

SQL 定義に互換性がなく、インプレース変更ができない場合は、「新しいインデックス + 新しい検索ビュー」の方法で再構築し、ビジネスクエリに影響を与えないようにします。

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

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

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

ソーステーブルの DDL 変更が検索ビューに与える影響と詳細な変更プラクティスについては、「DDL 変更ルールとベストプラクティス」をご参照ください。

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

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

同期リンクの作成

構文

説明

dbms_etl.sync_by_sql を呼び出す前に、セッション変数 esl_link_optionsesl_sink_options (AutoETL パラメーター設定とベストプラクティス など) を使用して、リンク同期設定を行うことができます。 AutoETL エンジンは、リンク作成時にこれらの変数を自動的に読み取ります。

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

説明

ソーステーブルと宛先テーブルの接続情報 (ホストアドレス、ポート、認証情報など) はシステムによって自動的に設定されるため、WITH 句で手動で指定する必要はありません。

CALL dbms_etl.sync_by_sql("search", "

-- ステップ 1: PolarDB ソーステーブルを定義
CREATE TEMPORARY TABLE `db1`.`t1` (
 `id` BIGINT,
 `c1` STRING,
 PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
 'connector' = 'mysql',
 'database-name' = 'db1',
 'table-name' = 't1'
);

-- ステップ 2: PolarSearch 宛先テーブルを定義
CREATE TEMPORARY TABLE `dest` (
 `id` BIGINT,
 `max_c` STRING,
 PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
 'connector' = 'opensearch',
 'index' = 'dest'
);

-- ステップ 3: 計算と挿入ロジックを定義
INSERT INTO `dest`
SELECT
 `t1`.`id`,
 MAX(`t1`.`c1`)
FROM `db1`.`t1` AS `t1`
GROUP BY `t1`.`id`;
");

データの検証

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

# <polarsearch_endpoint> を PolarSearch ノードのエンドポイントに置き換えます
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 -- リンクのステータス。active は正常動作を示します
 MESSAGE: -- エラーが発生した場合、ここにエラーメッセージが表示されます
 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 リンク: システムはリンク情報を完全に削除します。

  • その他のステータスのリンク:システムは削除をサポートしていません。

同期リンクの変更

同期リンクの作成後、ランタイムパラメーターを調整したり、同期 SQL を変更したりできます。検索ビューと同様に、AutoETL は 3 つの変更方法を提供します。

パラメーター変更

インプレース SQL 変更

<new_sync_sql> には、完全な新しい同期 SQL を指定する必要があります。その構造は、リンク作成時の dbms_etl.sync_by_sql における同期 SQL と同じです。

「新しいインデックス + 新しいリンク」方式による変更

SQL 定義に互換性がなく、インプレース変更ができない場合は、「新しいインデックス + 新しいリンク」の方法で再構築し、ビジネスクエリに影響を与えないようにします。リンク A を変更する例:

  1. 新しい同期 SQL に基づいてリンク B を作成し、新しい PolarSearch インデックスに同期します。

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

  3. リンク B が安定して実行されていることを確認したら、CALL dbms_etl.drop_sync_link('<sync_id>') を実行して古いリンク A を削除します。

よくある質問 (FAQ)

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

主な違いは、使用シナリオと複雑さにあります。

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

  • ETL ストアドプロシージャ: Flink SQL 互換構文 (CALL dbms_etl.sync_by_sql) を使用します。複雑なデータクリーニング、変換、集計を必要とするシナリオに適しており、完全な Flink SQL 制御機能を提供します。ソーステーブルと宛先テーブルの接続設定は、システムによって自動的に処理されます。