All Products
Search
Document Center

PolarDB:Arsipkan data dalam format CSV atau ORC

Last Updated:Mar 29, 2026

Saat tabel mengumpulkan data dingin, menyimpannya di PolarStore menghabiskan penyimpanan lokal yang mahal tanpa memberikan manfaat kueri yang berarti. Pengarsipan data dingin memindahkan data tabel dari PolarStore ke Object Storage Service (OSS) dalam format CSV atau ORC, sehingga mengosongkan penyimpanan lokal sekaligus tetap memungkinkan data tersebut dikueri melalui SQL standar — tidak diperlukan perubahan pada kueri aplikasi Anda.

Halaman ini menjelaskan cara mengarsipkan tabel standar dan tabel partisi, mengaktifkan enkripsi untuk data yang diarsipkan, memulihkan data ke PolarStore, serta menghapus file OSS.

Prasyarat

Sebelum memulai, pastikan Anda telah:

  • Mengaktifkan pengarsipan data dingin pada kluster Anda

  • Versi kluster yang memenuhi persyaratan format berikut:

    Format CSV

    Jenis klusterVersi minimum
    Edisi KlusterMySQL 8.0.1 revisi 8.0.1.1.47, atau MySQL 8.0.2 revisi 8.0.2.2.10
    Kluster Multi-master (Limitless) EdisiVersi kernel 8.0.1.0.13

    Format ORC

    Jenis klusterVersi minimum
    Edisi KlusterRevisi 8.0.2.2.30
    Kluster Multi-master (Limitless) EdisiRevisi 8.0.2.2.30
Pengarsipan manual tidak dicatat dalam log biner pada kluster yang menjalankan PolarDB for MySQL 8.0.1 (revisi 8.0.1.1.33 atau lebih baru) atau 8.0.2 (revisi 8.0.2.2.11.1 atau lebih baru).

Arsipkan tabel standar

Pengarsipan tabel standar merupakan operasi tingkat tabel. Tabel menjadi read-only dengan engine OSS, file datanya disimpan di OSS, dan ruang yang sebelumnya digunakan di PolarStore dilepaskan. Setelah diarsipkan, kueri tabel menggunakan pernyataan SQL yang sama seperti sebelumnya — tidak diperlukan perubahan pada pola akses Anda.

Batasan

  • Engine yang didukung: InnoDB dan X-Engine.

  • Tabel InnoDB harus memiliki primary key.

  • Tabel dengan Indeks Kolom dalam Memori (IMCI) hanya dapat diarsipkan dalam format ORC, bukan CSV.

  • Pernyataan DDL dan DML tidak dapat dijalankan pada tabel selama proses pengarsipan.

  • Pengarsipan ke server OSS yang dibuat pengguna tidak didukung.

  • Setelah diarsipkan, tabel bersifat read-only dan performa kueri mungkin menurun. Uji performa kueri setelah pengarsipan untuk memastikannya memenuhi kebutuhan Anda.

Sintaksis

Format CSV

  • Format 1:

    ALTER TABLE table_name ENGINE = CSV CONNECTION = 'default_oss_server';
  • Format 2: Kluster Anda harus memenuhi salah satu persyaratan berikut.

    • Pengarsipan dalam format CSV

      • Jika edisi produk adalah Edisi Kluster, versi Milvus harus salah satu dari berikut:

        • MySQL 8.0.1, versi minor 8.0.1.1.47 atau lebih baru.

        • MySQL 8.0.2, versi revisi 8.0.2.2.10 atau lebih baru.

      • Untuk Kluster Multi-master (Limitless) Edisi, versi kernel harus 8.0.1.0.13 atau lebih baru.

    • Pengarsipan dalam format ORC

      • Untuk Edisi Kluster, versi revisi harus 8.0.2.2.30 atau lebih baru.

      • Untuk Kluster Multi-master (Limitless) Edisi, versi revisi harus 8.0.2.2.30 atau lebih baru.

    • Pengarsipan dalam format X-Engine

      • Pengarsipan tabel standar:

        • MySQL 8.0.1 dengan revisi 8.0.1.1.31 atau lebih baru.

        • MySQL 8.0.2 dengan revisi 8.0.2.2.12 atau lebih baru.

      • Pengarsipan tabel partisi: MySQL 8.0.2 dengan revisi 8.0.2.2.12 atau lebih baru.

      • Pengarsipan sebagai tabel berorientasi kolom X-Engine: MySQL 8.0.2 dengan revisi 8.0.2.2.33 atau lebih baru.

    ALTER TABLE table_name ENGINE = CSV STORAGE OSS;

