全部产品
Search
文档中心

AnalyticDB:Penyimpanan bertingkat data hot dan cold

更新时间:Jan 13, 2026

AnalyticDB for PostgreSQL menyediakan Tiered Storage untuk membantu mengurangi biaya penyimpanan. Anda dapat memindahkan data yang jarang diakses dari Hot Tables ke Object Storage Service (OSS) sebagai Cold Tables. Topik ini menjelaskan batasan dan penggunaan Tiered Storage.

Catatan

Dalam topik ini, tabel yang disimpan di disk lokal disebut hot tables, sedangkan tabel yang disimpan di OSS remote disebut cold tables.

Persyaratan

  • Instans AnalyticDB for PostgreSQL V6.0 dengan minor version 6.3.11.1 atau lebih baru.

  • Instans AnalyticDB for PostgreSQL V7.0 dengan minor version 7.0.3.0 atau lebih baru.

Catatan

Anda dapat melihat minor version pada halaman Basic Information suatu instans di Konsol AnalyticDB for PostgreSQL. Jika instans Anda tidak memenuhi versi yang dipersyaratkan, perbarui minor version instans tersebut.

Batasan

  • Mode Serverless tidak didukung.

  • Batasan fitur tiered storage sedikit berbeda antara instans AnalyticDB for PostgreSQL V6.0 dan AnalyticDB for PostgreSQL V7.0. Tinjau batasan yang berlaku untuk versi instans Anda.

    v6.0

    • Anda dapat mengonversi tabel non-partisi menjadi cold table.

    • Anda dapat mengonversi seluruh tabel partisi menjadi cold table, atau mengonversi subpartisi tertentu menjadi cold partitions.

    • Anda tidak dapat mengonversi subpartisi dari tabel partisi yang memiliki indeks menjadi cold partitions, dan tidak dapat membuat Index pada tabel partisi yang sudah berisi cold partitions.

    • Ketika hot table dikonversi menjadi cold table, objek terkait seperti primary keys, indexes, sequences, rules, dan comments akan dihapus secara otomatis dan tidak dapat dipulihkan.

    • Data dalam cold tables atau cold partitions bersifat read-only. Anda tidak dapat melakukan operasi write, delete, atau update. Operasi Data Definition Language (DDL), seperti ALTER COLUMN dan DROP COLUMN, juga tidak didukung. Namun, Anda dapat menghapus cold table dengan pernyataan DROP TABLE.

    • AnalyticDB for PostgreSQL tidak mendukung konversi langsung cold tables atau cold partitions kembali menjadi hot tables. Anda dapat menjalankan pernyataan CREATE TABLE AS SELECT untuk membuat hot table baru dan memigrasikan data dari cold table ke hot table tersebut.

    v7.0

    • Anda dapat mengonversi tabel non-partisi menjadi cold table.

    • Anda dapat mengonversi seluruh tabel partisi menjadi cold table, atau mengonversi subpartisi tertentu menjadi cold partitions.

    • Operasi SELECT dan INSERT diizinkan pada cold tables dan cold partitions. Operasi DELETE dan UPDATE tidak didukung. Beberapa operasi DDL pada cold tables, seperti ALTER COLUMN dan DROP COLUMN, saat ini berada dalam tahap beta undangan saja. Untuk menggunakan fitur ini, ajukan tiket.

    • Anda dapat mengonversi subpartisi dari tabel partisi yang memiliki Index biasa menjadi cold subpartitions, tetapi tidak untuk yang memiliki primary key atau unique index.

    • Ketika hot table dikonversi menjadi cold table, objek terkait seperti primary keys, indexes, sequences, rules, dan comments akan dihapus secara otomatis dan tidak dapat dipulihkan.

    • AnalyticDB for PostgreSQL tidak mendukung konversi langsung cold tables atau cold partitions kembali menjadi hot tables. Anda dapat menjalankan pernyataan CREATE TABLE AS SELECT untuk membuat hot table baru dan memigrasikan data dari cold table ke hot table tersebut.

Penagihan

Setelah Anda mengonversi hot table menjadi cold table, data tersebut disimpan di OSS dan dikenai biaya penyimpanan. Aturan penagihan adalah sebagai berikut:

  • Penyimpanan dingin ditagih berdasarkan skema pay-as-you-go.

  • Penggunaan penyimpanan dingin dikumpulkan setiap 5 menit dan ditagih per jam.

  • Harga sama dengan harga penyimpanan standar OSS. Untuk informasi selengkapnya, lihat Harga OSS.

    Sebagai contoh, di wilayah Tiongkok daratan, harga OSS adalah USD 0,017 per GB/bulan. Harga per jam adalah USD 0,0000236111 per GB. Harga pada tagihan Anda bersifat final.

