Todos os produtos
Search
Central de documentação

ApsaraDB for SelectDB:Particionamento dinâmico

Última atualização: Jun 29, 2026

O particionamento dinâmico automatiza a criação e a exclusão de partições de intervalo com base em regras definidas na criação da tabela ou em tempo de execução. Esse recurso elimina o gerenciamento manual de partições e evita falhas de importação quando não há partições para a data correspondente.

Nota

O particionamento dinâmico oferece suporte apenas a partições de intervalo em tabelas com uma única coluna de chave de partição.

Funcionamento

O particionamento dinâmico mantém uma janela móvel de partições em torno da data atual. Dois deslocamentos definem essa janela:

  • **dynamic_partition.start** (inteiro negativo): o sistema exclui automaticamente as partições anteriores a esse deslocamento.

  • **dynamic_partition.end** (inteiro positivo): o sistema pré-cria partições até esse deslocamento futuro em relação à data atual.

Por exemplo, com time_unit=DAY, start=-1 e end=2, o agendador mantém sempre exatamente quatro partições: ontem, hoje, amanhã e depois de amanhã. À medida que o tempo avança, o agendador adiciona partições na extremidade superior e as remove na extremidade inferior.

Um agendador em segundo plano aplica essas regras a cada dynamic_partition_check_interval_seconds segundos (padrão: 600).

Importante

O sistema recria automaticamente partições perdidas entre a data atual e dynamic_partition.end. No entanto, ele não recria partições perdidas entre dynamic_partition.start e a data atual.

Crie uma tabela com particionamento dinâmico

Adicione as propriedades dynamic_partition.* à cláusula PROPERTIES ao criar uma tabela:

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

Referência de configuração

Parâmetros globais

Esses parâmetros se aplicam no nível da instância e afetam todas as tabelas com particionamento dinâmico.

Parâmetro

Padrão

Descrição

dynamic_partition_enable

true

Ativa ou desativa o particionamento dinâmico globalmente. Defina como false para desativar em todas as tabelas. Não afeta tabelas padrão.

dynamic_partition_check_interval_seconds

600

Frequência de execução do thread de agendamento, em segundos.

Altere esses valores em tempo de execução com:

ADMIN SET FRONTEND CONFIG ("dynamic_partition_enable" = "true");
ADMIN SET FRONTEND CONFIG ("dynamic_partition_check_interval_seconds" = "7200");

Parâmetros de tabela

Todos os parâmetros no nível da tabela usam o prefixo dynamic_partition..

Parâmetro

Obrigatório

Padrão

Descrição

dynamic_partition.time_unit

Sim

Unidade de agendamento: HOUR, DAY, WEEK ou MONTH. Se definido como HOUR, a coluna de chave de partição não pode ser do tipo DATE.

dynamic_partition.end

Sim

Deslocamento positivo. O sistema pré-cria partições até esta quantidade de unidades à frente do horário atual.

dynamic_partition.prefix

Sim

Prefixo do nome das partições criadas dinamicamente (por exemplo, p).

dynamic_partition.enable

Não

true

Ativa ou desativa o particionamento dinâmico para esta tabela. Defina como false para desativar sem remover as partições existentes.

dynamic_partition.start

Não

-2147483648

Deslocamento negativo. O sistema exclui partições anteriores a esta quantidade de unidades. O valor padrão desativa efetivamente a exclusão de partições históricas.

dynamic_partition.time_zone

Não

Asia/Shanghai

Fuso horário para o agendamento de partições.

dynamic_partition.create_history_partition

Não

false

Quando true, o sistema cria imediatamente as partições históricas até dynamic_partition.start. Não tem efeito se dynamic_partition.start não estiver definido.

dynamic_partition.history_partition_num

Não

-1

Número máximo de partições históricas a criar quando create_history_partition=true. -1 significa sem limite (usa start como limite).

dynamic_partition.reserved_history_periods

