Gunakan ALTER TABLE untuk mengonversi tabel antara tiga strategi partisi: umum (tidak dipartisi), partisi range, dan tabel partisi interval range.
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
Kluster PolarDB for MySQL 8.0 dengan versi revisi 8.0.2.2.0 atau lebih baru
Untuk memeriksa versi revisi Anda, lihat Kueri versi engine.
Cara kerja
Tabel partisi interval range menggunakan titik transisi untuk memisahkan partisi range yang didefinisikan secara eksplisit dari partisi interval yang dikelola secara otomatis. Semua data hingga titik transisi dimasukkan ke dalam partisi range bernama. Data di luar titik tersebut memicu pembuatan partisi otomatis sesuai interval yang ditentukan—tanpa perlu menjalankan ADD PARTITION secara manual.
Saat Anda menghapus definisi interval dari sebuah tabel, semua partisi interval yang ada berubah menjadi partisi range standar.
Aturan pengalihan
| Konversi | Didukung | Metode |
|---|---|---|
| Tabel umum → tabel partisi interval range | Ya | ALTER TABLE ... PARTITION BY |
| Tabel partisi interval range → tabel umum | Tidak | — |
| Tabel partisi range → tabel partisi interval range | Ya | ALTER TABLE ... PARTITION BY (8.0.2.2.0+) atau SET INTERVAL (8.0.2.2.1+) |
| Tabel partisi interval range → tabel partisi range | Ya | ALTER TABLE ... PARTITION BY (8.0.2.2.0+) atau SET INTERVAL() (8.0.2.2.1+) |
Setelah dikonversi menjadi tabel partisi interval range, database akan membuat partisi baru secara otomatis ketika data dimasukkan melewati titik transisi. Anda tidak dapat menambahkan partisi secara eksplisit ke tabel partisi interval range.
Sintaksis
Sintaksis 1 — mendefinisikan ulang skema partisi lengkap:
ALTER TABLE table_name partition_options;Di mana partition_options adalah:
PARTITION BY
{ RANGE{(expr) | COLUMNS(column_list)} }
{ INTERVAL(type, expr) | INTERVAL(expr) }
[(partition_definition [, partition_definition] ...)]Di mana definisi_partisi adalah:
PARTITION partition_name
[VALUES LESS THAN {expr | MAXVALUE}]
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]Sintaksis 2 — mengaktifkan/menonaktifkan interval pada tabel partisi range yang sudah ada (memerlukan versi 8.0.2.2.1 atau lebih baru):
ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) };Untuk menonaktifkan partisi interval dan kembali ke tabel partisi range, panggil SET INTERVAL() tanpa argumen.
Parameter
| Parameter | Deskripsi |
|---|---|
table_name | Nama tabel |
RANGE(expr) | Ekspresi partisi. Harus menghasilkan nilai INT; tipe string tidak didukung |
column_list | Daftar kolom untuk RANGE COLUMNS(); ekspresi tidak didukung |
INTERVAL(type) | Jenis interval waktu. Nilai yang didukung: YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND. Jika dihilangkan, tipe numerik digunakan |
INTERVAL(expr) | Nilai interval. Ketika type adalah SECOND, nilainya harus 60 atau lebih besar |
MAXVALUE | Nilai maksimum partisi |
engine_name | Nama storage engine |
Mengonversi tabel umum menjadi tabel partisi interval range
Definisikan partisi range awal untuk menetapkan titik transisi. Data yang dimasukkan melewati batas tersebut akan secara otomatis membuat partisi bulanan (atau interval lainnya).
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
);
-- Konversi menjadi tabel partisi interval range.
-- Partisi p0 menyimpan data sebelum 2021-10-01 (titik transisi).
-- Data mulai 2021-10-01 dan seterusnya membuat partisi bulanan secara otomatis.
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);Mengonversi tabel partisi range menjadi tabel partisi interval range
Tersedia dua metode. Keduanya menambahkan interval ke tabel partisi range yang sudah ada.
Metode 1: Mendefinisikan ulang skema partisi (memerlukan versi 8.0.2.2.0 atau lebih baru)
Gunakan metode ini untuk mengubah kunci partisi dan interval dalam satu pernyataan.
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) (
PARTITION p0 VALUES LESS THAN(10000000)
);
-- Mendefinisikan ulang skema partisi: ganti kunci ke orderdate dan tambahkan interval bulanan.
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);Metode 2: Atur interval pada tabel partisi range yang sudah ada (memerlukan versi 8.0.2.2.1 atau lebih baru)
Gunakan metode ini jika tabel sudah dipartisi berdasarkan kunci yang benar dan Anda hanya perlu mengaktifkan partisi interval.
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE COLUMNS(orderdate) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);
-- Aktifkan partisi interval dengan interval bulanan.
ALTER TABLE orders SET INTERVAL(MONTH, 1);Mengonversi tabel partisi interval range menjadi tabel partisi range
Menghapus definisi interval akan mengonversi semua partisi interval yang ada menjadi partisi range bernama.
Metode 1: Mendefinisikan ulang skema partisi (memerlukan versi 8.0.2.2.0 atau lebih baru)
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) INTERVAL(100000) (
PARTITION p0 VALUES LESS THAN(10000000)
);
-- Mendefinisikan ulang tanpa klausa INTERVAL untuk mengonversi ke tabel partisi range.
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);Metode 2: Hapus interval (memerlukan versi 8.0.2.2.1 atau lebih baru)
Panggil SET INTERVAL() tanpa argumen untuk menonaktifkan partisi interval. Partisi interval yang ada tetap dipertahankan sebagai partisi range.
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) INTERVAL(100000) (
PARTITION p0 VALUES LESS THAN(10000000)
);
-- Nonaktifkan partisi interval. Partisi interval yang ada dipertahankan sebagai partisi range.
ALTER TABLE orders SET INTERVAL(); /* Ubah tabel partisi interval range menjadi tabel partisi range tanpa menentukan jenis dan nilai interval. */