La forma más rápida de cambiar un tipo de datos de clave indexada de 600 GB de tabla de INT a BIGINT

13

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:

  1. ALTERAR TABLA
  2. Copiando estructura y INSERT INTO (SELECT *)
  3. Volcar la tabla y cambiar las definiciones de la tabla del archivo de volcado
  4. ¿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
Noam
fuente
Define el dolor, toma el menor tiempo ... ¿Resultados más rápidos?
@AlecTeal Tómese el menor tiempo posible
Noam
Aunque no responde la pregunta y esta pregunta probablemente se discutió antes de que la tabla se volviera tan grande, también buscaría una forma de reducir el tamaño de esta tabla.
1
¿Qué versión de MySQL? Importa como algunas versiones tienen ALTER TABLE ONLINE. ¿Tiene claves externas que hacen referencia a esta columna? Sería útil si mostraras el SHOW CREATE TABLE tablename;resultado.
ypercubeᵀᴹ
2
Si los nombres de campo cortos ayudaran a reducir el tamaño de la tabla, serían 600 MB .
Jon of All Trades

Respuestas:

2

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.

Ike Walker
fuente
¿Tienes alguna estimación de tiempo? (Sé que depende de muchos factores, pero si tuviera que adivinar, cuál sería el rango)
Noam
@Noam no necesita copiar la tabla. Si usa la tabla Alter, el PEOR CASO es que se copia, si está usando un motor maduro, solo se hará notar que cualquier cosa antes (alguna ubicación en el archivo o algún registro) usa int, cualquier publicación usa bigint, hasta optimizas
@AlecTeal ¿Tiene alguna referencia formal a eso?
Noam
@Noam ve mi respuesta.
1
@Noam, estimaría que 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.
Ike Walker
2

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:

pt-online-schema-change --alter "CHANGE `id` `id` BIGINT  NOT NULL; " D=DB,t=TABLE
Binlogic DBA
fuente
pt es el camino a seguir. @Noam FYI: la migración INT-> BIGINT en una tabla de ~ 270GB con muchas filas en la instancia EC2 con una actividad de escritura bastante pesada en esta tabla tomó 64 horas usando pt-online-schema-change.
Jakub Głazik