Todos los datos son InnoDB
Esto es lo que le dará una instantánea exacta de los datos en un momento dado:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
produce un punto de control que permite que el volcado capture todos los datos antes del punto de control mientras recibe los cambios entrantes. Esos cambios entrantes no se convierten en parte del volcado. Eso garantiza el mismo punto en el tiempo para todas las tablas.
--routines
vuelca todos los procedimientos almacenados y funciones almacenadas
--triggers
vuelca todos los disparadores para cada tabla que los tiene
Todos los datos son MyISAM o Mix de InnoDB / MyISAM
Tendrá que imponer un bloqueo de lectura global, ejecutar mysqldump y liberar el bloqueo global
mysql -uuser -ppass -Ae"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
sleep 5
mysql -uuser -ppass -ANe"SHOW PROCESSLIST" | grep "SELECT SLEEP(86400)" > /tmp/proclist.txt
SLEEP_ID=`cat /tmp/proclist.txt | awk '{print $1}'`
echo "KILL ${SLEEP_ID};" > /tmp/kill_sleep.sql
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
mysql -uuser -ppass -A < /tmp/kill_sleep.sql
Darle una oportunidad !!!
ACTUALIZACIÓN 2012-06-22 08:12 EDT
Como tiene <50 MB de datos totales, tengo otra opción. En lugar de lanzar un comando SLEEP en segundo plano para mantener el bloqueo de lectura global durante 86400 segundos (esas 24 horas) solo para obtener la identificación del proceso y matar afuera, intentemos configurar un tiempo de espera de 5 segundos en mysql en lugar de en el sistema operativo:
SLEEP_TIMEOUT=5
SQLSTMT="FLUSH TABLES WITH READ LOCK; SELECT SLEEP(${SLEEP_TIMEOUT})"
mysql -uuser -ppass -Ae"${SQLSTMT}" &
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
Este es un enfoque más limpio y simple para bases de datos muy pequeñas.