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 | 列の NOT NULL 制約を設定または削除します。 | |
ALTER PRIMARY KEY | テーブルのプライマリキーを変更します。新しいプライマリキーがデータ競合を引き起こす場合、非同期タスクはエラーを報告します。タスクステータスを監視してください。 | |
TO [LOGICAL] PARTITION | テーブルを論理または物理パーティションテーブルに変換します。次のシナリオがサポートされています:
| |
SET ( <parameter> [= <value>]) | テーブルのプロパティを変更します。一般的なシナリオは次のとおりです:
| |
WITH (<rebuild_parameter> [= <value>]) | REBUILD タスクのパラメーターを設定します。一般的なパラメーターは次のとおりです:
| |
注意事項
非同期 (ASYNC) 実行のみがサポートされています。これにより、長時間実行される接続を防ぎます。
REBUILD タスクを送信すると、すぐに
query_idが返されます。このquery_idを使用して、REBUILD タスクのステータスを確認できます。タスクの送信が完了しない場合、インスタンスで多くの非同期タスクが実行されている可能性があります。この場合、しばらく待ってからquery_idが返された後にタスクステータスを確認してください。REBUILD コマンドでテーブルパラメーターを変更すると、データの再配布が発生し、計算リソースを消費します。ビジネスの安定性を確保するために、オフピーク時間に REBUILD タスクを実行するか、Serverless 計算リソースを使用してください。
REBUILD タスク中、あるステップでテーブルが読み取り専用に設定されます。この間、テーブルにデータを書き込むことはできません。
REBUILD コマンドは、動的テーブルまたはマテリアライズドビューに依存するテーブルをサポートしていません。ただし、標準ビューに依存するテーブルはサポートしています。
複数のパラメーターを変更する場合は、オーバーヘッドを削減するために、1 つの REBUILD タスクで変更してください。
物理パーティションテーブルを再構築した後、動的パーティション管理プロパティは継承されません。REBUILD タスクが完了した後に、これらのプロパティを再設定する必要があります。これらのプロパティには、次のものが含まれます:
親テーブルの
auto_partitioningプロパティ。子テーブルの
keep_aliveなどのプロパティ。物理パーティションテーブルが再構築された後、
bitmap_columnsやdictionary_encoding_columnsなど、子テーブルで個別に設定されたプロパティは継承されません。代わりに、それらの値は親テーブルと一致するようになります。
REBUILD は現在、次のテーブルをサポートしていません:
JSONB 列の列ストレージ最適化やベクトル列の列制約など、特定の列プロパティを持つテーブル。
フルテキストインデックスまたはグローバルセカンダリインデックスを持つテーブル。
Serial または Bigserial 列を持つテーブル。
使用例
バイナリロギングが有効でないテーブルでの REBUILD の実行
-- テーブルを作成し、データをインポートします。
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');
-- NOT NULL 列を追加し、デフォルト値を設定します。
ASYNC REBUILD TABLE rebuild_test ADD COLUMN c text NOT NULL DEFAULT 'a';
-- プライマリキーを列 a に変更します。
ASYNC REBUILD TABLE rebuild_test ALTER PRIMARY KEY (a);
-- Serverless リソースを使用して Rebuild タスクを実行します。
-- テーブルの distribution_key と clustering_key を設定し、orientation を行列ハイブリッドストアに変更します。
ASYNC REBUILD TABLE rebuild_test
WITH (
rebuild_guc_hg_computing_resource = 'serverless'
)
SET (
distribution_key = 'a',
clustering_key = 'a',
orientation = 'row,column'
);
-- 標準テーブルを論理パーティションテーブルに変換します。
-- パーティションキーを ds に設定し、ds 列に NOT NULL 制約を追加します。
ASYNC REBUILD TABLE rebuild_test
ALTER COLUMN ds SET NOT NULL,
TO LOGICAL PARTITION BY LIST(ds);バイナリロギングが有効なテーブルでの REBUILD の実行
REBUILD コマンドは、履歴バイナリロギング (Binlog) データを保持しません。そのため、デフォルトでバイナリロギングが有効になっているテーブルで REBUILD を実行することはできません。この操作を実行するには、REBUILD タスクで binlog_mode パラメーターを設定し、以下の手順に従う必要があります。このプロセスにより、テーブルが再構築される前に、ダウンストリームクライアントがすべての履歴 Binlog データを消費したことが保証されます。
REBUILD を実行します。
ASYNC REBUILD TABLE rebuild_test WITH ( binlog_mode ) <your_action>;binlog_modeパラメーターを含む REBUILD タスクの場合、set_readonlyステップが完了するとタスクは自動的に一時停止します。次の SQL コマンドを実行して進行状況を確認できます。この時点で、システムはテーブルを読み取り専用に設定しています。テーブルにデータを書き込むことはできず、新しい Binlog データは生成されません。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)ダウンストリームクライアントが既存の Binlog データの消費を完了するのを待ちます。その後、手動で次の SQL コマンドを実行して REBUILD タスクを再開します。このプロセス中、ソーステーブルは読み取り専用のままであり、新しい Binlog データは生成されません。
RESUME '<query_id>';REBUILD タスクが正常に完了すると、新しいテーブルに対してバイナリロギングが自動的に有効になります。その後、ダウンストリームの Binlog 消費タスクを再開できます。新しいテーブルの Binlog の消費は
lsn = 0から開始する必要があります。
監視と O&M
REBUILD タスクのステータスの確認
REBUILD タスクは非同期で実行されます。タスクを送信すると、システムは送信の成功ステータスと query_id を返します。hologres.rebuild_progress システムテーブルで非同期サブタスクのステータスを確認する必要があります。REBUILD 操作は、すべてのサブタスクが成功した後にのみ完了します。次のコマンドを使用してステータスを確認できます:
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>');ソーステーブルが読み取り専用に設定された後にタスクが中断された場合は、次のコマンドを使用してテーブルへの書き込み操作を復元します。
ALTER TABLE <table_name> SET (readonly = false);