détails sur mysqldump, notamment l'option -T et --hex-blob

This commit is contained in:
gcolpart 2016-12-26 14:49:52 +01:00
parent 7eae86ed1a
commit df89f5f16e

View file

@ -501,51 +501,65 @@ mysql> SET @@max_connect_errors=50;
## Sauvegarde ## 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 --hex-blob foo > foo.sql
# mysqldump foo | gzip > foo.sql.gz $ 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) : Pour restaurer une base de données (sans et avec compression) :
~~~ ~~~
# mysqladmin create foo $ mysqladmin create foo
# mysql foo < foo.sql $ mysql foo < foo.sql
# gunzip < foo.sql.gz | mysql foo $ 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 : 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*): Pour presque faire un `--exclude` (qui manque cruellement à *mysqldump*):
~~~ ~~~
mysql -B -N -e 'show databases' | \ $ mysql -B -N -e 'show databases' | \
perl -ne 'print unless /\b(?:phpmyadmin|mysql|information_schema)\b/' | \ perl -ne 'print unless /\b(?:phpmyadmin|mysql|information_schema)\b/' | \
xargs echo mysqldump -B xargs echo mysqldump --hex-blob -B
~~~ ~~~
Et pour sauvegarder des tables correspondant à un motif (préfixe le plus souvent) : 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 : 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'`. 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 : 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 : 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} ~~~{.bash}
db=test1 db=test1
@ -591,7 +605,7 @@ grep CHARSET= *txt
for file in *.txt; do for file in *.txt; do
tablename=`basename $file .txt` #tablename=${file%.*} 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 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 : 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`). *Note* : il est nécessaire que MySQL ait les droits d'écriture dans le répertoire de destination (ici `/tmp`).