すべてのプロダクト
Search
ドキュメントセンター

Hologres:Rebuild

最終更新日:Apr 21, 2026

Hologres は、ALTER TABLE 構文を使用して一部のテーブル構造、テーブルプロパティ、および列プロパティの変更をサポートしています。ただし、テーブルストレージに影響を与えるプロパティについては、ALTER TABLE 構文はサポートされていません。Hologres V3.1 以降、REBUILD 構文がサポートされるようになりました。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 タスクは非同期で実行されます。タスクが実行されると、query_id が返されます。この query_id を使用して、タスクの実行ステータスをモニターできます。同期実行は現在サポートされていません。

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>])

テーブルプロパティを変更します。一般的なシナリオ:

  • 分散キー distribution_key を変更します。

  • セグメントキー event_time_column を変更します。

  • クラスタリングインデックス clustering_key を変更します。

  • テーブルストレージフォーマット orientation を変更し、行指向ストレージ、列指向ストレージ、行列ハイブリッドストレージを相互に変換します。

  • テーブルの table_group を変更します。

  • その他すべてのテーブルプロパティの変更がサポートされています。

  • ビットマップ索引 bitmap_columns または辞書エンコーディング列 dictionary_encoding_columns を変更するために REBUILD を使用する必要はありません。代わりに、ALTER TABLE 構文を使用します。

WITH (<rebuild_parameter> [= <value>])

REBUILD タスク関連のパラメーターを設定します。一般的なパラメーター:

  • keep_source: 値を設定する必要はありません。変換後、元のテーブルは削除されず、tmp_rebuild_old_<query_id>_<unique_id>_<table_name> に名前が変更されます。

  • binlog_mode:Binlog が有効なテーブルで REBUILD を実行できます。Binlog データの損失を防ぐには、「」セクションの手順に従う必要があります。

  • rebuild_guc_hg_computing_resource='serverless': サーバーレスリソースを使用して REBUILD タスクを実行します。これにより、インスタンスのリソースの使用が回避され、タスクの安定性が向上します。

  • rebuild_guc_<guc_name>='<guc_value>': タスクの他の GUC パラメーターを指定します。詳細については、「GUC パラメーター」をご参照ください。

注意事項

  • 非同期実行 (ASYNC) のみがサポートされており、長期間の接続占有は必要ありません。

  • REBUILD タスクを送信すると、迅速に実行されて query_id が返されます。 この query_id を使用して、REBUILD タスクの実行ステータスを確認することができます。 送信後、タスクがしばらく正常に完了しない場合、現在のインスタンスで多数の非同期スケジューリングタスクが実行されていることが原因である可能性があります。 query_id が返された後、しばらく待ってからタスクの実行ステータスを確認することをお勧めします。

  • REBUILD 機能を使用してテーブルパラメーターを変更すると、内部的なデータ再配布が行われ、コンピューティングリソースが消費されます。そのため、ビジネスのオフピーク時間帯に REBUILD タスクを実行するか、この操作にサーバーレスコンピューティングリソースを使用してビジネスの安定性を確保することを推奨します。

  • REBUILD タスク中、テーブルは読み取り専用となり、書き込みはできません。Hologres V4.1 以降、REBUILDDynamic Table テクノロジーを使用して増分更新を行い、読み取り専用ウィンドウを大幅に短縮します。長時間の書き込みダウンタイムを避けるために、ターゲットテーブルは次の要件を満たす必要があります:

    • REBUILD 操作の前にテーブルにプライマリキーが必要であり、新しいプライマリキーには元のプライマリキーのすべての列が含まれている必要があります。

    • REBUILD 操作の前に、テーブルは列指向ストレージまたは行列ハイブリッドストレージを使用している必要があります。

    • REBUILD 操作の後、テーブルに生成列が含まれていてはなりません。

    • REBUILD 操作の前にテーブルが物理パーティションテーブルである場合、そのパーティションキーは変更してはなりません。

    • REBUILD 操作の後にテーブルが論理パーティションテーブルになる場合、パーティションキーは 1 つしか持てません。

  • オーバーヘッドを削減するために、1 つの REBUILD タスクで複数のパラメーターを変更してください。

  • 物理パーティションテーブルを再構築した後、その「動的パーティション管理」プロパティは継承されません。再構築が完了した後、次のプロパティを手動で設定する必要があります:

    • 親テーブルの auto_partitioning プロパティ。

    • 子テーブルの keep_alive およびその他の属性。

    • 物理パーティションテーブルを再構築すると、子テーブルに個別に設定されていた bitmap_columnsdictionary_encoding_columns などのプロパティは継承されず、親テーブルの設定に復元されます。

  • REBUILD は、次のテーブルではサポートされていません:

    • JSONB 列の列指向ストレージ最適化や、ベクター列などの列制約など、特別な列プロパティ設定を持つテーブル。

    • フルテキストインデックスまたはグローバルセカンダリインデックスを持つテーブル。

    • Serial または Bigserial データ型の列を含むテーブル。

    • Dynamic Table またはマテリアライズドビューによって参照されるテーブル。ビューによって参照されるテーブルはサポートされています。

