Le partitionnement dynamique automatise la création et la suppression des partitions par plage selon des règles définies lors de la création de la table ou à l'exécution. Cette fonctionnalité élimine la gestion manuelle des partitions et évite les échecs d'importation lorsque les partitions requises n'existent pas.
Le partitionnement dynamique prend uniquement en charge les partitions par plage sur les tables comportant une seule colonne de clé de partition.
Fonctionnement
Le partitionnement dynamique maintient une fenêtre glissante de partitions autour de la date actuelle. Deux décalages définissent cette fenêtre :
**
dynamic_partition.start** (entier négatif) : le système supprime automatiquement les partitions antérieures à ce décalage.**
dynamic_partition.end** (entier positif) : le système pré-crée les partitions jusqu'à ce décalage après la date actuelle.
Par exemple, avec time_unit=DAY, start=-1 et end=2, le planificateur conserve toujours exactement quatre partitions : hier, aujourd'hui, demain et après-demain. Au fil du temps, il ajoute des partitions en début de fenêtre et supprime celles en fin de fenêtre.
Un planificateur d'arrière-plan applique ces règles toutes les dynamic_partition_check_interval_seconds secondes (valeur par défaut : 600).
Le système recrée automatiquement les partitions manquantes entre la date actuelle et dynamic_partition.end. En revanche, il ne recrée pas les partitions perdues entre dynamic_partition.start et la date actuelle.
Créer une table à partitionnement dynamique
Ajoutez les propriétés dynamic_partition.* dans la clause PROPERTIES lors de la création de la table :
CREATE TABLE tbl1
(...)
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.buckets" = "32"
);
Référence de configuration
Paramètres globaux
Ces paramètres s'appliquent au niveau de l'instance et affectent toutes les tables à partitionnement dynamique.
| Paramètre | Valeur par défaut | Description |
|---|---|---|
dynamic_partition_enable |
true |
Active ou désactive globalement le partitionnement dynamique. Définissez cette valeur sur false pour le désactiver sur toutes les tables. Les tables standard ne sont pas concernées. |
dynamic_partition_check_interval_seconds |
600 |
Fréquence d'exécution du thread de planification, en secondes. |
Modifiez ces valeurs à l'exécution avec les commandes suivantes :
ADMIN SET FRONTEND CONFIG ("dynamic_partition_enable" = "true");
ADMIN SET FRONTEND CONFIG ("dynamic_partition_check_interval_seconds" = "7200");
Paramètres de table
Tous les paramètres au niveau de la table sont préfixés par dynamic_partition..
| Paramètre | Obligatoire | Valeur par défaut | Description |
|---|---|---|---|
dynamic_partition.time_unit |
Oui | — | Unité de planification : HOUR, DAY, WEEK ou MONTH. Si vous choisissez HOUR, la colonne de clé de partition ne peut pas être de type DATE. |
dynamic_partition.end |
Oui | — | Décalage positif. Le système pré-crée les partitions jusqu'à ce nombre d'unités après l'heure actuelle. |
dynamic_partition.prefix |
Oui | — | Préfixe de nom pour les partitions créées dynamiquement (par exemple, p). |
dynamic_partition.enable |
Non | true |
Active ou désactive le partitionnement dynamique pour cette table. Définissez cette valeur sur false pour désactiver la fonctionnalité sans supprimer les partitions existantes. |
dynamic_partition.start |
Non | -2147483648 |
Décalage négatif. Le système supprime les partitions plus anciennes que ce nombre d'unités. La valeur par défaut désactive de fait la suppression des partitions historiques. |
dynamic_partition.time_zone |
Non | Asia/Shanghai |
Fuseau horaire utilisé pour la planification des partitions. |
dynamic_partition.create_history_partition |
Non | false |
Lorsque cette option vaut true, le système crée immédiatement les partitions historiques remontant à dynamic_partition.start. Sans effet si dynamic_partition.start n'est pas défini. |
dynamic_partition.history_partition_num |
Non | -1 |
Nombre maximal de partitions historiques à créer lorsque create_history_partition=true. La valeur -1 signifie aucune limite (la borne start est alors utilisée). |
dynamic_partition.reserved_history_periods |
Non | NULL |
Plages horaires spécifiques à conserver indépendamment de start. Format pour DAY/WEEK/MONTH : [yyyy-MM-dd,yyyy-MM-dd],[...]. Format pour HOUR : [yyyy-MM-dd HH:mm:ss,yyyy-MM-dd HH:mm:ss],[...]. |
dynamic_partition.buckets |
Non | — | Nombre de buckets dans chaque partition créée dynamiquement. Si non spécifié, la valeur par défaut de la table s'applique. |
dynamic_partition.start_day_of_week |
Non | 1 |
Jour de début de chaque semaine lorsque time_unit=WEEK. 1 = lundi, 7 = dimanche. |
dynamic_partition.start_day_of_month |
Non | 1 |
Jour de début de chaque mois lorsque time_unit=MONTH. Valeurs valides : 1–28. Les valeurs 29 à 31 ne sont pas prises en charge afin d'éviter toute ambiguïté entre les mois. |
Suffixes de nom de partition
**time_unit** |
Format du suffixe | Exemple |
|---|---|---|
HOUR |
yyyyMMddHH |
2020032501 |
DAY |
yyyyMMdd |
20200325 |
WEEK |
yyyy_ww |
2020_13 (13e semaine de 2020) |
MONTH |
yyyyMM |
202003 |
Partitions historiques
Lorsque create_history_partition=true, SelectDB détermine le nombre de partitions historiques à créer en fonction de start et history_partition_num. Le nombre de partitions créées (expect_create_partition_num) se calcule comme suit :
| Condition | Formule |
|---|---|
create_history_partition=false |
end − 0 |
create_history_partition=true, history_partition_num=-1 |
end − start |
create_history_partition=true, history_partition_num=N |
end − max(start, −N) |
Si expect_create_partition_num dépasse max_dynamic_partition_num (valeur par défaut : 500), le système ne crée pas les partitions excédentaires.
Exemple : La date actuelle est le 2021-05-20, time_unit=DAY, start=-3, end=3.
**history_partition_num** |
Partitions créées |
|---|---|
1 |
p20210519, p20210520–p20210523 (5 au total) |
5 |
p20210517–p20210523 (7 au total) |
-1 |
p20210517–p20210523 (7 au total) |
Avec history_partition_num=1, la formule donne end − max(start, −1) = 3 − max(−3, −1) = 3 − (−1) = 4 partitions futures + actuelle. Ainsi, le système crée seulement 1 partition historique (p20210519) au lieu de 3.
Exemples
Partitionnement par jour
Conservez les 7 derniers jours et pré-créez les 3 prochains jours :
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"
);
Si la date actuelle est le 2020-05-29, les partitions suivantes sont actives :
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")
Le 2020-05-30, le système crée la partition p20200602. Le 2020-06-06, il supprime p20200529 (7 jours après le début).
Partitionnement par semaine
Conservez les 2 dernières semaines et pré-créez les 2 prochaines, chaque semaine commençant le lundi (par défaut) :
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"
);
Si la date actuelle est le 2020-05-29 (semaine 22 de 2020), ces partitions sont actives :
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")
Chaque partition commence le lundi. Comme k1 est de type DATETIME, les horodatages sont complétés à 00:00:00.
Le 2020-06-15 (semaine 25), le système supprime p2020_22.
Pour faire débuter chaque semaine le mercredi, définissez "dynamic_partition.start_day_of_week" = "3". Les partitions se décalent en conséquence :
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")
Lorsqu'une semaine chevauche deux années, le nom de la partition utilise l'année du jour de début de la semaine. Par exemple, si une semaine commence le 2019-12-31, la partition est nommée p2019_53 ; si elle commence le 2020-01-01, elle est nommée p2020_01.
Partitionnement par mois
Pré-créez les 2 prochains mois sans supprimer les partitions historiques, chaque mois commençant le 3 :
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"
);
Si la date actuelle est le 2020-05-29 (et que start n'est pas défini, donc aucune suppression) :
p202005: ["2020-05-03", "2020-06-03")
p202006: ["2020-06-03", "2020-07-03")
p202007: ["2020-07-03", "2020-08-03")
Avec start_day_of_month=28 et la date actuelle au 2020-05-20 :
p202004: ["2020-04-28", "2020-05-28")
p202005: ["2020-05-28", "2020-06-28")
p202006: ["2020-06-28", "2020-07-28")
Modifier les paramètres de partitionnement dynamique
Mettez à jour les paramètres à l'exécution avec ALTER TABLE :
ALTER TABLE tbl1 SET (
"dynamic_partition.time_unit" = "MONTH",
"dynamic_partition.end" = "2"
);
La modification de time_unit peut entraîner des conflits de plages de partitions. Par exemple, si vous passez de DAY à MONTH alors que des partitions quotidiennes couvrant du 19 au 21 mai existent, le planificateur ne peut pas créer la partition mensuelle ["2020-05-01", "2020-06-01") car elle chevauche les partitions existantes. Le système peut créer la partition mensuelle ["2020-06-01", "2020-07-01"), mais vous devez créer manuellement les partitions pour l'intervalle du 2020-05-22 au 2020-05-30.
Supprimer des partitions d'une table à partitionnement dynamique
Pour supprimer manuellement une partition, désactivez d'abord le partitionnement dynamique. Sinon, le planificateur risque de recréer des partitions dans la fenêtre future lors de sa prochaine exécution.
-
Désactivez le partitionnement dynamique pour la table :
ALTER TABLE tbl1 SET ("dynamic_partition.enable" = "false"); -
Supprimez la partition :
ALTER TABLE tbl1 DROP PARTITION p20200519; -
Réactivez le partitionnement dynamique :
ALTER TABLE tbl1 SET ("dynamic_partition.enable" = "true");
Surveiller l'état de la planification
Exécutez SHOW DYNAMIC PARTITION TABLES pour consulter l'état de planification de toutes les tables à partitionnement dynamique dans la base de données actuelle :
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)
Colonnes clés de la sortie :
| Colonne | Description |
|---|---|
LastUpdateTime |
Date de la dernière modification des paramètres de partitionnement dynamique |
LastSchedulerTime |
Date de la dernière exécution du planificateur pour cette table |
State |
Résultat de la dernière exécution de planification (NORMAL ou erreur) |
LastCreatePartitionMsg |
Message d'erreur de la dernière tentative de création de partition, le cas échéant |
LastDropPartitionMsg |
Message d'erreur de la dernière tentative de suppression de partition, le cas échéant |
Basculer entre partitionnement dynamique et manuel
Une table ne peut être que dans un seul mode à la fois : dynamique ou manuel.
Convertir une table manuelle en partitionnement dynamique
Si vous n'avez pas configuré le partitionnement dynamique lors de la création de la table, ajoutez les propriétés à l'exécution :
ALTER TABLE tbl1 SET (
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "DAY",
"dynamic_partition.start" = "-7",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "32"
);
Une fois activé, le planificateur prend en charge la gestion des partitions. Les opérations manuelles ALTER TABLE ... ADD/DROP PARTITION sur la fenêtre dynamique ne sont plus nécessaires.
Si vous définissez dynamic_partition.start, le système supprime les partitions antérieures au décalage de début lors de la prochaine exécution de planification.
Convertir une table dynamique en partitionnement manuel
Désactivez le partitionnement dynamique pour reprendre un contrôle manuel complet :
ALTER TABLE tbl1 SET ("dynamic_partition.enable" = "false");
Après la désactivation, créez et supprimez les partitions manuellement avec ALTER TABLE.
Nombre de buckets pour les partitions créées dynamiquement
Les partitions créées dynamiquement utilisent dynamic_partition.buckets, et non la valeur par défaut de la table DISTRIBUTED BY HASH(...) BUCKETS N. Les partitions ajoutées manuellement avec ALTER TABLE tbl1 ADD PARTITION utilisent la valeur par défaut de la table.
Par exemple :
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"
);
Partitions créées automatiquement : 32 buckets (
dynamic_partition.buckets)Partitions ajoutées manuellement : 3 buckets (valeur par défaut de la table)
Si vous ne définissez pas dynamic_partition.buckets, les partitions créées automatiquement utilisent également la valeur par défaut de la table.
FAQ
J'obtiens l'erreur « Could not create table with dynamic partition when fe config dynamic_partition_enable is false. ». Quel est le problème ?
L'indicateur global dynamic_partition_enable est défini sur false. Exécutez la commande suivante pour l'activer :
ADMIN SET FRONTEND CONFIG ("dynamic_partition_enable" = "true");