En MySQL Community, cambiar el tipo de datos de una columna requiere el algoritmo COPY, que reescribe cada fila en la capa del servidor y mantiene un bloqueo de tabla durante todo el proceso, lo cual impide cualquier operación de lectura o escritura. La función Online Modify Column de AliSQL elimina este tiempo de inactividad al trasladar la operación a la capa del motor InnoDB, lo que permite modificar los tipos de columna mientras las lecturas y escrituras continúan sin interrupciones.
Funcionamiento
MySQL Community (incluida la versión 8.0) utiliza el algoritmo COPY para los cambios de tipo de columna: lee cada fila y la reescribe una por una en la capa del servidor, y bloquea la tabla durante toda la duración del proceso. AliSQL resuelve esto al mover la modificación del tipo de columna a la capa del motor InnoDB y reutilizar el marco de ejecución de DDL INPLACE de la versión community. El resultado es el mismo comportamiento que en otras operaciones DDL INPLACE: la tabla permanece totalmente accesible durante todo el proceso.
Operaciones compatibles
Online Modify Column admite dos categorías de cambio. Ambas requieren el motor InnoDB.
|
Operación |
Tipos compatibles |
Dirección |
Ejemplo |
|
Modificación de tipo |
|
Solo aumento de tamaño |
|
|
Extensión de longitud |
|
Solo aumento de longitud |
|
Limitaciones:
Solo se admiten tablas InnoDB.
No se pueden modificar las columnas que forman parte de una clave de partición.
Requisitos previos
Para usar Online Modify Column, su instancia debe cumplir con los siguientes requisitos de versión. Si la versión secundaria del motor es anterior a la requerida, actualice la versión secundaria del motor.
MySQL 8.0: versión secundaria del motor 20250731 o posterior
MySQL 5.7: versión secundaria del motor 20251031 o posterior
Habilite Online Modify Column
Online Modify Column se controla mediante el parámetro loose_rds_upgrade_datatype_online_enable.
|
Parámetro |
Descripción |
Ámbito |
Tipo de dato |
Valor predeterminado |
Valores válidos |
Reinicio obligatorio |
|
|
Habilita o deshabilita Online Modify Column |
Global |
Booleano |
|
|
No |
Para habilitar la función:
Vaya a la página Instances. En la barra de navegación superior, seleccione la región donde reside la instancia. Busque la instancia y haga clic en su ID.
En el panel de navegación izquierdo, haga clic en Parameter Settings.
En la pestaña Editable Parameters, busque
loose_rds_upgrade_datatype_online_enabley establezca su valor enON.Haga clic en OK y luego en Submit Parameters. En el cuadro de diálogo, seleccione cuándo aplicar el cambio.
Modifique tipos de columna en línea
Después de habilitar la función, utilice ALTER TABLE con ALGORITHM=INPLACE para modificar los tipos de columna en línea.
Los siguientes ejemplos utilizan la tabla t1 con este esquema:
CREATE TABLE `t1` (
`id` int NOT NULL,
`c1` int DEFAULT NULL,
`c2` char(10) DEFAULT NULL,
`c3` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Especifique ALGORITHM=INPLACE explícitamente
Especificar ALGORITHM=INPLACE garantiza que la operación utilice el método en línea.
-- Type modification: change c1 from INT to BIGINT
ALTER TABLE `t1` MODIFY `c1` bigint DEFAULT NULL, ALGORITHM=INPLACE;
-- Verify the result
SHOW CREATE TABLE `t1`\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int NOT NULL,
`c1` bigint DEFAULT NULL,
`c2` char(10) DEFAULT NULL,
`c3` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
1 row in set (0.00 sec)
-- Length extension: extend c2 from CHAR(10) to CHAR(20)
ALTER TABLE `t1` MODIFY `c2` char(20) DEFAULT NULL, ALGORITHM=INPLACE;
-- Length extension: extend c3 from VARCHAR(50) to VARCHAR(100)
ALTER TABLE `t1` MODIFY `c3` varchar(100) DEFAULT NULL, ALGORITHM=INPLACE;
-- Verify the result
SHOW CREATE TABLE `t1`\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int NOT NULL,
`c1` bigint DEFAULT NULL,
`c2` char(20) DEFAULT NULL,
`c3` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
1 row in set (0.00 sec)
Omitir la cláusula ALGORITHM
Si omite ALGORITHM, el sistema selecciona automáticamente el algoritmo más adecuado para modificar el tipo de columna.
ALTER TABLE `t1` MODIFY `c1` bigint DEFAULT NULL;