Saat volume data dalam tabel partisi meningkat, data historis lama (cold data) mengonsumsi ruang penyimpanan secara signifikan dan meningkatkan biaya penyimpanan. Untuk mengurangi biaya sekaligus mempertahankan akses data, Anda dapat menggunakan kebijakan Data Lifecycle Management (DLM) guna mengarsipkan partisi lama secara otomatis ke format engine kompresi tinggi (X-Engine). Fitur ini memungkinkan pemisahan data hot dan warm di tingkat partisi: data hot tetap berada di partisi InnoDB berkinerja tinggi, sedangkan data warm yang diarsipkan ke X-Engine secara signifikan menurunkan biaya penyimpanan namun tetap mendukung operasi DML writes serta perubahan Online DDL.
Cara kerja
Fitur arsip partisi otomatis menggunakan kebijakan Data Lifecycle Management (DLM) yang Anda definisikan pada suatu tabel. Cara kerjanya sebagai berikut:
Definisikan kebijakan: Anda dapat menentukan kebijakan DLM saat membuat tabel dengan
CREATE TABLEatau memodifikasi tabel denganALTER TABLE. Inti kebijakan ini adalah kondisi yang menentukan kapan arsip dilakukan. Misalnya, jika jumlah partisi melebihi ambang batas, partisi terlama akan ditandai untuk diarsipkan.Picu eksekusi: Kebijakan tidak dipicu secara otomatis. Anda harus memulai tugas arsip dengan salah satu dari dua cara berikut:
Eksekusi manual: Panggil prosedur tersimpan sistem untuk segera mengeksekusi semua kebijakan DLM yang telah didefinisikan.
Eksekusi terjadwal: Buat
EVENTuntuk secara otomatis memanggil prosedur tersimpan dan mengeksekusi kebijakan sesuai jadwal yang telah ditentukan, misalnya setiap hari selama jam sepi.
Lakukan arsip: Saat kebijakan dieksekusi, sistem mengidentifikasi partisi tabel yang memenuhi kondisi arsip dan mengubah mesin penyimpanannya dari InnoDB ke X-Engine secara online untuk menyelesaikan proses arsip.
Prasyarat
Sebelum menggunakan fitur ini, pastikan kluster Anda memenuhi persyaratan berikut:
Edisi: Cluster Edition.
Versi kernel:
Untuk arsip ke format X-Engine berbasis baris (row-based):
MySQL 8.0.2, versi revisi 8.0.2.2.34.1 atau lebih baru.
Untuk arsip ke format tabel kolom (columnar table) X-Engine:
MySQL 8.0.2, versi revisi 8.0.2.2.34.1 atau lebih baru.
Konfigurasi dan lakukan arsip partisi
Bagian ini memandu Anda melalui pembuatan, eksekusi, dan verifikasi kebijakan arsip.
Ikhtisar proses
Buat kebijakan arsip DLM: Tentukan aturan arsip pada tabel partisi target.
Eksekusi kebijakan arsip DLM: Picu proses arsip secara manual atau melalui tugas terjadwal.
Lihat status dan hasil arsip: Verifikasi bahwa partisi telah berhasil dikonversi ke engine X-Engine.
Langkah 1: Buat kebijakan arsip DLM
Anda dapat menentukan kebijakan arsip saat membuat tabel partisi atau menambahkannya ke tabel yang sudah ada.
Metode 1: Definisikan kebijakan saat membuat tabel baru
Gunakan klausa
DLM ADD POLICYdi akhir pernyataanCREATE TABLE. Contoh berikut membuat tabelsalesyang menggunakan kolomorder_timesebagai kunci partisi. Tabel ini memiliki dua kebijakan: kebijakan INTERVAL dan kebijakan DLM.Kebijakan INTERVAL: Secara otomatis membuat partisi baru untuk interval satu tahun ketika data yang dimasukkan berada di luar rentang partisi yang ada.
Kebijakan DLM: Menentukan kebijakan bernama
policy_part2part. Kebijakan ini menyatakan bahwa ketika jumlah total partisi melebihi tiga, partisi terlama akan ditandai untuk diarsipkan ke X-Engine.
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(YEAR, 1) (PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = InnoDB, PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = InnoDB, PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = InnoDB) DLM ADD POLICY policy_part2part TIER TO PARTITION ENGINE=XENGINE READ WRITE ON (PARTITIONS OVER 3);Metode 2: Tambahkan kebijakan ke tabel yang sudah ada
Gunakan pernyataan
ALTER TABLEuntuk menambahkan kebijakan DLM ke tabel partisi yang sudah ada. Untuk informasi lebih lanjut, lihat Buat atau hapus kebijakan DLM dalam ALTER TABLE.ALTER TABLE sales DLM ADD POLICY policy_part2part TIER TO PARTITION ENGINE=XENGINE ON (PARTITIONS OVER 3);Penjelasan sintaksis:
ON (PARTITIONS OVER N)merupakan inti kebijakan, di manaNadalah jumlah partisi terbaru yang dipertahankan dalam engine InnoDB. Ketika jumlah total partisi melebihiN, partisi terlama di luar jumlah tersebut akan ditandai untuk diarsipkan.
Masukkan data uji
Gunakan prosedur tersimpan
proc_batch_insertuntuk memasukkan data uji ke tabel partisisales. Hal ini memicu kebijakan INTERVAL untuk secara otomatis membuat partisi baru.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 + 737600); EXECUTE stmt using @ID1, @NAME, @TIME; SET begin = begin + 1; END WHILE; END; $$ delimiter ; CALL proc_batch_insert(1, 3000, 'sales');Hasil berikut menunjukkan bahwa data berhasil dimasukkan:
Query OK, 1 row affected (0.50 sec)Jalankan perintah berikut untuk melihat struktur tabel
sales.SHOW CREATE TABLE sales \GOutput menunjukkan struktur tabel, di mana semua partisi saat ini menggunakan engine InnoDB.
mysql> SHOW CREATE TABLE sales \G *************************** 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(YEAR, 1) */ /*!50500 (PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = InnoDB, PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = InnoDB, PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = InnoDB, PARTITION _p20230101000000 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = InnoDB, PARTITION _p20240101000000 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = InnoDB, PARTITION _p20250101000000 VALUES LESS THAN ('2025-01-01 00:00:00') ENGINE = InnoDB, PARTITION _p20260101000000 VALUES LESS THAN ('2026-01-01 00:00:00') ENGINE = InnoDB, PARTITION _p20270101000000 VALUES LESS THAN ('2027-01-01 00:00:00') ENGINE = InnoDB, PARTITION _p20280101000000 VALUES LESS THAN ('2028-01-01 00:00:00') ENGINE = InnoDB) */
Langkah 2: Eksekusi kebijakan arsip DLM
Picu kebijakan arsip yang telah didefinisikan untuk memulai proses konversi engine partisi. Anda dapat memilih untuk mengeksekusinya secara manual atau mengatur tugas terjadwal sesuai kebutuhan bisnis Anda.
Metode 1: Eksekusi terjadwal (Direkomendasikan): Untuk lingkungan produksi yang memerlukan arsip data rutin, kami merekomendasikan penggunaan fitur
EVENTMySQL untuk menjalankan tugas secara otomatis selama jam sepi, misalnya dini hari. Pendekatan ini mengotomatiskan tugas tersebut.Contoh berikut membuat event yang dimulai pada 2026-02-01 dan dijalankan setiap hari pukul 01.00 untuk mengeksekusi semua kebijakan DLM.
CREATE EVENT dlm_system_base_event ON SCHEDULE EVERY 1 DAY STARTS '2026-02-01 01:00:00' do CALL dbms_dlm.execute_all_dlm_policies();Metode 2: Eksekusi manual: Metode ini cocok untuk tugas arsip satu kali atau untuk mencoba ulang tugas secara manual setelah troubleshooting.
Panggil prosedur tersimpan berikut untuk segera memicu semua kebijakan DLM yang telah didefinisikan.
CALL dbms_dlm.execute_all_dlm_policies();
Langkah 3: Lihat status dan hasil arsip
Monitor progres tugas arsip. Setelah tugas selesai, verifikasi bahwa engine partisi telah berubah.
Lihat definisi kebijakan
Kueri tabel sistem
mysql.dlm_policiesuntuk memastikan kebijakan telah dibuat.SELECT * FROM mysql.dlm_policies WHERE Table_schema = 'your_database' AND Table_name = 'sales'\GHasil berikut dikembalikan:
*************************** 1. row *************************** Id: 1 Table_schema: your_database Table_name: sales Policy_name: policy_part2part Policy_type: PARTITION Archive_type: PARTITION COUNT Storage_mode: READ WRITE Storage_engine: XENGINE Storage_media: DISK Storage_schema_name: NULL Storage_table_name: NULL Data_compressed: ON Compressed_algorithm: Zstandard Enabled: ENABLED Priority_number: 200 Tier_partition_number: 3 Tier_condition: NULL Extra_info: {"oss_file_filter": "order_time"} Comment: NULLPenjelasan bidang utama:
Bidang
Deskripsi
Table_schema,Table_nameDatabase dan tabel tempat kebijakan diterapkan.
Policy_nameNama kustom kebijakan.
Storage_engineEngine penyimpanan target untuk partisi yang diarsipkan. Pada contoh ini, nilainya adalah
XENGINE.Tier_partition_numberKebijakan menentukan jumlah partisi InnoDB yang dipertahankan. Ini adalah nilai
NdalamPARTITIONS OVER N.Lihat progres eksekusi
Selama atau setelah eksekusi kebijakan, Anda dapat mengkueri tabel sistem
mysql.dlm_progressuntuk melacak status tugas.SELECT * FROM mysql.dlm_progress WHERE Table_schema = 'your_database' AND Table_name = 'sales' ORDER BY Id DESC LIMIT 1\GHasil berikut dikembalikan:
*************************** 1. row *************************** Id: 1 Table_schema: your_database Table_name: sales Policy_name: policy_part2part Policy_type: PARTITION Archive_option: PARTITIONS OVER 3 Storage_engine: XENGINE Storage_media: DISK Data_compressed: ON Compressed_algorithm: Zstandard Archive_partitions: p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, _p20250101000000 Archive_stage: ARCHIVE_COMPLETE Archive_percentage: 100 Archived_file_info: null Start_time: 2026-02-06 10:50:00 End_time: 2026-02-06 10:50:00 Extra_info: nullPenjelasan bidang utama:
Bidang
Deskripsi
Archive_partitionsPartisi yang diarsipkan dalam tugas ini.
Archive_stageStatus saat ini dari tugas arsip.
ARCHIVE_COMPLETEmenunjukkan keberhasilan, danARCHIVE_ERRORmenunjukkan kegagalan.Archive_percentagePresentase penyelesaian tugas.
Start_time,End_timeWaktu mulai dan selesai tugas.
Extra_infoInformasi tambahan. Jika
Archive_stagebernilaiARCHIVE_ERROR, bidang ini berisi detail error.Verifikasi struktur tabel
Setelah tugas arsip selesai, gunakan perintah
SHOW CREATE TABLEuntuk melihat struktur tabel dan memastikan bahwaENGINEpartisi yang diarsipkan telah berubah menjadiXENGINE.SHOW CREATE TABLE sales\GHasil berikut dikembalikan:
*************************** 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 /*!99990 800020216 PARTITION BY RANGE COLUMNS(order_time) */ /*!99990 800020200 INTERVAL(YEAR, 1) */ /*!99990 800020216 (PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = XENGINE, PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = XENGINE, PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = XENGINE, PARTITION _p20230101000000 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = XENGINE, PARTITION _p20240101000000 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = XENGINE, PARTITION _p20250101000000 VALUES LESS THAN ('2025-01-01 00:00:00') ENGINE = XENGINE, PARTITION _p20260101000000 VALUES LESS THAN ('2026-01-01 00:00:00') ENGINE = InnoDB, PARTITION _p20270101000000 VALUES LESS THAN ('2027-01-01 00:00:00') ENGINE = InnoDB, PARTITION _p20280101000000 VALUES LESS THAN ('2028-01-01 00:00:00') ENGINE = InnoDB) */
Pertimbangan untuk lingkungan produksi
Desain kebijakan: Pilih nilai
Nyang sesuai dalamPARTITIONS OVER Nberdasarkan skenario bisnis Anda. Misalnya, untuk data pesanan, Anda mungkin ingin menyimpan data enam bulan terakhir di partisi InnoDB untuk memastikan kinerja kueri. Untuk data log, Anda mungkin hanya perlu menyimpan data 30 hari terakhir.Monitoring dan peringatan: Monitor bidang
Archive_stagedi tabelmysql.dlm_progress. Saat statusnyaARCHIVE_ERROR, picu peringatan segera untuk intervensi tepat waktu.