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-change
ya 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 TABLE
usted deberá asegurarse de tener 600 GB de espacio extra en disco para admitir dos copias de la tabla mientras se está reconstruyendo.fuente
ALTER TABLE
podrí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-change
serí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