全部产品
Search
文档中心

Hologres:Keranjang daur ulang tabel

更新时间:Nov 19, 2025

Hologres menyediakan fitur recycle bin tabel. Saat Anda menghapus tabel menggunakan perintah DROP TABLE, tabel tersebut secara otomatis dipindahkan ke keranjang daur ulang. Anda dapat memulihkan tabel yang dihapus dari keranjang daur ulang sesuai kebutuhan untuk mencegah kehilangan data akibat operasi yang tidak disengaja.

Batasan

  • Hanya instans Hologres V3.1 dan versi yang lebih baru yang mendukung fitur recycle bin tabel.

  • Tabel di keranjang daur ulang mengonsumsi memori. Oleh karena itu, jangan aktifkan fitur recycle bin tabel untuk tabel yang memiliki indeks vektor. Untuk informasi selengkapnya, lihat Panduan indeks Proxima Graph.

Cara kerjanya

Saat Anda menghapus tabel internal, tabel partisi (baik tabel induk maupun tabel anak), atau tabel dinamis menggunakan perintah DROP TABLE [CASCADE] atau DROP DYNAMIC TABLE [CASCADE], Hologres secara otomatis memindahkannya ke keranjang daur ulang.

Tabel di keranjang daur ulang disimpan dalam skema terpisah bernama hg_recyclebin. Nama tabel, data, properti, dan indeksnya tetap dipertahankan.

Catatan
  • Tabel tidak dipindahkan ke keranjang daur ulang jika Anda menjalankan perintah TRUNCATE atau INSERT OVERWRITE.

  • Keranjang daur ulang tidak mendukung tabel eksternal, tampilan, atau Tampilan yang di-materialisasi.

  • Jika sebuah tabel memiliki Time to Live (TTL), TTL tersebut tetap aktif di keranjang daur ulang. Sistem secara berkala melakukan purge data dari tabel berdasarkan pengaturan TTL-nya.

Mengaktifkan atau menonaktifkan keranjang daur ulang

-- Mengaktifkan fitur keranjang daur ulang untuk database.
ALTER DATABASE <db_name> SET hg_enable_recyclebin = ON; 

-- Menonaktifkan fitur keranjang daur ulang untuk database.
ALTER DATABASE <db_name> SET hg_enable_recyclebin = OFF; 
Catatan
  • Untuk instans baru maupun yang sudah ada pada V3.1 atau versi yang lebih baru, fitur recycle bin tabel diaktifkan secara default. Tabel yang dihapus secara otomatis dipindahkan ke keranjang daur ulang.

  • Setelah Anda menonaktifkan keranjang daur ulang, Anda masih dapat memulihkan atau melakukan purge terhadap tabel yang sudah berada di dalamnya. Namun, tabel apa pun yang Anda hapus setelah menonaktifkan fitur ini tidak akan dipindahkan ke keranjang daur ulang.

  • Hanya superuser dari instans saat ini yang dapat menjalankan perintah SQL ini. Anda hanya perlu menjalankan perintah ini satu kali untuk setiap DB.

Pemulihan tabel

Anda dapat menggunakan perintah berikut untuk memulihkan tabel yang dihapus. Jika tabel dengan nama yang sama sudah ada, tentukan table_id untuk memulihkan tabel yang benar.

