Fitur manajemen siklus hidup data (DLM) membantu Anda mengurangi biaya penyimpanan dan meningkatkan efisiensi dengan secara otomatis dan berkala mengarsipkan data dingin yang jarang diakses dari PolarStore ke media penyimpanan berbiaya rendah, seperti Object Storage Service (OSS).
Prasyarat
Kluster Anda harus menjalankan PolarDB for MySQL 8.0.2, revisi 8.0.2.2.34.1 atau yang lebih baru.
Catatan Untuk memeriksa versi kluster Anda, lihat Kueri versi engine.
Jika kluster Anda menjalankan PolarDB for MySQL 8.0.2, revisi 8.0.2.2.11.1 atau yang lebih baru, fitur DLM tidak mencatat operasi dalam log biner.
Anda harus mengaktifkan pengarsipan data dingin sebelum dapat menggunakan kebijakan DLM. Untuk informasi selengkapnya, lihat Aktifkan pengarsipan data dingin.
Catatan Jika Anda tidak mengaktifkan fitur pengarsipan data dingin, error berikut akan dikembalikan:
ERROR 8158 (HY000): [Data Lifecycle Management] DLM storage engine is not support. The value of polar_dlm_storage_mode is OFF.
Batasan
Fitur DLM hanya mendukung tabel partisi yang tidak mengandung subpartisi. Metode partisi harus RANGE COLUMN.
Anda tidak dapat menggunakan fitur DLM pada tabel partisi yang memiliki global secondary index (GSI).
PolarDB for MySQL tidak mendukung modifikasi kebijakan DLM. Untuk memodifikasi kebijakan, Anda harus terlebih dahulu menghapus kebijakan yang ada lalu membuat yang baru.
Jika kebijakan DLM sudah ada pada suatu tabel, jangan lakukan operasi DDL yang menyebabkan inkonsistensi skema antara tabel sumber dan tabel arsip, seperti menambah atau menghapus kolom atau memodifikasi tipe data kolom. Inkonsistensi semacam itu dapat mencegah data yang diarsipkan selanjutnya diproses. Sebelum melakukan operasi DDL tersebut, Anda harus menghapus kebijakan DLM dari tabel tersebut. Untuk melanjutkan pengarsipan data otomatis, buat kebijakan DLM baru dan tentukan nama baru untuk tabel arsip. Nama baru tersebut tidak boleh sama dengan nama tabel arsip yang pernah digunakan sebelumnya.
Gunakan partisi INTERVAL RANGE untuk memperluas partisi secara otomatis dan gunakan fitur DLM untuk mengarsipkan data dari partisi yang jarang digunakan ke OSS.
Catatan Partisi INTERVAL RANGE hanya didukung untuk kluster yang menjalankan PolarDB for MySQL 8.0.2, revisi 8.0.2.2.0 atau yang lebih baru.
Anda harus menentukan kebijakan DLM saat menjalankan pernyataan CREATE TABLE atau ALTER TABLE.
Pernyataan SHOW CREATE TABLE tidak menampilkan kebijakan DLM. Anda dapat melihat semua kebijakan DLM di tabel mysql.dlm_policies.
Peringatan
Setelah data dingin diarsipkan, tabel arsip di OSS bersifat read-only, dan performa kueri mungkin lambat. Anda harus menguji terlebih dahulu untuk memastikan performa kueri memenuhi kebutuhan Anda.
Setelah partisi dari tabel partisi diarsipkan ke OSS, data dalam partisi tersebut menjadi read-only. Anda tidak dapat melakukan operasi DDL pada tabel partisi tersebut.
Operasi backup tidak mencakup data yang telah diarsipkan ke OSS. Data di OSS tidak mendukung pemulihan pada titik waktu.
Buat kebijakan
Buat kebijakan DLM dengan CREATE TABLE
CREATE TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
[dlm_add_options]
dlm_add_options:
DLM ADD
[(dlm_policy_definition [, dlm_policy_definition] ...)]
dlm_policy_definition:
POLICY policy_name
[TIER TO TABLE/TIER TO PARTITION/TIER TO NONE]
[ENGINE [=] engine_name]
[STORAGE SCHEMA_NAME [=] storage_schema_name]
[STORAGE TABLE_NAME [=] storage_table_name]
[STORAGE [=] OSS]
[READ ONLY]
[COMMENT 'comment_string']
[EXTRA_INFO 'extra_info']
ON [(PARTITIONS OVER num)]
Buat kebijakan DLM dengan ALTER TABLE
ALTER TABLE tbl_name
[alter_option [, alter_option] ...]
[partition_options]
[dlm_add_options]
dlm_add_options:
DLM ADD
[(dlm_policy_definition [, dlm_policy_definition] ...)]
dlm_policy_definition:
POLICY policy_name
[TIER TO TABLE/TIER TO PARTITION/TIER TO NONE]
[ENGINE [=] engine_name]
[STORAGE SCHEMA_NAME [=] storage_schema_name]
[STORAGE TABLE_NAME [=] storage_table_name]
[STORAGE [=] OSS]
[READ ONLY]
[COMMENT 'comment_string']
[EXTRA_INFO 'extra_info']
ON [(PARTITIONS OVER num)]
Parameter kebijakan DLM
Parameter | Wajib | Deskripsi |
tbl_name | Ya | Nama tabel. |
policy_name | Ya | Nama kebijakan. |
TIER TO TABLE | Ya | Mengarsipkan data ke tabel eksternal OSS baru. |
TIER TO PARTITION | Ya | Mengonversi partisi data panas menjadi partisi data dingin yang disimpan di OSS dalam tabel yang sama, sehingga menghasilkan tabel partisi hibrida.
Catatan Fitur ini sedang dalam rilis canary. Untuk menggunakan fitur ini, buka Quota Center, temukan nama kuota yang sesuai dengan ID kuota polardb_mysql_hybrid_partition, lalu klik Apply di kolom Actions. Anda hanya dapat mengarsipkan partisi dari tabel partisi ke OSS jika kluster Anda menjalankan PolarDB for MySQL 8.0.2, revisi 8.0.2.2.17 atau yang lebih baru. Saat menggunakan fitur ini, pastikan jumlah total partisi dalam tabel partisi tidak melebihi 8.192.
|
TIER TO NONE | Ya | Menghapus data dari partisi terlama alih-alih mengarsipkannya. |
engine_name | Tidak | Mesin penyimpanan untuk data yang diarsipkan. Saat ini, data hanya dapat diarsipkan ke engine CSV. |
storage_schema_name | Tidak | Database untuk tabel arsip. Nilai default-nya adalah database tabel sumber. |
storage_table_name | Tidak | Nama tabel arsip. Jika tidak ditentukan, nilai default-nya adalah <source_table_name>_<dlm_policy_name>. |
STORAGE [=] OSS | Tidak | Menyimpan data yang diarsipkan di OSS. Ini adalah nilai default. |
READ ONLY | Tidak | Menjadikan data yang diarsipkan bersifat read-only. Ini adalah nilai default. |
comment_string | Tidak | Komentar untuk kebijakan DLM. |
extra_info | Tidak | Menentukan informasi OSS_FILE_FILTER untuk tabel OSS tujuan.
Catatan Pengarsipan partisi ke OSS memerlukan kluster Anda menjalankan Edisi Perusahaan PolarDB for MySQL 8.0.2, revisi 8.0.2.2.25 atau yang lebih baru. Fitur ini hanya berlaku jika tabel tujuan belum ada. Dalam kasus ini, sistem secara otomatis menghasilkan atribut FILE_FILTER berdasarkan parameter OSS_FILE_FILTER dalam EXTRA_INFO saat tabel OSS tujuan dibuat. Jika tabel tujuan sudah ada, filter file yang sudah ada akan digunakan.
Format EXTRA_INFO adalah {"oss_file_filter":"field_filter[,field_filter]"}, dengan field_filter didefinisikan sebagai berikut: field_filter := field_name[:filter_type]
filter_type := bloom
|
ON (PARTITIONS OVER num) | Ya | Mengarsipkan data ketika jumlah partisi lebih besar dari num. |
Atur kebijakan
Aktifkan kebijakan DLM.
ALTER TABLE table_name DLM ENABLE POLICY [(dlm_policy_name [, dlm_policy_name] ...)]
Nonaktifkan kebijakan DLM.
ALTER TABLE table_name DLM DISABLE POLICY [(dlm_policy_name [, dlm_policy_name] ...)]
Hapus kebijakan DLM.
ALTER TABLE table_name DLM DROP POLICY [(dlm_policy_name [, dlm_policy_name] ...)]
Dalam pernyataan-pernyataan ini, table_name adalah nama tabel, dan dlm_policy_name adalah nama kebijakan yang akan diatur. Anda dapat menentukan beberapa nama kebijakan.
Jalankan kebijakan
Jalankan semua kebijakan DLM pada semua tabel di kluster saat ini.
CALL dbms_dlm.execute_all_dlm_policies();
Jalankan kebijakan DLM pada satu tabel.
CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');
Dalam pernyataan ini, database_name adalah nama database yang berisi tabel tersebut, dan table_name adalah nama tabel.
Anda dapat menggunakan fitur MySQL event untuk menjalankan kebijakan DLM selama jendela pemeliharaan kluster Anda. Metode ini mencegah gangguan performa database selama jam sibuk bisnis dan memungkinkan Anda memindahkan data kedaluwarsa secara berkala untuk mengurangi biaya penyimpanan. Gunakan sintaks berikut untuk menjalankan kebijakan DLM dengan event:
CREATE
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[COMMENT 'comment']
DO event_body;
schedule: {
EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
}
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
event_body: {
CALL dbms_dlm.execute_all_dlm_policies();
| CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');
}
Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter | Wajib | Deskripsi |
event_name | Ya | Nama event. |
schedule | Ya | Waktu dan frekuensi menjalankan event. |
comment | Tidak | Komentar untuk event. |
event_body | Ya | Konten yang dieksekusi oleh event. Ini harus berupa pernyataan yang menjalankan kebijakan DLM.
Catatan Jika Anda menggunakan CALL dbms_dlm.execute_all_dlm_policies(), event tersebut akan menjalankan semua kebijakan DLM pada kluster. Oleh karena itu, Anda hanya boleh membuat satu event semacam ini per kluster. Jika Anda menggunakan CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');, event tersebut hanya menjalankan semua kebijakan DLM pada tabel tertentu. Oleh karena itu, buatlah satu event untuk setiap tabel yang memerlukan pengarsipan terjadwal.
|
interval | Ya | Frekuensi eksekusi event. |
timestamp | Ya | Waktu mulai menjalankan event. |
database_name | Ya | Nama database. |
table_name | Ya | Nama tabel. |
Untuk informasi selengkapnya tentang fitur MySQL EVENT, lihat dokumentasi resmi MySQL untuk CREATE EVENT.
Untuk contoh penggunaan, lihat Contoh pengarsipan data dingin ke OSS.
Contoh
Arsipkan data ke tabel eksternal
Buat kebijakan DLM
Contoh berikut membuat tabel partisi bernama sales yang menggunakan kolom order_time sebagai kunci partisi. Tabel ini memiliki kebijakan INTERVAL dan kebijakan DLM:
Kebijakan INTERVAL: Ketika data yang dimasukkan berada di luar rentang partisi yang ada, partisi baru akan dibuat secara otomatis dengan interval waktu satu tahun.
Kebijakan DLM: Tabel ini didefinisikan untuk hanya menyimpan tiga partisi. Ketika jumlah partisi melebihi tiga, kebijakan DLM akan dipicu dan melakukan salah satu tindakan berikut:
Jika tabel eksternal OSS sales_history belum ada, tabel eksternal OSS baru bernama sales_history akan dibuat, dan data dingin diarsipkan ke tabel sales_history.
Jika tabel eksternal sales_history sudah ada, dan tabel sales_history berada di OSS bawaan, data dingin langsung diarsipkan ke tabel eksternal sales_history.
Catatan Untuk membuat tabel dengan partisi INTERVAL RANGE, pastikan semua prasyarat terpenuhi. Untuk informasi selengkapnya tentang INTERVAL, lihat Partisi INTERVAL RANGE.
Buat tabel sales dengan kebijakan DLM.
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 test_policy TIER TO TABLE ENGINE=CSV STORAGE=OSS READ ONLY
STORAGE TABLE_NAME = 'sales_history' EXTRA_INFO '{"oss_file_filter":"id,name:bloom"}' ON (PARTITIONS OVER 3);
Kebijakan DLM untuk tabel ini bernama test_policy. Ketika jumlah partisi melebihi tiga, kebijakan ini mengarsipkan data dingin dari tabel sumber dalam format CSV ke OSS. Tabel arsip yang dihasilkan bernama sales_history dan bersifat read-only. Jika tabel arsip OSS belum ada, sistem akan membuatnya secara otomatis dan menambahkan OSS_FILE_FILTER ke kolom id dan name.
Kebijakan DLM untuk tabel saat ini disimpan di tabel sistem mysql.dlm_policies. Anda dapat mengkueri tabel ini untuk melihat detail kebijakan DLM. Untuk informasi selengkapnya tentang tabel mysql.dlm_policies, lihat Deskripsi struktur tabel. Lihat struktur tabel mysql.dlm_policies.
mysql> SELECT * FROM mysql.dlm_policies\G
Contoh output:
*************************** 1. row ***************************
Id: 3
Table_schema: test
Table_name: sales
Policy_name: test_policy
Policy_type: TABLE
Archive_type: PARTITION COUNT
Storage_mode: READ ONLY
Storage_engine: CSV
Storage_media: OSS
Storage_schema_name: test
Storage_table_name: sales_history
Data_compressed: OFF
Compressed_algorithm: NULL
Enabled: ENABLED
Priority_number: 10300
Tier_partition_number: 3
Tier_condition: NULL
Extra_info: {"oss_file_filter": "id,name:bloom,order_time"}
Comment: NULL
1 row in set (0.03 sec)
Saat ini, tabel sales memiliki tiga partisi, sehingga belum ada data yang diarsipkan.
Masukkan 3.000 baris data uji ke tabel partisi sales. Hal ini memastikan bahwa data melebihi rentang partisi yang ditentukan dan memicu kebijakan INTERVAL untuk membuat partisi baru secara otomatis.
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');
Kebijakan INTERVAL dipicu, yang menambahkan partisi baru ke tabel sales. Struktur tabel sekarang sebagai berikut:
mysql> SHOW CREATE TABLE sales\G
Contoh output:
*************************** 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) */
1 row in set (0.03 sec)
Partisi baru meningkatkan jumlah total partisi menjadi lebih dari tiga. Hal ini memenuhi kondisi untuk kebijakan DLM, dan data kini siap untuk diarsipkan.
Jalankan kebijakan DLM
Anda dapat menjalankan kebijakan DLM secara langsung menggunakan pernyataan SQL, atau menjalankannya secara berkala menggunakan fitur MySQL EVENT. Misalnya, asumsikan jendela pemeliharaan Anda dimulai pukul 01.00 setiap hari, mulai 11 Oktober 2022. Anda dapat membuat event berikut untuk menjalankan kebijakan DLM setiap hari pukul 01.00.
CREATE EVENT dlm_system_base_event
ON SCHEDULE EVERY 1 DAY
STARTS '2022-10-11 01:00:00'
do CALL
dbms_dlm.execute_all_dlm_policies();
Setelah pukul 01.00, event ini menjalankan semua kebijakan DLM pada semua tabel.
Jalankan perintah berikut untuk melihat struktur tabel sales:
mysql> SHOW CREATE TABLE sales\G
Contoh output:
*************************** 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 _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) */
1 row in set (0.03 sec)
Tabel kini hanya memiliki tiga partisi.
Anda dapat mengkueri tabel mysql.dlm_progress untuk melihat riwayat eksekusi kebijakan DLM. Untuk informasi selengkapnya tentang tabel dlm_progress, lihat Struktur tabel. Jalankan perintah berikut untuk mengkueri tabel mysql.dlm_progress :
mysql> SELECT * FROM mysql.dlm_progress\G
Contoh output:
*************************** 1. row ***************************
Id: 1
Table_schema: test
Table_name: sales
Policy_name: test_policy
Policy_type: TABLE
Archive_option: PARTITIONS OVER 3
Storage_engine: CSV
Storage_media: OSS
Data_compressed: OFF
Compressed_algorithm: NULL
Archive_partitions: p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, _p20250101000000
Archive_stage: ARCHIVE_COMPLETE
Archive_percentage: 0
Archived_file_info: null
Start_time: 2024-07-26 17:56:20
End_time: 2024-07-26 17:56:50
Extra_info: null
1 row in set (0.00 sec)
Partisi yang menyimpan data dingin yang jarang diakses, termasuk p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000, telah diarsipkan ke tabel eksternal OSS.
Jalankan perintah berikut untuk melihat struktur tabel eksternal OSS:
mysql> SHOW CREATE TABLE sales_history\G
Contoh output:
*************************** 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,name:bloom,order_time' */
1 row in set (0.15 sec)
Tabel ini kini merupakan tabel CSV yang menggunakan engine OSS untuk penyimpanan. Anda dapat mengkuerinya seperti tabel lokal. Kolom yang ditentukan telah ditambahkan ke OSS_FILE_FILTER. Karena order_time adalah kunci partisi, OSS_FILE_FILTER juga dibuat secara otomatis untuknya.
Kueri data pada tabel sales dan sales_history secara terpisah.
SELECT COUNT(*) FROM sales;
+----------+
| count(*) |
+----------+
| 984 |
+----------+
1 row in set (0.01 sec)
SELECT COUNT(*) FROM sales_history;
+----------+
| count(*) |
+----------+
| 2016 |
+----------+
1 row in set (0.57 sec)
Jumlah total baris adalah 3.000, yang sesuai dengan jumlah baris yang awalnya dimasukkan ke tabel sales.
Kueri tabel eksternal OSS menggunakan OSS_FILE_FILTER. Saklar OSS_FILE_FILTER harus diaktifkan.
mysql> explain select * from sales_history where id = 9;
+----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-----------------------------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-----------------------------------------------------------------------------+
| 1 | SIMPLE | sales_history | NULL | ALL | NULL | NULL | NULL | NULL | 2016 | 10.00 | Using where; With pushed engine condition (`test`.`sales_history`.`id` = 9) |
+----+-------------+---------------+------------+------+---------------+------+---------+------+------+----------+-----------------------------------------------------------------------------+
1 row in set, 1 warning (0.59 sec)
mysql> select * from sales_history where id = 9;
+------+----------------+---------------------+
| id | name | order_time |
+------+----------------+---------------------+
| 9 | 2531826@stiven | 2019-07-04 00:00:00 |
+------+----------------+---------------------+
1 row in set (0.19 sec)
Arsipkan partisi ke OSS
Buat kebijakan DLM
Contoh berikut membuat tabel partisi bernama sales yang menggunakan kolom order_time sebagai kunci partisi. Tabel ini memiliki kebijakan INTERVAL dan kebijakan DLM:
Kebijakan INTERVAL: Ketika data yang dimasukkan berada di luar rentang partisi yang ada, partisi baru akan dibuat secara otomatis dengan interval waktu satu tahun.
Kebijakan DLM: Tabel ini didefinisikan untuk hanya menyimpan tiga partisi. Ketika jumlah partisi melebihi tiga, kebijakan DLM akan dipicu dan mengarsipkan partisi lama langsung ke OSS.
Buat tabel sales.
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=CSV STORAGE=OSS READ ONLY ON (PARTITIONS OVER 3);
Kebijakan DLM untuk tabel ini bernama policy_part2part. Ketika jumlah partisi melebihi tiga, partisi lama diarsipkan ke OSS.
Lihat kebijakan DLM di tabel mysql.dlm_policies.
SELECT * FROM mysql.dlm_policies\G
Contoh output:
*************************** 1. row ***************************
Id: 2
Table_schema: test
Table_name: sales
Policy_name: policy_part2part
Policy_type: PARTITION
Archive_type: PARTITION COUNT
Storage_mode: READ ONLY
Storage_engine: CSV
Storage_media: OSS
Storage_schema_name: NULL
Storage_table_name: NULL
Data_compressed: OFF
Compressed_algorithm: NULL
Enabled: ENABLED
Priority_number: 10300
Tier_partition_number: 3
Tier_condition: NULL
Extra_info: null
Comment: NULL
1 row in set (0.03 sec)
Gunakan prosedur tersimpan proc_batch_insert untuk memasukkan data uji ke tabel partisi sales. Tindakan ini memicu kebijakan INTERVAL, yang secara otomatis membuat partisi baru.
CALL proc_batch_insert(1, 3000, 'sales');
Hasil berikut menunjukkan bahwa data berhasil dimasukkan:
Query OK, 1 row affected, 1 warning (0.99 sec)
Jalankan perintah berikut untuk melihat struktur tabel sales:
SHOW CREATE TABLE sales \G
Contoh output:
*************************** 1. row ***************************
Table: sales
Create Table: CREATE TABLE `sales` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`order_time` datetime DEFAULT 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) */
1 row in set (0.03 sec)
Jalankan kebijakan DLM
Jalankan perintah berikut untuk menjalankan kebijakan DLM:
CALL dbms_dlm.execute_all_dlm_policies();
Kueri tabel mysql.dlm_progress untuk melihat riwayat eksekusi DLM.
SELECT * FROM mysql.dlm_progress \G
Contoh output:
*************************** 1. row ***************************
Id: 4
Table_schema: test
Table_name: sales
Policy_name: policy_part2part
Policy_type: PARTITION
Archive_option: PARTITIONS OVER 3
Storage_engine: CSV
Storage_media: OSS
Data_compressed: OFF
Compressed_algorithm: NULL
Archive_partitions: p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, _p20250101000000
Archive_stage: ARCHIVE_COMPLETE
Archive_percentage: 100
Archived_file_info: null
Start_time: 2023-09-11 18:04:39
End_time: 2023-09-11 18:04:40
Extra_info: null
1 row in set (0.02 sec)
Jalankan perintah berikut untuk melihat struktur tabel sales:
SHOW CREATE TABLE sales \G
Contoh output:
*************************** 1. row ***************************
Table: sales
Create Table: CREATE TABLE `sales` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`order_time` datetime DEFAULT NULL,
PRIMARY KEY (`order_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci CONNECTION='default_oss_server'
/*!99990 800020205 PARTITION BY RANGE COLUMNS(order_time) */ /*!99990 800020200 INTERVAL(YEAR, 1) */
/*!99990 800020205 (PARTITION p20200101000000 VALUES LESS THAN ('2020-01-01 00:00:00') ENGINE = CSV,
PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = CSV,
PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = CSV,
PARTITION _p20230101000000 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = CSV,
PARTITION _p20240101000000 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = CSV,
PARTITION _p20250101000000 VALUES LESS THAN ('2025-01-01 00:00:00') ENGINE = CSV,
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) */
1 row in set (0.03 sec)
Output menunjukkan bahwa partisi p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000 dari tabel partisi sales telah diarsipkan ke OSS. Hanya tiga partisi data panas, yaitu _p20260101000000, _p20270101000000, dan _p20280101000000, yang tetap disimpan di engine InnoDB. Tabel sales kini menjadi tabel partisi hibrida. Untuk informasi tentang cara mengkueri data dalam tabel partisi hibrida, lihat Kueri tabel partisi hibrida.
Hapus data dingin
Buat kebijakan DLM
Contoh berikut membuat tabel partisi bernama sales yang menggunakan kolom order_time sebagai kunci partisi. Tabel ini memiliki kebijakan INTERVAL dan kebijakan DLM:
Kebijakan INTERVAL: Ketika data yang dimasukkan berada di luar rentang partisi yang ada, partisi baru akan dibuat secara otomatis dengan interval waktu satu tahun.
Kebijakan DLM: Tabel ini didefinisikan untuk hanya menyimpan tiga partisi. Ketika jumlah partisi melebihi tiga, kebijakan DLM akan dipicu untuk menghapus data dingin.
Buat tabel sales dengan kebijakan DLM.
CREATE TABLE `sales` (
`id` int DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`order_time` datetime DEFAULT 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 test_policy TIER TO NONE ON (PARTITIONS OVER 3);
Kebijakan DLM untuk tabel ini bernama test_policy. Kebijakan ini dipicu ketika jumlah partisi melebihi tiga. Saat dijalankan, kebijakan ini menghapus data dingin.
Jalankan perintah berikut untuk mengkueri tabel mysql.dlm_policies:
SELECT * FROM mysql.dlm_policies\G
Contoh output:
*************************** 1. row ***************************
Id: 4
Table_schema: test
Table_name: sales
Policy_name: test_policy
Policy_type: NONE
Archive_type: PARTITION COUNT
Storage_mode: NULL
Storage_engine: NULL
Storage_media: NULL
Storage_schema_name: NULL
Storage_table_name: NULL
Data_compressed: OFF
Compressed_algorithm: NULL
Enabled: ENABLED
Priority_number: 50000
Tier_partition_number: 3
Tier_condition: NULL
Extra_info: null
Comment: NULL
1 row in set (0.01 sec)
Gunakan prosedur tersimpan proc_batch_insert untuk memasukkan data uji ke tabel partisi sales. Tindakan ini memicu kebijakan INTERVAL, yang secara otomatis membuat partisi baru.
CALL proc_batch_insert(1, 3000, 'sales');
Query OK, 1 row affected, 1 warning (0.99 sec)
Jalankan perintah berikut untuk melihat struktur tabel sales:
SHOW CREATE TABLE sales \G
Contoh output:
*************************** 1. row ***************************
Table: sales
Create Table: CREATE TABLE `sales` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`order_time` datetime DEFAULT 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) */
1 row in set (0.03 sec)
Jalankan kebijakan DLM
Jalankan perintah berikut untuk menjalankan kebijakan DLM secara langsung:
CALL dbms_dlm.execute_all_dlm_policies();
Saat kebijakan DLM sedang berjalan, kueri data di tabel mysql.dlm_progress.
SELECT * FROM mysql.dlm_progress \G
Hasil dalam tabel adalah sebagai berikut:
*************************** 1. row ***************************
Id: 1
Table_schema: test
Table_name: sales
Policy_name: test_policy
Policy_type: NONE
Archive_option: PARTITIONS OVER 3
Storage_engine: NULL
Storage_media: NULL
Data_compressed: OFF
Compressed_algorithm: NULL
Archive_partitions: p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, _p20250101000000
Archive_stage: ARCHIVE_COMPLETE
Archive_percentage: 100
Archived_file_info: null
Start_time: 2023-01-09 17:31:24
End_time: 2023-01-09 17:31:24
Extra_info: null
1 row in set (0.03 sec)
Partisi yang menyimpan data dingin yang jarang diakses, termasuk p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000, telah dihapus.
Struktur tabel sales kini sebagai berikut:
SHOW CREATE TABLE sales \G
Contoh output:
*************************** 1. row ***************************
Table: sales
Create Table: CREATE TABLE `sales` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`order_time` datetime DEFAULT 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 _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) */
1 row in set (0.02 sec)
Atur kebijakan dengan ALTER TABLE
Buat kebijakan DLM menggunakan pernyataan ALTER TABLE.
ALTER TABLE t DLM ADD POLICY test_policy TIER TO TABLE ENGINE=CSV STORAGE=OSS READ ONLY
STORAGE TABLE_NAME = 'sales_history' ON (PARTITIONS OVER 3);
Kebijakan DLM untuk tabel t bernama test_policy. Kebijakan ini dipicu ketika jumlah partisi melebihi tiga. Saat dijalankan, kebijakan ini mengarsipkan data dari partisi terlama tabel t ke tabel OSS bernama sales_history.
Aktifkan kebijakan DLM test_policy pada tabel t.
ALTER TABLE t DLM ENABLE POLICY test_policy;
Nonaktifkan kebijakan DLM test_policy pada tabel t.
ALTER TABLE t DLM DISABLE POLICY test_policy;
Hapus kebijakan DLM test_policy dari tabel t.
ALTER TABLE t DLM DROP POLICY test_policy;
Pemecahan masalah error eksekusi
Kebijakan DLM mungkin gagal dijalankan karena masalah konfigurasi. Catatan error disimpan di tabel mysql.dlm_progress. Jalankan perintah berikut untuk melihat catatan error:
SELECT * FROM mysql.dlm_progress WHERE Archive_stage = "ARCHIVE_ERROR";
Temukan detail error di bidang Extra_info. Setelah Anda mengidentifikasi dan menyelesaikan penyebab error, hapus catatan tersebut atau perbarui Archive_stage-nya menjadi ARCHIVE_COMPLETE. Anda kemudian dapat menjalankan perintah call dbms_dlm.execute_all_dlm_policies; untuk menjalankan kebijakan secara manual, atau menunggu eksekusi terjadwal berikutnya.
Catatan Untuk keamanan data, jika catatan eksekusi kebijakan memiliki status ARCHIVE_ERROR, penjadwal tidak akan menjalankan kebijakan tersebut lagi secara otomatis. Setelah Anda mengonfirmasi penyebab kegagalan dan memperbarui catatan tersebut, kebijakan akan melanjutkan eksekusi terjadwalnya.