sql >> Base de Datos >  >> RDS >> Mysql

Cambio de tablas grandes de MySQL InnoDB

Editar 2016: recientemente (agosto de 2016) lanzamos gh-ost , modificando mi respuesta para reflejarla.

Hoy en día existen varias herramientas que le permiten modificar tablas en línea para MySQL. Estos son:

Consideremos la `ALTER TABLE` "normal":

Una tabla grande tomará mucho tiempo para ALTER . innodb_buffer_pool_size es importante, al igual que otras variables, pero en una tabla muy grande todas son insignificantes. Solo lleva tiempo.

Qué hace MySQL para ALTER una tabla es crear una nueva tabla con un nuevo formato, copiar todas las filas y luego cambiar. Durante este tiempo la mesa está completamente bloqueada.

Considere su propia sugerencia:

Lo más probable es que funcione peor de todas las opciones. ¿Porqué es eso? Debido a que está utilizando una tabla InnoDB, INSERT INTO tablename_tmp SELECT * FROM tablename hace para una transacción. un enorme transacción. Creará incluso más carga que la normal ALTER TABLE .

Además, tendrás que cerrar tu aplicación en ese momento para que no escriba (INSERT , DELETE , UPDATE ) a su mesa. Si es así, toda su transacción no tiene sentido.

Qué proporcionan las herramientas en línea

No todas las herramientas funcionan igual. Sin embargo, los conceptos básicos son compartidos:

  • Crean una tabla "sombra" con esquema alterado
  • Crean y usan disparadores para propagar cambios de la tabla original a la tabla fantasma
  • Ellos lentamente copie todas las filas de su tabla a la tabla de sombra. Lo hacen por partes:digamos, 1000 filas a la vez.
  • Hacen todo lo anterior mientras usted aún puede acceder a la tabla original y manipularla.
  • Cuando están satisfechos, intercambian los dos, usando un RENAME .

El openark-kit La herramienta ha estado en uso durante 3,5 años. La herramienta Percona tiene algunos meses, pero posiblemente haya sido más probada que la anterior. Se dice que la herramienta de Facebook funciona bien para Facebook, pero no brinda una solución general para el usuario promedio. No lo he usado yo mismo.

Editar 2016: gh-ost es una solución sin disparadores, que reduce significativamente la carga de escritura maestra en el maestro, desacoplando la carga de escritura de migración de la carga normal. Es auditable, controlable, comprobable. Lo desarrollamos internamente en GitHub y lo lanzamos como código abierto; estamos haciendo todas nuestras migraciones de producción a través de gh-ost hoy dia. Ver más aquí .

Cada herramienta tiene sus propias limitaciones, fíjese bien en la documentación.

La forma conservadora

La forma conservadora es usar una replicación Maestro-Maestro Activo-Pasivo, hacer ALTER en el servidor en espera (pasivo), luego cambie los roles y haga ALTER nuevamente en lo que solía ser el servidor activo, ahora se volvió pasivo. Esta también es una buena opción, pero requiere un servidor adicional y un conocimiento más profundo de la replicación.