Tutti i dati sono InnoDB
Questo è ciò che ti darà un'istantanea puntuale nel tempo dei dati:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
produce un checkpoint che consente al dump di acquisire tutti i dati prima del checkpoint mentre riceve le modifiche in entrata. Tali modifiche in entrata non diventano parte del dump. Ciò garantisce lo stesso point-in-time per tutte le tabelle.
--routines
scarica tutte le procedure e le funzioni memorizzate
--triggers
scarica tutti i trigger per ogni tabella che li ha
Tutti i dati sono MyISAM o Mix di InnoDB / MyISAM
Dovrai imporre un blocco di lettura globale, eseguire mysqldump e rilasciare il blocco globale
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
Provaci !!!
AGGIORNAMENTO 2012-06-22 08:12 EDT
Dato che hai <50 MB di dati totali, ho un'altra opzione. Invece di avviare un comando SLEEP in background per mantenere il blocco di lettura globale per 86400 sec (quello 24 ore) solo per ottenere l'ID del processo e uccidere all'esterno, proviamo a impostare un timeout di 5 secondi in mysql piuttosto che nel 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
Questo è un approccio più pulito e semplice per database molto piccoli.