Format ORC

ALTER TABLE table_name ENGINE = ORC STORAGE OSS;
Jika file dengan nama yang sama sudah ada di OSS, operasi akan gagal dengan error: Target file for archived table exists on oss. Pada kluster yang menjalankan revisi 8.0.2.2.29 atau lebih baru, tambahkan FORCE STORAGE OSS ke pernyataan DROP TABLE untuk menghapus file OSS terkait saat menghapus skema tabel:
DROP TABLE table_name FORCE STORAGE OSS;

Parameter

ParameterDeskripsi
table_nameNama tabel yang akan diarsipkan ke OSS

Contoh

Arsipkan tabel t di database oss_test ke OSS dalam format CSV atau ORC.

  1. Buat tabel InnoDB dengan primary key.

    CREATE TABLE t(a int, b int, c int, primary key(a)) ENGINE = INNODB;
  2. Masukkan data.

    INSERT INTO t VALUES (1,2,3);
  3. Arsipkan tabel. Format CSV:

    ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server';

    Format ORC:

    ALTER TABLE t ENGINE = ORC STORAGE OSS;
  4. Setelah pengarsipan selesai, verifikasi hasilnya:

    • Di Konsol: Masuk ke Konsol PolarDB. Di halaman kluster target, buka Settings and Management > Data Lifecycle > Data Archive (Cold Data).

    • Dengan SQL: Kueri tabel yang diarsipkan secara langsung — pola akses tetap tidak berubah. ``sql SELECT * FROM t; ``

Arsipkan partisi ke tabel eksternal OSS

Pendekatan ini mengarsipkan partisi tertentu dari tabel partisi ke tabel eksternal OSS baru. Tabel sumber InnoDB tetap menyimpan partisi yang tidak diarsipkan, dan data yang diarsipkan dapat dikueri dari tabel eksternal OSS.

Prasyarat

  • Versi kluster: PolarDB for MySQL 8.0.2 revisi 8.0.2.2.25 atau lebih baru.

  • Atur parameter kluster partition_level_mdl_enabled ke ON untuk mengaktifkan kunci metadata (MDL) tingkat partisi. Untuk petunjuknya, lihat Atur parameter kluster dan node.

  • Atur parameter kluster loose_use_oss_meta ke ON. Untuk petunjuknya, lihat Atur parameter kluster dan node.

Batasan

  • Tabel OSS tujuan hanya mendukung format CSV.

  • Setelah mengarsipkan suatu partisi, tabel sumber harus tetap menyimpan minimal satu partisi InnoDB.

  • Data yang diarsipkan kehilangan informasi partisinya dan tidak dapat dipulihkan secara langsung. Gunakan INSERT INTO ... SELECT untuk memulihkan data jika diperlukan.

  • Subpartisi tidak dapat diarsipkan secara individual. Arsipkan seluruh partisi tingkat pertama sebagai gantinya.

  • Jenis partisi tingkat pertama yang didukung:

    Jenis partisi tingkat pertamaJenis partisi tingkat keduaDidukung
    LISTApa punYa
    RANGEApa punYa
    KEYApa punYa
    HASHApa punTidak
    LIST DEFAULTApa punYa, kecuali partisi DEFAULT

Sintaksis

CALL dbms_dlm.archive_partition2table(
  'source_db',
  'source_tb',
  'source_part',
  'archive_db',
  'archive_table',
  'oss_file_filter'
);

Parameter

ParameterDeskripsi
source_dbDatabase yang berisi tabel sumber
source_tbNama tabel sumber
source_partPartisi yang akan diarsipkan. Pisahkan beberapa nama partisi dengan koma
archive_dbDatabase untuk tabel OSS tujuan
archive_tableNama tabel OSS tujuan
oss_file_filterKolom yang akan digunakan untuk membuat OSS_FILE_FILTER guna percepatan kueri. Lihat Percepatan kueri OSS_FILE_FILTER

