Todos os dados são InnoDB
É isso que lhe dará uma captura instantânea exata dos dados no momento:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
produz um ponto de verificação que permite ao despejo capturar todos os dados anteriores ao ponto de verificação enquanto recebe as alterações recebidas. Essas alterações recebidas não se tornam parte do despejo. Isso garante o mesmo momento para todas as tabelas.
--routines
despeja todos os procedimentos armazenados e funções armazenadas
--triggers
despeja todos os gatilhos para cada tabela que os possui
Todos os dados são MyISAM ou mix de InnoDB / MyISAM
Você precisará impor um bloqueio de leitura global, executar o mysqldump e liberar o bloqueio 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
De uma chance !!!
UPDATE 2012-06-22 08:12 EDT
Como você tem <50 MB do total de dados, tenho outra opção. Em vez de lançar um comando SLEEP em segundo plano para manter o bloqueio de leitura global por 86400 s (24 horas) apenas para obter o ID do processo e eliminar fora, vamos tentar definir um tempo limite de 5 segundos no mysql e não no SO:
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
Essa é uma abordagem mais limpa e simples para bancos de dados muito pequenos.