Utilice ALTER TABLE para convertir una tabla entre tres estrategias de particionamiento: común (sin particionar), particionada por rango y particionada por rango con intervalos.
Requisitos previos
Antes de empezar, asegúrese de que cuenta con:
Un clúster de PolarDB for MySQL 8.0 con la versión de revisión 8.0.2.2.0 o posterior
Para comprobar su versión de revisión, consulte Query the engine version.
Cómo funciona
Una tabla particionada por rango con intervalos usa un punto de transición para separar las particiones de rango definidas explícitamente de las particiones de intervalo administradas automáticamente. Todos los datos hasta el punto de transición se almacenan en particiones de rango con nombre. Los datos posteriores a ese punto desencadenan la creación automática de particiones con el intervalo especificado; no es obligatorio usar ADD PARTITION manualmente.
Cuando se elimina la definición de intervalo de una tabla, todas las particiones de intervalo existentes se convierten en particiones de rango estándar.
Reglas de conversión
|
Conversión |
Compatible |
Método |
|
Tabla común → tabla particionada por rango con intervalos |
Sí |
|
|
Tabla particionada por rango con intervalos → tabla común |
No |
— |
|
Tabla particionada por rango → tabla particionada por rango con intervalos |
Sí |
|
|
Tabla particionada por rango con intervalos → tabla particionada por rango |
Sí |
|
Después de convertir una tabla en una tabla particionada por rango con intervalos, la base de datos crea nuevas particiones automáticamente cuando se insertan datos más allá del punto de transición. No se pueden agregar particiones de forma explícita a una tabla particionada por rango con intervalos.
Sintaxis
Sintaxis 1 — redefinir el esquema de particionamiento completo:
ALTER TABLE table_name partition_options;
Donde partition_options es:
PARTITION BY
{ RANGE{(expr) | COLUMNS(column_list)} }
{ INTERVAL(type, expr) | INTERVAL(expr) }
[(partition_definition [, partition_definition] ...)]
Donde partition_definition es:
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]
Sintaxis 2 — alternar el intervalo en una tabla particionada por rango existente (requiere 8.0.2.2.1 o posterior):
ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) };
Deshabilite el particionamiento por intervalo y vuelva a una tabla particionada por rango: llame a SET INTERVAL() sin argumentos.
Parámetros
|
Parámetro |
Descripción |
|
|
Nombre de la tabla |
|
|
Expresión de partición. Debe dar como resultado un valor INT; los tipos de cadena no son compatibles |
|
|
Lista de columnas para |
|
|
Tipo de tiempo del intervalo. Valores compatibles: |
|
|
Valor del intervalo. Cuando |
|
|
Valor máximo de la partición |
|
|
Nombre del motor de almacenamiento |
Convierta una tabla común en una tabla particionada por rango con intervalos
Defina una partición de rango inicial y establezca el punto de transición. Los datos insertados más allá de ese límite provocan la creación automática de particiones mensuales (o de cualquier otro intervalo).
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')
);
Convierta una tabla particionada por rango en una tabla particionada por rango con intervalos
Existen dos métodos disponibles. Ambos agregan un intervalo a una tabla particionada por rango existente.
Método 1: redefina el esquema de particionamiento (requiere 8.0.2.2.0 o posterior)
Utilice este método para cambiar tanto la clave de partición como el intervalo en una sola instrucción.
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: establezca el intervalo en una tabla particionada por rango existente (requiere 8.0.2.2.1 o posterior)
Utilice este método cuando la tabla ya está particionada por la clave correcta y solo necesita habilitar el particionamiento por intervalo.
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);
Convierta una tabla particionada por rango con intervalos en una tabla particionada por rango
Al eliminar la definición de intervalo, todas las particiones de intervalo existentes se convierten en particiones de rango con nombre.
Método 1: redefina el esquema de particionamiento (requiere 8.0.2.2.0 o 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: borre el intervalo (requiere 8.0.2.2.1 o posterior)
Deshabilite el particionamiento por intervalo: llame a SET INTERVAL() sin argumentos. Las particiones de intervalo existentes se convierten en particiones de rango.
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. */