Anda dapat melihat rincian penagihan untuk penyimpanan dingin dengan memilih Billing > Bill Details.

Penggunaan

Penting
  • Proses konversi hot table menjadi cold table melibatkan pembuatan tabel temporary, penulisan data ke dalamnya, dan pengunggahan data ke OSS. Operasi ini mengonsumsi sumber daya I/O lokal dan jaringan, yang dapat memengaruhi performa kueri pada instans Anda. Perhatikan potensi dampak terhadap bisnis Anda.

  • Setelah hot table dikonversi menjadi cold table, ruang disk lokal yang sebelumnya digunakan dilepaskan.

  • Untuk instans AnalyticDB for PostgreSQL V6.0, konversi dijadwalkan pada waktu tertentu. Proses penjadwalan dan antrian mungkin memerlukan waktu. Untuk instans AnalyticDB for PostgreSQL V7.0, konversi dimulai segera saat Anda mengeksekusi pernyataan tersebut. Waktu total yang dibutuhkan bergantung pada spesifikasi instans, jumlah tabel yang dikonversi secara bersamaan, dan volume data. Untuk informasi selengkapnya, lihat Performa.

Penggunaan fitur tiered storage berbeda antara instans AnalyticDB for PostgreSQL V6.0 dan AnalyticDB for PostgreSQL V7.0. Gunakan sintaksis yang sesuai dengan versi instans Anda.

v6.0

Mengonversi tabel non-partisi

Sintaksis

ALTER TABLE <tableName> SET ttl interval '<scheduling_interval>' move to storage_cold;

Contoh

Buat tabel non-partisi bernama tiered_storage_heap dan masukkan data ke dalamnya.

CREATE TABLE tiered_storage_heap (a int, b int);
INSERT INTO tiered_storage_heap SELECT random() * 1000,1 FROM generate_series(1,1000);
  • Contoh 1: Pindahkan tabel non-partisi tiered_storage_heap ke penyimpanan dingin setelah tiga hari (3days). Misalnya, jika Anda menjalankan pernyataan ALTER TABLE pada pukul 09.00.00 tanggal 17 Juli 2023, seluruh tabel akan dipindahkan ke penyimpanan dingin tiga hari kemudian pada pukul 09.00.00 tanggal 20 Juli 2023.

    ALTER TABLE tiered_storage_heap SET ttl interval '3days' move to storage_cold;
  • Contoh 2: Pindahkan tabel non-partisi tiered_storage_heap ke penyimpanan dingin pada waktu tertentu (16.53.58 tanggal 28 Juli 2023).

    ALTER TABLE tiered_storage_heap SET ttl '2023-07-28 16:53:58'::Timestamp move to storage_cold;
  • Contoh 3: Konversi tabel secara langsung dengan mengatur waktu konversi ke tanggal lampau.

    • Atur waktu konversi ke tiga hari lalu (-3days). Jalankan perintah berikut untuk segera memindahkan tabel ke penyimpanan dingin.

      ALTER TABLE tiered_storage_heap SET ttl interval '-3days' move to storage_cold;
    • Tentukan tanggal dan waktu lampau. Jika waktu saat ini adalah 16.53.58 tanggal 17 Juli 2023, Anda dapat menjalankan perintah berikut untuk segera memindahkan tabel ke penyimpanan dingin.

      ALTER TABLE tiered_storage_heap SET ttl '2022-07-16 16:53:58'::Timestamp move to storage_cold;

Mengonversi subpartisi dari tabel partisi

Sintaksis

ALTER TABLE <child_partition_name> SET ttl interval '<scheduling_interval>' move to storage_cold;

Untuk melihat nama subpartisi dari tabel partisi, jalankan \d+ di psql.

Contoh

Buat tabel partisi bernama tiered_storage_partition_hdfs.

CREATE TABLE tiered_storage_partition_hdfs(a int,b int) distributed by (a) partition by range(a) (start(1) end(20) every(10));
Catatan

Contoh ini membuat dua subpartisi: tiered_storage_partition_hdfs_1_prt_1 dan tiered_storage_partition_hdfs_1_prt_2.

Masukkan data ke subpartisi tiered_storage_partition_hdfs_1_prt_1.

INSERT INTO tiered_storage_partition_hdfs_1_prt_1 values(1, 1), (2, 2), (3, 3), (4, 4);

