定義情報を操作したい中央管理ノード、または、データノードで実行してください。
中央管理ノードからデータノードに対してのDDL文の実行は、例えば、以下のように実行します。以下のようにデータノードに対してDDL文を実行した場合、DDL文がそのままデータノードに送信され、中央管理ノード上ではDDL文は実行されません。
例1:中央管理ノード上から、データノードdn1に対するオブジェクトの定義 (中央管理ノードに接続) SET pgx_ddl_target_node = 'dn1'; CREATE ROLE role_dn1; //データノードdn1のみに対して実行される。 例2:中央管理ノード上から、データノードdn1に対するオブジェクトの変更 (中央管理ノードに接続) SET pgx_ddl_target_node = 'dn1'; ALTER ROLE role_dn1; //データノードdn1のみに対して実行される。 例3:中央管理ノード上から、データノードdn1に対するオブジェクトの削除 (中央管理ノードに接続) SET pgx_ddl_target_node = 'dn1'; DROP ROLE role_dn1; //データノードdn1のみに対して実行される。
データノードに対して定義したオブジェクトについて、中央管理ノード上や全ノードに対して実行した場合、エラーとなるか、意図しない動作となります。
例1:データノードdn1に対するオブジェクトに対し、dn1以外のノードに対して操作 (中央管理ノードに接続) SET pgx_ddl_target_node = 'dn1'; CREATE ROLE role_dn1; //データノードdn1のみに対して実行される。 SET pgx_ddl_target_node = '(dn1以外)'; ALTER ROLE role_dn1; //データノードdn1以外にrole_dn1は存在しない、もしくは、意図しない情報として定義されているため、実行エラー、または、意図しない動作となる。
中央管理ノードに対するDDL文の実行
中央管理ノード上でDDL文を実行してください。
オブジェクトを定義するコマンドでは、pgx_ddl_target_nodeを空、または'COORDINATOR'に設定してください。
中央管理ノード上のみに定義されたオブジェクトを操作する場合、中央管理ノード上のみで操作が実行されます。全ノードに対して定義されたオブジェクトに対して、中央管理ノード上のみでコマンドを実行したい場合、pgx_ddl_target_nodeを'COORDINATOR'に設定してください。
例えば、以下のように実行します。
例1: SET pgx_ddl_target_node = ''; //または、SET pgx_ddl_target_node = 'COORDINATOR'; CREATE ROLE role_coord; //中央管理ノードのみに対してCREATE ROLEが実行される。 例2: SET pgx_ddl_target_node = 'COORDINATOR'; ALTER ROLE role_sc LOGIN; //role_scが全ノード対象のオブジェクトである場合でも、pgx_ddl_target_node = 'COORDINATOR'のため、中央管理ノードのみに対して実行される。 例3: SET pgx_ddl_target_node = 'COORDINATOR'; DROP ROLE role_sc; //role_scが全ノード対象のオブジェクトである場合でも、pgx_ddl_target_node = 'COORDINATOR'のため、中央管理ノードのみに対して実行される。
全ノード対象のオブジェクトについて、中央管理ノード上のみで操作することは可能ですが、基本的には行うことは想定していません。例えば、全ノード対象のオブジェクトの定義情報を中央管理ノードのみで変更した場合に、そのオブジェクトに関連する全ノードに対する処理の実行時にエラーが発生するといった可能性があるため、注意してください。
利用シーンは限られますが、中央管理ノード上のみで操作するケースとして、例えば、以下が考えられます。
レプリケーションテーブルのインデックスについて、中央管理ノード上のインデックスのみが肥大化した場合
中央管理ノード上のインデックスのみが肥大化してしまうケースがあった場合に、他データノード上の業務に影響を与えず、中央管理ノード上のインデックスのみをREINDEXを実行する。
レプリケーションテーブルについて、中央管理ノード上のテーブルのみが肥大化した場合
(レプリケーションテーブルに多量にINSERTした後にROLLBACKした場合など)
中央管理ノード上のレプリケーションテーブルのみについてVACUUMを実行する。
データノードに対するDDL文の実行
中央管理ノード、またはデータノード上でDDL文を実行してください。
中央管理ノード上から実行する場合、pgx_ddl_target_node = 'データノード名' と設定して実行してください。
例えば、以下のように実行します。
SET pgx_ddl_target_node = 'datanode1'; CREATE ROLE role_sc; //datanode1に対してCREATE ROLEを実行