URL: https://linuxfr.org/users/coren/journaux/la-sauvegarde-mysql Title: La sauvegarde MySQL Authors: Coren Date: 2012年06月28日T18:38:26+02:00 License: CC By-SA Tags: mysql, sauvegarde et restauration Score: 22 Cher journal, J'ai enfin trouvé une manière de sauvegarder et de restaurer une base MySQL de plusieurs Go qui soit efficace dans les _deux_ sens. Pour les bases < 1 Go, il vaut mieux prendre les commandes classiques. - Sauvegarde: mysqldump --single-transaction --quick -B $db | gzip> $db.sql.gz - Restauration zcat $db.sql.gz < mysql Pour les bases> 1 Go, une approche innovante est préférable, surtout dans le cas d'innodb (où il ne faut pas oublier d'activer [innodb_file_per_table](http://dev.mysql.com/doc/refman/5.0/en/innodb-multiple-tablespaces.html)) - Sauvegarde (que vous pouvez éventuellement compresser par la suite): mysqldump --quick --skip-extended-insert --tab=/tmp/$db -B $db Concernant la restauration, c'est là où on va rencontrer des problèmes. Les clés étrangères vont provoquer des ERROR 1005 (HY000) at line 23: Can't create table '$db.$table' (errno: 150) et des mysqlimport: Error: 1452, Cannot add or update a child row: a foreign key constraint fails (`$db`.`$table`, CONSTRAINT `FK444FE365DB877774` FOREIGN KEY (`fk_$table_id`) REFERENCES `$table` (`$field`) ON DELETE CASCADE), when using table: $table Le plus simple est d'utiliser ce script, qui va désactiver les vérifications de clé durant l'import. Et non, malheureusement, la demande d'ajout de cette fonctionnalité directement dans la cli [datant de 2006](http://bugs.mysql.com/bug.php?id=19996) n'a toujours pas été implémenté. Il faut faire soi même son script, qui peut ressembler à ça: #!/bin/bash echo "SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;" for f in `ls -1 *.sql`; do echo "source '`pwd`/$f;'" done; echo "COMMIT;" for f in `ls -1 *.txt`; do table=${f/.txt/} echo "load data infile '`pwd`/$f' INTO TABLE $table;" done; echo "SET FOREIGN_KEY_CHECKS = 1;" echo "COMMIT;" - La restauration passe alors sans erreur et attaque directement les performances brutes du stockage sous-jacent: bash sql.sh | mysql Sur une base de 10 Go, on passe de 5h en restauration à environ 30 minutes, et de 5/10 Mo/s à 50/80 Mo/s, d'après iotop. L'autre gros avantage de cette méthode est d'être en capacité de pouvoir restaurer seulement une table sans avoir à réinjecter tout le dump dans une base à côté.

AltStyle によって変換されたページ (->オリジナル) /