Binlog がないテーブルの再構築

-- テーブルを作成し、データをインポートします。
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');

-- デフォルト値を持つ非 NULL 列を追加します。
ASYNC REBUILD TABLE rebuild_test ADD COLUMN c text NOT NULL DEFAULT 'a';

-- プライマリキーを列 a に変更します。
ASYNC REBUILD TABLE rebuild_test ALTER PRIMARY KEY (a);

-- サーバーレスリソースを使用して REBUILD タスクを実行し、テーブルの distribution_key と clustering_key を設定し、ストレージを行列ハイブリッドに変更します。
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);

Binlog があるテーブルの再構築

REBUILD は履歴 Binlog データを保持しません。したがって、Binlog が有効になっているテーブルでは、デフォルトで REBUILD はサポートされていません。ダウンストリームシステムが履歴 Binlog データを完全に消費したことを確認するには、binlog_mode パラメーターを指定し、以下の手順に従う必要があります。

  1. REBUILD コマンドを実行します。

    ASYNC REBUILD TABLE rebuild_test 
    WITH (
      binlog_mode
    )
    <YOUR_ACTION>;
  2. REBUILD タスクで binlog_mode パラメーターが設定されている場合、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)
  3. 下流クライアントが既存のすべての Binlog データの消費を完了するのを待ちます。その後、次の SQL ステートメントを実行して REBUILD タスクを手動で再開します。このプロセス中、ソーステーブルは読み取り専用モードのままであり、新しい Binlog データは生成されません。

    RESUME '<query_id>';

    REBUILD タスクが完了すると、新しいテーブルで Binlog が自動的に有効になります。その後、ダウンストリームの Binlog 消費タスクを再開し、lsn = 0 から消費を開始できます。

監視と運用保守

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

ステップ名:

  • prepare:タスクの準備をします。

  • create_tmp_table:一時テーブルを作成します。

  • get_src_table_snapshot:元のテーブルのデータスナップショットを取得します。

  • insert:履歴データを一時テーブルにインポートします。

  • set_readonly:再構築するテーブルを読み取り専用に設定します。これにより、データの書き込みが停止します。

  • check_snapshot: テーブルの現在のデータスナップショットを、ステップ 3 で取得されたものと比較します。両者が異なる場合、プロセスは re-insert ステップに進みます。

  • re-insert:増分データをインポートします。

  • check_additional_child_table:REBUILD の開始から現在までにユーザーによって新しい子テーブルが作成されたかどうかを確認します。このステップは物理パーティションテーブル専用です。

  • create_additional_child_table:一時テーブル用に新しい子テーブルを作成する可能性があります。このステップは物理パーティションテーブル専用です。

  • insert_additional_child_table:新しい一時子テーブルに履歴データをインポートします。このステップは物理パーティションテーブル専用です。

  • swap:元のテーブルを一時テーブルに置き換えます。

status

サブタスクのステータス。

  • done:完了。

  • doing:進行中。

  • NULL:このステップを実行する必要がないか、現在このステップを実行する必要があるかどうかを判断できません。

  • error:実行に失敗しました。message フィールドのエラーメッセージを確認してください。

progress

サブタスクの進捗: m/n。この形式では、n は実行されるサブステップの総数を表し、m は実行済みのサブステップ数を表します。この総数は、一般的にパーティション数と正の相関があります。

start_time

サブタスクの開始時刻。

end_time

サブタスクの終了時刻。

queryid

サブタスクの query_id。

pid

サービスプロセス ID。

message

サブタスクのメッセージ。サブタスクがエラーを報告した場合、エラーメッセージがこのフィールドに記録されます。

次の図は、サンプル結果を示しています。

opopo

REBUILD タスクの停止と再開

  • REBUILD 非同期タスクを停止します。

    SUSPEND '<query_id>';
  • CANCEL に設定された非同期タスクを再開します。

    RESUME '<query_id>';

REBUILD タスク例外の処理

REBUILD タスクがエラーで中断された場合、または SUSPEND コマンドを使用して手動で停止した場合は、RESUME コマンドで再開するか、次の手順に従ってタスクを終了し、ソーステーブルを復元できます。

  • 次のコマンドを実行して、REBUILD プロセス中に作成された一時テーブルをクリーンアップします。

    CALL hg_clean_rebuild_tmp_tables('<query_id>');
  • ソーステーブルが読み取り専用になった後にタスクが中断された場合は、適切なコマンドを実行して書き込みを再度有効にします。

    • Hologres V4.1 より前のバージョンの場合:

      ALTER TABLE <table_name> SET (readonly = false);
    • Hologres V4.1 以降の場合:

      ALTER TABLE <table_name> SET RESET (ddl_options,write_options);