Perilaku berdasarkan status tabel tujuan:

  • Tabel tujuan tidak ada: Tabel dibuat secara otomatis. OSS_FILE_FILTER dibuat pada kolom yang ditentukan, dengan primary key dan partition key ditambahkan secara otomatis.

  • Destination table exists: Nama dan tipe kolom harus sesuai dengan tabel sumber. Jika berbeda, sesuaikan skema menggunakan pernyataan DDL sebelum mengarsipkan. Lihat DDL untuk data dingin. Jika tabel tujuan sudah memiliki OSS_FILE_FILTER dengan definisi berbeda, maka definisi yang sudah ada akan digunakan.

  • Tabel tujuan tidak ada tetapi file dengan nama yang sama sudah ada di OSS: Operasi gagal dengan:

    ERROR 8181 (HY000): [Data Lifecycle Management] errmsg: Target file for archived table exists on oss, please remove it first, or use flag 'FORCE' to overwrite on existing files.

    Jika file OSS sisa tersebut tidak lagi diperlukan, hapus lalu coba lagi:

    -- Hapus file OSS sisa.
    CALL dbms_oss.delete_table_file('test', 'sales_history');
    -- Query OK, 0 rows affected (0.76 sec)
    
    -- Coba ulang operasi pengarsipan.
    CALL dbms_dlm.archive_partition2table('test', 'sales', 'p0', 'test', 'sales_history', 'id');
    -- Query OK, 0 rows affected (4.24 sec)

Contoh

