Este tema describe las operaciones DDL comunes de la base de datos nativa de la nube PolarDB for MySQL. Le ayuda a consultar y comprender el comportamiento de DDL, evaluar el riesgo de estas operaciones y reducir su impacto en las cargas de trabajo.
Descripción general de las operaciones DDL
En el ecosistema de MySQL, DDL abarca un conjunto complejo de operaciones que incluye índices, claves primarias, columnas, tablas, claves externas y columnas generadas. Las operaciones DDL consumen mucho tiempo y recursos de hardware, y muchas de ellas bloquean las tablas. Si se ejecutan de forma inadecuada, pueden interrumpir las cargas de trabajo normales y provocar un impacto catastrófico.
PolarDB for MySQL ha mejorado significativamente el rendimiento de DDL y la estabilidad de los bloqueos gracias a años de experiencia acumulada y a la iteración continua de sus funciones. Este tema describe el comportamiento de las operaciones DDL comunes en cada versión de PolarDB for MySQL desde los siguientes aspectos:
Si la tabla se bloquea (DML concurrente permitido): una operación DDL sin bloqueo (Online DDL) solicita un bloqueo mutex de tabla únicamente mientras modifica los metadatos. Por lo general, este bloqueo no dura más de 1 segundo. Se permiten lecturas y escrituras en la tabla de destino durante el cambio de esquema, lo que mejora la velocidad de respuesta y la disponibilidad en entornos de producción. En cambio, las instrucciones que no admiten Online DDL bloquean la tabla durante todo el proceso y no permiten escrituras simultáneas. Una operación DDL prolongada de este tipo puede afectar gravemente sus cargas de trabajo.
-
Si la tabla se reconstruye (duración): este tipo de operación DDL recrea la clave primaria y todos los índices secundarios con base en el nuevo esquema de la tabla, lo cual suele tomar bastante tiempo.
NotaDado que PolarDB for MySQL admite DDL paralelo, ejecutar una operación DDL con el kernel es mucho más rápido que hacerlo con herramientas de terceros como gh-ost o pt-osc.
Si solo se modifican los metadatos (se completa en segundos): únicamente se modifican los metadatos y los datos de la tabla permanecen intactos. El tiempo de ejecución de este tipo de operación DDL no aumenta con el tamaño de la tabla y, por lo general, se completa en cuestión de segundos.
Si se admite DDL paralelo (aceleración multihilo): para escenarios como la creación de índices o la reconstrucción de tablas grandes, PolarDB utiliza DDL paralelo multihilo para mejorar la eficiencia de ejecución hasta 15 o 20 veces. Para obtener más información, consulte Parallel DDL.
-
Si el rendimiento se ve afectado (cambio sin bloqueo): Use lock-free change tickets to perform lock-free schema changes no provoca desconexiones transitorias ni afecta las cargas de trabajo durante los periodos de menor actividad.
NotaEjecute esta operación durante los periodos de menor actividad, ya que puede aumentar el uso de IOPS y CPU.
Algoritmos de ejecución de DDL
PolarDB for MySQL admite los tres algoritmos de ejecución de DDL a continuación:
Algoritmo INSTANT: una operación DDL que utiliza el algoritmo INSTANT modifica únicamente los metadatos del diccionario de datos. No modifica ni copia los datos existentes, y tampoco reconstruye la tabla. Por lo tanto, la operación es independiente del tamaño de la tabla y todo el proceso DDL se completa en segundos.
Algoritmo INPLACE: con el algoritmo INPLACE, la copia y reconstrucción de datos ocurren dentro del motor, por lo que la ejecución es más rápida. La mayoría de las operaciones DDL que usan este algoritmo permiten lecturas y escrituras simultáneas, y tienen poco impacto en las cargas de trabajo. Además, algunas operaciones DDL con el algoritmo INPLACE, como RENAME TABLE y ADD COMMENT, solo modifican metadatos sin alterar los datos de la tabla y se completan en segundos.
Algoritmo COPY: una operación DDL que utiliza el algoritmo COPY copia todos los datos de la tabla hacia una nueva. Durante la copia, se mantiene un bloqueo SNW (SHARED_NO_WRITE) sobre la tabla original. Solo se admiten operaciones de lectura y no se permiten escrituras simultáneas durante la ejecución de DDL, lo cual tiene un impacto significativo en las cargas de trabajo.
Las operaciones DDL que permiten lecturas y escrituras simultáneas se denominan colectivamente Online DDL y tienen un impacto relativamente bajo en las cargas de trabajo. En la mayoría de los casos, no necesita especificar manualmente el algoritmo para una operación DDL. PolarDB selecciona automáticamente el mejor algoritmo en el siguiente orden: INSTANT, INPLACE y COPY. También puede usar las cláusulas ALGORITHM y LOCK de la instrucción ALTER TABLE para fine-tune el comportamiento de DDL:
Cláusula ALGORITHM: para ejecutar una instrucción DDL con un algoritmo específico, especifique el campo ALGORITHM. Valores válidos: DEFAULT, INSTANT, INPLACE y COPY. Si la operación DDL no admite el algoritmo indicado, se devuelve un error de inmediato.
-
Cláusula LOCK: esta cláusula ajusta el acceso concurrente a la tabla durante la ejecución de DDL. Úsela para controlar el nivel de lecturas y escrituras simultáneas mientras se modifica la tabla. Opciones válidas y su significado:
DEFAULT: el kernel permite el nivel máximo de lecturas y escrituras simultáneas según el tipo de DDL.
NONE: se permiten lecturas y escrituras simultáneas durante la ejecución de DDL. Se devuelve un error si no son compatibles.
SHARED: se permiten lecturas simultáneas, pero se bloquean las escrituras. Se devuelve un error si no se admiten las lecturas simultáneas.
EXCLUSIVE: se prohíben todas las lecturas y escrituras simultáneas durante la ejecución de DDL.
Para evitar que la tabla quede inaccesible durante la ejecución de ALTER TABLE, especifique la cláusula LOCK en dicha instrucción. Si el comportamiento de bloqueo de la ejecución DDL no cumple con la condición indicada, la operación se detiene de inmediato.
Vista previa de las características de ejecución de DDL con EXPLAIN DDL
Este tema enumera las características de ejecución de las operaciones DDL comunes. Sin embargo, dado que PolarDB ofrece un amplio conjunto de funciones, el comportamiento real de ejecución de DDL puede verse afectado por varios factores, como la estructura de la tabla de destino, la configuración de parámetros de la instancia y si ciertas funciones están habilitadas.
Para que los cambios de esquema sean más seguros y predecibles, se recomienda encarecidamente utilizar la función EXPLAIN DDL para conocer las características de ejecución de una operación DDL antes de ejecutar operaciones complejas.
Utilice la siguiente sintaxis para consultar las características de ejecución de una operación DDL:
{ EXPLAIN | DESCRIBE | DESC } ALTER TABLE ...
Con EXPLAIN DDL, puede obtener la siguiente información clave:
Si la operación DDL actual se puede ejecutar correctamente.
El tipo de algoritmo que utiliza la operación DDL actual. Valores válidos:
INSTANT,INPLACEyCOPY.Si la operación DDL actual necesita reconstruir los datos de toda la tabla. Una reconstrucción completa suele tomar mucho tiempo.
Si se permiten operaciones DML simultáneas durante la ejecución de DDL actual.
Si la operación DDL actual está bloqueada por transacciones no confirmadas.
Si la operación DDL actual admite la aceleración mediante DDL paralelo. De ser así, se muestra el grado de paralelismo de la operación.
Con esta información anticipada, puede evaluar el impacto de una operación DDL con mayor precisión, elegir el momento adecuado para ejecutarla y evitar que los bloqueos de tabla y los tiempos de ejecución prolongados afecten sus cargas de trabajo en producción. Para obtener más información, consulte EXPLAIN DDL.
Características de comportamiento de DDL
Operaciones de índice
PolarDB for MySQL 8.0.2
Operación | DML concurrente permitido | Reconstruye la tabla | Solo metadatos | DDL paralelo compatible |
Crear un índice secundario | Sí | No | No | Compatible |
Eliminar un índice secundario | Sí | No | Sí | N/A |
Cambiar el nombre de un índice secundario | Sí | No | Sí | N/A |
Agregar un índice de texto completo (FULLTEXT) | No | No Nota Cuando agrega el primer índice de texto completo a una tabla, se desencadena una reconstrucción adicional de la tabla si no existe una columna FTS_DOC_ID definida por el usuario. | No | No compatible |
Agregar un índice espacial (SPATIAL) | No | No | No | No compatible |
PolarDB for MySQL 8.0.1
Operación | DML concurrente permitido | Reconstruye la tabla | Solo metadatos | DDL paralelo compatible |
Crear un índice secundario | Sí | No | No | Compatible |
Eliminar un índice secundario | Sí | No | Sí | N/A |
Cambiar el nombre de un índice secundario | Sí | No | Sí | N/A |
Agregar un índice de texto completo (FULLTEXT) | No | No Nota Cuando agrega el primer índice de texto completo a una tabla, se desencadena una reconstrucción adicional de la tabla si no existe una columna FTS_DOC_ID definida por el usuario. | No | No compatible |
Agregar un índice espacial (SPATIAL) | No | No | No | No compatible |
PolarDB for MySQL 5.7
Operación | DML concurrente permitido | Reconstruye la tabla | Solo metadatos | DDL paralelo compatible |
Crear un índice secundario | Sí | No | No | Compatible |
Eliminar un índice secundario | Sí | No | Sí | N/A |
Cambiar el nombre de un índice secundario | Sí | No | Sí | N/A |
Agregar un índice de texto completo (FULLTEXT) | No | No Nota Cuando agrega el primer índice de texto completo a una tabla, se desencadena una reconstrucción adicional de la tabla si no existe una columna FTS_DOC_ID definida por el usuario. | No | No compatible |
Agregar un índice espacial (SPATIAL) | No | No | No | No compatible |
PolarDB for MySQL 5.6
Operación | DML concurrente permitido | Reconstruye la tabla | Solo metadatos | DDL paralelo compatible |
Crear un índice secundario | Sí | No | No | No compatible |
Eliminar un índice secundario | Sí | No | Sí | N/A |
Agregar un índice de texto completo (FULLTEXT) | No | No Nota Cuando agrega el primer índice de texto completo a una tabla, se desencadena una reconstrucción adicional de la tabla si no existe una columna FTS_DOC_ID definida por el usuario. | No | No compatible |
Agregar un índice espacial (SPATIAL) | No | No | No | No compatible |
Operaciones de clave primaria
PolarDB for MySQL 8.0.2
|
Operación |
DML concurrente permitido |
Reconstruye la tabla |
Solo metadatos |
DDL paralelo compatible |
|
Agregar una clave primaria |
Sí |
Sí |
No |
Compatible |
|
Eliminar una clave primaria |
No |
Sí |
No |
No compatible |
|
Eliminar la clave primaria existente y agregar una nueva |
Sí |
Sí |
No |
Compatible |
PolarDB for MySQL 8.0.1
|
Operación |
DML concurrente permitido |
Reconstruye la tabla |
Solo metadatos |
DDL paralelo compatible |
|
Agregar una clave primaria |
Sí |
Sí |
No |
Compatible |
|
Eliminar una clave primaria |
No |
Sí |
No |
No compatible |
|
Eliminar la clave primaria existente y agregar una nueva |
Sí |
Sí |
No |
Compatible |
PolarDB for MySQL 5.7
|
Operación |
DML concurrente permitido |
Reconstruye la tabla |
Solo metadatos |
DDL paralelo compatible |
|
Agregar una clave primaria |
Sí |
Sí |
No |
Compatible |
|
Eliminar una clave primaria |
No |
Sí |
No |
No compatible |
|
Eliminar la clave primaria existente y agregar una nueva |
Sí |
Sí |
No |
Compatible |
PolarDB for MySQL 5.6
|
Operación |
DML concurrente permitido |
Reconstruye la tabla |
Solo metadatos |
DDL paralelo compatible |
|
Agregar una clave primaria |
Sí |
Sí |
No |
No compatible |
|
Eliminar una clave primaria |
No |
Sí |
No |
No compatible |
|
Eliminar la clave primaria existente y agregar una nueva |
Sí |
Sí |
No |
No compatible |
En los siguientes escenarios, el DML concurrente solo se permite cuando el parámetro del clúster sql_mode contiene STRICT_TRANS_TABLES o STRICT_ALL_TABLES:
Agregar una clave primaria
Eliminar la clave primaria existente y agregar una nueva
Operaciones de columnas
PolarDB for MySQL 8.0.2
|
Operación |
Permite DML concurrente |
Reconstruye la tabla |
Solo metadatos |
Compatible con DDL paralelo |
|
Agregar una columna |
Sí |
No1 |
Sí1 |
Compatible1 |
|
Eliminar una columna |
Sí |
Sí |
No |
Compatible |
|
Cambiar el nombre de una columna |
Sí |
No |
Sí |
N/A |
|
Reordenar columnas |
Sí |
Sí |
No |
Compatible |
|
Establecer el valor predeterminado de una columna |
Sí |
No |
Sí |
N/A |
|
Modificar el comentario de una columna |
Sí |
No |
Sí |
N/A |
|
Cambiar el tipo de una columna |
No |
Sí |
No |
No compatible |
|
Aumentar la longitud de una columna VARCHAR |
Sí2 |
No |
Sí |
N/A |
|
Cambiar el juego de caracteres de UTF8mb3 a UTF8mb4 |
No |
No3 |
Sí3 |
No compatible |
|
Quitar el valor predeterminado de una columna |
Sí |
No |
Sí |
N/A |
|
Modificar el valor de incremento automático |
Sí |
No |
Sí |
N/A |
|
Cambiar una columna a NULL |
Sí |
Sí |
No |
Compatible |
|
Cambiar una columna a NOT NULL |
No |
Sí |
No |
No compatible |
|
Modificar la definición de una columna ENUM o SET |
Sí |
No |
Sí4 |
N/A |
La función Instant column addition at the end of a table solo permite agregar una columna al final de la tabla. Si la tabla no tiene una clave primaria explícita, establezca el parámetro
implicit_primary_keyen OFF. De este modo se evita que la operación instantánea de agregar columna falle por la presencia de una columna de clave primaria implícita al final de la tabla. Esta operación no es compatible con tablas comprimidas (ROW_FORMAT=COMPRESSED), tablas con índices de texto completo ni tablas temporales. Cuando el clúster no admite la adición instantánea de columnas, agregar una columna ejecuta la instrucción DDL con el algoritmo INPLACE, lo cual requiere reconstruir toda la tabla. Durante esta reconstrucción se permiten lecturas y escrituras simultáneas. También puede utilizar DDL paralelo para acelerar la operación.-
Al aumentar la longitud de una columna VARCHAR, la cantidad de bytes usados para almacenar dicha longitud debe mantenerse igual para que funcione la extensión rápida. En concreto, una columna VARCHAR de 0 a 255 bytes necesita un solo byte para guardar su longitud, mientras que una de 256 bytes o más requiere dos. Solo si el aumento permanece dentro del mismo rango de bytes, como entre 0 y 255 o de 256 hacia un valor mayor, ALTER TABLE modificará únicamente los metadatos. Cuando se amplía una columna VARCHAR de menos de 256 bytes a 256 o más, PolarDB usa Copy DDL de forma predeterminada y bloquea la tabla durante todo el proceso. Las operaciones DML de escritura no son compatibles; solo se permiten las de lectura.
Si no está seguro de que la modificación de VARCHAR cumpla estas condiciones, use
ALGORITHM=INPLACEpara ejecutar la operación DDL actual con el algoritmo INPLACE. Si la extensión rápida de columnas no es compatible, se devuelve un error de inmediato. Ejemplo:ALTER TABLE table_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.VARCHAR es un tipo de almacenamiento de longitud variable y el disco guarda únicamente la longitud real. Al usar campos VARCHAR, considere establecer la longitud máxima en 256 bytes o más desde el inicio. Así evitará que ampliar el campo después requiera el algoritmo COPY.
-
Cuando se cumplen las siguientes condiciones, cambiar el juego de caracteres de una columna de UTF8mb3 a UTF8mb4 modifica solo los metadatos y no los datos. De lo contrario, se requiere el algoritmo COPY para reconstruir la tabla, la cual permanece bloqueada durante todo el proceso. La tabla de destino solo admite lecturas y no escrituras.
El tipo de la columna es CHAR, VARCHAR, ENUM o TEXT.
No existe ningún índice en la columna que se va a modificar.
La longitud máxima de almacenamiento de la columna es menor a 256 bytes tanto antes como después de la conversión del juego de caracteres, o bien mayor a 255 bytes en ambos casos.
Especifique ALGORITHM=INPLACE para forzar la ejecución de la operación DDL sin reconstruir la tabla. Si la operación requiere el algoritmo COPY, se devuelve un error de inmediato. Ejemplo:
ALTER TABLE test modify column b char(1) CHARACTER SET utf8mb4 default null,algorithm = inplace; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY. La operación modifica únicamente los metadatos sin reconstruir toda la tabla cuando el tamaño de almacenamiento del tipo de dato no cambia y los elementos se agregan al final de ENUM o SET. En caso contrario, se requiere el algoritmo COPY para reconstruir la tabla.
PolarDB for MySQL 8.0.1
|
Operación |
Permite DML concurrente |
Reconstruye la tabla |
Solo metadatos |
Compatible con DDL paralelo |
|
Agregar una columna |
Sí |
No1 |
Sí1 |
Compatible1 |
|
Eliminar una columna |
Sí |
Sí |
No |
Compatible |
|
Cambiar el nombre de una columna |
Sí |
No |
Sí |
N/A |
|
Reordenar columnas |
Sí |
Sí |
No |
Compatible |
|
Establecer el valor predeterminado de una columna |
Sí |
No |
Sí |
N/A |
|
Modificar el comentario de una columna |
Sí |
No |
Sí |
N/A |
|
Cambiar el tipo de una columna |
No |
Sí |
No |
No compatible |
|
Aumentar la longitud de una columna VARCHAR |
Sí2 |
No |
Sí |
N/A |
|
Cambiar el juego de caracteres de UTF8mb3 a UTF8mb4 |
No |
No3 |
Sí3 |
No compatible |
|
Quitar el valor predeterminado de una columna |
Sí |
No |
Sí |
N/A |
|
Modificar el valor de incremento automático |
Sí |
No |
Sí |
N/A |
|
Cambiar una columna a NULL |
Sí |
Sí |
No |
Compatible |
|
Cambiar una columna a NOT NULL |
No |
Sí |
No |
No compatible |
|
Modificar la definición de una columna ENUM o SET |
Sí |
No |
Sí4 |
N/A |
-
La función Instant column addition at the end of a table solo permite agregar una columna al final de la tabla. Si la tabla no tiene una clave primaria explícita, establezca el parámetro
implicit_primary_keyen OFF. De este modo se evita que la operación instantánea de agregar columna falle por la presencia de una columna de clave primaria implícita al final de la tabla. Esta operación no es compatible con tablas comprimidas (ROW_FORMAT=COMPRESSED), tablas con índices de texto completo ni tablas temporales. Cuando el clúster no admite la adición instantánea de columnas, agregar una columna ejecuta la instrucción DDL con el algoritmo INPLACE, lo cual requiere reconstruir toda la tabla. Durante esta reconstrucción se permiten lecturas y escrituras simultáneas. También puede utilizar DDL paralelo para acelerar la operación.Además, si la tabla cuenta con un índice columnstore, la adición instantánea de columnas no es compatible porque agregar una columna exige reconstruir dicho índice. Establezca el parámetro
loose_imci_enable_add_column_instant_ddlen ON para habilitar esta función. En ese caso, PolarDB reconstruye el índice columnstore de forma asíncrona en segundo plano. El índice columnstore no estará disponible temporalmente durante la reconstrucción. Para obtener más información, consulte Execute DDL statements to dynamically create and delete an IMCI. -
Al aumentar la longitud de una columna VARCHAR, la cantidad de bytes usados para almacenar dicha longitud debe mantenerse igual para que funcione la extensión rápida. En concreto, una columna VARCHAR de 0 a 255 bytes necesita un solo byte para guardar su longitud, mientras que una de 256 bytes o más requiere dos. Solo si el aumento permanece dentro del mismo rango de bytes, como entre 0 y 255 o de 256 hacia un valor mayor, ALTER TABLE modificará únicamente los metadatos. Cuando se amplía una columna VARCHAR de menos de 256 bytes a 256 o más, PolarDB usa Copy DDL de forma predeterminada y bloquea la tabla durante todo el proceso. Las operaciones DML de escritura no son compatibles; solo se permiten las de lectura.
Si no está seguro de que la modificación de VARCHAR cumpla estas condiciones, use
ALGORITHM=INPLACEpara ejecutar la operación DDL actual con el algoritmo INPLACE. Si la extensión rápida de columnas no es compatible, se devuelve un error de inmediato. Ejemplo:ALTER TABLE table_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.VARCHAR es un tipo de almacenamiento de longitud variable y el disco guarda únicamente la longitud real. Al usar campos VARCHAR, considere establecer la longitud máxima en 256 bytes o más desde el inicio. Así evitará que ampliar el campo después requiera el algoritmo COPY.
-
Cuando el parámetro
loose_innodb_support_instant_modify_charsetse establece en ON y se cumplen las siguientes condiciones, cambiar el juego de caracteres de una columna de UTF8mb3 a UTF8mb4 modifica solo los metadatos y no los datos. De lo contrario, se requiere el algoritmo COPY para reconstruir la tabla, la cual permanece bloqueada durante todo el proceso. La tabla de destino solo admite lecturas y no escrituras.El tipo de la columna es CHAR, VARCHAR, ENUM o TEXT.
No existe ningún índice en la columna que se va a modificar.
La longitud máxima de almacenamiento de la columna es menor a 256 bytes tanto antes como después de la conversión del juego de caracteres, o bien mayor a 255 bytes en ambos casos.
Especifique ALGORITHM=INPLACE para forzar la ejecución de la operación DDL sin reconstruir la tabla. Si la operación requiere el algoritmo COPY, se devuelve un error de inmediato. Ejemplo:
ALTER TABLE test modify column b char(1) CHARACTER SET utf8mb4 default null,algorithm = inplace; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY. La operación modifica únicamente los metadatos sin reconstruir toda la tabla cuando el tamaño de almacenamiento del tipo de dato no cambia y los elementos se agregan al final de ENUM o SET. En caso contrario, se requiere el algoritmo COPY para reconstruir la tabla.
PolarDB for MySQL 5.7
|
Operación |
Permite DML concurrente |
Reconstruye la tabla |
Solo metadatos |
Compatible con DDL paralelo |
|
Agregar una columna |
Sí |
No1 |
Sí1 |
Compatible1 |
|
Eliminar una columna |
Sí |
Sí |
No |
Compatible |
|
Cambiar el nombre de una columna |
Sí |
No |
Sí |
N/A |
|
Reordenar columnas |
Sí |
Sí |
No |
Compatible |
|
Establecer el valor predeterminado de una columna |
Sí |
No |
Sí |
N/A |
|
Modificar el comentario de una columna |
Sí |
No |
Sí |
N/A |
|
Cambiar el tipo de una columna |
No |
Sí |
No |
No compatible |
|
Aumentar la longitud de una columna VARCHAR |
Sí2 |
No |
Sí |
N/A |
|
Cambiar el juego de caracteres de UTF8mb3 a UTF8mb4 |
No |
Sí |
No |
No compatible |
|
Quitar el valor predeterminado de una columna |
Sí |
No |
Sí |
N/A |
|
Modificar el valor de incremento automático |
Sí |
No |
Sí |
N/A |
|
Cambiar una columna a NULL |
Sí |
Sí |
No |
Compatible |
|
Cambiar una columna a NOT NULL |
No |
Sí |
No |
No compatible |
|
Modificar la definición de una columna ENUM o SET |
Sí |
No |
Sí3 |
N/A |
Para habilitar la función Instant column addition at the end of a table, establezca el parámetro
loose_innodb_support_instant_add_columnen ON. Solo se admite agregar una columna al final de la tabla. Si la tabla no tiene una clave primaria explícita, establezca el parámetroimplicit_primary_keyen OFF. De este modo se evita que la operación instantánea de agregar columna falle por la presencia de una columna de clave primaria implícita al final de la tabla. Esta operación no es compatible con tablas comprimidas (ROW_FORMAT=COMPRESSED), tablas con índices de texto completo ni tablas temporales. Cuando el clúster no admite la adición instantánea de columnas, agregar una columna ejecuta la instrucción DDL con el algoritmo INPLACE, lo cual requiere reconstruir toda la tabla. Durante esta reconstrucción se permiten lecturas y escrituras simultáneas. También puede utilizar DDL paralelo para acelerar la operación.-
Al aumentar la longitud de una columna VARCHAR, la cantidad de bytes usados para almacenar dicha longitud debe mantenerse igual para que funcione la extensión rápida. En concreto, una columna VARCHAR de 0 a 255 bytes necesita un solo byte para guardar su longitud, mientras que una de 256 bytes o más requiere dos. Solo si el aumento permanece dentro del mismo rango de bytes, como entre 0 y 255 o de 256 hacia un valor mayor, ALTER TABLE modificará únicamente los metadatos. Cuando se amplía una columna VARCHAR de menos de 256 bytes a 256 o más, PolarDB usa Copy DDL de forma predeterminada y bloquea la tabla durante todo el proceso. Las operaciones DML de escritura no son compatibles; solo se permiten las de lectura.
Si no está seguro de que la modificación de VARCHAR cumpla estas condiciones, use
ALGORITHM=INPLACEpara ejecutar la operación DDL actual con el algoritmo INPLACE. Si la extensión rápida de columnas no es compatible, se devuelve un error de inmediato. Ejemplo:ALTER TABLE table_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.VARCHAR es un tipo de almacenamiento de longitud variable y el disco guarda únicamente la longitud real. Al usar campos VARCHAR, considere establecer la longitud máxima en 256 bytes o más desde el inicio. Así evitará que ampliar el campo después requiera el algoritmo COPY.
La operación modifica únicamente los metadatos sin reconstruir toda la tabla cuando el tamaño de almacenamiento del tipo de dato no cambia y los elementos se agregan al final de ENUM o SET. En caso contrario, se requiere el algoritmo COPY para reconstruir la tabla.
PolarDB for MySQL 5.6
|
Operación |
Permite DML concurrente |
Reconstruye la tabla |
Solo metadatos |
Compatible con DDL paralelo |
|
Agregar una columna |
Sí |
No1 |
Sí1 |
No compatible |
|
Eliminar una columna |
Sí |
Sí |
No |
No compatible |
|
Cambiar el nombre de una columna |
Sí |
No |
Sí |
N/A |
|
Reordenar columnas |
Sí |
Sí |
No |
No compatible |
|
Establecer el valor predeterminado de una columna |
Sí |
No |
Sí |
N/A |
|
Modificar el comentario de una columna |
Sí |
No |
Sí |
N/A |
|
Cambiar el tipo de una columna |
No |
Sí |
No |
No compatible |
|
Aumentar la longitud de una columna VARCHAR |
No |
Sí |
No |
No compatible |
|
Cambiar el juego de caracteres de UTF8mb3 a UTF8mb4 |
No |
Sí |
No |
No compatible |
|
Quitar el valor predeterminado de una columna |
Sí |
No |
Sí |
N/A |
|
Modificar el valor de incremento automático |
Sí |
No |
Sí |
N/A |
|
Cambiar una columna a NULL |
Sí |
Sí |
No |
No compatible |
|
Cambiar una columna a NOT NULL |
No |
Sí |
No |
No compatible |
|
Modificar la definición de una columna ENUM o SET |
Sí |
No |
Sí2 |
N/A |
-
Para habilitar la función Instant column addition at the end of a table, establezca el parámetro
loose_innodb_support_instant_add_columnen ON. Esta función solo permite agregar una columna al final de la tabla. Si la tabla no tiene una clave primaria explícita, establezca el parámetroimplicit_primary_keyen OFF. De este modo se evita que la operación instantánea de agregar columna falle por la presencia de una columna de clave primaria implícita al final de la tabla. Además, esta operación no es compatible con tablas comprimidas (ROW_FORMAT=COMPRESSED), tablas con índices de texto completo, tablas temporales ni tablas particionadas. Cuando el clúster no admite la adición instantánea de columnas, agregar una columna ejecuta la instrucción DDL con el algoritmo INPLACE, lo cual requiere reconstruir toda la tabla. Durante esta reconstrucción se permiten lecturas y escrituras simultáneas.NotaPolarDB for MySQL La función de adición instantánea de columnas en 5.6 se encuentra en versión canary. Para usarla, vaya a Centro de cuotas, utilice Quota ID
polardb_mysql_iac_56para buscar el nombre de la cuota y haga clic en Apply en la columna Actions para habilitar la función. Esta operación modifica únicamente los metadatos sin reconstruir toda la tabla cuando el tamaño de almacenamiento del tipo de dato no cambia y los elementos se agregan al final de ENUM o SET. En caso contrario, se requiere el algoritmo COPY para reconstruir la tabla.
Operaciones de tablas
PolarDB for MySQL 8.0.2
Operación | Permite DML concurrente | Reconstruye la tabla | Solo metadatos | Compatible con DDL paralelo |
Cambiar ROW_FORMAT | Sí | Sí | No | Compatible |
Cambiar KEY_BLOCK_SIZE | Sí | Sí | No | Compatible |
Configurar estadísticas persistentes | Sí | No | Sí | N/A |
Declarar un juego de caracteres | Sí | No | Sí | N/A |
Convertir un juego de caracteres | No | Sí | No | No compatible |
Optimizar una tabla | Sí | Sí Nota Cuando se utiliza | No | Compatible |
Reconstruir una tabla | Sí | Sí | No | Compatible |
Cambiar el nombre de una tabla | Sí | No | Sí | N/A |
Modificar el comentario de una tabla | Sí | No | Sí | N/A |
Crear una tabla (CREATE TABLE) | \ | \ | Sí | N/A |
PolarDB for MySQL 8.0.1
Operación | Permite DML concurrente | Reconstruye la tabla | Solo metadatos | Compatible con DDL paralelo |
Cambiar ROW_FORMAT | Sí | Sí | No | Compatible |
Cambiar KEY_BLOCK_SIZE | Sí | Sí | No | Compatible |
Configurar estadísticas persistentes | Sí | No | Sí | N/A |
Declarar un juego de caracteres | Sí | No | Sí | N/A |
Convertir un juego de caracteres | No | Sí | No | No compatible |
Optimizar una tabla | Sí | Sí Nota Cuando se utiliza | No | Compatible |
Reconstruir una tabla | Sí | Sí | No | Compatible |
Cambiar el nombre de una tabla | Sí | No | Sí | N/A |
Modificar el comentario de una tabla | Sí | No | Sí | N/A |
Crear una tabla (CREATE TABLE) | \ | \ | Sí | N/A |
PolarDB for MySQL 5.7
Operación | Permite DML concurrente | Reconstruye la tabla | Solo metadatos | Compatible con DDL paralelo |
Cambiar ROW_FORMAT | Sí | Sí | No | No compatible |
Cambiar KEY_BLOCK_SIZE | Sí | Sí | No | No compatible |
Configurar estadísticas persistentes | Sí | No | Sí | N/A |
Declarar un juego de caracteres | Sí | No | Sí | N/A |
Convertir un juego de caracteres | No | Sí | No | No compatible |
Optimizar una tabla | Sí | Sí Nota Cuando se utiliza | No | Compatible |
Reconstruir una tabla | Sí | Sí | No | Compatible |
Cambiar el nombre de una tabla | Sí | No | Sí | N/A |
Modificar el comentario de una tabla | Sí | No | Sí | N/A |
Crear una tabla (CREATE TABLE) | \ | \ | Sí | N/A |
PolarDB for MySQL 5.6
Operación | Permite DML concurrente | Reconstruye la tabla | Solo metadatos | Compatible con DDL paralelo |
Cambiar ROW_FORMAT | Sí | Sí | No | No compatible |
Cambiar KEY_BLOCK_SIZE | Sí | Sí | No | No compatible |
Configurar estadísticas persistentes | Sí | No | Sí | N/A |
Declarar un juego de caracteres | Sí | No | Sí | N/A |
Convertir un juego de caracteres | No | Sí | No | No compatible |
Optimizar una tabla | Sí | Sí Nota Cuando se utiliza | No | No compatible |
Reconstruir una tabla | Sí | Sí | No | No compatible |
Cambiar el nombre de una tabla | Sí | No | Sí | N/A |
Modificar el comentario de una tabla | Sí | No | Sí | N/A |
Crear una tabla (CREATE TABLE) | \ | \ | Sí | N/A |
Cuando ejecute instrucciones CREATE TABLE de forma masiva, divídalas en lotes más pequeños y procéselas fuera de los horarios pico. Evite también las ventanas de operación y mantenimiento, como las ampliaciones de clúster. Una ejecución intensiva podría ocupar brevemente los recursos de bloqueo de metadatos (MDL), pero no afecta directamente los datos ni las cargas de trabajo existentes.
Operaciones con columnas generadas
PolarDB for MySQL 8.0.2
Operación | Permite DML concurrente | Reconstruye la tabla | Solo metadatos | Compatible con DDL paralelo |
Agregar una columna STORED | No Nota Agregar una expresión de columna STORED involucra la capa SQL/servidor, por lo que Online DDL no es compatible cuando se agrega una columna STORED. | Sí | No | No compatible |
Reordenar columnas STORED | No | Sí | No | No compatible |
Eliminar una columna STORED | Sí | Sí | No | Compatible |
Agregar una columna VIRTUAL | Sí | No | Sí | N/A |
Reordenar columnas VIRTUAL | No | Sí | No | No compatible |
Eliminar una columna VIRTUAL | Sí | No | Sí | N/A |
PolarDB for MySQL 8.0.1
Operación | Permite DML concurrente | Reconstruye la tabla | Solo metadatos | Compatible con DDL paralelo |
Agregar una columna STORED | No Nota Agregar una expresión de columna STORED involucra la capa SQL/servidor, por lo que Online DDL no es compatible cuando se agrega una columna STORED. | Sí | No | No compatible |
Reordenar columnas STORED | No | Sí | No | No compatible |
Eliminar una columna STORED | Sí | Sí | No | Compatible |
Agregar una columna VIRTUAL | Sí | No | Sí | N/A |
Reordenar columnas VIRTUAL | No | Sí | No | No compatible |
Eliminar una columna VIRTUAL | Sí | No | Sí | N/A |
PolarDB for MySQL 5.7
Operación | Permite DML concurrente | Reconstruye la tabla | Solo metadatos | Compatible con DDL paralelo |
Agregar una columna STORED | No Nota Agregar una expresión de columna STORED involucra la capa SQL/servidor, por lo que Online DDL no es compatible cuando se agrega una columna STORED. | Sí | No | No compatible |
Reordenar columnas STORED | No | Sí | No | No compatible |
Eliminar una columna STORED | Sí | Sí | No | Compatible |
Agregar una columna VIRTUAL | Sí | No | Sí | N/A |
Reordenar columnas VIRTUAL | No | Sí | No | No compatible |
Eliminar una columna VIRTUAL | Sí | No | Sí | N/A |
PolarDB for MySQL 5.6
PolarDB for MySQL 5.6 no admite columnas generadas.
Operaciones con claves externas
PolarDB for MySQL 8.0.2
|
Operación |
Permite DML concurrente |
Reconstruye la tabla |
Solo metadatos |
Compatible con DDL paralelo |
|
Agregar una clave externa |
Sí1 |
No1 |
Sí1 |
N/A |
|
Eliminar una clave externa |
Sí1 |
No1 |
Sí1 |
N/A |
PolarDB for MySQL 8.0.1
|
Operación |
Permite DML concurrente |
Reconstruye la tabla |
Solo metadatos |
Compatible con DDL paralelo |
|
Agregar una clave externa |
Sí1 |
No1 |
Sí1 |
N/A |
|
Eliminar una clave externa |
Sí1 |
No1 |
Sí1 |
N/A |
PolarDB for MySQL 5.7
|
Operación |
Permite DML concurrente |
Reconstruye la tabla |
Solo metadatos |
Compatible con DDL paralelo |
|
Agregar una clave externa |
Sí1 |
No1 |
Sí1 |
N/A |
|
Eliminar una clave externa |
Sí1 |
No1 |
Sí1 |
N/A |
PolarDB for MySQL 5.6
|
Operación |
Permite DML concurrente |
Reconstruye la tabla |
Solo metadatos |
Compatible con DDL paralelo |
|
Agregar una clave externa |
Sí1 |
No1 |
Sí1 |
N/A |
|
Eliminar una clave externa |
Sí1 |
No1 |
Sí1 |
N/A |
El DDL INPLACE solo es compatible cuando foreign_key_checks está deshabilitado y únicamente se modifican los metadatos. En caso contrario, solo se admite el DDL COPY y la tabla permanece bloqueada durante todo el proceso.
Operaciones con tablas particionadas
PolarDB for MySQL 8.0.2
|
Operación |
Permite DML concurrente |
Reconstruye la tabla |
Solo metadatos |
Compatible con DDL paralelo |
|
Agregar particiones (ADD) |
Sí1 |
No2 |
Sí |
No compatible |
|
Eliminar particiones (DROP) |
Sí1 |
No2 |
No |
No compatible |
|
Descartar espacios de tablas de particiones (DISCARD) |
No |
No |
No |
No compatible |
|
Importar espacios de tablas de particiones (IMPORT) |
No |
No |
No |
No compatible |
|
Truncar particiones (TRUNCATE) |
Sí |
No |
No |
No compatible |
|
Fusionar particiones (COALESCE) |
No |
Sí3 |
No |
No compatible |
|
Redistribuir particiones (REORGANIZE) |
Sí1 |
No7 |
No |
No compatible |
|
Intercambiar particiones (EXCHANGE) |
Sí1 |
No |
Sí |
No compatible |
|
Analizar particiones (ANALYZE) |
Sí |
No |
No8 |
No compatible |
|
Comprobar particiones (CHECK) |
Sí |
No |
No9 |
No compatible |
|
Optimizar particiones (OPTIMIZE) |
Sí4 |
Sí4 |
No |
Compatible4 |
|
Reconstruir particiones (REBUILD) |
Sí1 |
No7 |
No |
No compatible |
|
Reparar particiones (REPAIR) |
Sí |
No10 |
No |
No compatible |
|
Convertir una tabla en una tabla particionada |
No |
Sí |
Sí5 |
No compatible |
|
Convertir una tabla particionada en una tabla normal |
No |
Sí |
No |
No compatible |
|
Crear un PARTIAL INDEX |
Sí |
No6 |
No |
Compatible |
Se introdujeron bloqueos de metadatos (MDL) a nivel de partición. Después de establecer el parámetro
loose_partition_level_mdl_enableden true, ejecutar una operación DDL no afecta el DML en las particiones que no están involucradas. Para obtener más información, consulte Online partition maintenance.Las particiones RANGE y LIST no requieren reconstruir la tabla al agregarlas o eliminarlas. Las particiones HASH y KEY sí necesitan reconstruir la tabla al agregarse, y no es posible eliminarlas.
Solo se admiten particiones HASH y KEY.
Cuando se ejecuta OPTIMIZE PARTITION en una tabla del motor InnoDB, se reconstruye toda la tabla particionada. Durante este proceso, se admiten las lecturas y escrituras en la tabla de destino. En este caso, establezca el parámetro
innodb_parallel_build_primary_indexen ON y utilice la función Parallel DDL para acelerar la reconstrucción.La conversión instantánea solo admite Convert a non-partitioned table into a range-partitioned table.
PolarDB for MySQL permite crear y eliminar índices con granularidad de partición. Para obtener más información, consulte What is a partial index?.
Redistribuir o reconstruir particiones solo reconstruye aquellas que requieren redistribución o reconstrucción de datos. El resto de las particiones no se ve afectado.
Analizar una partición modifica únicamente las estadísticas, sin alterar los metadatos ni los datos de la tabla.
Comprobar una partición no modifica los metadatos ni los datos.
Reparar particiones reconstruye solo las que necesitan reparación.
PolarDB for MySQL 8.0.1
|
Operación |
Permite DML concurrente |
Reconstruye la tabla |
Solo metadatos |
Compatible con DDL paralelo |
|
Agregar particiones (ADD) |
No |
No1 |
Sí |
No compatible |
|
Eliminar particiones (DROP) |
No |
No2 |
No |
No compatible |
|
Descartar espacios de tablas de particiones (DISCARD) |
No |
No |
No |
No compatible |
|
Importar espacios de tablas de particiones (IMPORT) |
No |
No |
No |
No compatible |
|
Truncar particiones (TRUNCATE) |
Sí |
No |
No |
No compatible |
|
Fusionar particiones (COALESCE) |
No |
Sí |
No |
No compatible |
|
Redistribuir particiones (REORGNIZATE) |
No |
No4 |
No |
No compatible |
|
Intercambiar particiones (EXCHANGE) |
Sí |
Sí |
Sí |
No compatible |
|
Analizar particiones (ANALYZE) |
Sí |
Sí |
No5 |
No compatible |
|
Comprobar particiones (CHECK) |
Sí |
No |
No6 |
No compatible |
|
Optimizar particiones (OPTIMIZE) |
Sí3 |
Sí3 |
No |
Compatible3 |
|
Reconstruir particiones (REBUILD) |
No |
No4 |
No |
No compatible |
|
Reparar particiones (REPAIR) |
Sí |
No4 |
No |
No compatible |
|
Convertir una tabla en una tabla particionada |
No |
Sí |
No |
No compatible |
|
Convertir una tabla particionada en una tabla normal |
No |
Sí |
No |
No compatible |
Las particiones RANGE y LIST no requieren reconstruir la tabla al agregarlas. Las particiones HASH y KEY sí necesitan reconstruir la tabla al agregarse.
No es posible eliminar las particiones HASH y KEY.
Cuando se ejecuta OPTIMIZE PARTITION en una tabla del motor InnoDB, se reconstruye toda la tabla particionada. Durante este proceso, se admiten las lecturas y escrituras en la tabla de destino. En este caso, establezca el parámetro
innodb_parallel_build_primary_indexen ON y utilice la función Parallel DDL para acelerar la reconstrucción.Redistribuir, reconstruir y reparar particiones solo reconstruye aquellas que requieren redistribución, reconstrucción o reparación. El resto de las particiones no se ve involucrado.
Analizar una partición modifica únicamente las estadísticas, sin alterar los metadatos ni los datos de la tabla.
Comprobar una partición no modifica los metadatos ni los datos.
PolarDB for MySQL 5.7
|
Operación |
Permite DML concurrente |
Reconstruye la tabla |
Solo metadatos |
Compatible con DDL paralelo |
|
Agregar particiones (ADD) |
No |
No1 |
Sí |
No compatible |
|
Eliminar particiones (DROP) |
No |
No1 |
No |
No compatible |
|
Descartar espacios de tablas de particiones (DISCARD) |
No |
No |
No |
No compatible |
|
Importar espacios de tablas de particiones (IMPORT) |
No |
No |
No |
No compatible |
|
Truncar particiones (TRUNCATE) |
Sí |
No |
No |
No compatible |
|
Fusionar particiones (COALESCE) |
No |
Sí |
No |
No compatible |
|
Redistribuir particiones (REORGNIZATE) |
No |
No2 |
No |
No compatible |
|
Intercambiar particiones (EXCHANGE) |
Sí |
No |
Sí |
No compatible |
|
Analizar particiones (ANALYZE) |
Sí |
No |
No3 |
No compatible |
|
Comprobar particiones (CHECK) |
Sí |
No |
No4 |
No compatible |
|
Optimizar particiones (OPTIMIZE) |
No |
Sí |
No |
No compatible |
|
Reconstruir particiones (REBUILD) |
No |
No2 |
No |
No compatible |
|
Reparar particiones (REPAIR) |
Sí |
No2 |
No |
No compatible |
|
Convertir una tabla en una tabla particionada |
No |
Sí |
No |
No compatible |
|
Convertir una tabla particionada en una tabla normal |
No |
Sí |
No |
No compatible |
Las particiones RANGE y LIST no requieren reconstruir la tabla al agregarlas o eliminarlas. Las particiones HASH y KEY sí necesitan reconstruir la tabla al agregarse, y no es posible eliminarlas.
Redistribuir, reconstruir y reparar particiones solo reconstruye aquellas que requieren redistribución, reconstrucción o reparación. El resto de las particiones no se ve involucrado.
Analizar una partición modifica únicamente las estadísticas, sin alterar los metadatos ni los datos de la tabla.
Comprobar una partición no modifica los metadatos ni los datos.
PolarDB for MySQL 5.6
|
Operación |
Permite DML concurrente |
Reconstruye la tabla |
Solo metadatos |
Compatible con DDL paralelo |
|
Agregar particiones (ADD) |
No |
No1 |
Sí |
No compatible |
|
Eliminar particiones (DROP) |
No |
No1 |
No |
No compatible |
|
Descartar espacios de tablas de particiones (DISCARD) |
No |
No |
No |
No compatible |
|
Importar espacios de tablas de particiones (IMPORT) |
No |
No |
No |
No compatible |
|
Truncar particiones (TRUNCATE) |
Sí |
No |
No |
No compatible |
|
Fusionar particiones (COALESCE) |
No |
Sí |
No |
No compatible |
|
Redistribuir particiones (REORGNIZATE) |
No |
No2 |
No |
No compatible |
|
Intercambiar particiones (EXCHANGE) |
Sí |
No |
Sí |
No compatible |
|
Analizar particiones (ANALYZE) |
Sí |
No |
No3 |
No compatible |
|
Comprobar particiones (CHECK) |
Sí |
No |
No4 |
No compatible |
|
Optimizar particiones (OPTIMIZE) |
No |
Sí |
No |
No compatible |
|
Reconstruir particiones (REBUILD) |
No |
No2 |
No |
No compatible |
|
Reparar particiones (REPAIR) |
Sí |
No2 |
No |
No compatible |
|
Convertir una tabla en una tabla particionada |
No |
Sí |
No |
No compatible |
|
Convertir una tabla particionada en una tabla normal |
No |
Sí |
No |
No compatible |
Las particiones RANGE y LIST no requieren reconstruir la tabla al agregarlas o eliminarlas. Las particiones HASH y KEY sí necesitan reconstruir la tabla al agregarse, y no es posible eliminarlas.
Redistribuir, reconstruir y reparar particiones solo reconstruye aquellas que requieren redistribución, reconstrucción o reparación. El resto de las particiones no se ve involucrado.
Analizar una partición modifica únicamente las estadísticas, sin alterar los metadatos ni los datos de la tabla.
Comprobar una partición no modifica los metadatos ni los datos.
Métodos de ejecución de DDL
Cuando PolarDB for MySQL ejecuta una operación DDL con el algoritmo INPLACE o INSTANT, el método del kernel (Online DDL) es la opción preferida. Este método se ejecuta rápidamente y ofrece alta estabilidad.
Cuando PolarDB for MySQL ejecuta una operación DDL con el algoritmo COPY, la tabla permanece bloqueada durante todo el proceso y no admite lecturas ni escrituras mientras se ejecuta. En este caso, considere utilizar una herramienta de terceros, como la función de cambio sin bloqueo de Data Management (DMS) o gh-ost. Estas herramientas permiten lecturas y escrituras durante la ejecución del DDL, aunque suelen ser más lentas. En tablas grandes o escenarios de alta concurrencia, la ejecución puede fallar si se acumulan demasiados datos incrementales.
A continuación se muestra una tabla que compara la ejecución de operaciones DDL mediante el método del kernel y con herramientas de terceros:
|
Método de ejecución |
Permite lecturas y escrituras concurrentes |
Velocidad de ejecución |
Requiere registro binario |
Aceleración paralela |
|
Kernel (Online DDL) |
Sí |
Rápida |
No |
Compatible |
|
Herramientas de terceros (cambio sin bloqueo de DMS, gh-ost, entre otras) |
Sí |
Lenta |
Sí |
No compatible |
Incluso si utiliza una herramienta de terceros para ejecutar una operación DDL, se adquiere un bloqueo MDL-X durante el cambio de tabla (modificación de metadatos), lo que provoca un breve bloqueo de la tabla. Según sus necesidades, habilite la función Nonblocking DDL statements o la función Preemptive DDL para evitar el bloqueo de la tabla.
Contáctenos
Si tiene preguntas sobre las operaciones DDL, Contact us.