Hacer una copia de seguridad de MySQL no es muy difícil: simplemente ejecuta mysqldump y la salida a un archivo, pero tampoco está verdaderamente diseñado para entornos de producción.
Al principio, ejecutar mysqldump solo tomó unos segundos, por lo que no fue un gran problema que todo se bloqueara, pero con el tiempo nuestras copias de seguridad se volvieron tan grandes que todo el sitio dejaría de funcionar durante media hora si ejecutamos una copia de seguridad. Inclusive con mucho almacenamiento en caché, eso siempre significaba que alguien recibía una página de error todos los días. El problema es que mysqldump bloquea las tablas de la base de datos antes de exportar para que no se inserten cosas nuevas mientras estás exportando.
La respuesta es usar el --single-transaction
argumento, que le dará una copia de seguridad coherente sin bloquear todo. Lo que verdaderamente sucede es que mysqldump iniciará una nueva transacción SQL, vaciando todas las escrituras pendientes y después completará la copia de seguridad como parte de una transacción que no impide que sucedan otras actualizaciones.
Nota: la única advertencia es que las tablas de su base de datos deben utilizar InnoDB en lugar de MyISAM. Dado que ha sido el valor predeterminado durante un tiempo, probablemente debería estar bien.
Entonces, ahora que lo hemos resuelto, simplemente agregue el argumento a su rutina de respaldo normal, así:
mysqldump -uUser -pPass -hHost --single-transaction database > backup.bak
Y ahora sus copias de seguridad serán mucho más confiables.