Fitur Data Lifecycle Management (DLM) memungkinkan Anda mengarsipkan data dingin dari PolarStore ke penyimpanan OSS yang hemat biaya dalam format CSV atau ORC secara otomatis dan berkala, sehingga mengurangi biaya serta meningkatkan efisiensi.
Batasan
-
Fitur DLM hanya mendukung tabel partisi yang menggunakan metode partisi RANGE COLUMN dan tidak memiliki 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 melakukan perubahan, hapus kebijakan yang ada dan buat yang baru.
-
Jika sebuah tabel memiliki kebijakan DLM aktif, hindari operasi DDL yang menyebabkan ketidakkonsistenan antara tabel sumber dan tabel arsip, seperti menambah atau menghapus kolom atau mengubah tipe data kolom. Ketidakkonsistenan tersebut dapat membuat data arsip selanjutnya tidak dapat diparse. Sebelum melakukan operasi DDL ini, Anda harus menghapus kebijakan DLM. Untuk melanjutkan pengarsipan otomatis, buat kebijakan DLM baru dan tentukan nama baru untuk tabel arsip yang tidak boleh sama dengan nama tabel arsip yang pernah digunakan sebelumnya.
-
Kami merekomendasikan Anda menggunakan INTERVAL RANGE partitioning untuk memperluas partisi secara otomatis dan menggunakan fitur DLM untuk mengarsipkan data dari partisi yang jarang digunakan ke OSS.
Catatan
INTERVAL RANGE partitioning hanya didukung untuk kluster yang menjalankan PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.0 atau 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.
Perhatian
-
Setelah data dingin diarsipkan, tabel arsip di OSS bersifat read-only, dan performa kuerinya mungkin menurun. Anda harus melakukan pengujian terlebih dahulu untuk memastikan performa kueri memenuhi kebutuhan Anda.
-
Setelah partisi dari tabel partisi diarsipkan ke OSS, data dalam partisi yang diarsipkan menjadi read-only.
-
Tabel partisi hibrida mendukung Copy DDL dan INPLACE DDL untuk membuat atau menghapus indeks sekunder, tetapi tidak mendukung Instant DDL.
-
Backup tidak mencakup data yang diarsipkan ke OSS. Data di OSS tidak mendukung pemulihan pada titik waktu (point-in-time recovery).
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
|
Mengarsipkan data ke tabel eksternal OSS.
Catatan
Hanya format CSV yang didukung untuk pengarsipan ke tabel eksternal OSS.
|
|
TIER TO PARTITION
|
Ya
|
Mengarsipkan partisi dalam format CSV, ORC, atau X-Engine, yaitu membuat tabel partisi hibrida.
Catatan
-
Untuk mengarsipkan partisi dari tabel partisi sebagai tabel partisi hibrida, kondisi berikut harus dipenuhi:
-
MySQL 8.0.2 dan versi minor adalah 8.0.2.2.34.1 atau lebih baru. Anda harus mengatur parameter loose_allow_create_hybrid_partition ke ON.
-
MySQL 8.0.2 dan versi minor lebih lama dari 8.0.2.2.34.1. Lakukan upgrade ke versi minor yang lebih baru.
-
Saat menggunakan fitur ini, pastikan jumlah total partisi dalam tabel partisi tidak melebihi 8.192.
|
|
TIER TO NONE
|
Ya
|
Menghapus data dingin alih-alih mengarsipkannya.
|
|
engine_name
|
Tidak
|
Mesin penyimpanan untuk data yang diarsipkan. Nilai yang valid: CSV, ORC, dan X-Engine.
|
|
storage_schema_name
|
Tidak
|
Saat mengarsipkan ke tabel, parameter ini menentukan database yang berisi tabel tersebut. Nilai default adalah database tabel sumber.
|
|
storage_table_name
|
Tidak
|
Saat mengarsipkan ke tabel, parameter ini menentukan nama tabel arsip. Nilai default adalah <source_table_name>_<current_dlm_policy_name>.
|
|
STORAGE [=] OSS
|
Tidak
|
Data yang diarsipkan disimpan di engine OSS. Ini adalah pengaturan default.
|
|
READ ONLY
|
Tidak
|
Data yang diarsipkan bersifat read-only. Ini adalah pengaturan default.
|
|
comment_string
|
Tidak
|
Komentar untuk kebijakan DLM.
|
|
extra_info
|
Tidak
|
Informasi OSS_FILE_FILTER untuk tabel OSS tujuan.
Catatan
-
Anda hanya dapat mengarsipkan partisi dari tabel partisi ke OSS jika kluster Anda menjalankan Edisi Perusahaan PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.25 atau lebih baru.
-
Parameter ini hanya berlaku jika tabel tujuan belum ada. Dalam kasus ini, sistem secara otomatis menghasilkan atribut FILE_FILTER berdasarkan nilai OSS_FILE_FILTER dalam parameter EXTRA_INFO dan menghasilkan data filter selama pengarsipan. Jika tabel tujuan sudah ada, file filter yang sudah ada akan digunakan.
Format EXTRA_INFO adalah {"oss_file_filter":"field_filter[,field_filter]"}, dengan field_filter menggunakan format berikut: field_filter := field_name[:filter_type]
filter_type := bloom
|
|
ON (PARTITIONS OVER num)
|
Ya
|
Mengarsipkan data ketika jumlah partisi melebihi num.
|
Kelola 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 pernyataan di atas, table_name menentukan nama tabel, dan dlm_policy_name menentukan nama kebijakan yang akan dikelola. Anda dapat menentukan beberapa nama kebijakan.
Jalankan kebijakan DLM
-
Jalankan semua kebijakan DLM pada semua tabel di kluster saat ini.
CALL dbms_dlm.execute_all_dlm_policies();
-
Jalankan kebijakan DLM pada tabel tertentu.
CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');
Dalam pernyataan di atas, database_name menentukan nama database, dan table_name menentukan nama tabel.
Anda dapat menggunakan fitur mysql event untuk menjalankan kebijakan DLM selama jendela pemeliharaan kluster Anda. Hal ini menghindari dampak terhadap performa database selama jam sibuk dan secara berkala memindahkan data yang telah kedaluwarsa untuk mengurangi biaya penyimpanan. Sintaks untuk membuat event tersebut adalah sebagai berikut:
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 event dijalankan.
|
|
comment
|
Tidak
|
Komentar untuk event.
|
|
event_body
|
Ya
|
Pernyataan yang dijalankan oleh event. Ini harus berupa pernyataan eksekusi kebijakan DLM.
Catatan
-
Jika Anda menentukan CALL dbms_dlm.execute_all_dlm_policies(), event tersebut akan menjalankan semua kebijakan DLM pada kluster. Oleh karena itu, Anda harus membuat satu event untuk setiap kluster.
-
Jika Anda menentukan CALL dbms_dlm.execute_table_dlm_policies('database_name', 'table_name');, event tersebut hanya akan menjalankan semua kebijakan DLM pada tabel tertentu. Oleh karena itu, Anda harus membuat event yang sesuai untuk setiap tabel yang memiliki kebijakan DLM untuk mengarsipkan datanya pada waktu tertentu.
|
|
interval
|
Ya
|
Interval eksekusi event.
|
|
timestamp
|
Ya
|
Waktu mulai menjalankan event.
|
|
database_name
|
Ya
|
Nama database.
|
|
table_name
|
Ya
|
Nama tabel.
|
Untuk informasi lebih lanjut tentang fitur MySQL EVENT, lihat dokumentasi resmi MySQL untuk event.
Untuk contoh penggunaan, lihat Archive cold data to OSS.
Contoh
Arsipkan data ke tabel eksternal OSS
-
Buat kebijakan DLM
Contoh berikut membuat tabel partisi bernama sales. Tabel ini menggunakan kolom order_time sebagai kunci partisi dan dipartisi berdasarkan interval waktu. Tabel ini memiliki kebijakan INTERVAL dan kebijakan DLM:
-
Kebijakan INTERVAL: Saat data yang dimasukkan berada di luar rentang partisi yang ada, partisi baru dibuat secara otomatis. Interval waktunya adalah satu tahun.
-
Kebijakan DLM: Tabel hanya menyimpan tiga partisi. Saat jumlah partisi melebihi tiga, kebijakan DLM dipicu dan melakukan salah satu tindakan berikut:
-
Jika tabel eksternal OSS sales_history belum ada, buat tabel eksternal OSS baru sales_history, dan dump data dingin ke tabel eksternal sales_history.
-
Jika tabel eksternal sales_history sudah ada, dan tabel sales_history berada di ruang OSS bawaan, data dingin langsung di-dump ke tabel eksternal sales_history.
Catatan
Membuat tabel partisi INTERVAL RANGE memiliki prasyarat. Untuk informasi lebih lanjut tentang penggunaan INTERVAL, lihat INTERVAL RANGE partitioning.
-
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 sumber diarsipkan ke OSS dalam format CSV. Tabel arsip bernama sales_history dan bersifat read-only. Jika tabel OSS tujuan belum ada, sistem secara otomatis membuatnya dan menambahkan OSS_FILE_FILTER 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 detail tentang tabel mysql.dlm_policies, lihat Schema Description. Lihat 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 belum ada data yang diarsipkan.
-
Masukkan 3.000 baris data uji ke tabel partisi sales. Memasukkan data di luar rentang partisi yang ada 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 secara otomatis membuat partisi baru, meningkatkan jumlah partisi tabel sales. Skema tabel sekarang:
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)
Tabel sekarang memiliki lebih dari tiga partisi, yang memenuhi kondisi eksekusi kebijakan DLM. Pengarsipan data sekarang dapat dilanjutkan.
-
Jalankan kebijakan DLM
-
Anda dapat menjalankan kebijakan DLM langsung dengan pernyataan SQL atau menjadwalkan eksekusi berkala menggunakan fitur MySQL EVENT. Misalnya, jika jendela pemeliharaan kluster 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 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 menyimpan tiga partisi.
-
Anda dapat melihat catatan eksekusi kebijakan DLM di tabel mysql.dlm_progress. Untuk informasi tentang skema tabel dlm_progress, lihat System table schemas. Jalankan perintah berikut untuk melihat informasi di 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 diakses, termasuk p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000, telah diarsipkan 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 sekarang merupakan tabel CSV dengan datanya disimpan di OSS. Anda dapat mengkuerinya seperti tabel lokal. Sistem menambahkan kolom yang ditentukan ke OSS_FILE_FILTER. Karena order_time adalah kunci partisi, OSS_FILE_FILTER juga dibuat secara otomatis untuknya.
-
Kueri data di tabel sales dan sales_history masing-masing.
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 data yang awalnya dimasukkan ke tabel sales.
-
Kueri tabel eksternal OSS menggunakan OSS_FILE_FILTER. Anda harus mengaktifkan switch OSS_FILE_FILTER terlebih dahulu.
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
Arsipkan dalam format CSV
-
Buat kebijakan DLM
Contoh berikut membuat tabel partisi bernama sales. Tabel ini menggunakan kolom order_time sebagai kunci partisi dan dipartisi berdasarkan interval waktu. Tabel ini memiliki kebijakan INTERVAL dan kebijakan DLM:
-
Kebijakan INTERVAL: Saat data yang dimasukkan berada di luar rentang partisi yang ada, partisi baru dibuat secara otomatis. Interval waktunya adalah satu tahun.
-
Kebijakan DLM: Tabel hanya menyimpan tiga partisi. Saat jumlah partisi melebihi tiga, kebijakan DLM langsung mengarsipkan 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 yang lebih lama diarsipkan 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 guna 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 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 perintah berikut untuk menjalankan kebijakan DLM:
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 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 menunjukkan bahwa partisi p20200101000000, p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000 dari tabel partisi sales telah diarsipkan ke OSS. Hanya tiga partisi data panas _p20260101000000, _p20270101000000, dan _p20280101000000 yang tersisa di engine InnoDB. Tabel sales sekarang merupakan tabel partisi hibrida. Untuk informasi tentang cara mengkueri data di tabel partisi hibrida, lihat Query a hybrid partitioned table.
Arsipkan dalam format ORC
-
Buat kebijakan DLM
Contoh berikut membuat tabel partisi sales_orc yang menggunakan kolom order_time sebagai kunci partisi dan mempartisi data berdasarkan interval waktu. Tabel ini memiliki kebijakan INTERVAL dan DLM:
-
Kebijakan INTERVAL: Saat data yang dimasukkan melebihi rentang partisi, partisi baru dibuat secara otomatis dengan interval 1 tahun.
-
Kebijakan DLM: Saat tabel memiliki lebih dari 3 partisi, kebijakan DLM mengarsipkan partisi lama dalam format ORC ke OSS. Tabel menjadi tabel partisi hibrida.
Buat tabel sales_orc dengan kebijakan DLM yang menggunakan TIER TO PARTITION ENGINE=ORC untuk mengarsipkan partisi lama ke OSS.
CREATE TABLE `sales_orc` (
`id` int DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`order_time` datetime NOT NULL,
PRIMARY KEY (`order_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
-- Create RANGE COLUMN partitions on order_time with a 1-year INTERVAL (automatic partition creation)
PARTITION BY RANGE COLUMNS(order_time) INTERVAL(YEAR, 1)
-- Pre-create 3 initial partitions that hold data before 2020 / 2021 / 2022
(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 policy: when the partition count exceeds 3, archive old partitions in ORC format to OSS
-- TIER TO PARTITION: partition-level archiving. The table becomes a hybrid partitioned table
-- (hot InnoDB partitions coexist with cold ORC partitions)
DLM ADD POLICY policy_orc TIER TO PARTITION ENGINE=ORC STORAGE=OSS READ ONLY
ON (PARTITIONS OVER 3);
Kebijakan DLM bernama policy_orc. Saat jumlah partisi melebihi 3, partisi lama diarsipkan dalam format ORC ke OSS. Tabel menjadi tabel partisi hibrida yang berisi partisi InnoDB panas dan partisi ORC dingin.
-
Jalankan kebijakan DLM
Masukkan data uji ke tabel partisi sales_orc untuk memicu INTERVAL membuat partisi baru secara otomatis sehingga jumlah partisi melebihi 3 dan kondisi kebijakan DLM terpenuhi.
CALL proc_batch_insert(1, 3000, 'sales_orc');
Jalankan kebijakan DLM:
CALL dbms_dlm.execute_all_dlm_policies();
-
Lihat hasil pengarsipan
Jalankan perintah berikut untuk melihat catatan eksekusi kebijakan DLM di tabel mysql.dlm_progress:
SELECT * FROM mysql.dlm_progress\G
Partisi yang menyimpan data dingin yang jarang diakses telah diarsipkan ke OSS. Jalankan perintah berikut untuk melihat skema tabel sales_orc:
SHOW CREATE TABLE sales_orc\G
Hasilnya sebagai berikut:
*************************** 1. row ***************************
Table: sales_orc
CREATE TABLE `sales_orc` (
`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 800020223 OSS META=1 */ 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 = ORC,
PARTITION p20210101000000 VALUES LESS THAN ('2021-01-01 00:00:00') ENGINE = ORC,
PARTITION p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00') ENGINE = ORC,
PARTITION _p20230101000000 VALUES LESS THAN ('2023-01-01 00:00:00') ENGINE = ORC,
PARTITION _p20240101000000 VALUES LESS THAN ('2024-01-01 00:00:00') ENGINE = ORC,
PARTITION _p20250101000000 VALUES LESS THAN ('2025-01-01 00:00:00') ENGINE = ORC,
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)
Seperti yang ditunjukkan dalam hasil kueri, partisi p20210101000000, p20220101000000, _p20230101000000, _p20240101000000, dan _p20250101000000 dari tabel partisi sales_orc telah diarsipkan ke OSS. Hanya tiga partisi data panas _p20260101000000, _p20270101000000, dan _p20280101000000 yang tersisa di engine InnoDB. Tabel sales_orc sekarang merupakan tabel partisi hibrida. Untuk informasi tentang cara mengkueri data di tabel partisi hibrida, lihat Query a hybrid partitioned table.
Hapus data dingin secara langsung
-
Buat kebijakan DLM
Contoh berikut membuat tabel partisi bernama sales. Tabel ini menggunakan kolom order_time sebagai kunci partisi dan dipartisi berdasarkan interval waktu. Tabel ini memiliki dua kebijakan: INTERVAL dan DLM:
-
Kebijakan INTERVAL: Saat data yang dimasukkan berada di luar rentang partisi yang sudah ada, partisi baru akan dibuat secara otomatis. Interval waktunya adalah satu tahun.
-
Kebijakan DLM: Tabel hanya menyimpan tiga partisi. Jika jumlah partisi melebihi tiga, kebijakan DLM akan dipicu untuk menghapus data dingin secara langsung.
-
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 dijalankan ketika jumlah partisi melebihi tiga. Saat kebijakan ini dijalankan, data dingin akan dihapus secara langsung.
-
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 dalam tabel partisi sales untuk memicu kebijakan INTERVAL agar secara otomatis membuat partisi baru. Gunakan prosedur tersimpan proc_batch_insert untuk memasukkan data baru tersebut.
CALL proc_batch_insert(1, 3000, 'sales');
Query OK, 1 row affected, 1 warning (0.99 sec)
-
Jalankan perintah berikut untuk melihat 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 perintah berikut untuk menjalankan kebijakan DLM secara langsung:
CALL dbms_dlm.execute_all_dlm_policies();
-
Saat kebijakan DLM sedang dijalankan, lihat data dalam 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.
-
Skema tabel sales sekarang 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)
Manage policies with ALTER TABLE
-
Buat kebijakan DLM menggunakan 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 diberi nama test_policy. Kebijakan ini dijalankan ketika jumlah partisi melebihi tiga. Ketika kondisi ini terpenuhi, data dari partisi yang lebih lama pada tabel t diarsipkan ke OSS ke dalam tabel 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;
Atasi kesalahan eksekusi
Konfigurasi yang salah dapat menyebabkan error saat kebijakan DLM dijalankan. Catatan error tersebut disimpan dalam tabel mysql.dlm_progress. Jalankan perintah berikut untuk melihatnya:
SELECT * FROM mysql.dlm_progress WHERE Archive_stage = "ARCHIVE_ERROR";
Periksa bidang Extra_info untuk detail error guna mengidentifikasi penyebabnya. Kemudian, hapus catatan tersebut atau ubah Archive_stage-nya menjadi ARCHIVE_COMPLETE. Terakhir, jalankan kembali kebijakan tersebut secara manual dengan perintah call dbms_dlm.execute_all_dlm_policies;, atau tunggu hingga eksekusi terjadwal berikutnya.
Catatan
Demi keamanan data, jika suatu kebijakan memiliki catatan eksekusi dalam status ARCHIVE_ERROR, kebijakan tersebut tidak akan dijalankan kembali secara otomatis. Anda harus mengidentifikasi penyebab kegagalan dan memodifikasi catatan tersebut sebelum kebijakan dapat dijalankan lagi.