Algunas tablas INNODB en nuestra base de datos de producción están a punto de alcanzar el límite INT AUTO_INCREMENT de 2147483647 y necesitamos modificarlas a BIGINT, de lo contrario las escrituras comenzarán a fallar.
Las tablas están en una base de datos MySQL 5.6.19a de producción que se ejecuta en Amazon RDS.
¿Cómo podemos hacer un ALTER como este sin interrumpir las lecturas e inserciones de producción que están sucediendo todo el tiempo?
ALTER TABLE MYTABLE
CHANGE id
id
BIGINT NOT NULL AUTO_INCREMENT;
Aquí está DDL para la tabla:
CREATE TABLE `MYTABLE` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`siteId` int(11) NOT NULL,
`filter` varchar(10) NOT NULL DEFAULT 'ALL',
`date` varchar(10) NOT NULL,
`cards` varchar(250) NOT NULL,
`apples` varchar(45) NOT NULL,
`carrots` varchar(45) NOT NULL,
`corn` varchar(45) NOT NULL,
`peas` varchar(45) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique` (`siteId`,`filter`,`date`,`cards`),
KEY `date_k` (`date`),
KEY `cards_k` (`cards`),
KEY `apples_k` (`apples`),
KEY `siteId_k` (`siteId`)
) ENGINE=InnoDB AUTO_INCREMENT=1748961482 DEFAULT CHARSET=utf8
Percona Toolkit es el camino a seguir, al menos si no es muy corto en el tiempo. La conversión se hizo cargo de nuestra mesa (500 Gb, configuración maestro-esclavo) cuando la probamos un poco más de 24 horas, en producción tardó (con un mejor hardware) casi 1 mes (nota al margen curiosa que teníamos unos 30 días antes de que nos quedáramos sin ID, por lo tanto, ya comenzamos a planificar los planes B y C, trabajando con copias de seguridad fuera de línea, eliminando esclavos, ...). El retraso se debió principalmente a la espera de que la replicación ocurriera hacia los esclavos (permitimos un retraso máximo de 50 segundos). También asegúrese de limitar el número de hilos concurrentes. Tenemos más de 2 millones de inserciones / día y muchos millones de lecturas.
También tenga en cuenta que una vez que la cobertura ha comenzado, no puede detenerla (o al menos no encontramos ninguna forma de reiniciarla) :-(
fuente
Bien....
KEY TOP_QUERIES_LAST_30DAYS_fk (siteId)
es redundante con la CLAVE PRIMARIA, por lo que es mejor que la DEJE caer.INT UNSIGNED te llevaría a 4 mil millones, ¿será suficiente?
Considere cambiar
filter
a unENUM
.¿Tienes 1,75 mil millones de filas? ¿O "quemaste" muchos identificadores? Si es así, ¿tal vez podamos arreglar eso? Por ejemplo
REPLACE
y ciertos sabores deINSERT
arrojarán identificadores.INSERT...ON DUPLICATE KEY
Por lo general, puede reemplazarREPLACE
. Un proceso de 2 pasos puede evitarINSERT IGNORE
la quema de identificadores.De vuelta a la pregunta ...
Vea si pt-online-schema-change hará el truco: http://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html
fuente