Pindahkan subpartisi tiered_storage_partition_hdfs_1_prt_1 ke penyimpanan dingin setelah tiga hari. Misalnya, jika Anda menjalankan pernyataan ALTER TABLE pada pukul 09.00.00 tanggal 17 Juli 2023, subpartisi tiered_storage_partition_hdfs_1_prt_1 akan dipindahkan ke penyimpanan dingin tiga hari kemudian pada pukul 09.00.00 tanggal 20 Juli 2023. Subpartisi lain tidak terpengaruh.

ALTER TABLE tiered_storage_partition_hdfs_1_prt_1 SET ttl interval '3days' move to storage_cold;

Kueri status penyimpanan tabel

Anda dapat menggunakan salah satu metode berikut untuk menanyakan status penyimpanan tabel. Kueri akan mengembalikan cold untuk cold table dan hot untuk hot table.

  • Metode 1:

    SELECT pg_tiered_storage_relation_status('<table_name>'::regclass::oid::bigint);
  • Metode 2:

    SELECT pg_tiered_storage_relation_status(<table_oid>::bigint);

    Temukan OID tabel dengan menjalankan SELECT oid FROM pg_class where relname='<table_name>';.

v7.0

Mengonversi tabel non-partisi

Sintaksis

SELECT pg_tiered_storage_move_table_to_storage_cold('<schema_name>', '<table_name>');

Contoh

Buat tabel non-partisi bernama tiered_storage_heap_oss di skema public dan masukkan data ke dalamnya.

CREATE TABLE tiered_storage_heap_oss (a int, b int) DISTRIBUTED BY(a) ;
INSERT INTO  tiered_storage_heap_oss SELECT random() * 1000,1 FROM generate_series(1,100);
  • Contoh 1: Segera pindahkan seluruh tabel ke penyimpanan dingin.

    Jalankan pernyataan berikut untuk segera memindahkan seluruh tabel non-partisi ke penyimpanan dingin.

    SELECT pg_tiered_storage_move_table_to_storage_cold('public', 'tiered_storage_heap_oss');
  • Contoh 2: Gunakan pg_cron untuk menjadwalkan pemindahan seluruh tabel ke penyimpanan dingin.

    Asumsikan Anda ingin menggunakan akun etl_user untuk memindahkan tabel non-partisi tiered_storage_heap_oss di database etl ke penyimpanan dingin pada pukul 01.00 hari berikutnya. Hubungkan ke database postgres dan jalankan pernyataan berikut.

    SELECT cron.schedule('etl_table_transfer_to_cold', '0 1 * * *', 'SELECT pg_tiered_storage_move_table_to_storage_cold(''public'', ''tiered_storage_heap_oss'');', 'etl', 'etl_user');

    Setelah pukul 01.00 hari berikutnya, setelah Anda memastikan pemindahan berhasil, Anda dapat menjalankan pernyataan berikut untuk menghapus pekerjaan terjadwal tersebut.

    SELECT cron.unschedule(<job_id>);
    Catatan

    ID pekerjaan dihasilkan secara otomatis saat pekerjaan dibuat. Anda dapat melihat ID tersebut di bidang jobid pada tabel cron.job.

Mengonversi subpartisi dari tabel partisi

Sintaksis

SELECT pg_tiered_storage_move_table_to_storage_cold('<schema_name>', '<child_partition_name>');

Untuk melihat nama subpartisi dari tabel partisi, jalankan \d+ di psql.

