diff --git a/HowtoMySQL.md b/HowtoMySQL.md index c223a43f..a5ddbebf 100644 --- a/HowtoMySQL.md +++ b/HowtoMySQL.md @@ -501,51 +501,65 @@ mysql> SET @@max_connect_errors=50; ## Sauvegarde -Pour sauvegarder une base de données (sans et avec compression) : +Pour sauvegarder une base de données dans un seul fichier (sans et avec compression) : ~~~ -# mysqldump foo > foo.sql -# mysqldump foo | gzip > foo.sql.gz +$ mysqldump --hex-blob foo > foo.sql +$ mysqldump --hex-blob foo | gzip > foo.sql.gz ~~~ +*Note* : l'option *--hex-blob* est importante pour ne pas risquer de perdre certains caractères dans les colonnes de type BINARY/BLOB/BIT + +Pour sauvegarder une base de données au format *tab-separated data files*, avec - pour chaque table - un fichier .sql contenant la structure de la table (CREATE TABLE) et un fichier .txt contenant les données brutes (ré-injectable avec `LOAD DATA INFILE`) : + +~~~ +# mkdir /tmp/foo && chown mysql:mysql /tmp/foo +$ mysqldump -T --hex-blob foo > /tmp/foo +~~~ + +*Note* : le répertoire de destination doit exister et *mysqld* doit avoir les droits d'écrire dedans. + Pour restaurer une base de données (sans et avec compression) : ~~~ -# mysqladmin create foo -# mysql foo < foo.sql -# gunzip < foo.sql.gz | mysql foo +$ mysqladmin create foo +$ mysql foo < foo.sql +$ gunzip < foo.sql.gz | mysql foo ~~~ -Sauvegarder toutes les bases : +Sauvegarder toutes les bases (exemples en mode classique et en mode `-T`) : ~~~ -# mysqldump --opt --all-databases > all.sql +$ mysqldump --opt --all-databases --events --hex-blob > all.sql +$ for db in $(mysql -P3308 -e "SHOW DATABASES" | egrep -v "^(Database|information_schema|performance_schema)") \ + mkdir /backupmysql/$db && chown mysql:mysql /backupmysql/$db && \ + mysqldump --events --hex-blob -T /backupmysql/$db $db; done ~~~ Pour sauvegarder uniquement certaines tables : ~~~ -# mysqldump foo TABLE0 [TABLE1…] > foo_tables.sql +$ mysqldump --hex-blob foo TABLE0 [TABLE1…] > foo_tables.sql ~~~ Pour presque faire un `--exclude` (qui manque cruellement à *mysqldump*): ~~~ -mysql -B -N -e 'show databases' | \ - perl -ne 'print unless /\b(?:phpmyadmin|mysql|information_schema)\b/' | \ - xargs echo mysqldump -B +$ mysql -B -N -e 'show databases' | \ + perl -ne 'print unless /\b(?:phpmyadmin|mysql|information_schema)\b/' | \ + xargs echo mysqldump --hex-blob -B ~~~ Et pour sauvegarder des tables correspondant à un motif (préfixe le plus souvent) : ~~~ -# mysqldump foo $(mysql foo -B --column-names=False -e "show tables like 'exemple_%'") > foo_motif.sql +$ mysqldump --hex-blob foo $(mysql foo -B --column-names=False -e "show tables like 'exemple_%'") > foo_motif.sql ~~~ Pour dumper avec une condition particulière : ~~~ -mysqldump -t foo bar --where="id='66666666'" +$ mysqldump -t foo bar --hex-blob --where="id='66666666'" ~~~ Ce qui permet de réinjecter des données résultantes d'un `SELECT * FROM foo.bar WHERE id='66666666'`. @@ -569,16 +583,16 @@ mygrants() Pour avoir un dump avec un seul insert par ligne, pratique pour restaurer partiellement les bases `mysql.user` et `mysql.db` par exemple : ~~~ -# mysqldump --skip-extended-insert mysql > mysql.sql +$ mysqldump --skip-extended-insert --events mysql > mysql.sql ~~~ Pour restaurer une seule base d'un dump complet on peut utiliser : ~~~ -mysql -o foo < all.sql +$ mysql -o foo < all.sql ~~~ -Pour restaurer une base, dont la structure de chaque table est stockée dans un fichier SQL indépendant, et dont les données sont dans des fichiers de type "tab-separated data files" (option -T de mysqldump) avec une extension .txt : +Pour restaurer une base avec un dump de type "tab-separated data files" (`mysqldump -T`, voir plus haut) : ~~~{.bash} db=test1 @@ -591,7 +605,7 @@ grep CHARSET= *txt for file in *.txt; do tablename=`basename $file .txt` #tablename=${file%.*} - echo "LOAD DATA INFILE '$PWD/$file' INTO TABLE $tablename" CHARACTER SET utf8 | mysql $db + echo "LOAD DATA INFILE '$PWD/$file' INTO TABLE $tablename" CHARACTER SET utf8 | mysql $db done ~~~ @@ -604,7 +618,7 @@ Se positionner dans un répertoire où mysql a les droits (mysqltmp - /home/mysq Il est possible d'exporter le contenu d'une base au format CSV : ~~~ -# mysqldump -T /tmp --fields-enclosed-by=\" --fields-terminated-by=, --no-create-db --no-create-info foo +$ mysqldump --hex-blob -T /tmp --fields-enclosed-by=\" --fields-terminated-by=, --no-create-db --no-create-info foo ~~~ *Note* : il est nécessaire que MySQL ait les droits d'écriture dans le répertoire de destination (ici `/tmp`).