Topik ini menjelaskan cara mengotomatiskan pengelolaan partisi menggunakan tugas terjadwal untuk pembuatan, penghapusan, dan penukaran partisi secara berkala.
Informasi latar belakang
Di beberapa industri, sejumlah besar data dihasilkan secara berkala. Data yang tidak diperlukan juga harus dihapus secara berkala untuk menghemat ruang penyimpanan. Jika hanya satu tabel yang digunakan untuk menyimpan data, penambahan dan penghapusan sejumlah besar data secara berkala dalam tabel tersebut dapat memengaruhi kelangsungan bisnis. Karena sebagian besar tabel tidak dipartisi, Anda harus secara manual membuat tabel untuk data baru dan menghapus tabel yang menyimpan data yang tidak diperlukan secara berkala.
Praktik ini memiliki kekurangan berikut:
Pembaruan berkala sejumlah besar data dapat memengaruhi kelangsungan bisnis.
Pengelolaan tabel secara manual meningkatkan biaya O&M.
Anda dapat membuat tugas terjadwal untuk mengotomatiskan pengelolaan partisi, menghindari dampak potensial pada kelangsungan bisnis, serta mengurangi operasi manual.
Prasyarat
Kluster adalah kluster PolarDB for MySQL.
Versi kluster adalah 8.0.2, dengan versi revisi 8.0.2.2.0 atau lebih baru.
Untuk informasi tentang cara melihat versi kluster Anda, lihat bagian "Query the engine version" dari topik Versi Mesin.
Sintaksis dan parameter
Syntax
CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
DO event_body;Parameters
Parameter | Diperlukan? | Catatan |
DEFINER | Tidak | Memberikan izin kepada pengguna tertentu untuk menggunakan tugas terjadwal. |
IF NOT EXISTS | Tidak | Memeriksa apakah acara yang akan dibuat sudah ada. |
event_name | Ya | Nama acara. Nilai |
schedule | Ya | Jadwal waktu untuk acara. Anda dapat menentukan waktu dengan cara berikut:
Unit INTERVAL yang didukung adalah sebagai berikut: |
ON COMPLETION [NOT] PRESERVE | Tidak | Menentukan cara menangani acara setelah dieksekusi sekali. Nilai yang valid:
|
ENABLE, DISABLE, dan DISABLE ON SLAVE | Tidak | Menentukan properti acara. Nilai yang valid:
|
COMMENT 'comment' | Tidak | Komentar untuk acara. |
DO event_body | Ya | Kode yang akan dieksekusi ketika acara diaktifkan. Catatan
|
Contoh
Asumsikan tabel orders dipartisi berdasarkan rentang waktu. Data didistribusikan ke partisi berdasarkan rentang waktu tempatnya berada. Tabel dibuat menggunakan pernyataan berikut:
CREATE TABLE orders(
id int,
ordertime datetime
)
PARTITION BY RANGE COLUMNS(ordertime) INTERVAL(DAY, 1)
(
PARTITION p20220520 VALUES LESS THAN('2022-05-20'),
PARTITION p20220521 VALUES LESS THAN('2022-05-21')
);Berikut ini menggunakan tabel orders untuk menggambarkan cara menambah, menghapus, dan menukar partisi menggunakan tugas terjadwal.
Tambah partisi
Anda dapat membuat tugas terjadwal yang menambah partisi pada interval reguler ke tabel orders:
DELIMITER ||
CREATE EVENT IF NOT EXISTS add_partition ON SCHEDULE
EVERY 1 DAY STARTS '2022-05-20 22:00:00'
ON COMPLETION PRESERVE
DO
BEGIN
set @pname = concat("alter table orders add partition (partition p",date_format(date_add(curdate(), interval 2 day), '%Y%m%d'), " values less than('", date_add(curdate(), interval 2 day), "'))");
prepare stmt_add_partition from @pname;
execute stmt_add_partition;
deallocate prepare stmt_add_partition;
END ||
DELIMITER ;Asumsikan rentang waktu maksimum untuk partisi adalah dari 2022-05-20 00:00:00 hingga 2022-05-20 23:59:59. Mulai dari 2022-05-20 22:00:00, tugas terjadwal membuat partisi setiap hari untuk menyimpan data hari berikutnya.
Jika tabel orders dipartisi berdasarkan interval waktu, Anda juga dapat membuat tugas terjadwal untuk menambah partisi menggunakan INSERT INTO:
CREATE EVENT IF NOT EXISTS add_partition ON SCHEDULE
EVERY 1 DAY STARTS '2022-05-20 00:00:00'
ON COMPLETION PRESERVE
DO INSERT INTO orders VALUES(id, DATE_ADD(NOW(), INTERVAL 1 DAY));Asumsikan rentang waktu maksimum untuk partisi adalah dari 2022-05-20 00:00:00 hingga 2022-05-20 23:59:59. Mulai dari 2022-05-20 00:00:00, tugas terjadwal membuat partisi setiap hari untuk menyimpan data hari berikutnya.
Hapus partisi
Anda dapat membuat tugas terjadwal yang menghapus partisi yang tidak diperlukan secara berkala:
DELIMITER ||
CREATE EVENT IF NOT EXISTS drop_partition ON SCHEDULE
EVERY 1 DAY STARTS '2022-05-21 02:00:00'
ON COMPLETION PRESERVE
DO
BEGIN
set @pname = concat('alter table orders drop partition p', date_format(curdate(), '%Y%m%d'));
prepare stmt_drop_partition from @pname;
execute stmt_drop_partition;
deallocate prepare stmt_drop_partition;
END ||
DELIMITER ;Asumsikan pemeliharaan dimulai pada 02:00:00 setiap hari. Mulai dari 2022-05-21 02:00:00, tugas terjadwal menghapus partisi hari sebelumnya setiap hari pada 02:00:00.
Tukar partisi
Jika Anda ingin menyimpan data dalam partisi yang tidak diperlukan di tabel orders, Anda dapat membuat tugas terjadwal dengan exchange_partition untuk secara berkala menukar partisi ini dengan tabel yang sepenuhnya independen dari orders dan kemudian memutuskan apa yang akan dilakukan dengan data:
-- Buat tabel non-partisi dengan struktur yang sama seperti tabel terpartisi untuk menerima data yang dipindahkan dari partisi.
DELIMITER ||
CREATE EVENT IF NOT EXISTS exchange_partition ON SCHEDULE
EVERY 1 DAY STARTS '2022-05-21 02:00:00'
ON COMPLETION PRESERVE
DO
BEGIN
set @pname = concat('create table orders_', date_format(curdate(), '%Y%m%d'), '(id int, ordertime datetime)');
prepare stmt_create_table from @pname;
execute stmt_create_table;
deallocate prepare stmt_create_table;
set @pname = concat('alter table orders exchange partition p', date_format(curdate(), '%Y%m%d'), ' with table orders_', date_format(curdate(), '%Y%m%d'));
prepare stmt_exchange_partition from @pname;
execute stmt_exchange_partition;
deallocate prepare stmt_exchange_partition;
END ||
DELIMITER ;Mulai dari 2022-05-21 02:00:00, tugas terjadwal setiap hari menukar partisi hari sebelumnya dengan tabel kosong, secara efektif memindahkan data dari partisi ke tabel baru.