Di Hologres, Anda dapat menggunakan sintaks ALTER TABLE untuk memodifikasi struktur tabel tertentu, properti tabel, dan properti kolom. Namun, ALTER TABLE tidak dapat digunakan untuk mengubah properti yang memengaruhi penyimpanan tabel. Mulai versi V3.1 dan yang lebih baru, Hologres mendukung sintaks REBUILD yang memungkinkan modifikasi berbagai parameter tabel. Topik ini menjelaskan cara menggunakan perintah REBUILD di Hologres.
Sintaks
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>'Parameter
Parameter | Sub-parameter | Deskripsi |
ASYNC | Menentukan bahwa task REBUILD dijalankan secara asinkron. Perintah ini mengembalikan | |
table_name | Nama tabel target yang akan dibangun ulang. | |
column_name | Nama kolom dalam tabel target. | |
data_type | Tipe data kolom. | |
action | ADD COLUMN | Menambahkan kolom. Anda dapat menambahkan kolom NOT NULL dan menetapkan nilai default. |
ALTER COLUMN TYPE | Memodifikasi tipe data kolom. | |
ALTER COLUMN SET/DROP DEFAULT | Menetapkan atau menghapus nilai default untuk kolom. Nilai NULL yang sudah ada tidak diubah. | |
ALTER COLUMN SET/DROP NOT NULL | Menetapkan atau menghapus batasan NOT NULL untuk kolom. | |
ALTER PRIMARY KEY | Memodifikasi primary key tabel. Jika primary key baru menyebabkan konflik data, task asinkron akan melaporkan error. Pantau status 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>]) | Menetapkan parameter untuk tugas REBUILD. Parameter umum meliputi hal-hal berikut:
| |
Catatan
Hanya eksekusi asinkron (ASYNC) yang didukung guna mencegah koneksi berjalan lama.
Saat Anda mengirimkan task REBUILD, sistem segera mengembalikan
query_id. Anda dapat menggunakanquery_idini untuk memeriksa status task REBUILD. Jika pengiriman task tidak selesai, kemungkinan karena banyak task asinkron sedang berjalan di instans Anda. Dalam kasus ini, tunggu beberapa saat lalu periksa status task setelahquery_iddikembalikan.Memodifikasi parameter tabel dengan perintah REBUILD melibatkan redistribusi data dan mengonsumsi sumber daya komputasi. Untuk menjaga stabilitas bisnis, jalankan task REBUILD selama jam sepi atau gunakan sumber daya komputasi Serverless.
Selama task REBUILD berlangsung, salah satu langkahnya menetapkan tabel menjadi read-only. Selama periode tersebut, Anda tidak dapat menulis data ke tabel tersebut.
Perintah REBUILD tidak mendukung tabel yang bergantung pada tabel dinamis atau tampilan yang di-materialisasi, tetapi mendukung tabel yang bergantung pada tampilan standar.
Untuk memodifikasi beberapa parameter, lakukan dalam satu task REBUILD guna mengurangi overhead.
Setelah Anda merebuild tabel partisi fisik, properti manajemen partisi dinamis tidak diwariskan. Anda harus mengonfigurasi ulang properti-properti ini setelah task REBUILD selesai. Properti tersebut meliputi:
Properti
auto_partitioningdari tabel induk.Properti seperti
keep_aliveuntuk tabel anak.Setelah tabel partisi fisik direbuild, properti yang sebelumnya ditetapkan secara independen pada tabel anak—seperti
bitmap_columnsdandictionary_encoding_columns—tidak diwariskan. Nilainya akan diselaraskan dengan tabel induk.
REBUILD saat ini tidak mendukung tabel-tabel berikut:
Tabel dengan properti kolom tertentu, seperti optimisasi penyimpanan kolom untuk kolom JSONB atau kendala kolom untuk kolom vektor.
Tabel dengan indeks teks penuh atau indeks secondary global.
Tabel dengan kolom Serial atau Bigserial.
Contoh penggunaan
Jalankan REBUILD pada tabel tanpa binary logging
-- 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, serta ubah orientasi menjadi penyimpanan hibrida baris-kolom.
ASYNC REBUILD TABLE rebuild_test
WITH (
rebuild_guc_hg_computing_resource = 'serverless'
)
SET (
distribution_key = 'a',
clustering_key = 'a',
orientation = 'row,column'
);
-- Konversi tabel standar menjadi tabel partisi logis.
-- Tetapkan kunci partisi ke ds dan tambahkan kendala 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
Perintah REBUILD tidak menyimpan data binary logging (Binlog) historis. Oleh karena itu, Anda tidak dapat menjalankan REBUILD pada tabel yang telah mengaktifkan binary logging secara default. Untuk melakukan operasi ini, Anda harus mengonfigurasi parameter binlog_mode dalam task REBUILD dan mengikuti langkah-langkah berikut. Proses ini memastikan bahwa client downstream telah mengonsumsi semua data Binlog historis sebelum tabel direbuild.
Jalankan REBUILD.
ASYNC REBUILD TABLE rebuild_test WITH ( binlog_mode ) <your_action>;Untuk task REBUILD yang mencakup parameter
binlog_mode, task tersebut secara otomatis berhenti setelah langkahset_readonlyselesai. Anda dapat memeriksa progres dengan menjalankan perintah SQL berikut. Pada titik ini, sistem telah menetapkan tabel menjadi read-only. Anda tidak dapat menulis data ke tabel tersebut, dan tidak ada data Binlog 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 Binlog yang ada. Kemudian, jalankan secara manual perintah SQL berikut untuk melanjutkan task REBUILD. Selama proses ini, tabel sumber tetap dalam mode read-only, dan tidak ada data Binlog baru yang dihasilkan.
RESUME '<query_id>';Setelah task REBUILD berhasil diselesaikan, binary logging secara otomatis diaktifkan untuk tabel baru. Anda kemudian dapat merestart task konsumsi Binlog downstream. Konsumsi Binlog tabel baru harus dimulai dari
lsn = 0.
Pemantauan dan O&M
Periksa status task REBUILD
Task REBUILD dijalankan secara asinkron. Saat Anda mengirimkan task, sistem mengembalikan status sukses untuk pengiriman dan query_id. Anda harus memeriksa status sub-task asinkron di tabel sistem hologres.rebuild_progress. Operasi REBUILD hanya dianggap selesai setelah semua sub-task berhasil. Anda dapat menggunakan perintah berikut untuk memeriksa status:
SELECT * FROM hologres.rebuild_progress('<rebuild_query_id>');Kolom tabel sistem dan deskripsinya adalah sebagai berikut:
Kolom | Deskripsi |
job_name | query_id dari tugas REBUILD. |
step_id | ID langkah. Sub-task REBUILD dieksekusi secara berurutan sesuai ID ini. |
step | Nama langkah:
|
status | Status sub-task.
|
progress | Progres sub-task: |
start_time | Waktu mulai sub-task. |
end_time | Waktu selesai sub-task. |
queryid | query_id dari sub-task. |
pid | ID proses layanan. |
message | Pesan sub-task. Jika sub-task melaporkan error, pesan error tersebut dicatat di kolom ini. |
Berikut adalah hasil sampel:

Hentikan dan mulai ulang tugas REBUILD
Jeda task
REBUILDasinkron.SUSPEND '<query_id>';Lanjutkan tugas asinkron yang dijeda dengan menggunakan perintah
CANCEL.RESUME '<query_id>';
Tangani pengecualian tugas REBUILD
Jika task REBUILD terganggu oleh error atau dijeda secara manual dengan perintah SUSPEND, Anda dapat menggunakan perintah RESUME untuk melanjutkan task tersebut. Atau, Anda dapat mengikuti langkah-langkah berikut untuk mengakhiri task dan memulihkan tabel sumber.
Gunakan perintah berikut untuk membersihkan tabel sementara yang dibuat selama proses REBUILD.
CALL hg_clean_rebuild_tmp_tables('<query_id>');Jika task terganggu setelah tabel sumber ditetapkan menjadi read-only, gunakan perintah berikut untuk mengembalikan operasi tulis ke tabel tersebut.
ALTER TABLE <table_name> SET (readonly = false);