Necesito cambiar un tipo de datos de INT a BIGINT en una tabla MySQL de 600 GB. La columna tiene un índice único. Podría ser bueno con INT sin firmar, pero supongo que cambiar a eso o BIGINT será casi el mismo dolor. El motor de la mesa es InnoDB. Qué sería más fácil:
- ALTERAR TABLA
- Copiando estructura y
INSERT INTO (SELECT *) - Volcar la tabla y cambiar las definiciones de la tabla del archivo de volcado
- ¿Algo más?
ACTUALIZACIÓN: según lo solicitado, MySQL ver 5.5.15, sin claves foráneas y crear tabla:
CREATE TABLE `tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`created_at` datetime NOT NULL,
`tid` bigint(20) NOT NULL,
`t` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`f` tinyint(1) NOT NULL,
`i_id` bigint(20) NOT NULL,
`ir_id` int(11) NOT NULL,
`r_c` int(11) NOT NULL,
`r` tinyint(1) NOT NULL,
`e` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`t` varchar(5) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user` (`user_id`,`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=1657146169 DEFAULT CHARSET=utf8

ALTER TABLE ONLINE. ¿Tiene claves externas que hacen referencia a esta columna? Sería útil si mostraras elSHOW CREATE TABLE tablename;resultado.Respuestas:
Suponiendo que su tabla no tiene ningún desencadenante, debe considerar usarla,
pt-online-schema-changeya que le permitirá ALTERAR la tabla sin bloquearla.Todavía tomará bastante tiempo dado el tamaño de la tabla.
Además, con este método o con
ALTER TABLEusted deberá asegurarse de tener 600 GB de espacio extra en disco para admitir dos copias de la tabla mientras se está reconstruyendo.fuente
ALTER TABLEpodría tardar entre 24 y 96 horas en ejecutarse. Puede obtener una mejor estimación ejecutando ALTER TABLE en un entorno de prueba.Usar el kit de herramientas percona
pt-online-schema-changesería mi elección en la producción sin afectar el uso. Esto agregará algunos desencadenantes para obtener sus deltas y una tabla temporal que cambiaría de nombre una vez hecho esto.ejemplo:
fuente