PolarDB for MySQL のビジネスデータに対して全文検索や複雑な分析を実行する必要がある場合、データベースを直接操作するとコアビジネスの安定性に影響を与える可能性があります。PolarDB の PolarSearch ノードが提供する 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型およびGEOMETRY、POINT、LINESTRING、POLYGON、MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTIONなどの空間データ型は、同期に対応していません。検索ビュークエリの制限:検索ビューは現在、同期セマンティクスの定義のみをサポートし、データクエリには対応していません。データをクエリするには、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;パラメーター
パラメーター | 必須 | 説明 |
| はい | 検索ビューの名前。これは PolarSearch ノード上のターゲットインデックス名でもあります。 |
| いいえ | 検索ビューのカラムを手動で定義します。複数のカラムは 説明 単一テーブル同期では、 |
| いいえ | 検索ビューの主キーカラム。この構造は PolarSearch ノードのインデックスマッピングに対応するため、 指定しない場合、デフォルトで |
| いいえ | 検索ビューの作成時に明示的に指定する同期設定。同期並列度、同期ワーカーあたりのコンピューティングリソース使用量、宛先インデックス名などを指定します。複数の設定は |
| はい | データソースと同期ロジックを定義する |
使用上の制限と注意点
ソーステーブルには主キーまたは一意キーが含まれている必要があります。
検索ビュー内のすべてのソーステーブルに対する
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.t1のc1とc2の列を 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.t1とdb2.t2をidで 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;同期する列の調整: 当初は
c1とc2列を同期していましたが、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 定義に互換性がなく、インプレース変更ができない場合は、「新しいインデックス + 新しい検索ビュー」の方法で再構築し、ビジネスクエリに影響を与えないようにします。
新しい検索ビューを作成し、新しい PolarSearch インデックスに同期します。
SHOW SEARCH VIEW STATUSを実行して、新しい検索ビューのステータスを確認します。同期レイテンシーが 0~1 秒に低下したら、ビジネス クエリ ロジックを古いインデックスから新しいインデックスに切り替えます。古い検索ビューを削除します。
ソーステーブルの DDL 変更が検索ビューに与える影響と詳細な変更プラクティスについては、「DDL 変更ルールとベストプラクティス」をご参照ください。
ETL ストアドプロシージャ (sync_by_sql)
複雑な変換、集計、または計算が必要なシナリオでは、CALL dbms_etl.sync_by_sql ストアドプロシージャを使用して、Flink SQL 互換の構文でデータ同期ロジックを定義できます。
同期リンクの作成
構文
dbms_etl.sync_by_sql を呼び出す前に、セッション変数 esl_link_options、esl_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 ノード上のターゲットインデックスを変更または再構築する必要がある場合、同期書き込みエラーを回避するために、まず同期リンクを停止できます。PolarSearch ノードでのインデックス変更が完了したら、リンクを再起動します。
CALL dbms_etl.stop_sync_link('<sync_id>');リンクの再起動
停止中または実行中の同期リンクを再起動します。
CALL dbms_etl.restart_sync_link('<sync_id>');リンクの再構築
ソーステーブルからすべてのデータを再読み込みし、PolarSearch ノードに書き込みます。再構築では、ソーステーブル内のすべてのデータを再スキャンします。データ量が多い場合、時間がかかる可能性があります。再構築では、PolarSearch ノード上の既存のインデックスデータはクリアされません。代わりに、データは直接上書きされます。
CALL dbms_etl.rebuild_sync_link('<sync_id>');同期リンクの削除
この操作は、データ同期を停止し、関連リソースをクリーンアップします。
同期リンクの削除はリスクの高い操作です。実行前に確認してください。この操作はリンクのデータ同期を停止し、関連リソースをクリーンアップしますが、PolarSearch 内のインデックスデータは削除されません。
CALL dbms_etl.drop_sync_link('<sync_id>');システムは、リンクの状態に応じて drop_sync_link の削除を異なる方法で処理します:
activeリンク: ステータスはまずdroppingに変わります。システムがリンクリソースとターゲットインデックスデータのクリーンアップを完了した後、ステータスはdroppedに変わります。droppedリンク: システムはリンク情報を完全に削除します。その他のステータスのリンク:システムは削除をサポートしていません。
同期リンクの変更
同期リンクの作成後、ランタイムパラメーターを調整したり、同期 SQL を変更したりできます。検索ビューと同様に、AutoETL は 3 つの変更方法を提供します。
並列度やコンピューティングリソース使用量などのランタイムパラメーターのみを調整する場合は、パラメーター変更を使用します。同期 SQL の変更は不要です。
同期 SQL を変更する場合は、インプレース SQL 変更を優先します。SQL 定義に互換性がある場合、元のチェックポイントから同期を継続し、完全な再同期は不要です。SQL 定義に互換性があるかどうかを判断するには、「DDL 変更ルールとベストプラクティス」をご参照ください。
SQL 定義に互換性がなく、インプレース変更ができない場合は、「新しいインデックス + 新しいリンク」方式による変更を使用して再構築します。
パラメーター変更
実行中の同期リンクについては、まずセッション変数esl_link_optionsを使用して新しいリンク設定を行い、次にdbms_etl.update_sync_linkを呼び出して設定を適用できます。AutoETL は、新しいesl_link_options設定を自動的に読み取り、同期リンクを再起動します。
構文
SET esl_link_options = "<new_option_list>";
CALL dbms_etl.update_sync_link('<sync_id>', '');例
link8f4228x2uq12z 並列度を 8 に、ワーカーあたりの CPU を 4 に、ワーカーあたりの同時実行数を 8 に調整します:
SET esl_link_options = "'parallelism' = '8', 'link.tm.cpu' = '4', 'link.tm.slots' = '8'";
CALL dbms_etl.update_sync_link('8f4228x2uq12z', '');インプレース SQL 変更
インプレース SQL 変更は、新しい PolarSearch インデックスやリンクを作成したり、ビジネスクエリを切り替えたりすることなく、既存のリンクの同期 SQL を直接変更します。これにより、完全な同期時間を短縮できます。変更前後で SQL 定義に互換性がある場合、元のチェックポイントから同期を継続します。互換性がない場合、変更は失敗し、システムは自動的に変更前の同期定義にロールバックしてリンクを再起動します。
構文
<new_sync_sql> には、完全な新しい同期 SQL を指定する必要があります。その構造は、リンク作成時の dbms_etl.sync_by_sql における同期 SQL と同じです。
CALL dbms_etl.update_sync_link('<sync_id>', '<new_sync_sql>');例
フィルター条件 8f4228x2uq12z を c1 > 20 にリンクする:
CALL dbms_etl.update_sync_link('8f4228x2uq12z', "
CREATE TEMPORARY TABLE `db1`.`t1` (
`id` BIGINT,
`c1` STRING,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'mysql',
'database-name' = 'db1',
'table-name' = 't1'
);
CREATE TEMPORARY TABLE `dest` (
`id` BIGINT,
`c1` STRING,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'opensearch',
'index' = 'dest'
);
INSERT INTO `dest` SELECT `id`, `c1` FROM `db1`.`t1` WHERE `c1` > 20;
");「新しいインデックス + 新しいリンク」方式による変更
SQL 定義に互換性がなく、インプレース変更ができない場合は、「新しいインデックス + 新しいリンク」の方法で再構築し、ビジネスクエリに影響を与えないようにします。リンク A を変更する例:
新しい同期 SQL に基づいてリンク B を作成し、新しい PolarSearch インデックスに同期します。
CALL dbms_etl.show_sync_link_by_id('<sync_id>')を実行してリンク B のステータスを確認し、リンク B の同期レイテンシーが 0~1 秒に低下したら、ビジネスのクエリロジックを古いインデックスから新しいインデックスに切り替えます。リンク B が安定して実行されていることを確認したら、
CALL dbms_etl.drop_sync_link('<sync_id>')を実行して古いリンク A を削除します。