¿Las tablas de InnoDB se bloquearon durante mysqldump cuando se mezclaron con MyISAM?


9

Estoy buscando una solución de respaldo para mis servidores mysql y necesito el menor tiempo de inactividad posible. Tengo lo siguiente:

  • Servidores MySQL
  • no se replican
  • cada servidor representa su propio

Este número puede aumentar, por lo que configurar una replicación maestro / esclavo no será una buena idea.

La forma más sencilla de copia de seguridad, según veo, sería usar mysqldump con un software como "automysqlbackup". Mis datos más importantes usan InnoDB. Mis tablas InnoDB son bastante pesadas.

La pregunta es: si hago un mysqldump a todas las bases de datos en el servidor, ¿bloqueará mis tablas Innodb?

Respuestas:


7

mysqldumps con InnoDB y MyISAM juntos se tratan como mutuamente excluyentes. Aquí es por qué:

Si puede iniciar sesión en mysql mientras hay un mysqldump en progreso, verá algo como esto:

SELECT /* SQL_NO_CACHE */ * FROM tblname

Por defecto, mysqldump hará lo siguiente:

  • Cada base de datos es volcada en orden alfabético
  • Cada tabla volcada por base de datos se volca en orden alfabético (independientemente del motor de almacenamiento)

Esto debería estar bien para una instancia de MySQL que no tiene otra actividad de base de datos. Las tablas InnoDB y las tablas MyISAM no se afectan entre sí.

El uso --single-transactioncontra una instancia MySQL de todo InnoDB crea un punto de control y volca todas las tablas desde el mismo punto en el tiempo. Una vez que se encuentra una tabla MyISAM, todas las apuestas están desactivadas. Podría provocar que todas las tablas de InnoDB después de MyISAM se vuelquen desde un punto en el tiempo diferente.

Para tener un volcado de punto en el tiempo consistente para una mezcla de InnoDB y MyISAM, tiene las opciones disponibles

OPCIÓN 1

Reinicie mysql para que nadie más pueda iniciar sesión a través de TCP / IP y luego mysqldump

service mysql restart --skip-networking --skip-grant-tables
mysqldump --routines --triggers --all-databases > MySQLData.sql
service mysql restart 

OPCION 2

Si todas las tablas MyISAM son solo para lectura, solo mysqldump usando --single-transaction

OPCION # 3

Si se están escribiendo tablas de MyISAM, una sola transacción no es suficiente

Deberás hacer lo siguiente:

mysql -u... -p... -e"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)"
sleep 30
mysqldump --routines --triggers --all-databases > MySQLData.sql

Inmediatamente después de terminar mysqldump, inicie sesión en mysql y haga show processlist;. Busque la consulta SELECT SLEEP(86400), encuentre la ID del proceso y ejecuteKILL <procidnumn>;


5

mysqldump --single-transactionno bloquea las tablas, pero no se garantiza que las tablas MyISAM tengan volcados consistentes con esta opción. Es mejor usarlo mydumper, mydumperbloquea las tablas MyISAM y no bloquea InnoDB, por lo que el volcado es coherente.


¡Guau, gracias por esta gran herramienta! ¿Está familiarizado con una herramienta que puede automatizar copias de seguridad diarias, semanales y mensuales con mydumper? Algo así como "automysqlbackup", solo con mydumper? Gracias.
tounano

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.