Contoh

  • Contoh 1: Segera pindahkan subpartisi ke penyimpanan dingin.

    Buat tabel partisi bernama tiered_storage_partition_oss di skema public.

    CREATE TABLE tiered_storage_partition_oss(a int,b int) DISTRIBUTED BY (a) PARTITION BY range(a) (start(1) end(20) every(10));
    Catatan

    Contoh ini membuat dua subpartisi: tiered_storage_partition_oss_1_prt_1 dan tiered_storage_partition_oss_1_prt_2.

    Masukkan data ke subpartisi tiered_storage_partition_oss_1_prt_1.

    INSERT INTO  tiered_storage_partition_oss_1_prt_1 VALUES(1, 1), (2, 2), (3, 3), (4, 4);

    Segera pindahkan subpartisi ke penyimpanan dingin.

    SELECT pg_tiered_storage_move_table_to_storage_cold('public', 'tiered_storage_partition_oss_1_prt_1');
  • Contoh 2: Gunakan pg_cron untuk menjadwalkan konversi subpartisi harian.

    Buat tabel partisi harian bernama daily_log_details di database etl.

    CREATE TABLE daily_log_details (id INT, log_message text, created_date character varying(64))
    PARTITION BY LIST (created_date)
    (
       PARTITION p20230601 VALUES ('20230601'),
       PARTITION p20230602 VALUES ('20230602'),
       PARTITION p20230603 VALUES ('20230603'),
       PARTITION p20230604 VALUES ('20230604'),
       PARTITION p20230605 VALUES ('20230605'),
       PARTITION p20230606 VALUES ('20230606'),
       PARTITION p20230607 VALUES ('20230607'),
       PARTITION p20230608 VALUES ('20230608'),
       PARTITION p20230609 VALUES ('20230609'),
       PARTITION p20230610 VALUES ('20230610'),
       PARTITION p20230611 VALUES ('20230611'),
       DEFAULT PARTITION others
    );

    Atur pekerjaan untuk mengonversi subpartisi yang lebih dari 10 hari ke Penyimpanan Dingin. Pekerjaan dijalankan pada pukul 03.00 dan dieksekusi oleh etl_user. Ikuti langkah-langkah berikut.

    1. Buat fungsi pembersihan di database etl.

      CREATE OR REPLACE FUNCTION pg_tiered_storage_move_partition_daily_table_to_cold_storage(schemaname text, tablename text) RETURNS void
      AS $$
      DECLARE
          fetch_overdue_partition_sql text;
          cold_storage_sql text;
          target record;
      BEGIN
          fetch_overdue_partition_sql := 'WITH targetpartitions AS
          (SELECT * FROM pg_partitions 
          WHERE tablename = $1
          AND schemaname = $2 
          AND partitionlevel = 1
          AND partitionisdefault = FALSE)
          SELECT partitiontablename FROM targetpartitions WHERE 
          to_date(substring(targetpartitions.partitionname FROM 2), ''YYYYMMDD'') <= current_date - INTERVAL ''10 days''';
          
          -- Fetch overdue partitions
          FOR target IN EXECUTE fetch_overdue_partition_sql USING tablename, schemaname LOOP 
             cold_storage_sql := 'SELECT pg_tiered_storage_move_table_to_storage_cold($1::text, $2::text)';
             raise notice 'sql %', cold_storage_sql;
             EXECUTE cold_storage_sql USING schemaname, target.partitiontablename;
          END LOOP;
      END;
      $$
      LANGUAGE plpgsql;
    2. Hubungkan ke database postgres dan jalankan pernyataan tersebut.

      SELECT cron.schedule('etl_daily_transfer_to_cold', '0 3 * * *', 'SELECT pg_tiered_storage_move_partition_daily_table_to_cold_storage(''public'', ''daily_log_details'');', 'etl', 'etl_user');
  • Contoh 3: Gunakan pg_cron untuk menjadwalkan konversi subpartisi bulanan.

    Buat tabel partisi bulanan bernama month_log_details di database etl.

    CREATE TABLE month_log_details (id INT, log_message text, created_date character varying(64))
    PARTITION BY LIST (created_date)
    (
       PARTITION p202306 VALUES ('202306'),
       PARTITION p202307 VALUES ('202307'),
       PARTITION p202308 VALUES ('202308'),
       PARTITION p202309 VALUES ('202309'),
       PARTITION p202310 VALUES ('202310'),
       DEFAULT PARTITION others
    );

    Atur pekerjaan untuk mengonversi subpartisi yang lebih dari 3 bulan ke Penyimpanan Dingin. Pekerjaan dijalankan pada pukul 05.00 pada hari pertama setiap bulan dan dieksekusi oleh etl_user. Ikuti langkah-langkah berikut.

    1. Buat fungsi pembersihan di database etl.

      CREATE OR REPLACE FUNCTION pg_tiered_storage_move_partition_table_to_cold_storage(schemaname text, tablename text) RETURNS void
      AS $$
      DECLARE
          fetch_overdue_partition_sql text;
          cold_storage_sql text;
          target record;
      BEGIN
          fetch_overdue_partition_sql := 'WITH targetpartitions AS
          (SELECT * FROM pg_partitions 
          WHERE tablename = $1
          AND schemaname = $2 
          AND partitionlevel = 1
          AND partitionisdefault = FALSE)
          SELECT partitiontablename FROM targetpartitions WHERE 
          to_date(substring(targetpartitions.partitionname FROM 2), ''YYYYMM'') <= current_date - INTERVAL ''3 months''';
          
          -- Fetch overdue partitions
          FOR target IN EXECUTE fetch_overdue_partition_sql USING tablename, schemaname LOOP 
             cold_storage_sql := 'SELECT pg_tiered_storage_move_table_to_storage_cold($1::text, $2::text)';
             raise notice 'sql %', cold_storage_sql;
             EXECUTE cold_storage_sql USING schemaname, target.partitiontablename;
          END LOOP;
      END;
      $$
      LANGUAGE plpgsql;
    2. Hubungkan ke database postgres dan jalankan pernyataan tersebut.

      SELECT cron.schedule('etl_month_transfer_to_cold', '0 5 1 * *', 'SELECT pg_tiered_storage_move_partition_table_to_cold_storage(''public'', ''month_log_details'');', 'etl', 'etl_user');

