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.
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?
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.
Réponses:
Si vous videz les tables t1, t2 et t3 de mydb
Si vous avez une tonne de tables dans mydb et que vous voulez tout vider, sauf t1, t2 et t3, procédez comme suit:
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.
la source
SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"
pourSQL="${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.).--ignore-table
argument? Et si oui, ne vaudrait-il pas mieux supprimer votre script de la réponse et simplement le recommander--ignore-table
?Illegal use of option --ignore-table=<database>.<table>
moins que je spécifie la table commeschemaname.tablename
.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-table
option:la source
Quand vous avez plus que quelques tables, il est bien mieux d’exécuter quelque chose comme ceci:
Ou quelque chose comme ça:
N'oubliez pas que ces commandes doivent être saisies sur une seule ligne.
la source
Vous pouvez le faire simplement en utilisant la commande ci-dessous:
la source