プロシージャ | 説明 |
---|---|
pgx_attach_replication_table (schema_name name, table_name name, server_name name) | server_nameに指定したデータノードに対応するレプリケーションオブジェクトのレプリケーション対象にoriginalテーブルを追加します。その後、データノードに存在するschema_name,table_nameで指定したテーブルをreplicatedテーブルに変更し、初期データを同期します。 |
server_nameに指定したデータノードにはoriginalテーブルと同様の定義情報のテーブルが存在する必要があります。 pgx_detach_replication_table()によってレプリケーションを停止されたテーブルを再度利用することもできます。また、データノードに存在するテーブルにデータが格納されていると、originalテーブルとの整合性が保てなくなるので、データをすべて削除した後に実行してください。
schema_name, table_nameには既に存在するoriginalテーブルの情報を指定してください。指定したテーブルがレプリケーションテーブルでなかった場合はエラーになります。
server_nameを省略した場合は、全データノードに対して処理を実行します。
このプロシージャは中央管理ノードでスーパーユーザーのみ実行できます。
このプロシージャの実行がコミットされた時点で、ワーカーが起動し、初期データの同期を開始します。同期するデータが大量である場合は時間がかかる可能性があります。
同期が終了するまでは、replicatedテーブルのデータが不足している状態になりますので、アクセスしないよう注意してください。同期中にoriginalテーブルが更新された場合、その内容は同期終了後にreplicatedテーブルに反映されます。
同期が終了したか確認するには、データノードのログを確認してください。
以下にログの例を示します。
初期データ同期開始時: logical replication table synchronization worker for subscription "db13963_node16384", table "tbl1" has started. 初期データ同期終了時: logical replication table synchronization worker for subscription "db13963_node16384", table "tbl1" has finished.
以下の場合はエラーになります。
中央管理ノードにtable_nameという名前のoriginalテーブルが存在しない場合
接続しているデータベースでpgx_create_replication_object()を実行していない場合
内部的にコミットする処理が含まれるため、エラーとなった場合に一部の処理がロールバックされない可能性があります。ロールバックされていない処理が存在するかどうかはシステムカタログpgx_replication_table_nodeを確認することで判断できます。実行対象となるテーブルとデータノードの情報がシステムカタログpgx_replication_table_nodeに追加されていたら、ロールバックされていない処理が存在します。そのような場合は、同じテーブル、データノードに対してpgx_detach_replication_table()を実行し、元の状態に復旧してください。pgx_detach_replication_table()実行後にシステムカタログpgx_replication_table_nodeの情報が削除されていれば復旧が完了しています。 このとき、pgx_detach_replication_table()の実行がエラーとなる可能性もありますが、システムカタログpgx_replication_table_nodeが正しい状態に戻っていれば問題ありません。 これは、pgx_detach_replication_table()にも内部的にコミットする処理が含まれるためです。
このプロシージャはトランザクションブロック内で実行することはできません。