Tous les produits
Search
Centre de documentation

ApsaraDB for SelectDB:Partitionnement dynamique

Dernière mise à jour :Aug 11, 2026

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.

Remarque

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).

Important

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 : 128. 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)
Remarque

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")
Remarque

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"
);
Important

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.

  1. Désactivez le partitionnement dynamique pour la table :

     ALTER TABLE tbl1 SET ("dynamic_partition.enable" = "false");
  2. Supprimez la partition :

     ALTER TABLE tbl1 DROP PARTITION p20200519;
  3. 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.

Important

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");