概要
CREATE REPLICATION TABLE table_name [既存のCREATE TABLEのオプション]
説明
レプリケーションテーブルは、CREATE REPLICATION TABLE文を使用し、中央管理ノードで作成します。
レプリケーションテーブルは、論理レプリケーションを利用し、中央管理ノード上の複製元を各データノード上に複製することでデータの共有を実現しています。そのため、あらかじめ論理レプリケーションを使用できるようにパラメータを設定しておく必要があります。
また、レプリケーションに必要となるレプリケーションオブジェクトを、pgx_create_replication_object()を使用し、あらかじめ全データノードに作成しておく必要があります。
1つでもレプリケーションオブジェクトが定義されていないデータノードが存在する場合は、以下のメッセージが出力され、エラーとなります。
ERROR: レプリケーションオブジェクトは全てのデータノードに存在している必要があります。
CREATE REPLICATION TABLE文は中央管理ノードでのみ実行可能です。
pgx_ddl_target_nodeパラメータが空、または、'COORDINATOR'に設定されている場合でも、'ALLNODES'に設定されている場合と同様に、全ノードにテーブルを定義します。
また、定義されたテーブルは全ノードに対するオブジェクトとして登録されます。
pgx_ddl_target_nodeパラメータがデータノード名に設定されている場合は、以下のメッセージが出力され、エラーとなります。
ERROR: CREATE REPLICATION TABLEは中央管理ノードで実行する必要があります。
中央管理ノードに複製元となるoriginalテーブル、データノードに複製先となるreplicatedテーブルが定義されます。これらは同名のデータベースに定義されるため、あらかじめ中央管理ノード上のデータベースと同名のデータベースを全データノードに定義しておく必要があります。
CREATE REPLICATION TABLE文は、一般ユーザーでも実行可能ですが、以下を満たしている必要があります。
全データノードにマッピングされている
テーブル空間に対するCREATE権が付与されている
pgx_add_to_replication_object()の実行権限を付与されている
pgx_add_to_replication_object()は、CREATE REPLICATION TABLE文の実行中に内部的に実行される関数です。処理をスーパーユーザーの権限を用いて実行します。
レプリケーションテーブルの定義が完了したら実行権限は取り消しても構いません。
中央管理ノード、またはデータノードに、すでにtable_nameと同名のテーブルが存在していた場合は、以下のメッセージが出力され、エラーとなります。
ERROR: リレーション"table_name"はすでに存在します (10874)
CREATE REPLICATION TABLE文以外で定義したテーブルをレプリケーションテーブルに変更することはできません。そのテーブルのデータを持つレプリケーションテーブルを作成したい場合は、新たにCREATE REPLICATION TABLE文でレプリケーションテーブルを定義してから、originalテーブルに対象のテーブルのデータをコピーしてください。
コマンドの実行が成功しているかどうかは、以下を確認してください。
1) システムカタログpgx_replication_tableとpgx_replication_table_nodeに、レプリケーションテーブルの情報が格納されていること
2) originalテーブルをINSERT文などで更新し、replicatedテーブルにも更新が反映されること
いずれかが確認できなかった場合は、一度DROP TABLE文で削除してからエラーを解消し、再度CREATE REPLICATION TABLE文を実行してください。
CREATE REPLICATION TABLE文は、トランザクションブロック内で実行することはできません。
パラメータ
既存のCREATE TABLE文のパラメータのうち、以下のパラメータはCREATE TABLE文と動作が異なります。
TEMPORARY / TEMP 、UNLOGGED
一時テーブルとUNLOGGEDテーブルは、論理レプリケーションで複製することができません。そのため、これらのオプションを指定することはできません。
INHERITS/ PARTITION OF
親テーブルにはレプリケーションテーブルのみを指定することができます。指定した親テーブルがレプリケーションテーブルでなかった場合は、以下のメッセージが出力され、エラーとなります。
ERROR: table_nameはレプリケーションテーブルではありません。
TABLESPACE / USING INDEX TABLESPACE
指定するTABLESPACEは全データノードに存在している必要があります。上記を満たさないTABLESPACEが指定された場合、エラーとなります。