Use ALTER TABLE para converter uma tabela entre três estratégias de particionamento: comum (não particionada), particionada por intervalo e particionada por intervalo com incremento automático.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster PolarDB for MySQL 8.0 com versão de revisão 8.0.2.2.0 ou posterior
Para verificar a versão de revisão, consulte Consultar a versão do mecanismo.
Como funciona
Uma tabela particionada por intervalo com incremento automático usa um ponto de transição para separar as partições de intervalo definidas explicitamente das partições gerenciadas automaticamente. Todos os dados até o ponto de transição pertencem às partições de intervalo nomeadas. Dados além desse ponto acionam a criação automática de partições no intervalo especificado, sem necessidade de executar ADD PARTITION manualmente.
Ao remover a definição de intervalo de uma tabela, todas as partições de intervalo existentes tornam-se partições de intervalo padrão.
Regras de conversão
|
Conversão |
Suporte |
Método |
|
Tabela comum → tabela particionada por intervalo com incremento automático |
Sim |
|
|
Tabela particionada por intervalo com incremento automático → tabela comum |
Não |
— |
|
Tabela particionada por intervalo → tabela particionada por intervalo com incremento automático |
Sim |
|
|
Tabela particionada por intervalo com incremento automático → tabela particionada por intervalo |
Sim |
|
Após converter para uma tabela particionada por intervalo com incremento automático, o banco de dados cria novas partições automaticamente quando dados são inseridos além do ponto de transição. Não é possível adicionar partições explicitamente a esse tipo de tabela.
Sintaxe
Sintaxe 1 — redefinir todo o esquema de particionamento:
ALTER TABLE table_name partition_options;
Em que partition_options é:
PARTITION BY
{ RANGE{(expr) | COLUMNS(column_list)} }
{ INTERVAL(type, expr) | INTERVAL(expr) }
[(partition_definition [, partition_definition] ...)]
Em que partition_definition é:
PARTITION partition_name
[VALUES LESS THAN {expr | MAXVALUE}]
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string' ]
[DATA DIRECTORY [=] 'data_dir']
[INDEX DIRECTORY [=] 'index_dir']
[MAX_ROWS [=] max_number_of_rows]
[MIN_ROWS [=] min_number_of_rows]
[TABLESPACE [=] tablespace_name]
Sintaxe 2 — alternar o intervalo em uma tabela particionada por intervalo existente (requer 8.0.2.2.1 ou posterior):
ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) };
Para desativar o particionamento por intervalo e reverter para uma tabela particionada por intervalo, execute SET INTERVAL() sem argumentos.
Parâmetros
|
Parâmetro |
Descrição |
|
|
Nome da tabela |
|
|
Expressão de particionamento. Deve resultar em um valor INT; tipos de string não são suportados |
|
|
Lista de colunas para |
|
|
Tipo de tempo do intervalo. Valores suportados: |
|
|
Valor do intervalo. Quando |
|
|
Valor máximo da partição |
|
|
Nome do mecanismo de armazenamento |
Converter uma tabela comum em uma tabela particionada por intervalo com incremento automático
Defina uma partição de intervalo inicial para estabelecer o ponto de transição. A inserção de dados além desse limite cria automaticamente novas partições mensais (ou de qualquer outro intervalo configurado).
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
);
-- Convert to an interval range partitioned table.
-- Partition p0 holds data before 2021-10-01 (the transition point).
-- Data from 2021-10-01 onward creates monthly partitions automatically.
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);
Converter uma tabela particionada por intervalo em uma tabela particionada por intervalo com incremento automático
Dois métodos estão disponíveis. Ambos adicionam um intervalo a uma tabela já particionada por intervalo.
Método 1: Redefinir o esquema de particionamento (requer 8.0.2.2.0 ou posterior)
Use este método para alterar tanto a chave de particionamento quanto o intervalo em uma única instrução.
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) (
PARTITION p0 VALUES LESS THAN(10000000)
);
-- Redefine the partition scheme: switch the key to orderdate and add a monthly interval.
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);
Método 2: Definir o intervalo em uma tabela particionada por intervalo existente (requer 8.0.2.2.1 ou posterior)
Use este método quando a tabela já estiver particionada pela chave correta e você precisar apenas ativar o particionamento por intervalo com incremento automático.
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE COLUMNS(orderdate) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);
-- Activate interval partitioning with a monthly interval.
ALTER TABLE orders SET INTERVAL(MONTH, 1);
Converter uma tabela particionada por intervalo com incremento automático em uma tabela particionada por intervalo
Remover a definição de intervalo converte todas as partições de intervalo existentes em partições de intervalo nomeadas.
Método 1: Redefinir o esquema de particionamento (requer 8.0.2.2.0 ou posterior)
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) INTERVAL(100000) (
PARTITION p0 VALUES LESS THAN(10000000)
);
-- Redefine without the INTERVAL clause to convert to a range partitioned table.
ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) (
PARTITION p0 VALUES LESS THAN('2021-10-01')
);
Método 2: Limpar o intervalo (requer 8.0.2.2.1 ou posterior)
Execute SET INTERVAL() sem argumentos para desativar o particionamento por intervalo com incremento automático. As partições de intervalo existentes tornam-se partições de intervalo comuns.
CREATE TABLE orders(
orderkey BIGINT NOT NULL,
custkey BIGINT NOT NULL,
orderdate DATE NOT NULL
)
PARTITION BY RANGE(orderkey) INTERVAL(100000) (
PARTITION p0 VALUES LESS THAN(10000000)
);
-- Disable interval partitioning. Existing interval partitions are retained as range partitions.
ALTER TABLE orders SET INTERVAL(); /* Switch an interval range partitioned table to a range partitioned table without specifying the interval type and value. */