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.
ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query
un message d'erreur attendu?--single-transaction
option, comme indiqué dans une autre réponse.--lock-tables
.Voir la documentation officielle ici
la source
Si vous souhaitez effectuer cette opération pour MyISAM ou des tables mélangées sans aucun temps d'arrêt, vous pouvez configurer une base de données esclave et prendre vos instantanés à partir de là. La configuration de la base de données esclave, malheureusement, entraîne l’exportation de la base de données dynamique, mais une fois qu’elle est en cours d’exécution, vous devriez pouvoir verrouiller ses tables et exporter à l’aide des méthodes décrites par d’autres. Lorsque cela se produit, il sera en retard sur le maître, mais n'empêchera pas le maître de mettre à jour ses tables et se mettra au courant dès que la sauvegarde sera terminée.
la source
Voici comment je l'ai fait. Cela devrait fonctionner dans tous les cas puisqu'il utilise
FLUSH TABLES WITH READ LOCK
.La
sleep
commande shell sert uniquement à s'assurer que la tâche en arrière-plan exécutant la commande de verrouillage mysql est exécutée avant le démarrage de mysqldump. Vous pouvez le réduire à 1 seconde et tout devrait bien se passer. Augmentez-le à 30 secondes et essayez d'insérer une valeur dans n'importe quelle table à partir d'un autre client pendant ces 30 secondes.L'utilisation de ce verrouillage manuel en arrière-plan présente deux avantages, au lieu d'utiliser les
mysqldump
options--single-transaction
et--lock-tables
:mysqldump
pendant la même période de verrouillage. Cela est utile, par exemple, lors de la configuration de la réplication sur un nœud maître, car vous devez obtenir la position du journal binaire avecSHOW MASTER STATUS;
l'état exact du dump que vous avez créé (avant de déverrouiller la base de données) pour pouvoir créer un esclave de réplication.la source
La documentation officielle de MySQL suggère de créer une base de données Master "M1" et une base de données Slave "S1", décrites dans le "Scénario 2: Sauvegarde avec un esclave en lecture seule" Sauvegarde d'un maître ou d'un esclave en le rendant Lecture seulement
Vous devez définir la base de données esclave en lecture seule et effectuer les
la source
Si vous avez une très grande table MYISAM et que vous devez vider la table sans verrou et éviter une charge de serveur élevée, vous pouvez utiliser le script suivant.
la source