Comment utilisez-vous mysqldump des tables spécifiques?

Réponses:

540

Si vous videz les tables 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 tout vider, sauf t1, t2 et t3, procédez comme suit:

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

Essaie !!!

MISE À JOUR 2014-03-06 10:15 EST

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

RolandoMySQLDBA
la source
43
Pour exclure seulement quelques tables, vous pouvez utiliser --ignore-table = Table1 --ignore-table = Table2 --ignore-table = Table3 etc.
codewaggle
@ Codecowboy, vous pouvez changer SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"pour SQL="${SQL} AND table_name NOT LIKE 'foo\_%'". Je viens de le tester et ça marche. Vous pouvez changer la condition en '% foo%' pour obtenir toutes les tables contenant 'foo' n'importe où dans leurs noms (y compris 'nourriture', 'imbécile', etc.).
Buttle Butkus
1
L’approche consistant à exclure des tables ici n’est-elle pas redondante et excessive compte tenu de l’existence de l’ --ignore-tableargument? Et si oui, ne vaudrait-il pas mieux supprimer votre script de la réponse et simplement le recommander --ignore-table?
Mark Amery
@codewaggle Cela donne l'erreur à Illegal use of option --ignore-table=<database>.<table>moins que je spécifie la table comme schemaname.tablename.
WAF
trucs cool, aucune variable de raison SQL n'est pas multi-ligne?
sdkks
72

Une note pour développer la réponse de 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 une ou deux tables, vous pouvez les exclure individuellement avec l' --ignore-tableoption:

mysqldump -u -p etc. --ignore-table=Database.Table1 --ignore-table=Database.Table2 > dump_file.sql
codewaggle
la source
29

Quand vous avez plus que quelques tables, il est bien mieux d’exécuter 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 quelque chose comme ça:

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

N'oubliez pas que ces commandes doivent être saisies sur une seule ligne.

grosshat
la source
11

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

mysqldump -uusername -ppassword dbname \
  --ignore-table=schema.tablename1    \
  --ignore-table=schema.tablename2    \
  --ignore-table=schema.tablename3 > mysqldump.sql
Vaibhav
la source
4
--ignore-table est d'exclure certaines tables de mysqldump, pas d'inclure. :)
Praveen Prasannan
3
Pourtant, on pourrait énumérer toutes les tables à exclure et ne renvoyer que les tables restantes :-)
Colin 't Hart