Hologres mendukung sintaksis ALTER TABLE untuk memodifikasi skema tabel tertentu, properti tabel, dan properti kolom. Namun, ALTER TABLE tidak mendukung modifikasi properti yang memengaruhi penyimpanan tabel. Mulai dari Hologres V3.1, Anda dapat menggunakan sintaksis REBUILD untuk memodifikasi berbagai parameter tabel secara fleksibel. Topik ini menjelaskan cara menggunakan REBUILD di Hologres.
Sintaksis
Format perintah
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>'Deskripsi parameter
Parameter | Subkey | Deskripsi |
ASYNC | Menentukan bahwa task REBUILD dijalankan secara asinkron. Setelah Anda menjalankan perintah, | |
table_name | Nama tabel target yang akan direbuild. | |
column_name | Nama kolom dalam tabel target. | |
data_type | Tipe data kolom tersebut. | |
action | ADD COLUMN | Menambahkan kolom. Anda dapat menambahkan kolom NOT NULL dan menetapkan nilai default. |
ALTER COLUMN TYPE | Mengubah tipe data kolom. | |
ALTER COLUMN SET/DROP DEFAULT | Menetapkan atau menghapus nilai default untuk kolom. Nilai NULL pada data yang sudah ada tidak diubah. | |
ALTER COLUMN SET/DROP NOT NULL | Menetapkan atau menghapus kendala NOT NULL untuk kolom. | |
ALTER PRIMARY KEY | Mengubah primary key tabel. Jika primary key baru menyebabkan konflik data, error dilaporkan selama eksekusi asinkron. Pantau status eksekusi task tersebut. | |
TO [LOGICAL] PARTITION | Mengonversi tabel menjadi tabel partisi logis atau fisik. Skenario berikut didukung:
| |
SET ( <parameter> [= <value>]) | Memodifikasi properti tabel. Skenario umum meliputi hal-hal berikut:
| |
WITH (<rebuild_parameter> [= <value>]) | Menyetel parameter untuk task REBUILD. Parameter umum meliputi hal-hal berikut:
| |
Catatan penggunaan
Hanya eksekusi asinkron yang didukung guna mencegah koneksi terblokir dalam waktu lama.
Setelah mengirimkan task REBUILD, proses pengiriman segera selesai dan mengembalikan
query_idtask tersebut. Anda dapat menggunakanquery_idini untuk melihat status eksekusi task REBUILD. Jika pengiriman tidak selesai, kemungkinan karena banyak task penjadwalan asinkron sedang berjalan di instans saat ini. Dalam kasus ini, tunggu hinggaquery_iddikembalikan sebelum memeriksa status eksekusi task.Memodifikasi parameter tabel dengan REBUILD melibatkan redistribusi data dan mengonsumsi sumber daya komputasi. Jalankan task REBUILD selama jam sepi atau gunakan sumber daya komputasi Serverless untuk memastikan stabilitas bisnis.
Selama eksekusi task REBUILD, tabel berada dalam status read-only untuk periode tertentu sehingga data tidak dapat ditulis ke dalamnya. Mulai dari Hologres V4.1, pembaruan inkremental berbasis teknologi Dynamic Table secara signifikan mengurangi durasi read-only selama rebuild. Tabel target harus memenuhi persyaratan berikut; jika tidak, operasi tulis akan ditangguhkan dalam waktu lama:
Tabel target memiliki primary key sebelum rebuild, dan primary key baru mencakup primary key asli.
Tabel target merupakan tabel column-store atau row-column hybrid store sebelum rebuild.
Tabel target tidak mengandung kolom generated setelah rebuild.
Jika tabel target merupakan tabel partisi fisik sebelum rebuild, kunci partisi harus tetap tidak berubah setelah rebuild.
Jika tabel target menjadi tabel partisi logis setelah rebuild, tabel tersebut hanya boleh memiliki satu kunci partisi.
Untuk mengurangi overhead, modifikasi beberapa parameter dalam satu task REBUILD.
Setelah tabel partisi fisik direbuild, properti untuk manajemen partisi dinamis tidak diwariskan. Anda harus menyetelnya kembali setelah task REBUILD selesai. Properti tersebut meliputi hal-hal berikut:
Properti
auto_partitioningdari tabel induk.Properti tabel anak, seperti
keep_alive.Setelah tabel partisi fisik direbuild, properti yang sebelumnya disetel secara independen untuk tabel anak tidak diwariskan. Properti tabel anak menjadi konsisten dengan properti tabel induk, contohnya termasuk
bitmap_columnsdandictionary_encoding_columns.
Anda tidak dapat menjalankan REBUILD pada tabel dalam kasus-kasus berikut:
Tabel dengan properti kolom tertentu, seperti optimasi column-store untuk kolom JSONB, atau kendala kolom, seperti bidang vektor.
Tabel dengan indeks teks penuh atau indeks secondary global.
Tabel yang mengandung kolom bertipe Serial atau Bigserial.
Tabel yang memiliki dependensi Dynamic Table atau Tampilan yang di-materialisasi tidak didukung. Tabel yang memiliki dependensi Tampilan standar didukung.
Contoh penggunaan
Jalankan REBUILD pada tabel tanpa binary logging yang diaktifkan
-- Buat tabel dan impor 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');
-- Tambahkan kolom NOT NULL dan tetapkan nilai default
ASYNC REBUILD TABLE rebuild_test ADD COLUMN c text NOT NULL DEFAULT 'a';
-- Ubah primary key menjadi kolom a
ASYNC REBUILD TABLE rebuild_test ALTER PRIMARY KEY (a);
-- Gunakan sumber daya Serverless untuk menjalankan task Rebuild, tetapkan distribution_key dan clustering_key untuk tabel, dan ubah format penyimpanan menjadi 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'
);
-- Konversi tabel non-partisi menjadi tabel partisi logis, tetapkan kunci partisi ke ds, dan tambahkan properti NOT NULL ke kolom ds
ASYNC REBUILD TABLE rebuild_test
ALTER COLUMN ds SET NOT NULL,
TO LOGICAL PARTITION BY LIST(ds);Jalankan REBUILD pada tabel dengan binary logging yang diaktifkan
REBUILD tidak menyimpan data binary logging historis. Secara default, Anda tidak dapat menjalankan REBUILD pada tabel yang telah mengaktifkan binary logging. Untuk menjalankan task tersebut, Anda harus menentukan parameter binlog_mode dan mengikuti langkah-langkah berikut guna memastikan bahwa client downstream telah sepenuhnya mengonsumsi semua data binary logging historis.
Jalankan REBUILD.
ASYNC REBUILD TABLE rebuild_test WITH ( binlog_mode ) <YOUR_ACTION>;Untuk task REBUILD dengan parameter
binlog_modeyang ditetapkan, task tersebut secara otomatis berhenti setelah langkahset_readonlyselesai. Anda dapat memeriksa progres menggunakan pernyataan SQL berikut. Pada titik ini, sistem telah menyetel tabel ke status read-only sehingga data tidak dapat ditulis ke tabel dan tidak ada data binary logging baru yang dihasilkan.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)Tunggu hingga client downstream selesai mengonsumsi data binary logging yang ada. Kemudian, jalankan secara manual pernyataan SQL berikut untuk melanjutkan task REBUILD. Saat task dilanjutkan, tabel sumber tetap dalam status read-only dan tidak ada data binary logging baru yang dihasilkan.
RESUME '<query_id>';Setelah task REBUILD berhasil dijalankan, binary logging secara otomatis diaktifkan untuk tabel baru. Anda kemudian dapat merestart task konsumsi binary logging downstream dan mulai mengonsumsi log biner tabel baru dari
lsn = 0.
Pemantauan dan O&M
Lihat status eksekusi task REBUILD
Task REBUILD dijalankan secara asinkron. Setelah task dikirimkan, sistem mengembalikan status sukses dan query_id. Anda harus melakukan kueri pada tabel sistem hologres.rebuild_progress untuk melihat status subtask asinkron. Tabel dianggap telah direbuild hanya setelah semua subtask berhasil. Perintahnya adalah sebagai berikut:
SELECT * FROM hologres.rebuild_progress('<rebuild_query_id>');Kolom pada tabel sistem dan deskripsinya adalah sebagai berikut:
Nama kolom | Deskripsi |
job_name | query_id dari task REBUILD. |
step_id | ID langkah. Subtask task REBUILD dijalankan secara berurutan berdasarkan ID ini. |
step | Nama langkah:
|
status | Status subtask.
|
progress | Progres subtask: |
start_time | Waktu mulai subtask. |
end_time | Waktu selesai subtask. |
queryid | query_id dari subtask. |
pid | ID proses layanan. |
message | Pesan subtask. Jika terjadi error pada subtask, pesan error dicatat di kolom ini. |
Berikut adalah contoh hasilnya:

Hentikan dan mulai ulang tugas REBUILD
Hentikan task
REBUILDasinkron.SUSPEND '<query_id>';Lanjutkan task asinkron yang dibatalkan oleh
CANCEL.RESUME '<query_id>';
Penanganan exception task REBUILD
Jika task REBUILD terganggu oleh error atau jika Anda menjalankan perintah SUSPEND secara manual untuk menjeda task, Anda dapat menjalankan perintah RESUME untuk melanjutkan task. Anda juga dapat mengikuti langkah-langkah berikut untuk mengakhiri task dan memulihkan tabel sumber.
Jalankan perintah berikut untuk membersihkan tabel temporary yang dihasilkan selama proses REBUILD.
CALL hg_clean_rebuild_tmp_tables('<query_id>');Jika tabel sumber telah diatur ke status read-only oleh task REBUILD sebelum task tersebut terganggu, jalankan perintah berikut untuk menghapus status read-only dan melanjutkan operasi tulis.
ALTER TABLE <table_name> SET (readonly = false);