Hologres menyediakan fitur recycle bin tabel. Saat Anda menghapus tabel menggunakan perintah DROP TABLE, tabel tersebut secara otomatis dipindahkan ke recycle bin, sehingga memungkinkan pemulihan dan mencegah kehilangan data akibat operasi yang tidak disengaja.
Batasan
Fitur recycle bin tabel hanya tersedia untuk instans Hologres versi V3.1 ke atas.
Tabel di dalam recycle bin tetap mengonsumsi memori. Oleh karena itu, jangan aktifkan fitur recycle bin untuk tabel yang memiliki indeks vektor. Untuk informasi lebih lanjut, lihat Panduan penggunaan indeks Proxima Graph.
Cara kerja
Saat Anda menghapus tabel internal, tabel partisi (baik tabel induk maupun tabel anak), atau tabel dinamis dengan perintah DROP TABLE [CASCADE] atau DROP DYNAMIC TABLE [CASCADE], Hologres secara otomatis memindahkannya ke recycle bin tabel.
Tabel di dalam recycle bin disimpan dalam skema terpisah bernama hg_recyclebin. Nama tabel, data, properti, dan indeks tetap dipertahankan.
Tabel tidak dipindahkan ke recycle bin jika Anda menjalankan perintah TRUNCATE atau INSERT OVERWRITE.
Tabel asing, tampilan, dan tampilan yang di-materialisasi tidak dipindahkan ke recycle bin.
Jika waktu hidup (TTL) ditetapkan untuk suatu tabel, TTL tersebut tetap berlaku di dalam recycle bin. Sistem secara berkala membersihkan data tabel berdasarkan TTL tersebut.
Aktifkan atau nonaktifkan recycle bin
-- Aktifkan recycle bin untuk database.
ALTER DATABASE <db_name> SET hg_enable_recyclebin = ON;
-- Nonaktifkan recycle bin untuk database.
ALTER DATABASE <db_name> SET hg_enable_recyclebin = OFF; Fitur recycle bin tabel diaktifkan secara default untuk instans baru maupun yang sudah ada versi V3.1 ke atas.
Setelah Anda menonaktifkan recycle bin, Anda masih dapat memulihkan atau purge tabel yang sudah berada di dalamnya. Namun, tabel apa pun yang dihapus setelah menonaktifkan fitur ini tidak akan dipindahkan ke recycle bin.
Hanya superuser dari instans saat ini yang dapat menjalankan perintah SQL ini. Perintah ini hanya perlu dijalankan sekali untuk setiap DB.
Memulihkan tabel
Anda dapat menggunakan perintah berikut untuk memulihkan tabel yang telah dihapus. Jika tabel dengan nama yang sama sudah ada, Anda dapat menentukan table_id (didukung di V3.1.18 ke atas) atau id (didukung di semua versi) untuk mengidentifikasi tabel yang ingin dipulihkan.
RECOVER TABLE <table_name>;
-- Jika tabel dengan nama yang sama sudah ada, tentukan table_id untuk memulihkannya (untuk V3.1.18 ke atas).
RECOVER TABLE <table_name> WITH (table_id = xxxx);
-- Sintaks umum (untuk semua versi).
RECOVER TABLE <table_name> [WITH (id = xxxx)];Perhatikan hal-hal berikut:
Saat Anda memulihkan tabel
Data, properti, dan indeks tabel—seperti primary key (PK), clustering key, dan segment key—dipulihkan. Jika tabel memiliki TTL yang ditetapkan, TTL tersebut tetap berlaku, dan sistem secara berkala membersihkan data berdasarkan TTL tersebut.
Sebelum Anda memulihkan tabel
Jika tabel dengan nama yang sama sudah ada di skema tersebut, Anda harus menghapus atau mengganti nama tabel yang ada. Jika tidak, perintah RECOVER akan gagal. Namun, jika tabel yang ada memiliki PK atau clustering key, Anda harus memindahkannya ke skema berbeda sebelum menjalankan perintah RECOVER. Untuk informasi lebih lanjut, lihat Contoh.
Operasi pemulihan gagal jika skema tempat tabel tersebut berada telah dihapus.
Untuk tabel partisi
Tabel anak yang dipulihkan menjadi tabel standar. Anda harus secara manual attach ke tabel induk.
Jika Anda memulihkan tabel induk, baik tabel induk maupun tabel anaknya dipulihkan ke struktur partisi aslinya. Anda tidak perlu secara manual attach tabel anak.
Jika partisi dinamis diaktifkan pada tabel induk, konfigurasi tersebut tidak diaktifkan kembali secara otomatis setelah pemulihan. Anda harus mengaktifkannya secara manual. Untuk informasi lebih lanjut, lihat Partisi dinamis.
Untuk tabel dinamis
Tabel dinamis yang dipulihkan menjadi tabel standar. Anda dapat mengkueri datanya, tetapi tabel tersebut tidak lagi melakukan refresh secara otomatis. Jika Anda memerlukan kemampuan auto-refresh, Anda harus membuat ulang tabel dinamis tersebut. Untuk informasi lebih lanjut, lihat ALTER DYNAMIC TABLE.
Memulihkan tabel dasar tidak memulihkan tabel dinamis dependennya.
Untuk skenario cascading
Saat Anda menggunakan perintah
DROP TABLE xxx CASCADEuntuk menghapus tabel, objek dependennya—seperti tampilan dan tampilan yang di-materialisasi—juga dihapus. Saat Anda memulihkan tabel tersebut, hanya tabel target yang dipulihkan. Tampilan, tampilan yang di-materialisasi, dan tabel dinamis tidak dipulihkan. Tabel dinamis dependen juga tidak dipulihkan.Misalnya, asumsikan tabel dinamis bergantung pada view1, dan view1 bergantung pada table1. Perintah
DROP TABLE table1 CASCADEmenghapus tabel dinamis dan view1. Setelah Anda menjalankan perintah RECOVER, tabel dinamis dan view1 tidak dipulihkan dan harus dibuat ulang secara manual.Izin untuk memulihkan tabel
Anda memerlukan izin tertentu untuk menjalankan perintah RECOVER. Untuk informasi lebih lanjut, lihat Izin.
Kelola recycle bin
Operasi yang didukung
Operasi berikut didukung untuk tabel di dalam recycle bin:
RECOVER (memulihkan tabel) dan PURGE (menghapus permanen tabel).
Lihat detail tabel menggunakan
hologres.hg_recyclebin.
Lihat detail tabel
Anda dapat menjalankan pernyataan berikut untuk melihat detail tabel di dalam recycle bin:
Pemilik tabel hanya dapat melihat tabel yang mereka miliki di dalam recycle bin. Mereka tidak dapat melihat tabel milik pengguna lain. Superuser dapat melihat semua tabel di dalam recycle bin.
SELECT * FROM hologres.hg_recyclebin;Tabel berikut menjelaskan parameter dalam informasi yang dikembalikan.
Nama parameter | Deskripsi |
table_id | ID unik tabel di dalam recycle bin. Digunakan untuk mengidentifikasi tabel. |
schema_name | Skema tempat tabel berada sebelum dihapus. |
table_name | Nama tabel yang dihapus. |
table_owner | Pemilik tabel sebelum dihapus. |
dropby | Pengguna yang menghapus tabel. |
drop_time | Waktu saat tabel dihapus. |
Periksa penyimpanan tabel di dalam recycle bin
Anda dapat menggunakan sintaks berikut untuk memeriksa penyimpanan tabel di dalam recycle bin. Parameter
table_idbersifat opsional. Jika nama skema dan nama tabel tidak unik, Anda dapat menggunakantable_iduntuk menentukan tabel tertentu.-- Lihat ukuran penyimpanan tabel di dalam recycle bin. SELECT hologres.hg_recyclebin_relation_size('<schema_name.table_name>'[,<table_id>]); -- Gunakan sintaks berikut untuk mengembalikan nilai dengan satuan. SELECT PG_SIZE_PRETTY(hologres.hg_recyclebin_relation_size('<schema_name.table_name>'[,<table_id>]));Contoh berikut menunjukkan cara menggunakan sintaks tersebut:
-- Asumsikan tabel yang dihapus bernama tbl1 dan berada di skema public. SELECT hologres.hg_recyclebin_relation_size('public.tbl1'); -- Jika beberapa tabel di dalam recycle bin memiliki skema dan nama tabel yang sama, gunakan table_id untuk menentukan tabel tertentu. Misalnya: SELECT hologres.hg_recyclebin_relation_size('public.tbl1', 42);Anda dapat melihat penyimpanan yang digunakan oleh recycle bin tabel setiap DB menggunakan metrik pemantauan.
Mulai dari V3.1.32, V3.2.12, dan V4.0.2, Hologres menyediakan metrik pemantauan penyimpanan untuk recycle bin tabel. Anda dapat menggunakan metrik ini untuk melihat penyimpanan recycle bin di setiap DB.
Mengatur periode retensi Keranjang daur ulang
Secara default, tabel di dalam recycle bin disimpan selama satu hari. Setelah periode ini berakhir, sistem secara otomatis purge tabel tersebut, dan tidak dapat dipulihkan lagi. Anda dapat mengaktifkan atau menonaktifkan recycle bin. Anda juga dapat menggunakan sintaks berikut untuk mengubah periode retensi sesuai kebutuhan.
ALTER DATABASE <db_name> SET hg_recyclebin_retention_days = 5; -- Ubah periode retensi tabel menjadi 5 hari.Biaya penyimpanan tetap dikenakan untuk tabel di dalam recycle bin.
Periode retensi diukur dalam hari. Nilai minimum adalah 1, dan maksimum adalah 10.
Hanya superuser yang dapat menjalankan pernyataan ini. Pernyataan ini berlaku di tingkat DB.
Kuras tabel dari Keranjang daur ulang
Anda dapat secara manual purge tabel dari recycle bin menggunakan perintah PURGE. Perintahnya sebagai berikut:
-- Purge satu tabel.
purge TABLE {table_name};
-- Purge semua tabel dari recycle bin. Perintah ini harus dijalankan oleh superuser.
CALL hologres.hg_purge_all_tables();Setelah perintah berhasil dijalankan, tabel langsung dihapus. Tabel tersebut tidak dapat ditemukan di recycle bin atau dipulihkan lagi.
Anda hanya dapat purge tabel. Anda tidak dapat purge tabel dinamis dependen.
Izin untuk purge tabel: Anda memerlukan izin tertentu untuk menjalankan perintah PURGE. Untuk informasi lebih lanjut, lihat Izin.
Hapus tabel dan lewati recycle bin
Secara default, tabel yang dihapus dengan perintah DROP TABLE atau DROP Dynamic Table [CASCADE] dipindahkan ke recycle bin. Untuk melewati recycle bin dan menghapus tabel secara permanen, Anda dapat menggunakan perintah berikut:
DROP TABLE <table_name> [CASCADE] FORCE;Izin
Kueri izin di Keranjang daur ulang
Pemilik tabel hanya dapat melihat tabel yang mereka hapus sendiri, bukan tabel yang dihapus oleh pengguna lain.
Superuser dapat melihat semua tabel di dalam recycle bin.
Izin untuk menghapus, memulihkan, dan purge tabel di dalam recycle bin
Menghapus Tabel
Hanya superuser, pengguna dalam grup pengguna Developer atau Admin (SPM/SLPM), dan pemilik tabel (model otorisasi PostgreSQL standar) yang dapat menjalankan perintah
DROPuntuk memindahkan tabel ke recycle bin.Purge tabel
Hanya superuser, pengguna dalam grup pengguna Developer atau Admin (SPM/SLPM), dan pemilik tabel (model otorisasi PostgreSQL standar) yang dapat menjalankan perintah
PURGEuntuk purge tabel dari recycle bin.Pemulihan tabel
Hanya superuser, pengguna dalam grup pengguna Developer atau Admin (SPM/SLPM), pemilik tabel (model otorisasi PostgreSQL standar), dan pengguna yang menghapus tabel yang dapat menjalankan perintah
RECOVERuntuk memulihkan tabel.
Dalam model izin SPM/SLPM, hanya pengguna yang berada dalam grup pengguna Developer atau Admin sebelum tabel dipindahkan ke recycle bin yang dapat mengelola tabel tersebut di dalam recycle bin. Pengguna yang ditambahkan ke grup Developer atau Admin setelah tabel dipindahkan ke recycle bin tidak dapat mengelola tabel tersebut.
Saat Anda beralih dari SPM/SLPM ke mode ahli, hanya Superuser yang dapat memulihkan dan purge tabel di dalam recycle bin.
Contoh khusus:
Jika user1 adalah pemilik schema1 dan user2 adalah pemilik schema1.table2, user1 dapat menghapus schema1 dan schema1.table2. Namun, user1 tidak dapat mengakses schema1.table2 karena user2 belum memberikan izin yang diperlukan kepada user1.
-- 1. user1 membuat schema1 dan memberikan izin CREATE pada skema tersebut kepada user2.
CREATE SCHEMA schema1;
GRANT CREATE ON SCHEMA schema1 TO "BASIC$user2";
-- 2. user2 membuat schema1.table2 dan menjadi pemilik tabel.
CREATE TABLE schema1.table2(id INT);
-- user1 dapat menghapus schema1 dan semua objeknya, termasuk table2, tetapi tidak dapat melihat table2.
SELECT * FROM schema1.table2;
# ERROR: permission denied for table table2
DROP SCHEMA schema1 CASCADE;
# DROP CASCADES TO TABLE schema1.table2
# DROP SCHEMAUntuk memulihkan table2, Anda memiliki dua opsi:
user1, yang menghapus tabel, dapat memulihkan tabel di dalam schema1.
user2, pemilik tabel, dapat memulihkan tabel tersebut.
Contoh
Hapus tabel lalu pulihkan dari recycle bin
Contoh 1: Hapus dan pulihkan tabel standar
Buat tabel standar dan hapus.
CREATE TABLE tbl1 ( id INT NOT NULL) WITH ( orientation = 'column', distribution_key = 'id', clustering_key = 'id', event_time_column = 'id'); INSERT INTO tbl1 SELECT i FROM GENERATE_SERIES(1, 1000000) i; DROP TABLE tbl1;Lihat recycle bin untuk memastikan tabel tersebut ada.
SELECT * FROM hologres.hg_recyclebin;Hasilnya sebagai berikut:
table_id | schema_name | table_name | table_owner | dropby | drop_time ---------+-------------+------------+-----------------+-------------+----------------------- 14| public | tbl1 | xx_developer | 1365xxxxxxxx| 2025-04-17 19:23:10+08 (1 row)Lihat penyimpanan tabel:
SELECT (hologres.hg_recyclebin_relation_size('tbl1')/1024)::text||'KB' AS hg_recyclebin_relation_size;Hasil penyimpanan sebagai berikut:
hg_recyclebin_relation_size ----------------------------- 1336KB (1 row)Pulihkan tabel.
-- Pulihkan semua data dan properti tabel standar tbl1, termasuk PK dan clustering key. RECOVER TABLE tbl1;
Contoh 2: Hapus dan pulihkan tabel partisi
Buat tabel partisi dengan tabel induk dan tabel anak.
CREATE TABLE tbl2_parent(id INT) PARTITION BY list (id); CREATE TABLE tbl2_child_1 PARTITION OF tbl2_parent FOR VALUES IN (1); CREATE TABLE tbl2_child_2 PARTITION OF tbl2_parent FOR VALUES IN (2);Hapus dan pulihkan salah satu tabel anak. Tabel anak yang dipulihkan menjadi tabel standar. Anda harus secara manual attach ke tabel induk partisi aslinya.
-- Hapus tabel anak partisi. DROP TABLE tbl2_child_1; -- Tabel anak partisi dipindahkan ke recycle bin. SELECT * FROM hologres.hg_recyclebin;Hasilnya sebagai berikut:
table_id | schema_name | table_name | table_owner | dropby | drop_time ----------+-------------+--------------+------------------+-----------+------------------------ 16 | public | tbl2_child_1 | xx_developer | 1365xxxxx | 2025-04-17 19:33:30+08 (1 row)Pulihkan tabel anak partisi dan periksa strukturnya. Tabel tersebut kini menjadi tabel standar, bukan tabel anak partisi.
RECOVER TABLE tbl2_child_1; SELECT hg_dump_script('tbl2_child_1');Hasilnya sebagai berikut:
hg_dump_script -------------------------------------------------------------- BEGIN; + + /* + DROP TABLE public.tbl2_child_1; + */ + CREATE TABLE public.tbl2_child_1 ( + id INTEGER + ) WITH ( + orientation = 'column', + storage_format = 'orc', + table_group = 'xxxx_tg_default', + table_storage_mode = 'any', + time_to_live_in_seconds = '3153600000' + ); + + + + COMMENT ON TABLE public.tbl2_child_1 IS NULL; + ALTER TABLE public.tbl2_child_1 OWNER TO "xx_developer"; + + + END; + (1 row)Hapus tabel induk partisi. Setelah dipulihkan, tabel tersebut dikembalikan sebagai tabel partisi.
-- Hapus tabel induk partisi. DROP TABLE tbl2_parent CASCADE; -- Lihat recycle bin. Tabel induk dan tabel anaknya dipindahkan ke recycle bin. SELECT * FROM hologres.hg_recyclebin;Berikut hasilnya:
table_id | schema_name | table_name | table_owner | dropby | drop_time ---------+-------------+--------------+---------------+---------------+------------------------ 17 | public | tbl2_child_2 | xx_developer | 1365xxxxxxxx | 2025-04-17 19:41:04+08 15 | public | tbl2_parent | xx_developer | 1365xxxxxxxx | 2025-04-17 19:41:04+08Anda dapat memulihkan tabel induk partisi.
RECOVER TABLE tbl2_parent;Anda dapat menjalankan pernyataan berikut di client PSQL untuk melihat DDL tabel induk partisi.
\d+ tbl2_parent;Tabel anak juga dipulihkan.
Partitioned table "public.tbl2_parent" Column | Type | Collation | Nullable | Default | Storage | Stats target | Description --------+---------+-----------+----------+---------+---------+--------------+------------- id | integer | | | | plain | | Partition key: LIST (id) Partitions: tbl2_child_2 FOR VALUES IN (2)
Contoh 4: Pulihkan tabel dengan nama yang bentrok
Jika Anda menghapus tabel lalu membuat tabel baru dengan nama yang sama, pemulihan tabel yang dihapus akan gagal. Anda harus terlebih dahulu mengganti nama tabel yang ada.
Buat dan hapus tbl6.
CREATE TABLE tbl6(id INT); -- Hapus tabel. Tabel dipindahkan ke recycle bin. DROP TABLE tbl6;Buat tabel baru yang juga bernama tbl6 dan coba pulihkan tabel yang dihapus.
CREATE TABLE tbl6(id INT); RECOVER TABLE tbl6;Pemulihan gagal karena tabel dengan nama yang sama sudah ada. Anda harus menghapus atau mengganti nama tabel yang ada.
ERROR: Table public.tbl6 already existsGanti nama tabel tbl6 yang ada menjadi tbl6_rename, lalu pulihkan tbl6 asli. Pemulihan kini berhasil.
ALTER TABLE tbl6 rename to tbl6_rename; RECOVER TABLE tbl6;
Jika tabel baru dengan nama yang sama juga memiliki PK dan clustering key yang sama dengan tabel yang dihapus, mengganti namanya tidak menyelesaikan bentrokan. Anda harus memindahkan tabel baru ke skema berbeda atau menghapusnya untuk memulihkan tabel asli.
Buat tabel tbl1 lalu hapus.
-- Buat tabel dan atur PK serta clustering key. CREATE TABLE tbl1 ( col1 INT, col2 INT, col3 INT, PRIMARY KEY (col1, col2) ) WITH ( clustering_key = 'col1' ); -- Hapus tabel. DROP TABLE tbl1; -- Buat ulang tabel dengan nama yang sama, dan atur PK serta clustering key. CREATE TABLE tbl1 ( col1 INT, col2 INT, col3 INT, PRIMARY KEY (col1, col2) ) WITH ( clustering_key = 'col1' ); -- Lihat recycle bin. SELECT * FROM hologres.hg_recyclebin;Hasilnya sebagai berikut.
table_id | schema_name | table_name | table_owner | dropby | drop_time ----------+-------------+------------+------------------+------------------+------------------------ 493497 | public | tbl1 | 13659371xxx| 13659371xxx | 2025-04-17 20:11:08+08Mencoba memulihkan tabel tbl1 langsung dari recycle bin gagal.
-- Pulihkan tabel yang dihapus dari recycle bin. Terjadi error dan pemulihan gagal. RECOVER TABLE tbl1;Error sebagai berikut.
ERROR: Table public.tbl1 already existsMengganti nama tabel tbl1 lalu mencoba memulihkannya tetap gagal.
-- Ganti nama tabel yang ada. ALTER TABLE tbl1 RENAME TO tbl2; -- Pemulihan tetap gagal karena tabel yang ada memiliki PK dan clustering key. RECOVER TABLE tbl1;Pesan error berikut dikembalikan.
ERROR: relation "tbl1_pkey" already EXISTS IN SCHEMA "public"Pindahkan tabel tbl1 ke skema lain lalu pulihkan. Pemulihan kini berhasil.
CREATE SCHEMA test; ALTER TABLE tbl2 SET SCHEMA test; -- Pemulihan berhasil. RECOVER TABLE tbl1;
Hapus tabel dan lewati recycle bin
-- Hapus tabel standar tanpa memindahkannya ke recycle bin.
CREATE TABLE tbl1(id INT);
DROP TABLE tbl1 FORCE; Purge tabel dari recycle bin
CREATE TABLE tbl1(id INT);
DROP TABLE tbl1;
-- Purge tabel dari recycle bin.
PURGE TABLE tbl1;