From 43da24c07bca825194886c1d19f4bfdce8a73610 Mon Sep 17 00:00:00 2001 From: Gregory Colpart Date: Thu, 8 Feb 2018 01:50:23 +0100 Subject: [PATCH] relecture et correction d'ajouts --- HowtoMySQL.md | 140 +++++++++++----------------------- HowtoMySQL/Troubleshooting.md | 41 +++++++++- 2 files changed, 85 insertions(+), 96 deletions(-) diff --git a/HowtoMySQL.md b/HowtoMySQL.md index 04b4c83b..59a33910 100644 --- a/HowtoMySQL.md +++ b/HowtoMySQL.md @@ -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 : - -\ +> *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](). + + diff --git a/HowtoMySQL/Troubleshooting.md b/HowtoMySQL/Troubleshooting.md index 1fc643d3..21dcb684 100644 --- a/HowtoMySQL/Troubleshooting.md +++ b/HowtoMySQL/Troubleshooting.md @@ -564,4 +564,43 @@ ROUND(((data_length + index_length) / 1024 / 1024), 2) AS "Size in (MB)" FROM information_schema.TABLES WHERE table_schema = "" ORDER BY (data_length + index_length) DESC; -~~~ \ No newline at end of file +~~~ + +## 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 +~~~ +