¿Cómo mysqldump tablas específicas?

Respuestas:

540

Si está volcando las tablas t1, t2 y t3 de mydb

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

Si tiene un montón de tablas en mydb y desea volcar todo excepto t1, t2 y t3, haga lo siguiente:

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

Darle una oportunidad !!!

ACTUALIZACIÓN 2014-03-06 10:15 EST

@RoryDonohue me señaló que la función GROUP_CONCAT necesita tener su longitud máxima extendida. Agregué la variable de sesión group_concat_max_len a mi respuesta con una longitud máxima de 10K. Gracias, @RoryDonohue.

RolandoMySQLDBA
fuente
43
Para excluir solo algunas tablas, puede usar --ignore-table = Table1 --ignore-table = Table2 --ignore-table = Table3 etc.
codewaggle
@codecowboy, puedes cambiar SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"a SQL="${SQL} AND table_name NOT LIKE 'foo\_%'". Lo acabo de probar y funciona. Puede cambiar la condición a '% foo%' para obtener todas las tablas que contengan 'foo' en cualquier lugar de sus nombres (incluyendo 'comida', 'tonto', etc.).
Buttle Butkus
1
¿No es el enfoque para excluir tablas aquí redundante y excesivo dada la existencia del --ignore-tableargumento? Y si es así, ¿no sería mejor eliminar el guión de la respuesta y recomendarlo --ignore-table?
Mark Amery
@codewaggle Eso da el error a Illegal use of option --ignore-table=<database>.<table>menos que especifique la tabla como schemaname.tablename.
WAF
cosas interesantes, ¿alguna razón por la que la variable SQL no es de varias líneas?
sdkks
72

Una nota para ampliar la respuesta de RolandoMySQLDBA .

El guión que incluyó es un gran enfoque para incluir ( and table_name in) o excluir ( and table_name NOT in) una lista de tablas.

Si solo necesita excluir una o dos tablas, puede excluirlas individualmente con la --ignore-tableopción:

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

Cuando tiene más de unas pocas tablas, es mucho mejor ejecutar algo como esto:

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]

O algo así:

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

Recuerde que esos comandos deben escribirse solo en una línea.

asqueroso
fuente
11

Puedes hacerlo simplemente usando el siguiente comando:

mysqldump -uusername -ppassword dbname \
  --ignore-table=schema.tablename1    \
  --ignore-table=schema.tablename2    \
  --ignore-table=schema.tablename3 > mysqldump.sql
Vaibhav
fuente
44
--ignore-table es excluir ciertas tablas de mysqldump, no incluirlas. :)
Praveen Prasannan
3
Sin embargo, uno podría enumerar todas las tablas para excluir y volcaría solo las restantes :-)
Colin 't Hart