Toutes les données sont InnoDB
Voici ce qui vous donnera un instantané exact des données:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
produit un point de contrôle qui permet au vidage de capturer toutes les données avant le point de contrôle lors de la réception des modifications entrantes. Ces modifications entrantes ne font pas partie du dump. Cela garantit le même moment pour toutes les tables.
--routines
vide toutes les procédures stockées et les fonctions stockées
--triggers
décharge tous les déclencheurs pour chaque table qui les contient
Toutes les données sont MyISAM ou un mélange d'InnoDB / MyISAM
Vous devrez imposer un verrou global en lecture, effectuer le mysqldump et libérer le verrou 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
Essaie !!!
MISE À JOUR 2012-06-22 08:12 EDT
Depuis que vous avez <50 Mo de données totales, j'ai une autre option. Au lieu de lancer une commande SLEEP en arrière-plan pour conserver le verrou de lecture global pendant 86400 secondes (que 24 heures) juste pour obtenir l'ID de processus et le tuer à l'extérieur, essayons de définir un délai d'expiration de 5 secondes dans mysql plutôt que dans le système d'exploitation:
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
C'est une approche plus simple et plus propre pour les très petites bases de données.