Topik ini menjelaskan fitur pembagian partisi dinamis dari ApsaraDB for SelectDB serta memberikan contoh penggunaannya. Fitur ini membantu Anda mengelola partisi secara dinamis dan mengurangi biaya.
Ikhtisar
Dalam skenario tertentu, tabel dapat dibagi berdasarkan hari. Jika partisi dikelola secara manual, data mungkin gagal diimpor ke tabel pada hari-hari ketika partisi tidak dibuat, sehingga meningkatkan biaya pemeliharaan. Untuk mengatasi masalah ini, Anda dapat menggunakan fitur pembagian partisi dinamis untuk mengonfigurasi aturan pembagian partisi saat membuat tabel. ApsaraDB for SelectDB akan membuat atau menghapus partisi berdasarkan aturan yang telah dikonfigurasi. Anda juga dapat memodifikasi aturan tersebut saat runtime untuk mengelola partisi dengan lebih efisien.
ApsaraDB for SelectDB memungkinkan Anda menggunakan fitur pembagian partisi dinamis untuk secara otomatis membuat atau menghapus partisi rentang.
Buat tabel dengan partisi dinamis
Aturan pembagian partisi dinamis dapat dikonfigurasi saat membuat atau memodifikasi tabel pada runtime. Aturan ini hanya berlaku untuk tabel yang dibagi menggunakan satu kolom kunci partisi tunggal. Contoh kode berikut menunjukkan cara mengonfigurasi aturan pembagian partisi dinamis saat pembuatan tabel:
CREATE TABLE tbl1
(...)
PROPERTIES
(
"dynamic_partition.prop1" = "value1",
"dynamic_partition.prop2" = "value2",
...
)Item konfigurasi global
Berikut adalah item konfigurasi global yang terkait dengan pembagian partisi dinamis untuk instans ApsaraDB for SelectDB.
-
Menentukan apakah fitur pembagian partisi dinamis diaktifkan. Nilai default: true. Parameter ini hanya memengaruhi operasi pembagian partisi pada tabel dengan partisi dinamis dan tidak berdampak pada tabel standar.
Anda dapat menjalankan perintah berikut saat runtime untuk menentukan parameter ini:
ADMIN SET FRONTEND CONFIG ("dynamic_partition_enable" = "true")Untuk menonaktifkan fitur pembagian partisi dinamis secara global, atur parameter ini menjadi false.
-
Interval waktu thread pembagian partisi dinamis dijalankan. Satuan: detik. Nilai default: 600, yang berarti thread pembagian partisi dinamis dijalankan setiap 10 menit.
Anda dapat menjalankan perintah berikut saat runtime untuk memodifikasi parameter ini:
ADMIN SET FRONTEND CONFIG ("dynamic_partition_check_interval_seconds" = "7200")
Item konfigurasi tabel
Nama parameter untuk mengonfigurasi aturan pembagian partisi dinamis memiliki awalan dynamic_partition. Tabel berikut menjelaskan parameter terkait pembagian partisi dinamis.
Parameter | Nilai Default | Deskripsi |
dynamic_partition.enable |
| Menentukan apakah akan mengaktifkan fitur pembagian partisi dinamis. Nilai valid:
|
dynamic_partition.time_unit | Tidak ada nilai default | Satuan waktu untuk penjadwalan partisi dinamis. Nilai valid:
|
dynamic_partition.time_zone |
| Zona waktu partisi yang dibuat secara dinamis. |
dynamic_partition.start |
| Offset awal partisi yang dibuat secara dinamis, yang merupakan angka negatif. Berdasarkan parameter |
dynamic_partition.end | Tidak ada nilai default | Offset akhir partisi yang dibuat secara dinamis, yang merupakan angka positif. Berdasarkan parameter |
dynamic_partition.prefix | Tidak ada nilai default | Awalan nama partisi yang dibuat secara dinamis. |
dynamic_partition.create_history_partition |
| Menentukan apakah akan membuat partisi historis. Parameter ini tidak berpengaruh jika Anda membiarkan parameter |
dynamic_partition.history_partition_num |
| Jumlah partisi historis yang ingin Anda buat. Parameter ini berlaku jika parameter |
dynamic_partition.reserved_history_periods |
| Rentang waktu partisi historis yang akan dipertahankan. Jika parameter |
dynamic_partition.buckets | Tidak ada nilai default | Jumlah bucket dalam partisi yang dibuat secara dinamis. |
dynamic_partition.start_day_of_week |
| Titik awal setiap minggu. Parameter ini berlaku jika parameter |
dynamic_partition.start_day_of_month |
| Titik awal setiap bulan. Parameter ini berlaku jika parameter |
Contoh Pengaturan Parameter dynamic_partition.reserved_history_periods
Sebagai contoh, tabel dibagi per hari.
Tentukan parameter pembagian partisi dinamis berikut:
time_unit="DAY/WEEK/MONTH", end=3, start=-3, reserved_history_periods="[2020-06-01,2020-06-20],[2020-10-31,2020-11-15]".Sistem secara otomatis mempertahankan partisi historis dalam rentang waktu yang ditentukan.
["2020-06-01","2020-06-20"],["2020-10-31","2020-11-15"]Tentukan parameter pembagian partisi dinamis berikut:
time_unit="HOUR", end=3, start=-3, reserved_history_periods="[2020-06-01 00:00:00,2020-06-01 03:00:00]".Sistem secara otomatis mempertahankan partisi historis dalam rentang waktu yang ditentukan.
["2020-06-01 00:00:00","2020-06-01 03:00:00"]Dalam nilai parameter
reserved_history_periods, setiap interval dalam format[...,...]terdiri dari waktu mulai dan waktu akhir. Keduanya harus ditentukan, dengan waktu mulai tidak boleh lebih lambat dari waktu akhir.
Aturan untuk membuat partisi historis
Jika Anda mengatur parameter create_history_partition ke true, ApsaraDB for SelectDB akan menentukan jumlah partisi historis yang dibuat berdasarkan nilai parameter dynamic_partition.start dan dynamic_partition.history_partition_num.
Sebagai contoh, gunakan parameter expect_create_partition_num untuk menentukan jumlah partisi historis yang akan dibuat. Hitung nilai parameter ini berdasarkan aturan berikut:
create_history_partition=trueJika parameter
dynamic_partition.history_partition_numdiatur ke -1, hitung nilai parameterexpect_create_partition_nummenggunakan rumus berikut: expect_create_partition_num = end - start.Jika parameter
dynamic_partition.history_partition_numdiatur ke nilai lain, hitung nilai parameterexpect_create_partition_nummenggunakan rumus berikut: expect_create_partition_num = end - Max(start,-history_partition_num).
create_history_partition=false: Dalam hal ini, tidak ada partisi historis yang dibuat. Hitung nilai parameter expect_create_partition_num menggunakan rumus berikut:expect_create_partition_num = end - 0.
Jika nilai parameter expect_create_partition_num lebih besar daripada nilai parameter max_dynamic_partition_num, pembuatan partisi tambahan akan gagal. Nilai default untuk parameter max_dynamic_partition_num adalah 500.
Contoh partisi historis
-
Sebagai contoh, tanggal saat ini adalah 2021-05-20. Tabel dibagi per hari dengan parameter pembagian partisi dinamis berikut:
create_history_partition=true, end=3, start=-3, history_partition_num=1. Sistem secara otomatis membuat partisi berikut:p20210519 p20210520 p20210521 p20210522 p20210523 -
Sebagai contoh, tanggal saat ini adalah 2021-05-20. Tabel dibagi per hari dengan parameter pembagian partisi dinamis berikut:
create_history_partition=true, end=3, start=-3, history_partition_num=5. Sistem secara otomatis membuat partisi berikut:p20210517 p20210518 p20210519 p20210520 p20210521 p20210522 p20210523 -
Sebagai contoh, tanggal saat ini adalah 2021-05-20. Tabel dibagi per hari dengan parameter pembagian partisi dinamis berikut:
create_history_partition=true, end=3, start=-3, history_partition_num=-1. Sistem secara otomatis membuat partisi berikut:p20210517 p20210518 p20210519 p20210520 p20210521 p20210522 p20210523PentingSaat menggunakan fitur pembagian partisi dinamis, beberapa partisi dalam rentang waktu antara offset awal yang ditentukan oleh parameter
dynamic_partition.startdan offset akhir yang ditentukan oleh parameterdynamic_partition.endmungkin hilang karena masalah tak terduga. Partisi yang hilang dalam rentang waktu antara tanggal saat ini dan offset akhir yang ditentukan oleh parameterdynamic_partition.endakan dibuat ulang, sedangkan partisi yang hilang dalam rentang waktu antara offset awal yang ditentukan oleh parameterdynamic_partition.startdan tanggal saat ini tidak dibuat ulang.
Contoh
Konfigurasikan aturan pembagian partisi dinamis untuk tabel
tbl1dengan kolom kunci partisi k1 bertipe DATE. Data dibagi per hari. Hanya partisi dalam tujuh hari sebelumnya yang dipertahankan, dan partisi untuk tiga hari ke depan dibuat terlebih dahulu.CREATE TABLE tbl1 ( k1 DATE, k2 int ) PARTITION BY RANGE(k1) () DISTRIBUTED BY HASH(k1) PROPERTIES ( "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "DAY", "dynamic_partition.start" = "-7", "dynamic_partition.end" = "3", "dynamic_partition.prefix" = "p", "dynamic_partition.create_history_partition" = "true", "dynamic_partition.buckets" = "32" );Sebagai contoh, jika tanggal saat ini adalah 2020-05-29, berdasarkan aturan di atas, partisi berikut dibuat untuk tabel
tbl1:p20200529: ["2020-05-29", "2020-05-30") p20200530: ["2020-05-30", "2020-05-31") p20200531: ["2020-05-31", "2020-06-01") p20200601: ["2020-06-01", "2020-06-02")Pada hari berikutnya, yaitu 30 Mei 2020, partisi baru
p20200602: ["2020-06-02", "2020-06-03")dibuat.Pada 06 Juni 2020, karena parameter
dynamic_partition.startdiatur ke -7, partisi yang dibuat tujuh hari sebelumnya dihapus. Dalam hal ini, partisip20200529dihapus.Konfigurasikan aturan partisi dinamis untuk tabel
tbl1dengan kolom kunci partisi k1 bertipeDATETIME. Data dipartisi berdasarkan minggu. Hanya partisi dalam dua minggu sebelumnya yang dipertahankan, dan partisi untuk dua minggu ke depan dibuat terlebih dahulu.CREATE TABLE tbl1 ( k1 DATETIME, ... ) PARTITION BY RANGE(k1) () DISTRIBUTED BY HASH(k1) PROPERTIES ( "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "WEEK", "dynamic_partition.start" = "-2", "dynamic_partition.end" = "2", "dynamic_partition.prefix" = "p", "dynamic_partition.create_history_partition" = "true", "dynamic_partition.buckets" = "8" );Sebagai contoh, tanggal saat ini adalah 2020-05-29, yang merupakan minggu ke-22 pada tahun 2020. Secara default, awal setiap minggu adalah hari Senin. Berdasarkan aturan sebelumnya, partisi-partisi berikut dibuat untuk tabel
tbl1:p2020_22: ["2020-05-25 00:00:00", "2020-06-01 00:00:00") p2020_23: ["2020-06-01 00:00:00", "2020-06-08 00:00:00") p2020_24: ["2020-06-08 00:00:00", "2020-06-15 00:00:00")Setiap partisi dimulai pada hari Senin. Karena kolom k1 bertipe
DATETIME, sistem melengkapi jam, menit, dan detik pada nilai kunci partisi dengan 00:00:00.Pada 15 Juni 2020, yang merupakan minggu ke-25 tahun 2020, partisi yang dibuat dua minggu sebelumnya dihapus. Dalam hal ini, partisi
p2020_22dihapus.Dalam contoh di atas, jika parameter
dynamic_partition.start_day_of_weekdisetel ke 3 (hari Rabu sebagai titik awal setiap minggu), partisi berikut dibuat:p2020_22: ["2020-05-27 00:00:00", "2020-06-03 00:00:00") p2020_23: ["2020-06-03 00:00:00", "2020-06-10 00:00:00") p2020_24: ["2020-06-10 00:00:00", "2020-06-17 00:00:00")Partisi yang dibuat berada dalam rentang waktu dari Rabu minggu ini hingga Selasa minggu depan.
CatatanTanggal 2019-12-31 dan 2020-01-01 termasuk dalam minggu yang sama. Jika titik awal partisi adalah 2019-12-31, partisi tersebut diberi nama
p2019_53. Jika titik awal partisi adalah 2020-01-01, partisi tersebut diberi namap2020_01.Konfigurasikan aturan partisi dinamis untuk tabel
tbl1dengan kolom kunci partisi k1 bertipeDATE. Data dipartisi berdasarkan bulan. Tidak ada partisi historis yang dihapus, dan partisi untuk dua bulan ke depan dibuat terlebih dahulu. Selain itu, hari ketiga setiap bulan ditentukan sebagai titik awal setiap bulan.CREATE TABLE tbl1 ( k1 DATE, ... ) PARTITION BY RANGE(k1) () DISTRIBUTED BY HASH(k1) PROPERTIES ( "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "MONTH", "dynamic_partition.end" = "2", "dynamic_partition.prefix" = "p", "dynamic_partition.create_history_partition" = "true", "dynamic_partition.history_partition_num" = "6", "dynamic_partition.buckets" = "8", "dynamic_partition.start_day_of_month" = "3" );Sebagai contoh, tanggal saat ini adalah 2020-05-29. Berdasarkan aturan sebelumnya, partisi berikut dibuat untuk tabel
tbl1:p202005: ["2020-05-03", "2020-06-03") p202006: ["2020-06-03", "2020-07-03") p202007: ["2020-07-03", "2020-08-03")Karena parameter
dynamic_partition.startdibiarkan kosong, partisi historis tidak dihapus.Sebagai contoh, jika tanggal saat ini adalah 2020-05-20 dan titik awal adalah hari kedua puluh delapan setiap bulan, partisi berikut dibuat:
p202004: ["2020-04-28", "2020-05-28") p202005: ["2020-05-28", "2020-06-28") p202006: ["2020-06-28", "2020-07-28")
Modifikasi parameter partisi dinamis
Jalankan pernyataan berikut pada waktu proses untuk memodifikasi parameter partisi dinamis:
ALTER TABLE tbl1 SET( "dynamic_partition.prop1" = "value1", ...);Jika Anda memodifikasi parameter partisi dinamis tertentu, konflik mungkin terjadi. Sebagai contoh, data dipartisi berdasarkan hari, dan partisi berikut dibuat:
p20200519: ["2020-05-19", "2020-05-20")
p20200520: ["2020-05-20", "2020-05-21")
p20200521: ["2020-05-21", "2020-05-22")Jika Anda mempartisi data berdasarkan bulan, sistem akan mencoba membuat partisi dengan rentang ["2020-05-01", "2020-06-01"). Namun, rentang ini bertentangan dengan rentang partisi yang sudah ada, sehingga partisi tidak dapat dibuat. Sebaliknya, partisi dengan rentang ["2020-06-01", "2020-07-01") dapat dibuat. Dalam situasi ini, Anda perlu membuat partisi untuk rentang waktu 2020-05-22 hingga 2020-05-30.
Hapus partisi dalam tabel yang dipartisi secara dinamis
Sebelum menghapus partisi dalam tabel yang dipartisi secara dinamis, nonaktifkan terlebih dahulu fitur partisi dinamis dengan menjalankan pernyataan berikut:
ALTER TABLE tbl1 SET ("dynamic_partition.enable" = "false");Selanjutnya, jalankan pernyataan berikut untuk menghapus partisi tertentu:
ALTER TABLE tbl1 DROP PARTITION p20200519;Secara umum, setelah Anda menghapus partisi dalam tabel yang dipartisi secara dinamis, Anda perlu mengaktifkan kembali fitur partisi dinamis sehingga ApsaraDB for SelectDB dapat terus mengelola partisi secara otomatis selama operasi bisnis berikutnya.
ALTER TABLE tbl1 SET ("dynamic_partition.enable" = "true");Kueri status penjadwalan tabel yang dipartisi secara dinamis
Jalankan pernyataan berikut untuk memeriksa status penjadwalan semua tabel yang dipartisi secara dinamis di database saat ini:
mysql> SHOW DYNAMIC PARTITION TABLES;
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
| TableName | Enable | TimeUnit | Start | End | Prefix | Buckets | StartOf | LastUpdateTime | LastSchedulerTime | State | LastCreatePartitionMsg | LastDropPartitionMsg | ReservedHistoryPeriods |
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
| d3 | true | WEEK | -3 | 3 | p | 1 | MONDAY | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | [2021-12-01,2021-12-31] |
| d5 | true | DAY | -7 | 3 | p | 32 | N/A | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d4 | true | WEEK | -3 | 3 | p | 1 | WEDNESDAY | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d6 | true | MONTH | -2147483648 | 2 | p | 8 | 3rd | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d2 | true | DAY | -3 | 3 | p | 32 | N/A | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
| d7 | true | MONTH | -2147483648 | 5 | p | 8 | 24th | N/A | 2020-05-25 14:29:24 | NORMAL | N/A | N/A | NULL |
+-----------+--------+----------+-------------+------+--------+---------+-----------+----------------+---------------------+--------+------------------------+----------------------+-------------------------+
7 rows in set (0.02 sec)LastUpdateTime: waktu terakhir parameter partisi dinamis dimodifikasi.
LastSchedulerTime: waktu terakhir penjadwalan partisi dinamis dilakukan.
State: status terakhir penjadwalan partisi dinamis.
LastCreatePartitionMsg: pesan kesalahan yang dihasilkan saat pembuatan partisi dinamis terakhir.
LastDropPartitionMsg: pesan kesalahan yang dihasilkan saat penghapusan partisi dinamis terakhir.
Operasi lanjutan
Tabel yang dipartisi secara dinamis dapat diubah menjadi tabel yang dipartisi secara manual. Namun, sebuah tabel hanya bisa dipartisi secara dinamis atau manual.
Mengubah tabel yang dipartisi secara manual menjadi tabel yang dipartisi secara dinamis
Jika Anda belum mengonfigurasi aturan partisi dinamis untuk tabel saat pembuatan, Anda dapat memodifikasi parameter partisi dinamis dengan menjalankan pernyataan ALTER TABLE pada waktu proses untuk menetapkan aturan partisi dinamis pada tabel tersebut.
Setelah fitur partisi dinamis diaktifkan, Anda tidak dapat lagi mengelola partisi secara manual. Sistem akan secara otomatis mengelola partisi berdasarkan parameter partisi dinamis yang telah Anda tentukan.
Jika parameter dynamic_partition.start ditentukan, partisi historis dalam rentang waktu tertentu sebelum offset awal partisi dinamis akan dihapus.
Mengubah tabel yang dipartisi secara dinamis menjadi tabel yang dipartisi secara manual
Anda dapat menjalankan pernyataan ALTER TABLE tbl_name SET ("dynamic_partition.enable" = "false") untuk menonaktifkan fitur partisi dinamis dan mengubah tabel yang dipartisi secara dinamis menjadi tabel yang dipartisi secara manual.
Setelah fitur partisi dinamis dinonaktifkan, partisi tidak lagi dikelola secara otomatis. Anda harus menjalankan pernyataan ALTER TABLE untuk membuat atau menghapus partisi.
FAQ
Q: Apa yang harus saya lakukan jika kesalahan "Could not create table with dynamic partition when fe config dynamic_partition_enable is false" dilaporkan ketika saya membuat tabel yang dipartisi secara dinamis?
A: Anda tidak dapat membuat tabel yang dipartisi secara dinamis karena parameter global
dynamic_partition_enabledari fitur partisi dinamis disetel ke false. Jalankan perintahADMIN SET FRONTEND CONFIG ("dynamic_partition_enable" = "true")untuk menyetel parameter global ini ke true.Q: Bagaimana cara menentukan jumlah bucket untuk partisi yang dibuat secara dinamis?
A: Partisi yang dibuat secara dinamis dibuat secara otomatis oleh proses penjadwalan internal sistem. Ketika partisi dibuat secara otomatis untuk tabel, sistem menggunakan pengaturan parameter partisi dinamis yang namanya diawali dengan
dynamic_partitionalih-alih pengaturan parameter default tabel. Parameter partisi dinamis yang diterapkan juga menentukan jumlah bucket dalam partisi. Contoh kode berikut memberikan ilustrasi:CREATE TABLE tbl1 ( `k1` int, `k2` date ) PARTITION BY RANGE(k2)() DISTRIBUTED BY HASH(k1) BUCKETS 3 PROPERTIES ( "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "DAY", "dynamic_partition.start" = "-3", "dynamic_partition.end" = "3", "dynamic_partition.prefix" = "p", "dynamic_partition.create_history_partition" = "true", "dynamic_partition.buckets" = "32" );Dalam contoh sebelumnya, tidak ada partisi awal yang dibuat karena klausa PARTITION BY tidak berisi definisi partisi. Parameter berikut ditentukan:
DISTRIBUTED BY HASH(k1) BUCKETS 3dan"dynamic_partition.buckets" = "32".Pengaturan parameter pertama adalah pengaturan default tabel, dan pengaturan parameter kedua bersifat eksklusif untuk partisi dinamis. Ketika sistem secara otomatis membuat partisi, jumlah bucket diatur ke 32 bukan 3. Saat Anda membuat partisi secara manual dengan menjalankan pernyataan
ALTER TABLE tbl1 ADD PARTITION, jumlah bucket diatur ke 3. Partisi yang dibuat secara dinamis menggunakan satu set pengaturan parameter terpisah. Pengaturan parameter default tabel digunakan hanya jika tidak ada pengaturan parameter eksklusif yang dikonfigurasikan untuk partisi dinamis.CREATE TABLE tbl3 ( `k1` int, `k2` date ) PARTITION BY RANGE(k2)( PARTITION p1 VALUES LESS THAN ("2019-10-10") ) DISTRIBUTED BY HASH(k1) BUCKETS 3 PROPERTIES ( "dynamic_partition.enable" = "true", "dynamic_partition.time_unit" = "DAY", "dynamic_partition.start" = "-3", "dynamic_partition.end" = "3", "dynamic_partition.prefix" = "p", "dynamic_partition.create_history_partition" = "true", "dynamic_partition.buckets" = "32" );Dalam contoh ini, partisi p1 dibuat secara manual. Partisi ini menggunakan pengaturan parameter default tabel dan jumlah bucket diatur ke 3. Namun, partisi yang dibuat secara dinamis oleh sistem masih menggunakan pengaturan parameter eksklusif untuk partisi dinamis dan jumlah bucket diatur ke 32.