Não

NULL

Intervalos de tempo específicos a manter independentemente de start. Formato para DAY/WEEK/MONTH: [yyyy-MM-dd,yyyy-MM-dd],[...]. Formato para HOUR: [yyyy-MM-dd HH:mm:ss,yyyy-MM-dd HH:mm:ss],[...].

dynamic_partition.buckets

Não

Número de buckets em cada partição criada dinamicamente. Se não definido, assume o padrão do nível da tabela.

dynamic_partition.start_day_of_week

Não

1

Dia inicial de cada semana quando time_unit=WEEK. 1 = segunda-feira, 7 = domingo.

dynamic_partition.start_day_of_month

Não

1

Dia inicial de cada mês quando time_unit=MONTH. Valores válidos: 128. Os valores de 29 a 31 não têm suporte para evitar ambiguidades entre meses.

Sufixos de nome de partição

**time_unit**

Formato do sufixo

Exemplo

HOUR

yyyyMMddHH

2020032501

DAY

yyyyMMdd

20200325

WEEK

yyyy_ww

2020_13 (13ª semana de 2020)

MONTH

yyyyMM

202003

Partições históricas

Quando create_history_partition=true, o SelectDB determina quantas partições históricas criar com base em start e history_partition_num. O cálculo do número de partições criadas (expect_create_partition_num) segue a lógica abaixo:

Condição

Fórmula

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)

Nota

Se expect_create_partition_num exceder max_dynamic_partition_num (padrão: 500), o sistema não criará as partições excedentes.

Exemplo: Data atual é 2021-05-20, time_unit=DAY, start=-3, end=3.

**history_partition_num**

Partições criadas

1

p20210519, p20210520–p20210523 (5 no total)

5

p20210517–p20210523 (7 no total)

-1

p20210517–p20210523 (7 no total)

Com history_partition_num=1, a fórmula resulta em end − max(start, −1) = 3 − max(−3, −1) = 3 − (−1) = 4 futuras + atual. Portanto, o sistema cria apenas 1 partição histórica (p20210519) em vez de 3.

Exemplos

Particionamento por dia

Mantenha os últimos 7 dias e pré-crie os próximos 3 dias:

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

Considerando a data atual como 2020-05-29, as seguintes partições estão ativas:

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

Em 2020-05-30, o sistema cria p20200602. Em 2020-06-06, ele exclui p20200529 (7 dias após o início).

Particionamento por semana

Mantenha as últimas 2 semanas e pré-crie as próximas 2 semanas, iniciando cada semana na segunda-feira (padrão):

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

Considerando a data atual como 2020-05-29 (semana 22 de 2020), estas partições estão ativas:

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

Cada partição começa na segunda-feira. Como k1 é DATETIME, os timestamps são preenchidos até 00:00:00.

Em 2020-06-15 (semana 25), o sistema exclui p2020_22.

Para iniciar cada semana na quarta-feira, defina "dynamic_partition.start_day_of_week" = "3". As partições mudam conforme abaixo:

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

Quando uma semana abrange dois anos, o nome da partição usa o ano do dia inicial da semana. Por exemplo, se uma semana começar em 2019-12-31, a partição receberá o nome p2019_53; se começar em 2020-01-01, receberá o nome p2020_01.

Particionamento por mês

Pré-crie os próximos 2 meses sem excluir partições históricas, iniciando cada mês no dia 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"
);

Considerando a data atual como 2020-05-29 (e start não definido, logo sem exclusão):

p202005: ["2020-05-03", "2020-06-03")
p202006: ["2020-06-03", "2020-07-03")
p202007: ["2020-07-03", "2020-08-03")

Com start_day_of_month=28 e data atual 2020-05-20:

p202004: ["2020-04-28", "2020-05-28")
p202005: ["2020-05-28", "2020-06-28")
p202006: ["2020-06-28", "2020-07-28")

Modifique parâmetros de particionamento dinâmico

