Insight dans faire des sauvegardes avec mysqldump
IMHO Faire des sauvegardes est devenu une forme d'art si vous savez comment l'aborder
Vous avez des options
Option 1: mysqldump une instance entière de mysql
C'est le plus facile, le plus simple !!!
mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz
Tout ce qui est écrit dans un seul fichier: structures de table, index, déclencheurs, procédures stockées, utilisateurs, mots de passe cryptés. D'autres options de mysqldump peuvent également exporter différents styles de commandes INSERT, de fichier journal et de coordonnées de position à partir de journaux binaires, d'options de création de base de données, de données partielles (option --where), etc.
Option 2: bases de données séparées mysqldump dans des fichiers de données séparés
Commencez par créer une liste de bases de données (2 techniques pour le faire)
Technique 1
mysql -h... -u... -p... -A --skip-column-names -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
Technique 2
mysql -h... -u... -p... -A --skip-column-names -e"SELECT DISTINCT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
La technique 1 est le moyen le plus rapide. La technique 2 est la plus sûre et la plus sûre. La technique 2 est préférable car, parfois, les utilisateurs créent des dossiers à usage général dans / var / lib / mysql (datadir) qui ne sont pas liés à la base de données. La classe information_schema enregistrerait le dossier en tant que base de données dans la table information_schema.schemata. La technique 2 contournerait les dossiers ne contenant pas de données mysql.
Une fois que vous avez compilé la liste des bases de données, vous pouvez passer en boucle sur la liste et les copier, même en parallèle si vous le souhaitez.
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
S'il y a trop de bases de données à lancer à la fois, dumpez-les 10 à la fois:
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Option 3: mysqldump sépare les tables dans des fichiers de données séparés
Commencez par créer une liste de tables
mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfTables.txt
Puis videz toutes les tables par groupes de 10
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DBTB in `cat ListOfTables.txt`
do
DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
mysqldump -h... -u... -p... --hex-blob --triggers ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Option 4: UTILISEZ VOTRE IMAGINATION
Essayez des variantes des options susmentionnées, plus des techniques pour des instantanés nets.
Exemples
- Ordonnez la liste des tables en fonction de la taille de chaque table, par ordre croissant ou décroissant.
- En utilisant un processus séparé, exécutez "FLUSH TABLES WITH READ LOCK; SELECT SLEEP (86400)" avant de lancer mysqldumps. Tuez ce processus une fois que mysqldumps est terminé. Ceci est utile si une base de données contient à la fois InnoDB et MyISAM.
- Enregistrez les mysqldumps dans des dossiers datés et faites pivoter les anciens dossiers de sauvegarde.
- Chargez toute l'instance mysqldumps sur des serveurs autonomes.
CAVEAT
Seule l'option 1 apporte tout. L'inconvénient est que mysqldumps créé de cette manière ne peut être rechargé que dans la même version majeure de mysql que celle créée par mysqldump. En d'autres termes, un mysqldump à partir d'une base de données MySQL 5.0 ne peut pas être chargé en 5.1 ou 5.5. La raison ? Le schéma mysql est totalement différent entre les versions majeures.
Les options 2 et 3 n'incluent pas la sauvegarde des noms d'utilisateur et des mots de passe.
Voici le moyen générique de dump des subventions SQL pour les utilisateurs, qui est lisible et plus portable.
mysql -h... -u... -p... --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -h... -u... -p... --skip-column-names -A | sed 's/$/;/g' > MySQLGrants.sql
L'option 3 n'enregistre pas les procédures stockées. Vous pouvez donc effectuer les opérations suivantes.
mysqldump -h... -u... -p... --no-data --no-create-info --routines > MySQLStoredProcedures.sql &
Un autre point à noter concerne InnoDB. Si vous avez un pool de mémoire tampon InnoDB important, il est judicieux de le vider le mieux possible avant toute sauvegarde. Sinon, MySQL passe le temps nécessaire pour vider les tables de la page sale restante du pool de mémoire tampon. Voici ce que je suggère:
Environ 1 heure avant la sauvegarde, exécutez cette commande SQL
SET GLOBAL innodb_max_dirty_pages_pct = 0;
Innodb_max_dirty_pages_pct est 75 par défaut dans MySQL 5.5. Dans MySQL 5.1 et versions antérieures, innodb_max_dirty_pages_pct par défaut est 90. Si vous définissez innodb_max_dirty_pages_pct sur 0, cela accélérera le vidage des pages sales sur le disque. Cela empêchera ou au moins atténuera l'impact du nettoyage de toute validation incomplète en deux phases des données InnoDB avant d'effectuer toute opération mysqldump sur les tables InnoDB.
FINAL WORD SUR mysqldump
La plupart des gens hésitent à utiliser mysqldump au profit d'autres outils, qui sont vraiment bons.
Ces outils incluent
- MAATKIT (parallèle sauvegarde / restauration de scripts, de Percona [Obsolète mais grand])
- XtraBackup (Sauvegarde de capture instantanée TopNotch de Percona)
- CDP R1Soft ( Option de module MySQL prenant des instantanés à un instant donné)
- MySQL Enterprise Backup (anciennement InnoDB Hot Backups [commercial])
Si vous avez l’esprit d’un véritable administrateur de base de données MySQL, vous pouvez adopter mysqldump et en maîtriser parfaitement la maîtrise. Que toutes vos sauvegardes soient le reflet de vos compétences en tant que DBA MySQL .