Fitur Data Lifecycle Management (DLM) secara otomatis mengarsipkan data dingin dengan memindahkan data yang jarang digunakan dari PolarStore ke Object Storage Service (OSS) berbiaya rendah secara berkala. Hal ini mengurangi biaya penyimpanan dan meningkatkan efisiensi database.
Penerapan
Kluster Anda harus menjalankan PolarDB for MySQL 8.0.2 dengan versi minor 8.0.2.2.9 atau lebih baru.
Untuk memeriksa versi kluster Anda, lihat Kueri nomor versi.
Catatan Jika kluster Anda menjalankan PolarDB for MySQL 8.0.2 dengan versi minor 8.0.2.2.11.1 atau lebih baru, fitur DLM tidak mencatat binary logs.
Sebelum menggunakan kebijakan DLM, Anda harus terlebih dahulu mengaktifkan pengarsipan data dingin.
Catatan Jika Anda tidak mengaktifkan pengarsipan data dingin, error berikut akan dilaporkan:
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 menggunakan metode partisi RANGE COLUMN dan tidak mengandung subpartisi.
Anda tidak dapat menggunakan fitur DLM pada tabel partisi yang memiliki global secondary index (GSI).
PolarDB for MySQL tidak mendukung modifikasi kebijakan DLM. Untuk mengubah kebijakan, hapus kebijakan yang ada dan buat yang baru.
Jika kebijakan DLM sudah ada pada suatu tabel, jangan lakukan operasi Data Definition Language (DDL) yang menyebabkan skema tabel arsip dan tabel sumber menjadi tidak konsisten. Contohnya termasuk menambah atau menghapus kolom serta mengubah tipe kolom. Operasi semacam itu dapat mencegah data yang diarsipkan selanjutnya untuk diurai. Sebelum melakukan operasi DDL tersebut, hapus kebijakan DLM dari tabel tersebut. Untuk menggunakan pengarsipan data otomatis di kemudian hari, buat kebijakan DLM baru dan tentukan nama tabel arsip yang berbeda dari semua nama yang pernah digunakan sebelumnya.
Kami merekomendasikan penggunaan fitur interval range partitioning untuk memperluas partisi secara otomatis. Secara bersamaan, gunakan fitur DLM untuk mengarsipkan data dari partisi yang jarang digunakan ke OSS.
Catatan Hanya kluster yang menjalankan PolarDB for MySQL 8.0.2 dengan versi minor 8.0.2.2.0 atau lebih baru yang mendukung interval range partitioning.
Tentukan fitur DLM saat Anda menggunakan CREATE TABLE atau ALTER TABLE.
Kebijakan DLM tidak ditampilkan saat Anda menjalankan SHOW CREATE TABLE. Anda dapat melihat informasi semua kebijakan DLM pada tabel Anda di tabel mysql.dlm_policies.
Catatan
Setelah data dingin diarsipkan, tabel arsip di OSS bersifat read-only dan memiliki performa kueri yang buruk. Uji data yang diarsipkan terlebih dahulu untuk memastikan performa kueri memenuhi kebutuhan Anda.
Setelah suatu partisi dari tabel partisi diarsipkan ke OSS, data dalam partisi yang diarsipkan tersebut bersifat read-only. Anda tidak dapat melakukan operasi DDL pada tabel partisi tersebut.
Saat Anda melakukan operasi backup, data yang telah dipindahkan ke OSS tidak dibackup. Data di OSS tidak mendukung point-in-time restore (PITR).
Buat kebijakan DLM
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 | Arsipkan ke tabel. |
TIER TO PARTITION | Ya | Arsipkan partisi ke OSS.
Catatan Fitur ini sedang dalam rilis canary. Untuk menggunakan fitur ini, buka Quota Center, temukan kuota dengan ID polardb_mysql_hybrid_partition, lalu klik Request di kolom Actions untuk mengaktifkannya. Anda hanya dapat mengarsipkan partisi dari tabel partisi di kluster yang menjalankan PolarDB for MySQL 8.0.2 dengan revisi 8.0.2.2.17 atau lebih baru ke OSS. Saat menggunakan fitur ini, pastikan jumlah total partisi dalam tabel partisi tidak melebihi 8.192.
|
TIER TO NONE | Ya | Langsung menghapus data yang perlu diarsipkan. |
engine_name | Tidak | Engine tempat data arsip disimpan. Saat ini, Anda hanya dapat mengarsipkan data ke Mesin penyimpanan CSV. |
storage_schema_name | Tidak | Saat mengarsipkan ke tabel, ini adalah database tempat tabel tersebut berada. Nilai default-nya adalah database tabel saat ini. |
storage_table_name | Tidak | Saat mengarsipkan ke tabel, ini adalah nama tabel tersebut. Anda dapat menentukan nama tabel. Nilai default-nya adalah <current_table_name>_<current_DLM_policy_name>. |
STORAGE [=] OSS | Tidak | Data yang diarsipkan disimpan di engine OSS. Ini adalah nilai default. |
READ ONLY | Tidak | Data yang diarsipkan bersifat read-only. Ini adalah nilai default. |
comment_string | Tidak | Komentar untuk kebijakan DLM. |
extra_info | Tidak | Informasi OSS_FILE_FILTER pada tabel OSS tujuan.
Catatan Anda hanya dapat mengarsipkan partisi dari tabel partisi di kluster Edisi Perusahaan yang menjalankan PolarDB for MySQL 8.0.2 dengan revisi 8.0.2.2.25 atau lebih baru ke OSS. Fitur ini hanya berlaku jika tabel tujuan belum ada. Dalam kasus ini, sistem menggunakan parameter OSS_FILE_FILTER dalam EXTRA_INFO untuk secara otomatis menghasilkan properti FILE_FILTER saat membuat tabel OSS tujuan. Fitur ini juga secara otomatis menghasilkan data filter selama proses pengarsipan. Jika tabel tujuan sudah ada, file filter yang ada akan digunakan.
Format EXTRA_INFO adalah {"oss_file_filter":"field_filter[,field_filter]"}, dengan format field_filter 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. |
Modifikasi kebijakan DLM
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 perintah-perintah ini, table_name adalah nama tabel saat ini, dan dlm_policy_name adalah nama kebijakan yang akan dimodifikasi. Anda dapat menentukan beberapa nama kebijakan.
Jalankan kebijakan DLM
Jalankan kebijakan DLM pada semua tabel di kluster saat ini.
CALL dbms_dlm.execute_all_dlm_policies();
Jalankan kebijakan DLM pada satu tabel tertentu.
CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');
Dalam perintah ini, database_name adalah nama database tempat tabel tersebut berada, dan table_name adalah nama tabel tersebut.
Anda dapat menggunakan fitur mysql event untuk menjalankan kebijakan DLM selama jendela O&M kluster Anda. Hal ini menghindari dampak terhadap performa database akibat menjalankan DLM selama jam sibuk bisnis dan memungkinkan Anda memindahkan data kedaluwarsa secara berkala untuk mengurangi biaya penyimpanan database. Sintaksis untuk menjalankan kebijakan DLM dengan EVENT adalah:
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 saat ini. |
schedule | Ya | Waktu eksekusi dan interval untuk EVENT saat ini. |
comment | Tidak | Komentar untuk EVENT saat ini. |
event_body | Ya | Konten yang dieksekusi oleh EVENT saat ini. Atur ini ke pernyataan yang menjalankan kebijakan DLM.
Catatan Saat Anda menggunakan CALL dbms_dlm.execute_all_dlm_policies(), EVENT saat ini menjalankan semua kebijakan DLM di kluster. Oleh karena itu, Anda perlu membuat satu EVENT per kluster. Saat Anda menggunakan CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');, EVENT saat ini hanya menjalankan kebijakan DLM pada tabel tertentu. Oleh karena itu, Anda perlu membuat EVENT yang sesuai untuk setiap tabel dengan kebijakan DLM agar datanya diarsipkan pada waktu yang ditentukan.
|
interval | Ya | Interval eksekusi untuk EVENT. |
timestamp | Ya | Waktu mulai eksekusi EVENT. |
database_name | Ya | Nama database. |
table_name | Ya | Nama tabel. |
Untuk informasi lebih lanjut tentang fitur MySQL EVENT, lihat dokumentasi resmi MySQL EVENT.
Untuk contoh penggunaan, lihat Contoh pengarsipan data dingin ke OSS.
Contoh
Arsipkan data dari tabel partisi ke tabel eksternal OSS
Buat kebijakan DLM
Contoh berikut membuat tabel partisi bernama sales. Tabel ini menggunakan kolom order_time sebagai kunci partisi dan membagi partisi berdasarkan interval waktu. Tabel ini memiliki dua kebijakan: INTERVAL dan DLM.
Kebijakan INTERVAL: Saat data yang dimasukkan melebihi rentang partisi, partisi baru dibuat secara otomatis dengan interval waktu satu tahun.
Kebijakan DLM: Tabel ini didefinisikan hanya memiliki tiga partisi. Ketika jumlah partisi melebihi tiga dan kebijakan DLM dijalankan:
Jika tabel eksternal OSS sales_history belum ada, tabel eksternal OSS baru bernama sales_history dibuat, dan data dingin dipindahkan ke tabel eksternal sales_history.
Jika tabel eksternal sales_history sudah ada dan tabel sales_history berada di ruang OSS bawaan, data dingin langsung dipindahkan ke tabel eksternal sales_history.
Catatan Membuat tabel partisi INTERVAL RANGE memiliki prasyarat tertentu. Untuk informasi lebih lanjut tentang penggunaan INTERVAL, lihat PolarDB INTERVAL.
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. Saat jumlah partisi melebihi tiga, data dingin dari tabel saat ini dipindahkan ke OSS dalam format CSV. Tabel arsip bernama sales_history dan bersifat read-only. Jika tabel OSS arsip belum ada, tabel OSS dibuat secara otomatis, dan OSS_FILE_FILTER dibuat pada kolom id dan name.
Kebijakan DLM untuk tabel saat ini disimpan di tabel sistem mysql.dlm_policies. Anda dapat melihat detail kebijakan DLM di tabel ini. Untuk informasi lebih lanjut tentang tabel mysql.dlm_policies, lihat Deskripsi skema tabel. Lihat informasi skema tabel mysql.dlm_policies.
mysql> SELECT * FROM mysql.dlm_policies\G
Hasil berikut dikembalikan:
*************************** 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 pengarsipan data belum dilakukan.
Masukkan 3.000 catatan uji ke tabel partisi sales untuk memastikan data melebihi definisi partisi saat ini. Hal ini 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');
Pada titik ini, kebijakan INTERVAL dipicu untuk membuat partisi baru secara otomatis. Hal ini meningkatkan jumlah partisi di tabel sales, dan skema tabel berubah menjadi:
mysql> SHOW CREATE TABLE sales\G
Hasil 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
/*!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 telah dibuat, dan jumlah partisi lebih dari tiga. Hal ini memenuhi kondisi eksekusi kebijakan DLM, sehingga data dapat diarsipkan.
Jalankan kebijakan DLM
Anda dapat menjalankan kebijakan DLM langsung dengan pernyataan SQL, atau menjalankannya secara berkala menggunakan fitur EVENT MySQL. Misalnya, asumsikan bahwa mulai 11 Oktober 2022, jendela O&M kluster Anda dimulai pukul 01.00 setiap hari. Kebijakan DLM kemudian akan berjalan setiap hari pukul 01.00. Buat EVENT eksekusi yang sesuai sebagai berikut:
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 kebijakan DLM pada semua tabel.
Jalankan perintah berikut untuk melihat informasi skema tabel sales.
mysql> SHOW CREATE TABLE sales\G
Hasil 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
/*!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 sekarang hanya memiliki tiga partisi yang tersisa.
Anda dapat melihat catatan eksekusi kebijakan DLM di tabel mysql.dlm_progress. Untuk definisi tabel dlm_progress, lihat Deskripsi skema tabel. Jalankan perintah berikut untuk melihat informasi skema tabel mysql.dlm_progress .
mysql> SELECT * FROM mysql.dlm_progress\G
Hasil berikut dikembalikan:
*************************** 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 digunakan, termasuk p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000, telah dipindahkan ke tabel eksternal OSS.
Jalankan perintah berikut untuk melihat skema tabel eksternal OSS.
mysql> SHOW CREATE TABLE sales_history\G
Hasil berikut dikembalikan:
*************************** 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 menjadi tabel CSV dengan data yang disimpan di engine OSS. Metode kuerinya sama 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)
Anda dapat melihat bahwa jumlah total catatan adalah 3.000, yang sesuai dengan jumlah data yang awalnya dimasukkan ke tabel sales.
Kueri tabel eksternal OSS menggunakan OSS_FILE_FILTER (switch 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 dari tabel partisi ke OSS
Buat kebijakan DLM
Contoh berikut membuat tabel partisi bernama sales. Tabel ini menggunakan kolom order_time sebagai kunci partisi dan membagi partisi berdasarkan interval waktu. Tabel ini memiliki dua kebijakan: INTERVAL dan DLM.
Kebijakan INTERVAL: Saat data yang dimasukkan melebihi rentang partisi, partisi baru dibuat secara otomatis dengan interval waktu satu tahun.
Kebijakan DLM: Tabel ini didefinisikan hanya memiliki tiga partisi. Saat jumlah partisi melebihi tiga, menjalankan kebijakan DLM langsung memindahkan partisi yang lebih lama 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. Saat jumlah partisi melebihi tiga, partisi lama dipindahkan ke OSS.
Lihat kebijakan DLM di tabel mysql.dlm_policies.
SELECT * FROM mysql.dlm_policies\G
Hasil berikut dikembalikan:
*************************** 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. Hal ini memicu kebijakan INTERVAL untuk membuat partisi baru secara otomatis.
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 informasi skema tabel sales.
SHOW CREATE TABLE sales \G
Hasil berikut dikembalikan:
*************************** 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 kebijakan DLM dengan perintah berikut.
CALL dbms_dlm.execute_all_dlm_policies();
Lihat catatan eksekusi DLM di tabel mysql.dlm_progress.
SELECT * FROM mysql.dlm_progress \G
Hasil berikut dikembalikan:
*************************** 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 informasi skema tabel sales.
SHOW CREATE TABLE sales \G
Hasil berikut dikembalikan:
*************************** 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)
Informasi skema tabel yang dikueri menunjukkan bahwa partisi p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000 di tabel partisi sales semuanya telah dipindahkan ke OSS. Hanya tiga partisi data panas _p20260101000000, _p20270101000000, dan _p20280101000000 yang tetap berada di engine InnoDB. Tabel sales telah menjadi tabel partisi hibrida. Untuk informasi tentang cara mengkueri data di tabel partisi hibrida, lihat Kueri partisi hibrida.
Langsung hapus data dingin
Buat kebijakan DLM
Contoh berikut membuat tabel partisi bernama sales. Tabel ini menggunakan kolom order_time sebagai kunci partisi dan membagi partisi berdasarkan interval waktu. Tabel ini memiliki dua kebijakan: INTERVAL dan DLM.
Kebijakan INTERVAL: Saat data yang dimasukkan melebihi rentang partisi, partisi baru dibuat secara otomatis dengan interval waktu satu tahun.
Kebijakan DLM: Tabel ini didefinisikan hanya memiliki tiga partisi. Saat jumlah partisi melebihi tiga dan kebijakan DLM dijalankan, data dingin langsung dihapus.
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, dan kondisi eksekusinya adalah jumlah partisi lebih dari tiga. Saat kebijakan DLM dijalankan, data dingin langsung dihapus.
Jalankan perintah berikut untuk melihat tabel mysql.dlm_policies.
SELECT * FROM mysql.dlm_policies\G
Hasil berikut dikembalikan:
*************************** 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)
Masukkan data uji ke tabel partisi sales untuk memicu kebijakan INTERVAL membuat partisi baru secara otomatis. Gunakan prosedur tersimpan proc_batch_insert untuk memasukkan data baru. Skema tabel adalah sebagai berikut:
CALL proc_batch_insert(1, 3000, 'sales');
Query OK, 1 row affected, 1 warning (0.99 sec)
Jalankan perintah berikut untuk melihat informasi skema tabel sales.
SHOW CREATE TABLE sales \G
Hasil berikut dikembalikan:
*************************** 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 kebijakan DLM langsung dengan perintah berikut.
CALL dbms_dlm.execute_all_dlm_policies();
Saat kebijakan DLM sedang berjalan, lihat data di tabel mysql.dlm_progress.
SELECT * FROM mysql.dlm_progress \G
Tabel menunjukkan hasil 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 digunakan, termasuk p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000, telah dihapus.
Skema tabel sales adalah sebagai berikut:
SHOW CREATE TABLE sales \G
Hasil berikut dikembalikan:
*************************** 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)
Buat atau hapus kebijakan DLM dengan ALTER TABLE
Buat kebijakan DLM dengan 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, dan kondisi eksekusinya adalah jumlah partisi lebih dari tiga. Saat kebijakan DLM ini dijalankan dan jumlah partisi lebih dari tiga, data dari partisi lama di tabel t diarsipkan ke OSS. Tabel arsip di 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;
Penanganan error eksekusi
Kebijakan DLM mungkin gagal dieksekusi karena masalah konfigurasi. Saat hal ini terjadi, catatan error disimpan di tabel mysql.dlm_progress. Lihat catatan error dengan perintah berikut:
SELECT * FROM mysql.dlm_progress WHERE Archive_stage = "ARCHIVE_ERROR";
Temukan detail error di bidang Extra_info. Setelah Anda mengonfirmasi penyebab error, hapus catatan saat ini atau ubah Archive_stage catatan tersebut menjadi ARCHIVE_COMPLETE. Kemudian, jalankan secara manual kebijakan DLM dengan perintah call dbms_dlm.execute_all_dlm_policies;, atau tunggu hingga dijalankan secara otomatis pada siklus eksekusi berikutnya.
Catatan Untuk keamanan data, jika status catatan eksekusi kebijakan adalah ARCHIVE_ERROR, kebijakan tersebut tidak akan berjalan otomatis lagi. Kebijakan hanya akan dilanjutkan setelah Anda mengonfirmasi penyebab kegagalan dan memodifikasi catatan yang sesuai.