RECOVER TABLE <table_name> [WITH (table_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 TTL ditetapkan untuk tabel tersebut, TTL tetap aktif di keranjang daur ulang. Sistem secara berkala melakukan purge data berdasarkan pengaturan TTL.

  • Sebelum Anda memulihkan tabel

    • Jika tabel dengan nama yang sama sudah ada di skema tersebut, Anda harus terlebih dahulu menghapus atau mengganti namanya. Jika tidak, operasi RECOVER akan gagal. Jika tabel yang ada memiliki primary key (PK) atau clustering key, Anda harus memindahkannya ke skema yang berbeda sebelum pemulihan. Untuk informasi selengkapnya, lihat Contoh.

    • Jika skema tempat tabel tersebut berada telah dihapus, operasi pemulihan akan gagal.

  • Untuk tabel partisi

    • Partisi anak yang dipulihkan menjadi tabel standar. Anda harus secara manual attach ke tabel induk.

    • Saat Anda memulihkan tabel induk, baik tabel induk maupun partisi anaknya dipulihkan ke struktur partisi aslinya. Anda tidak perlu secara manual melampirkan partisi anak.

    • Jika partisi dinamis diaktifkan untuk tabel induk, fitur tersebut tidak secara otomatis diaktifkan kembali setelah pemulihan. Anda harus mengaktifkannya secara manual. Untuk informasi selengkapnya, 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 diperlukan, Anda dapat membuat ulang tabel dinamis tersebut. Untuk informasi selengkapnya, lihat ALTER DYNAMIC TABLE.

    • Memulihkan tabel dasar dari tabel dinamis tidak memulihkan tabel dinamis tersebut.

  • Untuk Skenario Kaskade

    Saat Anda menggunakan perintah DROP TABLE xxx CASCADE, objek dependen seperti tampilan dan Tampilan yang di-materialisasi juga dihapus. Perintah RECOVER hanya memulihkan tabel tersebut. Perintah ini tidak memulihkan tampilan dependen, Tampilan yang di-materialisasi, atau objek tabel dinamis, termasuk tabel dinamis cascaded.

    Sebagai contoh, tabel dinamis bergantung pada view1, dan view1 bergantung pada table1. Perintah DROP TABLE table1 CASCADE menghapus tabel dinamis dan view1. Setelah Anda menjalankan perintah RECOVER, tabel dinamis dan view1 tidak dipulihkan. Anda harus membuatnya ulang secara manual.

  • Izin untuk Pemulihan

    Menjalankan perintah RECOVER memerlukan izin tertentu. Untuk informasi selengkapnya, lihat Izin.

Kelola recycle bin

Operasi yang didukung

Operasi berikut didukung untuk tabel di keranjang daur ulang:

  • RECOVER (memulihkan tabel) dan PURGE (menghapus permanen tabel).

  • Menampilkan detail tabel di keranjang daur ulang dengan mengkueri hologres.hg_recyclebin.

Menampilkan detail tabel di keranjang daur ulang

Anda dapat menggunakan pernyataan berikut untuk melihat detail tentang tabel di keranjang daur ulang:

Catatan

Pemilik tabel hanya dapat melihat tabel yang mereka miliki di keranjang daur ulang dan tidak dapat melihat tabel milik pengguna lain. Superuser dapat melihat semua tabel di keranjang daur ulang.

SELECT * FROM hologres.hg_recyclebin;

Tabel berikut menjelaskan parameter dalam informasi yang dikembalikan.

Parameter

Deskripsi

table_id

ID unik tabel di keranjang daur ulang. 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.

Menampilkan penyimpanan tabel di keranjang daur ulang

  • Anda dapat menggunakan sintaks berikut untuk melihat ukuran penyimpanan tabel di keranjang daur ulang. Parameter table_id bersifat opsional. Jika beberapa tabel memiliki nama skema dan nama tabel yang identik, gunakan table_id untuk menentukan tabel yang dimaksud.

    -- Menampilkan ukuran penyimpanan tabel di keranjang daur ulang.
    SELECT hologres.hg_recyclebin_relation_size('<schema_name.table_name>'[,<table_id>]);
    
    -- Gunakan sintaks berikut untuk menyertakan satuan penyimpanan.
    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 di skema public.
    SELECT hologres.hg_recyclebin_relation_size('public.tbl1');
    
    -- Jika beberapa tabel di keranjang daur ulang memiliki nama skema dan nama tabel yang sama, Anda juga harus menggunakan table_id untuk mengkueri penggunaan penyimpanan tabel tertentu. Contohnya:
    SELECT hologres.hg_recyclebin_relation_size('public.tbl1', 42);
  • Anda dapat melihat penyimpanan yang digunakan oleh recycle bin tabel untuk setiap DB menggunakan metrik pemantauan.

    Mulai dari Hologres V3.1.32, V3.2.12, dan V4.0.2, metrik pemantauan tersedia untuk penyimpanan recycle bin tabel. Anda dapat melihat penggunaan penyimpanan recycle bin untuk setiap DB.

Menetapkan periode retensi untuk keranjang daur ulang

Setelah tabel yang dihapus dipindahkan ke keranjang daur ulang, tabel tersebut disimpan selama satu hari secara default. Setelah satu hari, sistem secara otomatis melakukan purge terhadap tabel tersebut, dan tidak dapat dipulihkan lagi. Anda dapat mengaktifkan atau menonaktifkan keranjang daur ulang, atau mengubah periode retensi sesuai kebutuhan menggunakan sintaks berikut.

ALTER DATABASE <db_name> SET hg_recyclebin_retention_days = 5; -- Mengubah periode retensi tabel menjadi 5 hari.
Catatan
  • Tabel di keranjang daur ulang tetap dikenai biaya penyimpanan.

  • Unit untuk periode retensi adalah hari. Nilai minimum adalah 1 dan nilai maksimum adalah 10.

  • Hanya superuser yang dapat menjalankan pernyataan ini. Pengaturan ini berlaku di tingkat DB.

Kuras tabel dari Keranjang daur ulang

Anda dapat secara manual melakukan purge terhadap tabel dari keranjang daur ulang menggunakan perintah PURGE. Perintahnya adalah sebagai berikut:

-- Melakukan purge terhadap satu tabel.
purge TABLE {table_name};

-- Melakukan purge terhadap semua tabel dari keranjang daur ulang. Perintah ini harus dijalankan oleh superuser.
CALL hologres.hg_purge_all_tables();
Catatan
  • Setelah perintah berhasil dijalankan, tabel tersebut langsung dihapus. Tabel tersebut tidak dapat lagi ditemukan di keranjang daur ulang atau dipulihkan.

  • Anda hanya dapat melakukan purge terhadap tabel, bukan tabel dinamis cascaded.

  • Izin untuk melakukan purge terhadap tabel: Menjalankan perintah PURGE memerlukan izin tertentu. Untuk informasi selengkapnya, lihat Izin.

Menghapus tabel tanpa memindahkannya ke keranjang daur ulang

Secara default, tabel yang dihapus menggunakan perintah DROP TABLE atau DROP Dynamic Table [CASCADE] dipindahkan ke keranjang daur ulang. Untuk melewati keranjang daur ulang, Anda dapat menggunakan perintah berikut.

DROP TABLE <table_name> [CASCADE] FORCE;

Izin

Izin kueri untuk keranjang daur ulang

  • Pemilik tabel hanya dapat mengkueri tabel yang mereka hapus. Mereka tidak dapat melihat tabel yang dihapus oleh pengguna lain.

  • Superuser dapat mengkueri semua tabel di keranjang daur ulang.

Izin untuk menghapus, memulihkan, dan melakukan purge terhadap tabel di keranjang daur ulang

  • Menghapus tabel

    Hanya superuser, pengguna dalam kelompok pengguna Developer/Admin (dalam SPM/SLPM), atau pemilik tabel (dalam model otorisasi PostgreSQL standar) yang memiliki izin untuk menjalankan perintah DROP guna menghapus tabel dan memindahkannya ke keranjang daur ulang.

  • Membersihkan tabel

    Hanya superuser, pengguna dalam kelompok pengguna Developer/Admin (dalam SPM/SLPM), atau pemilik tabel (dalam model otorisasi PostgreSQL standar) yang memiliki izin untuk menjalankan perintah PURGE guna menghapus permanen tabel dari keranjang daur ulang.

  • Memulihkan tabel

    Hanya superuser, pengguna dalam kelompok pengguna Developer/Admin (dalam SPM/SLPM), pemilik tabel (dalam model otorisasi PostgreSQL standar), atau pengguna yang menghapus tabel yang memiliki izin untuk menjalankan perintah RECOVER guna memulihkan tabel tersebut.

Catatan
  • Dalam model izin SPM/SLPM, hanya pengguna yang berada dalam kelompok pengguna Developer/Admin sebelum tabel dipindahkan ke keranjang daur ulang yang memiliki izin untuk mengelola tabel tersebut di keranjang daur ulang. Jika pengguna ditambahkan ke kelompok pengguna Developer/Admin setelah tabel berada di keranjang daur ulang, pengguna tersebut tidak memiliki izin untuk mengelola tabel tersebut.

  • Saat Anda beralih dari SPM/SLPM ke model otorisasi PostgreSQL standar, hanya superuser yang dapat memulihkan dan melakukan purge terhadap tabel yang sudah ada di keranjang daur ulang.

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 tersebut.
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 SCHEMA

Untuk memulihkan table2, Anda dapat menggunakan salah satu metode berikut:

  • user1, yang menghapus tabel tersebut, dapat memulihkan tabel tersebut di bawah schema1.

  • user2, pemilik tabel tersebut, dapat memulihkan tabel tersebut.

Contoh

Menghapus tabel dan memulihkannya dari keranjang daur ulang

Contoh 1: Menghapus dan memulihkan tabel standar

  1. Buat tabel standar lalu 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;
  2. Periksa keranjang daur ulang untuk memastikan tabel tersebut ada di dalamnya.

    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)

    Anda dapat melihat penyimpanan tabel tersebut:

    SELECT (hologres.hg_recyclebin_relation_size('tbl1')/1024)::text||'KB' AS hg_recyclebin_relation_size;

    Hasil berikut menunjukkan penyimpanan tabel:

    hg_recyclebin_relation_size 
    -----------------------------
                          1336KB
    (1 row)
  3. Pulihkan tabel.

    -- Memulihkan semua data dan properti tabel standar tbl1, termasuk PK dan clustering key.
    RECOVER TABLE tbl1;  

Contoh 2: Hapus dan pulihkan tabel partisi

  1. Buat tabel partisi dengan tabel induk dan partisi anak berikut:

    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);
  2. Hapus dan pulihkan salah satu partisi anak. Partisi anak yang dipulihkan menjadi tabel standar. Anda harus secara manual melampirkannya ke tabel induk asli.

    -- Menghapus partisi anak.
    DROP TABLE tbl2_child_1;
    
    -- Partisi anak dipindahkan ke keranjang daur ulang.
    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 partisi anak dan periksa strukturnya. Partisi dipulihkan sebagai tabel standar, bukan partisi 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)
  3. Hapus tabel induk. Setelah dipulihkan, tabel tersebut tetap menjadi tabel partisi.

    -- Menghapus tabel induk.
    DROP TABLE tbl2_parent CASCADE;
    
    -- Periksa keranjang daur ulang. Baik tabel induk maupun partisi anak dipindahkan ke keranjang daur ulang.
    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+08

    Pulihkan tabel induk.

    RECOVER TABLE tbl2_parent; 

    Anda dapat menjalankan pernyataan berikut di Klien PSQL untuk melihat DDL tabel induk tersebut.

    \d+ tbl2_parent;

    Hasil berikut menunjukkan bahwa partisi 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: Memulihkan tabel dengan nama yang bertentangan

  • Jika Anda menghapus tabel lalu membuat tabel baru dengan nama yang sama di DB, kesalahan akan dilaporkan saat Anda mencoba memulihkan tabel yang dihapus. Anda harus mengganti nama tabel yang ada.

    1. Buat dan hapus tabel tbl6.

      CREATE TABLE tbl6(id INT);
      -- Menghapus tabel. Tabel dipindahkan ke keranjang daur ulang.
      DROP TABLE tbl6;
    2. Buat tabel baru yang juga bernama tbl6, lalu coba pulihkan tabel tbl6 yang dihapus.

      CREATE TABLE tbl6(id INT);
      RECOVER TABLE tbl6;   

      Hasil berikut dikembalikan. Pemulihan gagal karena tabel dengan nama yang sama sudah ada. Anda harus menghapus atau mengganti nama tabel yang ada.

      ERROR:  Table public.tbl6 already exists
    3. Ganti nama tabel tbl6 yang ada menjadi tbl6_rename, lalu pulihkan tabel tbl6 yang dihapus. Pemulihan berhasil.

      ALTER TABLE tbl6 rename to tbl6_rename;
      RECOVER TABLE tbl6; 
  • Jika tabel yang ada dengan nama yang sama memiliki PK dan clustering key yang sama dengan tabel yang dihapus, mengganti nama tabel tidak akan berhasil. Anda harus memindahkan tabel yang ada ke skema yang berbeda atau menghapusnya sebelum dapat memulihkan tabel yang dihapus.

    1. Buat dan hapus tabel tbl1.

      -- Buat tabel dan atur primary key serta clustering key.
      CREATE TABLE tbl1 (
          col1 INT,
          col2 INT,
          col3 INT,
          PRIMARY KEY (col1, col2)
      )
      WITH (
          clustering_key = 'col1'
      );
      -- Menghapus tabel.
      DROP TABLE  tbl1;
      
      -- Buat tabel baru dengan nama yang sama dan atur primary key serta clustering key.
      CREATE TABLE tbl1 (
          col1 INT,
          col2 INT,
          col3 INT,
          PRIMARY KEY (col1, col2)
      )
      WITH (
          clustering_key = 'col1'
      );
      
      -- Periksa keranjang daur ulang.
      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
    2. Kesalahan dilaporkan jika Anda mencoba langsung memulihkan tabel tbl1 dari keranjang daur ulang.

      -- Memulihkan tabel yang dihapus dari keranjang daur ulang. Kesalahan dilaporkan dan pemulihan gagal.
      RECOVER  TABLE tbl1;

      Pesan kesalahan berikut dikembalikan.

      ERROR: Tabel public.tbl1 sudah ada
    3. Kesalahan dilaporkan jika Anda mengganti nama tabel tbl1 lalu mencoba memulihkan tabel yang dihapus.

      -- 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 kesalahan berikut dikembalikan.

      ERROR: relasi "tbl1_pkey" sudah ADA DI SKEMA "public" 
    4. Pindahkan tabel tbl1 ke skema lain lalu pulihkan. Pemulihan berhasil.

      CREATE SCHEMA test;
      ALTER TABLE tbl2 SET SCHEMA test;
      
      -- Pemulihan berhasil.
      RECOVER  TABLE tbl1;

Menghapus tabel tanpa memindahkannya ke keranjang daur ulang

-- Menghapus tabel standar tanpa memindahkannya ke keranjang daur ulang.
CREATE TABLE tbl1(id INT);
DROP TABLE tbl1 FORCE;   

Menyaring (purge) tabel dari keranjang daur ulang

CREATE TABLE tbl1(id INT);
DROP TABLE tbl1;
-- Menghapus permanen tabel dari keranjang daur ulang.
PURGE TABLE tbl1;