Arsipkan partisi p0 dari tabel partisi sales ke tabel OSS baru bernama sales_history.

  1. Buat tabel partisi InnoDB dan masukkan data.

    DROP TABLE IF EXISTS `sales`;
    
    -- Buat tabel partisi RANGE.
    CREATE TABLE `sales` (
      `id` int DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `order_time` datetime NOT NULL,
      primary key (order_time)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    PARTITION BY RANGE COLUMNS(order_time) INTERVAL(month, 1)
    (PARTITION p0 VALUES LESS THAN ('2022-01-01') ENGINE = InnoDB,
     PARTITION p1 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION p2 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = InnoDB);
    
    -- Masukkan 1.000 baris menggunakan prosedur batch insert.
    DROP PROCEDURE IF EXISTS proc_batch_insert;
    delimiter $$
    CREATE PROCEDURE proc_batch_insert(IN begin INT, IN end INT, IN name VARCHAR(20))
      BEGIN
      SET @insert_stmt = concat('INSERT INTO ', name, ' VALUES(? , ?, ?);');
      PREPARE stmt from @insert_stmt;
      WHILE begin <= end DO
        SET @ID1 = begin;
        SET @NAME = CONCAT(begin+begin*281313, '@stiven');
        SET @TIME = from_days(begin + 738368);
        EXECUTE stmt using @ID1, @NAME, @TIME;
        SET begin = begin + 1;
        END WHILE;
      END;
    $$
    delimiter ;
    
    CALL proc_batch_insert(1, 1000, 'sales');
  2. Periksa skema saat ini dari tabel sales.

    SHOW CREATE TABLE sales;

    Output yang diharapkan:

    *************************** 1. row ***************************
           Table: sales
    Create Table: CREATE TABLE `sales` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `order_time` datetime NOT NULL,
      PRIMARY KEY (`order_time`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    /*!50500 PARTITION BY RANGE  COLUMNS(order_time) */ /*!99990 800020200 INTERVAL(MONTH, 1) */
    /*!50500 (PARTITION p0 VALUES LESS THAN ('2022-01-01') ENGINE = InnoDB,
     PARTITION p1 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = InnoDB,
     PARTITION p2 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = InnoDB,
     ...) */
    1 row in set (0.03 sec)
  3. Arsipkan partisi p0 ke tabel OSS sales_history, dengan OSS_FILE_FILTER pada kolom id.

    CALL dbms_dlm.archive_partition2table('test', 'sales', 'p0', 'test', 'sales_history', 'id');
    -- Query OK, 0 rows affected (1.86 sec)
  4. Verifikasi skema tabel sales_history yang dibuat.

    SHOW CREATE TABLE sales_history;

    Output yang diharapkan:

    *************************** 1. row ***************************
           Table: sales_history
    Create Table: CREATE TABLE `sales_history` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(20) DEFAULT NULL,
      `order_time` datetime DEFAULT NULL,
      PRIMARY KEY (`order_time`)
    ) /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */
    /*!99990 800020224 OSS_FILE_FILTER='id,order_time' */
    1 row in set (0.00 sec)
  5. Kueri data yang diarsipkan.

    Aktifkan Percepatan kueri OSS_FILE_FILTER untuk meningkatkan performa kueri pada tabel OSS.
    SELECT * FROM sales_history WHERE id = 100;

    Output yang diharapkan:

    +------+-----------------+---------------------+
    | id   | name            | order_time          |
    +------+-----------------+---------------------+
    |  100 | 28131400@stiven | 2021-11-09 00:00:00 |
    +------+-----------------+---------------------+
    1 row in set (0.24 sec)

Arsipkan partisi secara langsung (tabel partisi hibrida)

Fitur ini sedang dalam rilis canary. Untuk mengaktifkannya, buka Pusat Kuota, temukan kuota dengan ID polardb_mysql_hybrid_partition, lalu klik Request.

Pengarsipan partisi secara langsung mengonversi partisi tertentu dari tabel InnoDB ke penyimpanan berbasis OSS, sehingga menciptakan tabel partisi hibrida. Partisi yang tidak diarsipkan tetap berada di PolarStore, dan ruang yang digunakan oleh partisi yang diarsipkan dilepaskan secara otomatis.

Prasyarat

  • Versi kluster: PolarDB for MySQL 8.0.2 revisi 8.0.2.2.14 atau lebih baru.

Batasan

  • Hanya tabel partisi dengan engine InnoDB yang didukung.

  • Minimal satu partisi InnoDB harus tetap ada di tabel. Partisi InnoDB terakhir tidak dapat diarsipkan.

  • Operasi DDL tidak dapat dilakukan pada tabel partisi hibrida. Lihat Buat tabel partisi hibrida untuk detail lengkapnya.

  • Data partisi yang diarsipkan bersifat read-only. Operasi tulis tidak didukung pada partisi yang diarsipkan.

  • Subpartisi tidak dapat diarsipkan secara individual.

  • Partisi DEFAULT dari tabel partisi LIST DEFAULT HASH tidak dapat diarsipkan.

  • Tabel partisi HASH dan KEY tidak dapat diarsipkan.

  • Seluruh tabel partisi tidak dapat diarsipkan secara manual. Arsipkan partisi satu per satu.

Sintaksis

-- Arsipkan sebagai CSV:
ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV;

-- Arsipkan sebagai ORC:
ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = ORC;
Jika file dengan nama yang sama sudah ada di OSS, operasi akan gagal dengan: Target file for archived table exists on oss. Untuk menimpa file OSS yang sudah ada, tambahkan FORCE ke pernyataan tersebut: Pada kluster yang menjalankan revisi 8.0.2.2.29 atau lebih baru, FORCE STORAGE OSS juga didukung:
ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV/ORC FORCE;
ALTER TABLE table_name CHANGE PARTITION part_name ENGINE = CSV FORCE STORAGE OSS;

Parameter

ParameterDeskripsi
table_nameNama tabel partisi
part_nameNama partisi yang akan diarsipkan

Contoh

Arsipkan partisi p1 dan p2 dari tabel t ke OSS dalam format CSV.

  1. Buat tabel partisi RANGE InnoDB.

    CREATE TABLE t(a int, b int, c int, primary key(a))
    PARTITION BY RANGE(a)
    (PARTITION p1 VALUES LESS THAN (100),
     PARTITION p2 VALUES LESS THAN (200),
     PARTITION p3 VALUES LESS THAN MAXVALUE
    );
  2. Masukkan data.

    INSERT INTO t VALUES (1,1,1), (10,10,10), (100,100,100),
                         (150,150,150), (200,200,200), (1000,1000,1000);
  3. Arsipkan partisi p1 dan p2. Format CSV:

    ALTER TABLE t CHANGE PARTITION p1 ENGINE = CSV;
    ALTER TABLE t CHANGE PARTITION p2 ENGINE = CSV;

    Format ORC:

    ALTER TABLE t CHANGE PARTITION p1 ENGINE = ORC;
    ALTER TABLE t CHANGE PARTITION p2 ENGINE = ORC;
  4. Setelah pengarsipan selesai, verifikasi hasilnya:

    • Di Konsol: Masuk ke Konsol PolarDB. Di halaman kluster target, buka Settings and Management > Data Lifecycle > Data Archive (Cold Data).

    • Dengan SQL: Kueri tabel partisi hibrida. Lihat Mengkueri partisi hibrida untuk detailnya.

Aktifkan enkripsi TDE untuk data yang diarsipkan

Enkripsi Data Transparan (TDE) mengenkripsi file data yang ditulis ke OSS selama pengarsipan. Server OSS melakukan enkripsi dan dekripsi secara transparan — kueri data yang diarsipkan menggunakan SQL seperti biasa, tanpa langkah tambahan.

Untuk informasi lebih lanjut tentang enkripsi sisi OSS, lihat Enkripsi data.

Prasyarat

  • Hanya pengarsipan manual dalam format CSV atau ORC.

  • Versi kluster: PolarDB for MySQL 8.0.1 revisi 8.0.1.1.47 atau lebih baru, atau 8.0.2 revisi 8.0.2.2.27 atau lebih baru. Jika kluster Anda tidak memenuhi persyaratan ini, upgrade versi minor.

Sintaksis

Tambahkan ENCRYPTION="Y" ke pernyataan pengarsipan:

ALTER TABLE t1 ENGINE = CSV ENCRYPTION="Y" STORAGE OSS;

Pulihkan data dari OSS ke PolarStore

Pulihkan tabel standar yang diarsipkan

Pemulihan mengonversi tabel OSS kembali menjadi tabel InnoDB read-write di PolarStore. Data yang diarsipkan di OSS dihapus setelah pemulihan.

Tabel OSS yang diarsipkan bersifat read-only. Operasi INSERT, UPDATE, dan DELETE akan gagal dengan: 1036 - Table 't1' is read only. Pulihkan tabel ke PolarStore sebelum melakukan modifikasi apa pun.

Sintaksis

ALTER TABLE table_name ENGINE = engine_name;

Parameter

ParameterDeskripsi
table_nameNama tabel OSS yang diarsipkan untuk dipulihkan
engine_nameJenis engine yang akan dipulihkan (misalnya, InnoDB)

Contoh

Pulihkan tabel OSS t di database oss_test ke PolarStore.

ALTER TABLE `oss_test`.`t` ENGINE = InnoDB;

Setelah pemulihan, modifikasi data sesuai kebutuhan, lalu arsipkan kembali tabel menggunakan salah satu format berikut:

-- Format 1:
ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server';

-- Format 2:
ALTER TABLE t ENGINE = CSV STORAGE OSS;

Pulihkan partisi yang diarsipkan

Memulihkan partisi yang diarsipkan memindahkan datanya dari OSS kembali ke PolarStore. Data dingin di OSS dihapus setelah pemulihan.

Sintaksis

ALTER TABLE table_name REORGANIZE PARTITION part_name INTO (partition_definition);

Parameter

ParameterDeskripsi
table_nameNama tabel yang berisi partisi yang diarsipkan
part_nameNama partisi yang akan dipulihkan
partition_definitionDefinisi partisi, yang harus sesuai dengan definisi asli partisi yang dipulihkan

Contoh

Pulihkan partisi p1 dari tabel partisi t dari OSS ke PolarStore.

ALTER TABLE t REORGANIZE PARTITION p1 INTO (PARTITION p1 VALUES LESS THAN (100));

Hapus file OSS

Fitur ini memerlukan PolarDB for MySQL 8.0.1 revisi 8.0.1.1.42 atau lebih baru, atau 8.0.2 revisi 8.0.2.2.23 atau lebih baru. Jika kluster Anda tidak memenuhi persyaratan ini, upgrade versi minor.

Menghapus tabel yang diarsipkan atau memulihkannya ke PolarStore tidak secara otomatis menghapus file dasar di OSS. Setelah Anda memastikan data tersebut tidak lagi diperlukan, hapus file tersebut secara manual:

CALL dbms_oss.delete_table_file('database_name', 'table_name');

Penghapusan file OSS bersifat asinkron — file benar-benar dihapus hanya setelah semua node kluster berhenti menggunakannya. Jika perintah gagal dengan OSS files are still in use, tunggu sebentar lalu coba lagi.

Langkah selanjutnya