Kueri status penyimpanan tabel

Jalankan pernyataan berikut untuk menanyakan status penyimpanan tabel. Kueri akan mengembalikan cold untuk cold table dan hot untuk hot table.

SELECT pg_tiered_storage_table_status('<schema_name>', '<table_name>|<child_partition_name>')

Lihat penyimpanan hot dan cold

Login ke Konsol AnalyticDB for PostgreSQL. Di halaman Basic Information, lihat Hot Storage dan Cold Storage pada kartu Instance Status.

Cadangan dan pemulihan

AnalyticDB for PostgreSQL tiered storage mendukung pencadangan dan pemulihan. Pemulihan data tunduk pada aturan berikut:

v6.0

Ketika cadangan penuh tersedia, Anda dapat memulihkan data ke titik waktu apa pun. Status penyimpanan (hot atau cold) data pada saat pemulihan sesuai dengan statusnya pada saat pencadangan.

v7.0

Ketika cadangan penuh tersedia, Anda dapat memulihkan data ke titik waktu tertentu. Status penyimpanan (hot atau cold) data pada saat pemulihan sesuai dengan statusnya pada saat pencadangan. AnalyticDB for PostgreSQL V7.0 memiliki batasan berikut:

  • Jika tidak ada data yang ditulis ke tabel setelah dikonversi menjadi cold table, Anda dapat memulihkan tabel ke titik waktu apa pun.

  • Jika data ditulis ke tabel setelah dikonversi menjadi cold table, Anda dapat memulihkan tabel ke titik cadangan apa pun yang dibuat sebelum konversi. Jika Anda memulihkan ke titik waktu setelah konversi, Anda hanya dapat memulihkan hingga waktu penulisan terakhir.

Untuk mendukung pencadangan dan pemulihan, ruang OSS yang digunakan oleh tabel yang dihapus tidak langsung dilepaskan. Sebaliknya, ruang tersebut dipertahankan selama periode yang ditentukan oleh pengaturan Data Backup Retention Period. Anda dikenai biaya atas ruang OSS selama periode retensi ini.

Untuk informasi selengkapnya tentang pencadangan dan pemulihan, lihat Cadangan dan pemulihan.

Penskalaan

Ketika Anda melakukan skala-masuk pada instans AnalyticDB for PostgreSQL V6.0, cold tables dipindahkan ke tabel temporary lokal untuk redistribusi data. Setelah skala-masuk selesai, data diunggah kembali ke OSS, dan tabel temporary lokal dihapus. Untuk memastikan skala-masuk berhasil, total ruang disk yang tersisa di semua node setelah operasi harus lebih besar dari total ruang yang ditempati oleh cold tables. Selama proses skala-masuk, data diunduh dari OSS. Durasi skala-masuk dibatasi oleh bandwidth unduh OSS. Oleh karena itu, Anda harus mengevaluasi durasi skala-masuk dengan cermat.

Untuk instans AnalyticDB for PostgreSQL V7.0, penskalaan tidak memengaruhi data di penyimpanan dingin. Redistribusi data atau pemindahan data kembali ke penyimpanan lokal tidak diperlukan. Anda tidak perlu mempertimbangkan ruang disk yang ditempati oleh penyimpanan dingin.

Performa

Pengujian dilakukan pada instans 4-node dan 8-node, masing-masing dengan node 2-core 8 GB, menggunakan pernyataan berikut.

CREATE TABLE t333 (a int, b int);
INSERT INTO t333 SELECT random() * 1000000, random()*1000000 FROM generate_series(1,3000000000);

Instans v6.0 mengeksekusi: ALTER TABLE t333 SET ttl interval '-3days' move to storage_cold;

Instans v7.0 mengeksekusi: SELECT pg_tiered_storage_move_table_to_storage_cold('public', 't333');

Tabel berikut menunjukkan hasil pengujian waktu konversi tabel tunggal dalam satuan detik.

Ukuran Tabel Hot (GB)

Waktu konversi (4-node, detik)

Waktu konversi (8-node, detik)

v6.0

v7.0

v6.0

v7.0

1

10

5

5

2,8

10

96

48

42

25,2

100

848

490

333

243