検索ビューまたは ETL ストアドプロシージャ (sync_by_sql) を持つソーステーブルに対して DDL 操作を実行する場合、変更の種類によって同期リンクへの影響が異なります。本トピックでは、各 DDL 操作の影響について説明し、必要に応じて再構築を行うためのベストプラクティスを提供します。
ソーステーブルへの DDL の影響
DDL 操作の詳細については、「PolarDB for MySQL の DDL 操作ガイド」をご参照ください。次の表は、ソーステーブルに対する一般的な DDL 操作が同期リンクに与える影響を示しています。
|
変更タイプ |
操作 |
同期ステータス |
説明 |
|
カラムの変更 |
カラムの削除 |
正常 |
既存のデータは削除されたカラムの値を保持します。増分データでは、フィールド値が |
|
カラムの追加 |
正常 |
新しいカラムは同期リンクに自動的に追加されません。リンクにカラムを追加するには、AutoETL 変更プラクティスをご参照ください。 |
|
|
カラムの型変更 |
型に依存 |
互換性のある型 (例: 互換性のない型: リンクが利用できなくなります。リンクを再構築する必要があります。 |
|
|
カラムの名前変更 |
中断 |
リンクは作成時のカラム名を使用します。名前変更後、リンクはソーステーブルの名前変更されたカラムを識別できません。リンクを再構築する必要があります。 |
|
|
その他 (カラムの並び替え、デフォルト値の変更、コメントの変更、VARCHAR 長の拡張、文字セットの変更、自動インクリメントプロパティの変更、NULL 制約の変更など) |
正常 |
これらの操作は同期に影響を与えません。 |
|
|
インデックスの変更 |
セカンダリインデックスの追加、削除、または変更 |
正常 |
セカンダリインデックスの変更は同期に影響を与えません。 |
|
プライマリキーインデックスの削除または変更 |
中断 |
リンクはデータ同期のためにソーステーブルのプライマリキーに依存しています。プライマリキーを変更した後は、リンクを再構築する必要があります。 |
|
|
テーブルの変更 |
|
中断 |
リンクは |
|
|
中断 |
リンクは新しいテーブル名を認識しません。増分データの同期が停止します。 |
|
|
その他 ( |
正常 |
これらの操作は同期に影響を与えません。 |
|
|
パーティションテーブルの変更 |
パーティションテーブルへの変換、パーティションの追加、パーティションのマージ、再パーティション化、パーティションの分析、パーティションのチェック、パーティションの最適化、パーティションの再構築、非パーティションテーブルへの変換、ローカルインデックスの使用など |
正常 |
これらの操作は同期に影響を与えません。 |
|
|
中断 |
リンクはこれらの操作を検出できません。データを削除し、その変更を PolarSearch に同期するには、代わりに |
|
|
|
中断 |
リンクは指定されたパーティション内の直接的なデータの置換または修復を検出できません。他のパーティションは影響を受けません。これらの操作の後は、リンクを再構築することを推奨します。 |
AutoETL 変更プラクティス
検索ビューまたは ETL ストアドプロシージャの同期構造を変更する必要がある場合 (例: 同期フィールドの追加)、まず変更をインプレースで実行できるかどうかを判断します。
-
インプレース変更 がサポートされている場合は、検索ビューまたは ETL ストアドプロシージャの SQL 定義を直接更新します。同期は元のオフセットから再開され、完全再同期は不要です。
-
インプレース変更 がサポートされていない場合は、「新しいインデックス + 新しいリンク」 アプローチを使用して再構築します。新しい検索ビューまたは ETL ストアドプロシージャがデータ同期と検証を完了した後、アプリケーションのクエリトラフィックを新しいインデックスに切り替えます。
インプレース変更のサポート可否
次の表は、検索ビューまたは ETL ストアドプロシージャの一般的な変更と、インプレース変更がサポートされているかどうかを示しています。
|
変更タイプ |
適用シナリオ |
インプレース変更のサポート |
説明 |
|
ランタイムパラメータの変更 |
単一テーブル同期 / 複数テーブル集約 |
はい |
同期リソースと同時実行数のパラメータ調整は、計算セマンティクスを変更しません。インプレース変更がサポートされます。 |
|
|
単一テーブル同期 / 複数テーブル集約 |
はい |
フィルター条件の変更は、PolarSearch ノードに既に同期済みの既存データを更新しません。既存データをクリーンアップするには、リンクを再構築してください。 |
|
同期カラムの追加 |
単一テーブル同期 |
はい |
新しいカラムは増分データにのみ適用されます。履歴データはバックフィルされません。すべてのデータをバックフィルするには、リンクを再構築してください。 |
|
同期カラムの削除 |
単一テーブル同期 |
はい |
PolarSearch ノード内の削除されたカラムは更新されなくなります。 |
|
PolarSearch ノードインデックスのプライマリキーの変更 |
単一テーブル同期 / 複数テーブル集約 |
いいえ。再構築が必要です。 |
プライマリキーは PolarSearch のドキュメント ID でもあります。この変更は互換性がありません。 |
|
|
複数テーブル集約 |
いいえ。再構築が必要です。 |
同期構造が変更されます。完全な再計算が必要です。 |
|
|
複数テーブル集約 |
いいえ。再構築が必要です。 |
集約構造が変更されます。履歴の集約結果は再利用できません。 |
|
|
複数テーブル集約 |
いいえ。再構築が必要です。 |
同期構造が変更されます。完全な再計算が必要です。 |
|
単一テーブル同期と複数テーブル集約の相互変換 |
単一テーブル同期 / 複数テーブル集約 |
いいえ。再構築が必要です。 |
同期ロジックが完全に変更されます。 |
|
プライマリキー / |
単一テーブル同期 / 複数テーブル集約 |
いいえ。再構築が必要です。 |
キーカラムの型変更後、元の同期状態を再利用できません。 |
インプレース変更
既存のリンクで SQL ロジックを変更し、既存のリンク状態を使用して同期を再開します。詳細については、「検索ビュー - 検索ビューの変更」および「ETL ストアドプロシージャ (sync_by_sql) - 同期リンクの変更」をご参照ください。
-
検索ビューの構文:
ALTER SEARCH VIEW view_name UPDATE [WITH (option_list)] [TO (column_list, PRIMARY KEY (pk_column_list))] AS new_select_statement; -
ETL ストアドプロシージャの構文:
SET esl_link_options = "<new_option_list>"; -- new_sync_sql が空の場合、既存の同期 SQL が保持されます CALL dbms_etl.update_sync_link('<sync_id>', '<new_sync_sql>');
「新しいインデックス + 新しいリンク」による変更
「新しいインデックス + 新しいリンク」アプローチは、最も汎用性の高い変更方法です。リンクはデータを再スキャンし、PolarSearch ノードに書き込みます。新しい検索ビューまたは ETL ストアドプロシージャがデータ同期と検証を完了した後、アプリケーションのクエリトラフィックを新しいインデックスに切り替えます。
例:
shop.user テーブルにフィールドを追加し、検索ビューを再構築します。元の検索ビューは shop.user テーブル (id, name, phone, gmt_create カラムを含む) を user_v1 インデックスに同期しています。オンラインクエリを中断せずに membership_level カラムを追加する必要があります。
-
新しいインデックスの作成: PolarSearch ノードに
user_v2という名前の新しいインデックスを作成し、そのマッピングに新しいmembership_levelフィールドを含めます。PUT user_v2 { "mappings": { "properties": { "id": { "type": "keyword" }, "name": { "type": "text", "fields": { "keyword": { "type": "keyword" } } }, "phone": { "type": "keyword" }, "gmt_create": { "type": "date" }, "membership_level": { "type": "integer" } } } } -
ソーステーブルの変更: ソースの PolarDB for MySQL 内の
userテーブルに新しいカラムを追加します。ALTER TABLE shop.user ADD COLUMN membership_level TINYINT NOT NULL DEFAULT 0 COMMENT 'Membership level'; -
新しい検索ビューの作成:
shop.userテーブルからuser_v2インデックスにデータを同期する新しい検索ビューを作成します。CREATE SEARCH VIEW user_v2 AS SELECT id, name, phone, gmt_create, membership_level FROM shop.user; -
検証と切り替え:
SHOW SEARCH VIEW STATUSを実行して、新しい検索ビューのステータスを確認します。同期レイテンシーが約 0 ~ 1 秒に低下した後、新しいインデックス内のデータを検証します。検証後、アプリケーションのクエリトラフィックを新しいuser_v2インデックスに切り替えます。 -
古いリソースのクリーンアップ: 新しい検索ビューが安定して動作した後、古い検索ビューと
user_v1インデックスを削除します。DROP SEARCH VIEW user_v1;