Hologres mendukung modifikasi beberapa struktur tabel, properti tabel, dan properti kolom melalui sintaks ALTER TABLE. Namun, untuk properti yang memengaruhi penyimpanan tabel, sintaks ALTER TABLE tidak didukung. Mulai dari Hologres V3.1, sintaks REBUILD tersedia dan memungkinkan Anda memodifikasi berbagai parameter tabel secara fleksibel. Topik ini menjelaskan cara menggunakan REBUILD di Hologres.
Sintaks
Format pernyataan
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-item |
Deskripsi |
|
ASYNC |
Pernyataan ini menentukan bahwa tugas REBUILD dieksekusi secara asinkron. Setelah tugas dieksekusi, sebuah |
|
|
table_name |
Nama tabel target yang akan direbuild. |
|
|
column_name |
Nama kolom pada tabel target. |
|
|
data_type |
Tipe data kolom. |
|
|
action |
ADD COLUMN |
Menambahkan kolom. Anda dapat menambahkan kolom NOT NULL dan mengatur nilai default. |
|
ALTER COLUMN TYPE |
Memodifikasi tipe data kolom. |
|
|
ALTER COLUMN SET/DROP DEFAULT |
Mengatur atau menghapus nilai default untuk kolom. Nilai NULL pada data yang sudah ada tidak akan berubah. |
|
|
ALTER COLUMN SET/DROP NOT NULL |
Mengatur atau menghapus kendala NOT NULL untuk kolom. |
|
|
ALTER PRIMARY KEY |
Memodifikasi primary key tabel. Jika terjadi konflik data dengan primary key baru, error akan dilaporkan selama eksekusi asinkron. Pantau status eksekusi tugas segera. |
|
|
TO [LOGICAL] PARTITION |
Mengonversi tabel menjadi tabel partisi logis/fisik, mendukung skenario berikut:
|
|
|
SET ( <parameter> [= <value>]) |
Memodifikasi properti tabel. Skenario umum:
|
|
|
WITH (<rebuild_parameter> [= <value>]) |
Mengatur parameter terkait tugas REBUILD. Parameter umum:
|
|
Perhatian
-
Hanya eksekusi asinkron (ASYNC) yang didukung, sehingga tidak memerlukan koneksi jangka panjang.
-
Setelah mengirimkan tugas REBUILD, pernyataan tersebut mengembalikan
query_id. Anda dapat menggunakanquery_idini untuk melihat status eksekusi tugas REBUILD. Jika pengiriman tidak segera mengembalikanquery_id, kemungkinan banyak tugas asinkron sedang berjalan di instans tersebut. Disarankan untuk menunggu hinggaquery_iddikembalikan sebelum memeriksa status tugas. -
Penggunaan fitur REBUILD untuk memodifikasi parameter tabel melibatkan redistribusi data tingkat bawah yang mengonsumsi sumber daya komputasi. Oleh karena itu, disarankan mengeksekusi tugas REBUILD pada jam non-puncak atau menggunakan sumber daya komputasi tanpa server guna menjaga stabilitas bisnis.
-
Selama tugas REBUILD berlangsung, tabel sementara diatur ke status read-only dan penulisan diblokir. Mulai dari Hologres V4.1, REBUILD menggunakan teknologi Dynamic Table untuk pembaruan inkremental, yang secara signifikan mengurangi durasi status read-only. Optimasi ini hanya berlaku jika tabel memenuhi kondisi berikut; jika tidak, tabel tetap dalam status read-only selama seluruh durasi tugas.
-
Tabel target harus memiliki primary key sebelum rebuild, dan primary key baru harus mencakup semua kolom dari primary key asli.
-
Tabel target harus menggunakan penyimpanan berorientasi kolom atau penyimpanan hibrida baris-kolom sebelum rebuild.
-
Tabel target tidak boleh berisi kolom generated setelah rebuild.
-
Jika tabel target merupakan tabel partisi fisik sebelum rebuild, kunci partisinya 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, gabungkan beberapa perubahan ke dalam satu tugas REBUILD.
-
Setelah tabel partisi fisik direbuild, properti manajemen partisi dinamis-nya tidak diwariskan. Anda harus mengonfigurasi ulang properti tersebut setelah tugas selesai. Properti tersebut meliputi:
-
Properti
auto_partitioningpada tabel partisi induk. -
Properti partisi anak, seperti
keep_alive. -
Setelah tabel partisi fisik direbuild, semua properti yang sebelumnya diatur secara independen pada partisi anaknya tidak diwariskan. Partisi anak akan mewarisi semua properti dari tabel induk, seperti
bitmap_columnsdandictionary_encoding_columns.
-
-
REBUILD tidak didukung untuk jenis tabel berikut:
-
Tabel dengan properti kolom tertentu (seperti optimasi penyimpanan kolom untuk kolom JSONB) atau kendala kolom (seperti kolom vektor).
-
Tabel dengan indeks teks penuh atau indeks secondary global.
-
Tabel yang berisi kolom bertipe data Serial atau Bigserial.
-
Tabel yang memiliki dependensi Dynamic Table atau materialized view. Tabel yang memiliki dependensi standard view didukung.
-
Contoh
Rebuild pada tabel tanpa Binlog
-- 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 dengan 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 tugas REBUILD, atur distribution_key dan clustering_key, serta ubah ke 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 non-partisi menjadi tabel partisi logis, atur 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);
Rebuild pada tabel dengan Binlog
Pernyataan REBUILD tidak menyimpan data Binlog historis. Oleh karena itu, secara default Anda tidak dapat menjalankan REBUILD pada tabel yang memiliki Binlog aktif. Anda harus menentukan parameter binlog_mode dan mengikuti langkah-langkah berikut untuk memastikan bahwa konsumen downstream telah sepenuhnya memproses semua data Binlog yang ada.
-
Jalankan pernyataan REBUILD.
ASYNC REBUILD TABLE rebuild_test WITH ( binlog_mode ) <YOUR_ACTION>; -
Untuk tugas REBUILD dengan parameter
binlog_mode, tugas tersebut secara otomatis berhenti setelah langkahset_readonlyselesai. Anda dapat memeriksa progresnya dengan menggunakan pernyataan SQL berikut. Pada titik ini, tabel dalam status read-only, sehingga tidak ada data yang dapat ditulis 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 klien downstream selesai mengonsumsi data Binlog yang ada dan hentikan tugas konsumen tersebut. Kemudian, jalankan secara manual pernyataan SQL berikut untuk melanjutkan tugas REBUILD.
RESUME '<query_id>'; -
Setelah tugas REBUILD selesai, Binlog secara otomatis diaktifkan untuk tabel baru. Anda harus menjalankan ulang tugas konsumsi Binlog downstream secara tanpa status dan mengonsumsi Binlog tabel baru mulai dari
lsn = 0.
Konversi tabel reguler menjadi liquid table
Mulai dari Hologres V4.2, Anda dapat menggunakan REBUILD untuk mengonversi tabel reguler menjadi liquid table, atau mengonversi liquid table kembali menjadi tabel reguler.
--- Konversi tabel reguler menjadi liquid table.
ASYNC REBUILD TABLE normal_table
SET (
liquid_table = 'true'
);
--- Konversi liquid table menjadi tabel reguler.
ASYNC REBUILD TABLE liquid_table
SET (
liquid_table = 'false'
);
Pemantauan dan O&M
Lihat status eksekusi tugas REBUILD
Tugas REBUILD berjalan secara asinkron. Ketika tugas berhasil dikirimkan, pernyataan tersebut mengembalikan status sukses dan query_id. Kueri tampilan sistem hologres.rebuild_progress untuk memantau status subtask asinkron. Operasi REBUILD hanya selesai ketika semua subtask berhasil. Jalankan perintah berikut:
SELECT * FROM hologres.rebuild_progress('<rebuild_query_id>');
Tabel berikut menjelaskan kolom pada tabel sistem tersebut.
|
Nama kolom |
Deskripsi |
|
job_name |
query_id dari tugas REBUILD. |
|
step_id |
ID langkah. Subtask REBUILD dieksekusi secara berurutan sesuai ID langkah. |
|
step |
Nama langkah:
|
|
status |
Status subtask.
|
|
progress |
Progres subtask, ditampilkan sebagai |
|
start_time |
Waktu mulai subtask. |
|
end_time |
Waktu selesai subtask. |
|
queryid |
query_id dari subtask. |
|
pid |
ID proses layanan. |
|
message |
Pesan subtask. Jika subtask melaporkan error, pesan error tersebut dicatat di kolom ini. |
Hentikan dan jalankan ulang tugas REBUILD
-
Menghentikan sementara tugas asinkron
REBUILD.SUSPEND '<query_id>'; -
Menjalankan ulang tugas asinkron yang ditandai
CANCEL.RESUME '<query_id>';
Pengecualian tugas bangun ulang
Jika tugas REBUILD terganggu oleh error atau dihentikan secara manual, Anda dapat melanjutkannya dengan perintah RESUME atau menghentikan tugas dan membersihkannya dengan mengikuti langkah-langkah berikut:
-
Jalankan perintah berikut untuk membersihkan tabel sementara yang dibuat selama proses REBUILD.
CALL hg_clean_rebuild_tmp_tables('<query_id>'); -
Jika tabel diatur menjadi read-only, jalankan perintah yang sesuai untuk mengembalikan akses tulis.
-
Untuk versi Hologres sebelum V4.1, jalankan perintah berikut.
ALTER TABLE <table_name> SET (readonly = false); -
Untuk Hologres V4.1 dan versi setelahnya, jalankan perintah berikut.
ALTER TABLE <table_name> RESET (ddl_options,write_options);
-