Comment mysqldump table (s) spécifique?


318

Comment puis-je vider une table ou un ensemble de tables spécifique sans inclure le reste des tables db?

+1

Voir aussi: [Toute option permettant à mysqldump d'ignorer les bases de données pour la sauvegarde?] (http://dba.stackexchange.com/q/35081/1192) 19 mars. 162016-03-19 12:32:16

431

Si vous tables abandonnes t1, t2 et t3 de mydb

mysqldump -u... -p... mydb t1 t2 t3 > mydb_tables.sql 

Si vous avez une tonne de tables dans mydb et que vous voulez vider tout sauf t1, t2 et t3, faites ceci:

DBTODUMP=mydb 
SQL="SET group_concat_max_len = 10240;" 
SQL=" ${SQL}SELECT GROUP_CONCAT(table_name separator ' ')" 
SQL="$ {SQL} FROM information_schema.tables WHERE table_schema=' ${DBTODUMP}'" 
SQL="$ {SQL} AND table_name NOT IN ('t1','t2','t3')" 
TBLIST='mysql -u... -p... -AN -e" ${SQL}"' 
mysqldump -u... -p...$ {DBTODUMP} ${TBLIST} > mydb_tables.sql 

Essayez-le!

MISE À JOUR 06/03/2014 10h15 EST

@RoryDonohue m'a fait remarquer que la fonction GROUP_CONCAT doit avoir sa longueur maximale prolongée. J'ai ajouté la variable de session group_concat_max_len à ma réponse avec une longueur maximale de 10K. Merci, @RoryDonohue.

+29

Pour exclure seulement quelques tables, vous pouvez utiliser --ignore-table = Table1 - ignore-table = Table2 --ignore-table = Table 3 etc. 13 déc.. 122012-12-13 13:06:49

  0

@codecowboy, vous pouvez changer 'SQL =" $ {SQL} ET nom_table NOT IN ('t1', 't2', 't3') "' à 'SQL =" $ {SQL} ET nom_table PAS COMME 'foo \ _%' "'. Je viens de le tester et ça marche. Vous pouvez changer la condition à '% foo%' pour obtenir toutes les tables contenant 'foo' n'importe où dans leurs noms (y compris 'food', 'fool', etc). 23 déc.. 142014-12-23 02:55:37

  0

L'approche pour * exclure * les tables n'est-elle pas redondante et excessive compte tenu de l'existence de l'argument '--ignore-table'? Et si oui, ne vaudrait-il pas mieux supprimer votre script de la réponse et simplement recommander '--ignore-table' à la place? 26 sept.. 162016-09-26 17:34:31

  0

@codewaggle Cela donne l'erreur 'Utilisation illégale de l'option --ignore-table = <database>. <table> 'sauf si je spécifie la table en tant que' schemaname.tablename'. 10 janv.. 172017-01-10 14:33:31

  0

trucs cool, quelle que soit la raison SQL variable n'est pas multi-ligne? 23 juin. 172017-06-23 04:32:56

  0

Il ne fonctionne tout simplement pas 'Accès refusé pour l'utilisateur à la base de données t1 lors de la sélection de la base de données' 07 févr.. 182018-02-07 12:44:57


24

Lorsque vous avez plus de quelques tables, il est beaucoup mieux courir quelque chose comme ceci:

mysql databasename -u [user] -p[password] -e 'show tables like "table_name_%"' 
     | grep -v Tables_in 
     | xargs mysqldump [databasename] -u [root] -p [password] > [target_file] 

Ou somethink comme ceci:

mysqldump -u [user] -p[password] databasename 'echo "show tables like 'table_name_%';" 
     | mysql -u[user] -p[password] databasename 
     | sed '/Tables_in/d'' > [target_file] 

Rappelez-vous que ces commandes doivent être saisies dans une ligne seulement.


65

Une note à développer sur the answer by RolandoMySQLDBA.

Le script qu'il a inclus est une excellente approche pour inclure (and table_name in) ou exclure (and table_name NOT in) une liste de tables.

Si vous avez juste besoin d'exclure un ou deux tables, vous pouvez les exclure individuellement avec l'option --ignore-table:

mysqldump -u -p etc. --ignore-table=Database.Table1 --ignore-table=Database.Table2 > dump_file.sql 

8

Vous pouvez le faire en utilisant simplement ci-dessous commande:

mysqldump -uusername -ppassword dbname \ 
    --ignore-table=schema.tablename1 \ 
    --ignore-table=schema.tablename2 \ 
    --ignore-table=schema.tablename3 > mysqldump.sql 
+3

--ignore-table est d'exclure certaines tables de mysqldump, ne pas inclure. :) 16 sept.. 132013-09-16 07:02:50

+1

Pourtant, on pourrait lister toutes les tables à exclure et il viderait juste celles restantes :-) 07 janv.. 152015-01-07 18:17:40