Atualize os parâmetros em tempo de execução com ALTER TABLE:

ALTER TABLE tbl1 SET (
    "dynamic_partition.time_unit" = "MONTH",
    "dynamic_partition.end"       = "2"
);
Importante

Alterar time_unit pode causar conflitos de intervalo de partição. Por exemplo, ao mudar de DAY para MONTH enquanto existem partições diárias cobrindo de 19 a 21 de maio, o agendador não consegue criar a partição mensal ["2020-05-01", "2020-06-01") porque ela se sobrepõe às partições existentes. O agendador consegue criar a partição mensal ["2020-06-01", "2020-07-01"), mas você deve criar manualmente as partições para a lacuna de 2020-05-22 a 2020-05-30.

Exclua partições de uma tabela com particionamento dinâmico

Para excluir uma partição manualmente, primeiro desative o particionamento dinâmico. Caso contrário, o agendador poderá recriar partições na janela futura em sua próxima execução.

  1. Desative o particionamento dinâmico para a tabela:

     ALTER TABLE tbl1 SET ("dynamic_partition.enable" = "false");
  2. Remova a partição:

     ALTER TABLE tbl1 DROP PARTITION p20200519;
  3. Reative o particionamento dinâmico:

     ALTER TABLE tbl1 SET ("dynamic_partition.enable" = "true");

Monitorar status do agendamento

Execute SHOW DYNAMIC PARTITION TABLES para visualizar o status de agendamento de todas as tabelas com particionamento dinâmico no banco de dados atual:

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)

Principais colunas de saída:

Coluna

Descrição

LastUpdateTime

Momento da última modificação dos parâmetros de particionamento dinâmico

LastSchedulerTime

Momento da última execução do agendador para esta tabela

State

Resultado da última execução do agendamento (NORMAL ou erro)

LastCreatePartitionMsg

Mensagem de erro da última tentativa de criação de partição, se houver

LastDropPartitionMsg

Mensagem de erro da última tentativa de exclusão de partição, se houver

Converter entre particionamento dinâmico e manual

Uma tabela só pode estar em um modo por vez: dinâmico ou manual.

Converter uma tabela manual para particionamento dinâmico

Se você não definiu o particionamento dinâmico na criação da tabela, adicione as propriedades em tempo de execução:

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

Após a ativação, o agendador assume o gerenciamento das partições. Operações manuais de ALTER TABLE ... ADD/DROP PARTITION na janela dinâmica deixam de ser necessárias.

Importante

Se você definir dynamic_partition.start, o sistema excluirá as partições anteriores ao deslocamento inicial na próxima execução do agendamento.

Converter uma tabela dinâmica para particionamento manual

Desative o particionamento dinâmico para retomar o controle manual completo:

ALTER TABLE tbl1 SET ("dynamic_partition.enable" = "false");

Após a desativação, crie e remova partições manualmente com ALTER TABLE.

Contagem de buckets para partições criadas dinamicamente

As partições criadas dinamicamente usam dynamic_partition.buckets, e não o padrão do nível da tabela DISTRIBUTED BY HASH(...) BUCKETS N. As partições adicionadas manualmente com ALTER TABLE tbl1 ADD PARTITION usam o padrão do nível da tabela.

Por exemplo:

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"
);
  • Partições criadas automaticamente: 32 buckets (dynamic_partition.buckets)

  • Partições adicionadas manualmente: 3 buckets (padrão da tabela)

Se você não definir dynamic_partition.buckets, as partições criadas automaticamente também usarão o padrão da tabela.

Perguntas frequentes

Recebo a mensagem "Could not create table with dynamic partition when fe config dynamic_partition_enable is false." Qual é o problema?

O sinalizador global dynamic_partition_enable está definido como false. Execute o comando a seguir para ativá-lo:

ADMIN SET FRONTEND CONFIG ("dynamic_partition_enable" = "true");