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-transaction
contra 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>;