Hologres は、ALTER TABLE 構文を使用して特定のテーブルスキーマ、テーブルプロパティ、および列プロパティを変更することをサポートしています。ただし、ALTER TABLE はテーブルストレージに影響するプロパティの変更をサポートしていません。Hologres V3.1 以降では、REBUILD 構文を使用してさまざまなテーブルパラメーターを柔軟に変更できます。このトピックでは、Hologres で REBUILD を使用する方法について説明します。
構文
コマンド形式
ASYNC REBUILD TABLE [ IF EXISTS ] <table_name>
[ WITH ( <rebuild_parameter> [= <value>] [, ... ] )]
<action> [, ... ];
WHERE action IS ONE OF:
ADD [ COLUMN ] <column_name> <data_type> [ column_constraint [ ... ] ]
ALTER [ COLUMN ] <column_name> [ SET DATA ] TYPE <data_type> [ USING <expression> ]
ALTER [ COLUMN ] <column_name> SET DEFAULT <expression>
ALTER [ COLUMN ] <column_name> DROP DEFAULT
ALTER [ COLUMN ] <column_name> { SET | DROP } NOT NULL
ALTER PRIMARY KEY (<column_name> [, ...])
TO [LOGICAL] PARTITION [BY LIST(<column_name> [, <column_name>])]
SET ( <parameter> [= <value>] [, ... ] )
WHERE rebuild_parameter IS ONE OF:
keep_source
binlog_mode
rebuild_guc_<guc_name> = '<guc_value>'パラメーターの説明
パラメーター | サブキー | 説明 |
ASYNC | REBUILD タスクを非同期的に実行することを指定します。コマンドを実行すると、タスクの | |
table_name | 再構築するターゲットテーブルの名前。 | |
column_name | ターゲットテーブル内の列の名前。 | |
data_type | 列のデータの型。 | |
action | ADD COLUMN | 列を追加します。NOT NULL 列を追加し、デフォルト値を設定できます。 |
ALTER COLUMN TYPE | 列のデータの型を変更します。 | |
ALTER COLUMN SET/DROP DEFAULT | 列のデフォルト値を設定または削除します。既存データの NULL 値は変更されません。 | |
ALTER COLUMN SET/DROP NOT NULL | 列の非 NULL 制約を設定または削除します。 | |
ALTER PRIMARY KEY | テーブルのプライマリキーを変更します。新しいプライマリキーがデータ競合を引き起こす場合、非同期実行中にエラーが報告されます。タスク実行ステータスを監視してください。 | |
TO [LOGICAL] PARTITION | テーブルを論理パーティションテーブルまたは物理パーティションテーブルに変換します。以下のシナリオがサポートされています。
| |
SET ( <parameter> [= <value>]) | テーブルプロパティを変更します。一般的なシナリオは以下のとおりです。
| |
WITH (<rebuild_parameter> [= <value>]) | REBUILD タスクのパラメーターを設定します。一般的なパラメーターは以下のとおりです。
| |
注意事項
非同期実行のみがサポートされています。これにより、接続が長時間占有されるのを防ぎます。
REBUILD タスクを送信すると、送信プロセスは迅速に完了し、タスクの
query_idが返されます。このquery_idを使用して、REBUILD タスクの実行ステータスを表示できます。送信が完了しない場合、これは現在のインスタンスで多くの非同期スケジューリングタスクが実行されているためである可能性があります。この場合、タスク実行ステータスを確認する前にquery_idが返されるのを待ってください。REBUILD によるテーブルパラメーターの変更には、データ再分散が伴い、コンピューティングリソースを消費します。ビジネスの安定性を確保するために、オフピーク時に REBUILD タスクを実行するか、サーバーレスコンピューティングリソースを使用してください。
REBUILD タスクの実行中、テーブルは一定期間読み取り専用状態になり、データは書き込めません。Hologres V4.1 以降では、Dynamic Table テクノロジーに基づく増分更新により、再構築中の読み取り専用期間が大幅に短縮されます。ターゲットテーブルは以下の要件を満たす必要があります。そうでない場合、書き込み操作は長時間中断されます。
ターゲットテーブルは再構築前にプライマリキーを持ち、新しいプライマリキーには元のプライマリキーが含まれています。
ターゲットテーブルは再構築前に列のストアまたは行と列のハイブリッドストアテーブルです。
ターゲットテーブルは再構築後に生成された列を含みません。
ターゲットテーブルが再構築前に物理パーティションテーブルである場合、パーティションキーは再構築後も変更されないままでなければなりません。
ターゲットテーブルが再構築後に論理パーティションテーブルである場合、パーティションキーは1つのみです。
オーバーヘッドを削減するために、単一の REBUILD タスクで複数のパラメーターを変更してください。
物理パーティションテーブルが再構築された後、動的パーティション管理のプロパティは継承されません。REBUILD タスク完了後にこれらを設定する必要があります。これらのプロパティには以下が含まれます。
親テーブルの
auto_partitioningプロパティ。子テーブルのプロパティ (例:
keep_alive)。物理パーティションテーブルが再構築された後、子テーブルに個別に設定されていたプロパティは継承されません。子テーブルのプロパティは親テーブルのプロパティと一致するようになります。例として、
bitmap_columnsおよびdictionary_encoding_columnsがあります。
以下のケースでは、テーブルで REBUILD を実行できません。
JSONB 列の列ストア最適化やベクターフィールドなどの特定の列プロパティ、または列制約を持つテーブル。
フルテキストインデックスまたはグローバルセカンダリインデックスを持つテーブル。
Serial または Bigserial 型の列を含むテーブル。
Dynamic Table またはマテリアライズドビューの依存関係を持つテーブルはサポートされていません。標準ビューの依存関係を持つテーブルはサポートされています。
使用例
バイナリログが無効なテーブルで REBUILD を実行する
-- Create a table and import data
CREATE TABLE rebuild_test (
a TEXT,
b TEXT,
ds TEXT
);
INSERT INTO rebuild_test VALUES ('1', '1', '2025-04-01'), ('2', '2', '2025-04-02'), ('3', '3', '2025-04-03');
-- Add a NOT NULL column and set a default value
ASYNC REBUILD TABLE rebuild_test ADD COLUMN c text NOT NULL DEFAULT 'a';
-- Change the primary key to column a
ASYNC REBUILD TABLE rebuild_test ALTER PRIMARY KEY (a);
-- Use Serverless resources to run the Rebuild task, set the distribution_key and clustering_key for the table, and change the storage format to row-column hybrid
ASYNC REBUILD TABLE rebuild_test
WITH (
rebuild_guc_hg_computing_resource = 'serverless'
)
SET (
distribution_key = 'a',
clustering_key = 'a',
orientation = 'row,column'
);
-- Convert the non-partitioned table to a logical partitioned table, set the partition key to ds, and add the NOT NULL property to the ds column
ASYNC REBUILD TABLE rebuild_test
ALTER COLUMN ds SET NOT NULL,
TO LOGICAL PARTITION BY LIST(ds);バイナリログが有効なテーブルで REBUILD を実行する
REBUILD は過去のバイナリログデータを保持しません。デフォルトでは、バイナリログが有効なテーブルで REBUILD を実行することはできません。タスクを実行するには、binlog_mode パラメーターを指定し、以下の手順に従う必要があります。これにより、ダウンストリームクライアントがすべての過去のバイナリログデータを完全に消費したことが保証されます。
REBUILD を実行します。
ASYNC REBUILD TABLE rebuild_test WITH ( binlog_mode ) <YOUR_ACTION>;binlog_modeパラメーターが設定された REBUILD タスクの場合、タスクはset_readonlyステップが完了すると自動的に一時停止します。以下の SQL ステートメントを使用して進行状況をクエリできます。この時点で、システムはテーブルを読み取り専用に設定しています。データはテーブルに書き込めず、新しいバイナリログデータは生成されません。postgres=# SELECT step, status, progress FROM hologres.rebuild_progress('<query_id>'); step | status | progress -------------------------------+--------+---------- prepare | done | 1/1 create_tmp_table | done | 1/1 get_src_table_snapshot | done | 1/1 insert | done | 1/1 set_readonly | done | 1/1 check_snapshot | | 0/1 re-insert | | - check_additional_child_table | | - create_additional_child_table | | - insert_additional_child_table | | - swap | | 0/1 (11 rows)ダウンストリームクライアントが既存のバイナリログデータの消費を完了するのを待ちます。その後、以下の SQL ステートメントを手動で実行して REBUILD タスクを再開します。タスクが再開されている間も、ソーステーブルは読み取り専用のままであり、新しいバイナリログデータは生成されません。
RESUME '<query_id>';REBUILD タスクが正常に実行されると、新しいテーブルに対してバイナリログが自動的に有効になります。その後、ダウンストリームのバイナリログ消費タスクを再開し、
lsn = 0から新しいテーブルのバイナリログの消費を開始できます。
監視と運用保守
REBUILD タスクの実行ステータス表示
REBUILD タスクは非同期的に実行されます。タスクが送信されると、システムは成功ステータスと query_id を返します。hologres.rebuild_progress システムテーブルをクエリして、非同期サブタスクのステータスを表示する必要があります。すべてのサブタスクが成功して初めて、テーブルは再構築されたと見なされます。コマンドは以下のとおりです。
SELECT * FROM hologres.rebuild_progress('<rebuild_query_id>');システムテーブルの列とその説明は以下のとおりです。
列名 | 説明 |
job_name | REBUILD タスクの query_id。 |
step_id | ステップ ID。REBUILD タスクのサブタスクは、この ID に基づいて順次実行されます。 |
step | ステップ名:
|
status | サブタスクのステータス。
|
progress | サブタスクの進行状況: |
start_time | サブタスクの開始時刻。 |
end_time | サブタスクの終了時刻。 |
queryid | サブタスクの query_id。 |
pid | サービスプロセスID。 |
message | サブタスクのメッセージ。サブタスクでエラーが発生した場合、エラーメッセージがこのフィールドに記録されます。 |
以下は結果の例です。

REBUILD タスクの停止と再開
非同期
REBUILDタスクを停止します。SUSPEND '<query_id>';CANCELによってキャンセルされた非同期タスクを再開します。RESUME '<query_id>';
REBUILD タスクの例外処理
REBUILD タスクがエラーによって中断された場合、または SUSPEND コマンドを手動で実行してタスクを一時停止した場合、RESUME コマンドを実行してタスクを続行できます。また、以下の手順に従ってタスクを終了し、ソーステーブルを回復することもできます。
以下のコマンドを実行して、REBUILD プロセス中に生成された一時テーブルをクリーンアップします。
CALL hg_clean_rebuild_tmp_tables('<query_id>');タスクが中断される前にソーステーブルが REBUILD タスクによって読み取り専用に設定されていた場合、以下のコマンドを実行して読み取り専用状態を解除し、書き込み操作を再開します。
ALTER TABLE <table_name> SET (readonly = false);