Hologres mendukung fitur table recycle bin yang secara otomatis memindahkan tabel yang dihapus menggunakan perintah DROP TABLE ke recycle bin. Anda dapat memulihkan tabel-tabel tersebut untuk mencegah kehilangan data akibat kesalahan.
Limitations
-
Fitur table recycle bin hanya tersedia untuk instans Hologres versi V3.1 dan yang lebih baru.
-
Tabel dalam recycle bin tetap mengonsumsi memori. Oleh karena itu, tidak disarankan mengaktifkan recycle bin untuk tabel yang memiliki vector index. Untuk informasi selengkapnya, lihat Work with Proxima Graph indexes.
How it works
Perintah DROP TABLE [CASCADE] dan DROP DYNAMIC TABLE [CASCADE] secara otomatis memindahkan tabel internal, tabel partisi (termasuk tabel induk dan tabel anak), serta Dynamic Table ke recycle bin.
Tabel dalam recycle bin disimpan dalam skema terpisah bernama hg_recyclebin. Nama tabel, data, properti, dan indeksnya tetap dipertahankan.
-
Tabel tidak dipindahkan ke recycle bin jika Anda menjalankan perintah TRUNCATE atau INSERT OVERWRITE.
-
Tabel eksternal, view, dan materialized view tidak didukung.
-
Jika sebuah tabel memiliki TTL, kebijakan tersebut tetap aktif di recycle bin, dan sistem terus melakukan purge data sesuai aturan tersebut.
Enable or disable the recycle bin
-- Aktifkan table recycle bin untuk database tertentu.
ALTER DATABASE <db_name> SET hg_enable_recyclebin = ON;
-- Nonaktifkan table recycle bin untuk database tertentu.
ALTER DATABASE <db_name> SET hg_enable_recyclebin = OFF;
-
Fitur table recycle bin diaktifkan secara default untuk instans baru maupun yang sudah ada pada versi V3.1 dan yang lebih baru. Tabel yang di-drop secara otomatis dipindahkan ke table recycle bin.
-
Setelah Anda menonaktifkan recycle bin, Anda masih dapat memulihkan atau purge tabel yang sudah berada di dalamnya. Namun, tabel yang dihapus setelah itu tidak akan dipindahkan ke recycle bin.
-
Jalankan perintah ini sekali per database. Hanya superuser dari instans saat ini yang dapat menjalankan perintah SQL ini.
Recover tables
Anda dapat menggunakan perintah berikut untuk memulihkan tabel yang telah dihapus. Jika sudah ada tabel dengan nama yang sama, Anda dapat menentukan table_id (didukung di V3.1.18 dan yang lebih baru) atau id (didukung di semua versi) untuk mengidentifikasi tabel spesifik yang ingin dipulihkan.
RECOVER TABLE <table_name>;
-- Jika sudah ada tabel lain dengan nama yang sama, tentukan table_id untuk memulihkan tabel target (V3.1.18 dan yang lebih baru).
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 pemulihan
Data, properti, dan indeks tabel seperti primary key (PK), clustering key, dan segment key dipulihkan. Jika tabel memiliki TTL, kebijakan tersebut tetap aktif, dan sistem secara berkala melakukan purge data sesuai aturan tersebut.
-
Sebelum pemulihan
-
Jika sudah ada tabel dengan nama yang sama dalam skema tersebut, Anda harus menghapus atau mengganti namanya terlebih dahulu sebelum melakukan pemulihan. Jika tidak, perintah RECOVER akan gagal. Namun, jika tabel yang ada memiliki primary key atau clustering key, Anda harus memindahkannya ke skema berbeda sebelum menjalankan perintah RECOVER. Untuk informasi selengkapnya, lihat bagian Examples dalam topik ini.
-
Jika skema tabel tersebut dihapus, operasi pemulihan akan gagal.
-
-
Untuk tabel partisi
-
Tabel anak yang dipulihkan menjadi tabel standar. Anda harus secara manual ATTACH kembali ke tabel induknya.
-
Ketika Anda memulihkan tabel induk, baik tabel induk maupun tabel anaknya dipulihkan ke struktur partisi aslinya. Anda tidak perlu secara manual melampirkan kembali tabel anak.
-
Jika dynamic partitioning diaktifkan pada tabel induk, fitur tersebut tidak secara otomatis diaktifkan kembali setelah pemulihan. Anda harus mengaktifkannya secara manual. Untuk informasi selengkapnya, lihat Manage dynamic partitioning.
-
-
Untuk Dynamic Table
-
Dynamic Table yang dipulihkan menjadi tabel standar. Anda dapat mengkueri datanya, tetapi fitur pembaruan otomatis tidak lagi aktif. Untuk mengaktifkan kembali pembaruan otomatis, Anda harus membuat ulang Dynamic Table tersebut. Untuk informasi selengkapnya, lihat ALTER DYNAMIC TABLE.
-
Memulihkan tabel dasar tidak memulihkan Dynamic Table yang bergantung padanya.
-
-
Untuk skenario cascading
Menggunakan perintah
DROP TABLE ... CASCADEjuga menghapus objek dependen, seperti view dan materialized view. Saat Anda memulihkan tabel tersebut, hanya tabel itu sendiri yang dipulihkan. Objek dependen seperti view, materialized view, dan Dynamic Table tidak dipulihkan.Sebagai contoh, jika Dynamic Table bergantung pada
view1danview1bergantung padatable1, menjalankan perintahDROP TABLE table1 CASCADEjuga akan menghapus Dynamic Table danview1. Saat Anda memulihkantable1, Dynamic Table danview1tidak dipulihkan dan harus dibuat ulang secara manual. -
Izin untuk pemulihan
Anda memerlukan izin tertentu untuk menjalankan perintah RECOVER. Untuk informasi selengkapnya, lihat Permissions.
Manage the recycle bin
Supported operations
Tabel dalam recycle bin mendukung operasi berikut:
-
RECOVER (memulihkan tabel) dan PURGE (menghapus permanen tabel).
-
Menampilkan detail tabel dengan mengkueri
hologres.hg_recyclebin.
View table details in the recycle bin
Anda dapat menjalankan pernyataan berikut untuk melihat detail tabel dalam recycle bin:
Pemilik tabel hanya dapat melihat tabel miliknya sendiri dalam recycle bin. Superuser dapat melihat semua tabel dalam recycle bin.
SELECT * FROM hologres.hg_recyclebin;
Tabel berikut menjelaskan parameter dalam informasi yang dikembalikan.
|
Parameter |
Description |
|
table_id |
ID unik tabel dalam recycle bin. ID ini digunakan untuk mengidentifikasi tabel. |
|
schema_name |
Skema asal tabel. |
|
table_name |
Nama tabel yang di-drop. |
|
table_owner |
Pemilik tabel sebelum di-drop. |
|
dropby |
Pengguna yang menghapus tabel. |
|
drop_time |
Waktu saat tabel di-drop. |
Check storage usage in the recycle bin
-
Gunakan sintaks berikut untuk memeriksa penggunaan penyimpanan tabel dalam recycle bin. Parameter
table_idbersifat opsional. Jika beberapa tabel memiliki nama skema dan nama tabel yang sama, Anda dapat menentukantable_iduntuk mengidentifikasi tabel tertentu.-- Lihat ukuran penyimpanan tabel dalam recycle bin. SELECT hologres.hg_recyclebin_relation_size('<schema_name.table_name>'[,<table_id>]); -- Gunakan sintaks berikut untuk menampilkan ukuran penyimpanan dengan satuan. SELECT PG_SIZE_PRETTY(hologres.hg_recyclebin_relation_size('<schema_name.table_name>'[,<table_id>]));Kode berikut memberikan contoh:
-- Asumsikan tabel yang dihapus bernama tbl1 dan berada dalam skema public. SELECT hologres.hg_recyclebin_relation_size('public.tbl1'); -- Jika beberapa tabel dalam recycle bin memiliki skema dan nama tabel yang sama, Anda harus menggunakan table_id untuk mengkueri penggunaan penyimpanan tabel tertentu. Contoh: SELECT hologres.hg_recyclebin_relation_size('public.tbl1', 42); -
Lihat penyimpanan yang ditempati oleh table recycle bin untuk setiap database berdasarkan metrik pemantauan.
Metrik pemantauan penyimpanan untuk table recycle bin tersedia di Hologres versi V3.1.32, V3.2.12, V4.0.2, dan yang lebih baru. Anda dapat menggunakan metrik ini untuk melihat penggunaan penyimpanan recycle bin di setiap database.
Set the recycle bin retention period
Secara default, tabel dalam recycle bin disimpan selama satu hari sebelum sistem menghapusnya secara permanen. Tabel yang telah dipurge tidak dapat dipulihkan. Anda dapat mengaktifkan atau menonaktifkan table recycle bin, atau mengubah periode retensi sesuai kebutuhan bisnis dengan menggunakan sintaks berikut.
-- Ubah periode retensi tabel menjadi 5 hari.
ALTER DATABASE <db_name> SET hg_recyclebin_retention_days = 5;
-
Tabel dalam recycle bin tetap dikenai penagihan penyimpanan.
-
Periode retensi diukur dalam hari. Nilai minimum adalah 1, dan nilai maksimum adalah 10.
-
Hanya superuser yang dapat menjalankan pernyataan ini. Pengaturan ini berlaku di tingkat database.
Purge tables from the recycle bin
Anda dapat secara manual menghapus tabel dari recycle bin menggunakan perintah PURGE. Perintahnya sebagai berikut:
-- Hapus satu tabel.
PURGE TABLE {table_name};
-- Hapus semua tabel dari recycle bin. Perintah ini harus dijalankan oleh superuser.
CALL hologres.hg_purge_all_tables();
-
Setelah perintah berhasil dijalankan, tabel langsung dihapus dan tidak dapat dipulihkan.
-
Anda hanya dapat menghapus tabel, bukan Dynamic Table yang dihapus secara cascading.
-
Izin untuk menghapus tabel: Anda memerlukan izin tertentu untuk menjalankan perintah PURGE. Untuk informasi selengkapnya, lihat Permissions.
-
Setelah Anda menjalankan PURGE atau
hg_purge_all_tables(), metadata langsung dihapus. Namun, penyimpanan dasarnya tunduk pada mekanisme penghapusan tertunda (sekitar 2 jam secara default), sehingga penggunaan penyimpanan aktual tidak langsung berkurang. Ini merupakan perilaku yang diharapkan.
Delete a table without the recycle bin
Secara default, tabel yang dihapus dengan perintah DROP TABLE atau DROP Dynamic Table [CASCADE] dipindahkan ke recycle bin. Anda dapat menggunakan perintah berikut untuk melewati recycle bin dan menghapus tabel secara permanen.
DROP TABLE <table_name> [CASCADE] FORCE;
Setelah menjalankan DROP TABLE ... FORCE, metadata langsung dihapus. Namun, penyimpanan dasarnya tunduk pada mekanisme penghapusan tertunda (sekitar 2 jam secara default), sehingga penggunaan penyimpanan aktual tidak langsung berkurang. Ini merupakan perilaku yang diharapkan.
Permissions
Query permissions for the recycle bin
-
Pemilik tabel hanya dapat mengkueri tabel yang mereka hapus, bukan tabel yang dihapus oleh pengguna lain.
-
Superuser dapat mengkueri semua tabel dalam recycle bin.
Permissions for delete, recover, and purge
-
Menghapus tabel
Hanya superuser, anggota grup pengguna Developer atau Admin (dalam model izin SPM/SLPM), atau pemilik tabel (dalam Model Otorisasi PostgreSQL Standar) yang dapat menjalankan perintah
DROPuntuk menghapus tabel dan memindahkannya ke recycle bin. -
Menghapus permanen tabel
Hanya superuser, anggota grup pengguna Developer atau Admin (dalam model izin SPM/SLPM), atau pemilik tabel (dalam Model Otorisasi PostgreSQL Standar) yang dapat menjalankan perintah
PURGEuntuk menghapus permanen tabel dari recycle bin. -
Memulihkan tabel
Hanya superuser, anggota grup pengguna Developer atau Admin (dalam model izin SPM/SLPM), pemilik tabel (dalam Model Otorisasi PostgreSQL Standar), atau pengguna yang menghapus tabel yang dapat menjalankan perintah
RECOVERuntuk memulihkan tabel ke kondisi semula.
-
Dalam model izin SPM/SLPM, hanya pengguna yang merupakan anggota grup pengguna Developer atau Admin sebelum tabel dipindahkan ke recycle bin yang dapat mengelola tabel tersebut. Jika pengguna ditambahkan ke grup Developer atau Admin setelah tabel dipindahkan ke recycle bin, pengguna tersebut tidak dapat mengelola tabel tersebut.
-
Jika Anda beralih dari model izin SPM/SLPM ke Model Otorisasi PostgreSQL Standar, hanya superuser yang dapat memulihkan atau menghapus permanen tabel yang sudah ada dalam recycle bin.
Kasus 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 tersebut.
CREATE TABLE schema1.table2(id INT);
-- user1 dapat menghapus schema1 dan semua objek di dalamnya, 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 SCHEMA
Untuk memulihkan table2, Anda memiliki dua opsi:
-
user1, sebagai pengguna yang menghapus tabel, dapat memulihkan tabel dalam
schema1. -
user2, sebagai pemilik tabel, dapat memulihkan tabel tersebut.
Examples
Delete and recover a table
Example 1: Delete and recover a table
-
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; -
Periksa recycle bin untuk memastikan tabel telah dipindahkan ke sana.
SELECT * FROM hologres.hg_recyclebin;Hasil berikut dikembalikan:
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)Periksa penyimpanan tabel:
SELECT (hologres.hg_recyclebin_relation_size('tbl1')/1024)::text||'KB' AS hg_recyclebin_relation_size;Perintah mengembalikan ukuran penyimpanan tabel:
hg_recyclebin_relation_size ----------------------------- 1336KB (1 row) -
Pulihkan tabel.
-- Pulihkan semua data dan properti tabel standar tbl1, termasuk primary key dan clustering key-nya. RECOVER TABLE tbl1;
Example 2: Delete and recover a partitioned table
-
Buat tabel partisi beserta tabel induk dan tabel anak yang sesuai.
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 salah satu tabel anak dan pulihkan. Tabel anak yang dipulihkan menjadi tabel standar dan harus dilampirkan secara manual ke tabel induk aslinya.
-- Hapus tabel anak. DROP TABLE tbl2_child_1; -- Tabel anak dipindahkan ke recycle bin. SELECT * FROM hologres.hg_recyclebin;Hasil berikut dikembalikan:
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 dan periksa strukturnya. Sekarang ini menjadi tabel standar dan bukan lagi tabel anak.
RECOVER TABLE tbl2_child_1; SELECT hg_dump_script('tbl2_child_1');Hasil berikut dikembalikan:
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. Setelah dipulihkan, tabel tersebut tetap menjadi tabel partisi.
-- Hapus tabel induk. DROP TABLE tbl2_parent CASCADE; -- Periksa recycle bin. Tabel induk dan tabel anak keduanya dipindahkan ke recycle bin. SELECT * FROM hologres.hg_recyclebin;Hasil berikut dikembalikan:
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+08Pulihkan tabel induk.
RECOVER TABLE tbl2_parent;Jalankan pernyataan berikut di psql client untuk melihat DDL tabel induk.
\d+ tbl2_parent;Hasil berikut dikembalikan, yang menunjukkan bahwa tabel anaknya 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)
Example 4: Recover a table with a conflicting name
-
Jika Anda menghapus tabel lalu membuat tabel baru dengan nama yang sama, pemulihan tabel yang dihapus akan gagal. Anda harus mengganti nama tabel yang ada terlebih dahulu.
-
Buat dan hapus
tbl6.CREATE TABLE tbl6(id INT); -- Hapus tabel dan pindahkan ke recycle bin. DROP TABLE tbl6; -
Buat tabel baru yang juga bernama
tbl6dan coba pulihkan tabel yang dihapus.CREATE TABLE tbl6(id INT); RECOVER TABLE tbl6;Hasil berikut dikembalikan. Pemulihan gagal karena sudah ada tabel dengan nama yang sama. Anda harus menghapus atau mengganti nama tabel yang ada.
ERROR: Table public.tbl6 already exists -
Ganti nama tabel yang ada
tbl6menjaditbl6_rename, lalu pulihkantbl6asli. Pemulihan sekarang berhasil.ALTER TABLE tbl6 RENAME TO tbl6_rename; RECOVER TABLE tbl6;
-
-
Jika tabel yang ada dengan nama yang sama memiliki primary key dan clustering key yang sama dengan tabel yang dihapus, mengganti namanya tidak akan berhasil. Anda harus memindahkan tabel yang ada ke skema lain atau menghapusnya sebelum memulihkan tabel yang dihapus.
-
Buat tabel bernama
tbl1dan 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 tabel baru dengan nama, PK, dan clustering key yang sama. CREATE TABLE tbl1 ( col1 INT, col2 INT, col3 INT, PRIMARY KEY (col1, col2) ) WITH ( clustering_key = 'col1' ); -- Periksa recycle bin. SELECT * FROM hologres.hg_recyclebin;Hasil berikut dikembalikan.
table_id | schema_name | table_name | table_owner | dropby | drop_time ----------+-------------+------------+------------------+------------------+------------------------ 493497 | public | tbl1 | 13659371xxx| 13659371xxx | 2025-04-17 20:11:08+08 -
Mencoba memulihkan tabel
tbl1dari recycle bin gagal.-- Coba pulihkan tabel yang di-drop dari recycle bin. Pemulihan gagal. RECOVER TABLE tbl1;Pesan error berikut dikembalikan.
ERROR: Table public.tbl1 already exists -
Mengganti nama tabel
tbl1lalu mencoba memulihkan tabel asli tetap gagal.-- Ganti nama tabel yang ada. ALTER TABLE tbl1 RENAME TO tbl2; -- Pemulihan tetap gagal karena tabel yang ada memiliki primary key dan clustering key. RECOVER TABLE tbl1;Pesan error berikut dikembalikan.
ERROR: relation "tbl1_pkey" already EXISTS IN SCHEMA "public" -
Pindahkan tabel baru ke skema lain. Kemudian, Anda dapat berhasil memulihkan tabel asli.
CREATE SCHEMA test; ALTER TABLE tbl2 SET SCHEMA test; -- Pemulihan berhasil. RECOVER TABLE tbl1;
-
Delete a table without the recycle bin
-- Hapus tabel standar tanpa memindahkannya ke recycle bin.
CREATE TABLE tbl1(id INT);
DROP TABLE tbl1 FORCE;
Purge a table from the recycle bin
CREATE TABLE tbl1(id INT);
DROP TABLE tbl1;
-- Hapus paksa tabel dari recycle bin.
PURGE TABLE tbl1;