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.
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).
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 |
|
|
|
Ativa ou desativa o particionamento dinâmico globalmente. Defina como |
|
|
|
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 |
|
|
Sim |
— |
Unidade de agendamento: |
|
|
Sim |
— |
Deslocamento positivo. O sistema pré-cria partições até esta quantidade de unidades à frente do horário atual. |
|
|
Sim |
— |
Prefixo do nome das partições criadas dinamicamente (por exemplo, |
|
|
Não |
|
Ativa ou desativa o particionamento dinâmico para esta tabela. Defina como |
|
|
Não |
|
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. |
|
|
Não |
|
Fuso horário para o agendamento de partições. |
|
|
Não |
|
Quando |
|
|
Não |
|
Número máximo de partições históricas a criar quando |
|
|
Não |
|
Intervalos de tempo específicos a manter independentemente de |
|
|
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. |
|
|
Não |
|
Dia inicial de cada semana quando |
|
|
Não |
|
Dia inicial de cada mês quando |
Sufixos de nome de partição
|
** |
Formato do sufixo |
Exemplo |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
|
|
|
|
|
|
|
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.
|
** |
Partições criadas |
|
|
p20210519, p20210520–p20210523 (5 no total) |
|
|
p20210517–p20210523 (7 no total) |
|
|
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")
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"
);
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.
-
Desative o particionamento dinâmico para a tabela:
ALTER TABLE tbl1 SET ("dynamic_partition.enable" = "false"); -
Remova a partição:
ALTER TABLE tbl1 DROP PARTITION p20200519; -
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 |
|
|
Momento da última modificação dos parâmetros de particionamento dinâmico |
|
|
Momento da última execução do agendador para esta tabela |
|
|
Resultado da última execução do agendamento ( |
|
|
Mensagem de erro da última tentativa de criação de partição, se houver |
|
|
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.
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");