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 kluster Versi minimum Edisi Kluster MySQL 8.0.1 revisi 8.0.1.1.47, atau MySQL 8.0.2 revisi 8.0.2.2.10 Kluster Multi-master (Limitless) Edisi Versi kernel 8.0.1.0.13 Format ORC
Jenis kluster Versi minimum Edisi Kluster Revisi 8.0.2.2.30 Kluster Multi-master (Limitless) Edisi Revisi 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, tambahkanFORCE STORAGE OSSke pernyataanDROP TABLEuntuk menghapus file OSS terkait saat menghapus skema tabel:
DROP TABLE table_name FORCE STORAGE OSS;Parameter
| Parameter | Deskripsi |
|---|---|
table_name | Nama tabel yang akan diarsipkan ke OSS |
Contoh
Arsipkan tabel t di database oss_test ke OSS dalam format CSV atau ORC.
Buat tabel InnoDB dengan primary key.
CREATE TABLE t(a int, b int, c int, primary key(a)) ENGINE = INNODB;Masukkan data.
INSERT INTO t VALUES (1,2,3);Arsipkan tabel. Format CSV:
ALTER TABLE t ENGINE = CSV CONNECTION = 'default_oss_server';Format ORC:
ALTER TABLE t ENGINE = ORC STORAGE OSS;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_enabledkeONuntuk mengaktifkan kunci metadata (MDL) tingkat partisi. Untuk petunjuknya, lihat Atur parameter kluster dan node.Atur parameter kluster
loose_use_oss_metakeON. 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 ... SELECTuntuk 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 pertama Jenis partisi tingkat kedua Didukung LIST Apa pun Ya RANGE Apa pun Ya KEY Apa pun Ya HASH Apa pun Tidak LIST DEFAULT Apa pun Ya, kecuali partisi DEFAULT
Sintaksis
CALL dbms_dlm.archive_partition2table(
'source_db',
'source_tb',
'source_part',
'archive_db',
'archive_table',
'oss_file_filter'
);Parameter
| Parameter | Deskripsi |
|---|---|
source_db | Database yang berisi tabel sumber |
source_tb | Nama tabel sumber |
source_part | Partisi yang akan diarsipkan. Pisahkan beberapa nama partisi dengan koma |
archive_db | Database untuk tabel OSS tujuan |
archive_table | Nama tabel OSS tujuan |
oss_file_filter | Kolom 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_FILTERdibuat 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_FILTERdengan 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.
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');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)Arsipkan partisi
p0ke tabel OSSsales_history, denganOSS_FILE_FILTERpada kolomid.CALL dbms_dlm.archive_partition2table('test', 'sales', 'p0', 'test', 'sales_history', 'id'); -- Query OK, 0 rows affected (1.86 sec)Verifikasi skema tabel
sales_historyyang 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)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, tambahkanFORCEke pernyataan tersebut: Pada kluster yang menjalankan revisi 8.0.2.2.29 atau lebih baru,FORCE STORAGE OSSjuga 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
| Parameter | Deskripsi |
|---|---|
table_name | Nama tabel partisi |
part_name | Nama partisi yang akan diarsipkan |
Contoh
Arsipkan partisi p1 dan p2 dari tabel t ke OSS dalam format CSV.
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 );Masukkan data.
INSERT INTO t VALUES (1,1,1), (10,10,10), (100,100,100), (150,150,150), (200,200,200), (1000,1000,1000);Arsipkan partisi
p1danp2. 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;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. OperasiINSERT,UPDATE, danDELETEakan 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
| Parameter | Deskripsi |
|---|---|
table_name | Nama tabel OSS yang diarsipkan untuk dipulihkan |
engine_name | Jenis 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
| Parameter | Deskripsi |
|---|---|
table_name | Nama tabel yang berisi partisi yang diarsipkan |
part_name | Nama partisi yang akan dipulihkan |
partition_definition | Definisi 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
Untuk mempercepat kueri data yang diarsipkan, aktifkan Percepatan kueri OSS_FILE_FILTER.
Untuk mengelola data yang diarsipkan dengan DDL, lihat DDL untuk data dingin.
Untuk bekerja dengan tabel partisi hibrida, lihat Buat tabel partisi hibrida.