relecture et correction d'ajouts

This commit is contained in:
Gregory Colpart 2018-02-08 01:50:23 +01:00
parent 8ae466d36e
commit 43da24c07b
2 changed files with 85 additions and 96 deletions

View file

@ -742,28 +742,18 @@ Pour sauvegarder une base de données au format *tab-separated data files*, avec
~~~
# mkdir /tmp/foo && chown mysql:mysql /tmp/foo
$ mysqldump -T --hex-blob foo > /tmp/foo
$ mysqldump -T foo > /tmp/foo
~~~
> *Note* : le répertoire de destination doit exister et *mysqld* doit avoir les droits d'écrire dedans.
Restaurer une base de données (sans et avec compression) :
On peut utiliser les options `--fields-xxx` pour obtenir des fichiers au format CSV :
~~~
$ mysqladmin create foo
$ mysql foo < foo.sql
$ gunzip < foo.sql.gz | mysql foo
$ mysqldump --hex-blob --fields-enclosed-by='\"' --fields-terminated-by=',' -T /tmp/foo foo
~~~
Restaurer une table avec les données brutes :
~~~
$ mysqladmin create foo
$ mysql foo < /path/foo.sql
$ mysqlimport foo /path/bar.txt
~~~
Sauvegarder toutes les bases (exemples en mode classique et en mode `-T`) :
Pour sauvegarder toutes les bases (exemples en mode classique et en mode `-T`) :
~~~
$ mysqldump --opt --all-databases --events --hex-blob > all.sql
@ -816,54 +806,20 @@ mygrants()
}
~~~
Pour extraire une table depuis un dump (dans le cas où il y a pas de backup avec table séparé)
Il faut déterminer la structure des tables du dump avec :
~~~
grep -n "Table structure" dump.sql
~~~
Ce qui donne quelque chose comme ça :
~~~
19:-- Table structure for table `wp-cgp`
43:-- Table structure for table `wp_WP_SEO_404_links`
73:-- Table structure for table `wp_WP_SEO_Redirection`
109:-- Table structure for table `wp_WP_SEO_Redirection_LOG`
143:-- Table structure for table `wp_acccess`
170:-- Table structure for table `wp_avant_premiere`
196:-- Table structure for table `wp_commentmeta`
223:-- Table structure for table `wp_comments`
265:-- Table structure for table `wp_icl_string_translations`
294:-- Table structure for table `wp_icl_strings`
322:-- Table structure for table `wp_investments`
396:-- Table structure for table `wp_links`
431:-- Table structure for table `wp_login_redirects`
458:-- Table structure for table `wp_mtouchquiz_answer`
486:-- Table structure for table `wp_mtouchquiz_question`
~~~
Si l'on veux extraire la table *wp_investments*, on détermine ou commence et fini la table, ici elle commence a 322 et fini à 395, la fin ce détermine toujours à n-1 de la prochaine table.
On fait un *sed -n* avec le début et la fin de la table pour l'extraire dans un fichier .sql :
~~~
sed -n '[numéro_du_début_de_la_ligne],[numéro_de_fin_de_la_ligne] p' dump.sql > table.sql
~~~
Exemple avec la table *wp_investments* :
~~~
sed -n '322,395 p' dump.sql > wp_investments.sql
~~~
### Restaurer
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 --events mysql > mysql.sql
$ mysqldump --skip-extended-insert --events --hex-blob mysql > mysql.sql
~~~
### Restauration
Pour restaurer une base de données (sans et avec compression) :
~~~
$ mysqladmin create foo
$ mysql foo < foo.sql
$ gunzip < foo.sql.gz | mysql foo
~~~
Pour restaurer uniquement la base _foo_ à partir d'un dump complet on peut utiliser :
@ -872,7 +828,14 @@ Pour restaurer uniquement la base _foo_ à partir d'un dump complet on peut util
$ mysql -o foo < all.sql
~~~
Pour restaurer une base avec un dump de type "tab-separated data files" (`mysqldump -T`, voir plus haut) :
Pour restaurer une table de type "tab-separated data files" (`mysqldump -T`) dans une base _foo_ (exemples par défaut et avec des options `--fields-xxx`) :
~~~
$ mysqlimport --default-character-set=utf8 foo /tmp/foo/bar.txt
$ mysqlimport --default-character-set=utf8 --fields-enclosed-by='\"' --fields-terminated-by=',' foo /tmp/foo/bar.txt
~~~
Pour restaurer une base entière avec un dump de type "tab-separated data files" (exemples par défaut et avec des options `--fields-xxx`) :
~~~{.bash}
db=test1
@ -886,21 +849,31 @@ grep CHARSET= *txt
for file in *.txt; do
tablename=$(basename $file .txt)
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 FIELDS TERMINATED BY ',' ENCLOSED BY '"' | mysql $db
done
~~~
Pour le CHARACTER SET, se baser au character_set_database de la base :
~~~{.bash}
$ mysql -e 'show variables;' | grep character_set_database
character_set_database utf8
~~~
Si cela concerne plusieurs bases répartis dans différents répertoires :
\<se placer sur le répertoire en question (/home/mysqltmp/)\>
> *Note 1* : Attention, l'utilisateur MySQL doit avoir le droit de lecture sur les fichiers .txt
Se positionner dans un répertoire où mysql a les droits (mysqltmp - /home/mysqltmp par ex).
> *Note 2* : Si vous n'avez pas toutes vos tables en utf8 (par exemple du `CHARSET=LATIN1`), ce n'est pas bien… et vous devrez pour la peine adapter le script (en détectant le charset utilisé avec « file » si nécessaire)
> *Note 3* : Si erreur 150 : «Can't create table» voir du côté des foreign keys :
>
>~~~{.bash}
>$ mysql -e 'SHOW ENGINE INNODB STATUS\G;' | grep LATEST\ FOREIGN -A3
>~~~
>
>et ignorer les erreurs pour pouvoir recréer les tables :
>
>~~~{.bash}
>$ mysql -e "set GLOBAL foreign_key_checks=OFF;"
>~~~
Si cela concerne plusieurs bases réparties dans différents sous-répertoires :
~~~{.bash}
cd /home/mysqldump
for dir in *
do
echo "=======base $dir========="
@ -921,31 +894,6 @@ do
done
~~~
> *Note 1* : Attention, l'utilisateur MySQL doit avoir le droit de lecture sur les fichiers .txt
Se positionner dans un répertoire où mysql a les droits (mysqltmp - /home/mysqltmp par ex).
> *Note 2* : Si vous n'avez pas toutes vos tables en utf8 (par exemple du `CHARSET=LATIN1`), ce n'est pas bien… et vous devrez pour la peine adapter le script (en détectant le charset utilisé avec « file » si nécessaire)
> *Note 3* : Si erreur 150 : «Can't create table» voir du côté des foreign keys :
>
>~~~{.bash}
>$ mysql -e 'SHOW ENGINE INNODB STATUS\G;' | grep LATEST\ FOREIGN -A3
>~~~
>
>et ignorer les erreurs pour pouvoir recréer les tables :
>
>~~~{.bash}
>$ mysql -e "set GLOBAL foreign_key_checks=OFF;"
>~~~
Il est possible d'exporter le contenu d'une base au format CSV :
~~~
$ 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`).
On peut également restaurer un dump _foo.sql_ (ou tout script au format SQL) de façon interactive via la commande `source` :
~~~{.sql}
@ -1394,3 +1342,5 @@ Voir [/HowtoMySQL/Replication]().
## FAQ et erreurs courantes
Voir [/HowtoMySQL/Troubleshooting]().

View file

@ -564,4 +564,43 @@ ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size in (MB)"
FROM information_schema.TABLES
WHERE table_schema = "<NOM_BDD>"
ORDER BY (data_length + index_length) DESC;
~~~
~~~
## Restauration d'une table depuis un dump complet
Pour extraire une table depuis un dump complet `dump.sql`, on détermine la liste des tables via `grep -n "Table structure"`, par exemple :
~~~
$ grep -n "Table structure" dump.sql
19:-- Table structure for table `wp-cgp`
43:-- Table structure for table `wp_WP_SEO_404_links`
73:-- Table structure for table `wp_WP_SEO_Redirection`
109:-- Table structure for table `wp_WP_SEO_Redirection_LOG`
143:-- Table structure for table `wp_acccess`
170:-- Table structure for table `wp_avant_premiere`
196:-- Table structure for table `wp_commentmeta`
223:-- Table structure for table `wp_comments`
265:-- Table structure for table `wp_icl_string_translations`
294:-- Table structure for table `wp_icl_strings`
322:-- Table structure for table `wp_investments`
396:-- Table structure for table `wp_links`
431:-- Table structure for table `wp_login_redirects`
458:-- Table structure for table `wp_mtouchquiz_answer`
486:-- Table structure for table `wp_mtouchquiz_question`
~~~
Si l'on veut extraire la table `wp_investments`, on détermine où commence et finit la table, ici elle commence à la ligne 322 et finit à la ligne 395 (juste avant la table suivante).
On peut ainsi utiliser `sed -n` pour extraire la table :
~~~
$ sed -n '[numéro_du_début_de_la_ligne],[numéro_de_fin_de_la_ligne] p' dump.sql > table.sql
~~~
Exemple avec la table *wp_investments* :
~~~
$ sed -n '322,395 p' dump.sql > wp_investments.sql
~~~