19
0
Fork 0

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
1 changed files with 33 additions and 19 deletions

View File

@ -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`).