¿Cómo mysqldump tabla (s) específica (s)?


318

¿Cómo puedo volcar una tabla específica o un conjunto de tablas sin incluir el resto de las tablas db?

+1

Ver también: [¿Alguna opción para que mysqldump ignore las bases de datos para realizar copias de seguridad?] (Http://dba.stackexchange.com/q/35081/1192) 19 mar. 162016-03-19 12:32:16

431

Si está volcando tablas t1, t2 y t3 desde mydb

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

Si tienes un montón de tablas en mydb y quieres volcar todo, excepto t1, t2 y t3, haz esto:

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

@RoryDonohueme señaló que elGROUP_CONCATLa función debe tener su longitud máxima extendida.Agregué la variable de sesióngroup_concat_max_lenA mi respuesta con una longitud máxima de 10K.Gracias, @RoryDonohue.

+29

Para excluir solo unas pocas tablas puede usar --ignore-table = Table1 --ignore-table = Table2 --ignore-table = Table3 etc. 13 dic. 122012-12-13 13:06:49

  0

@codecowboy, puede cambiar 'SQL =" $ {SQL} AND table_name NOT IN ('t1', 't2', 't3') "' a 'SQL =" $ {SQL} AND table_name NOT LIKE 'foo \ _ % '"'.Acabo de probarlo y funciona.Puede cambiar la condición a '% foo%' para obtener todas las tablas que contengan 'foo' en cualquier lugar con sus nombres (incluidos 'food', 'fool', etc.). 23 dic. 142014-12-23 02:55:37

  0

¿No es redundante y excesivo el enfoque para * excluir * las tablas aquí dada la existencia del argumento '--ignore-table'?Y si es así, ¿no sería mejor eliminar la secuencia de comandos de la respuesta y simplemente recomendar '--ore tabla-en su lugar? 26 sep. 162016-09-26 17:34:31

  0

@codewaggle Eso da el error 'Uso ilegal de la opción --ignore-table =.

'a menos que yo especifique la tabla como' schemaname.tablename'. – 10 ene. 172017-01-10 14:33:31

  0

Cosas interesantes, ¿alguna razón por la cual la variable SQL no es multilínea? 23 jun. 172017-06-23 04:32:56

  0

Simplemente no funciona. Acceso denegado para el usuario a la base de datos t1 al seleccionar la base de datos. 07 feb. 182018-02-07 12:44:57


24

Cuando tienes 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 como esto:

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 en una sola línea.


65

Una nota para ampliar en the answer by RolandoMySQLDBA .

El script 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 opción --ignore-table :

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

8

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
+3

--ignore-table es excluir ciertas tablas de mysqldump, no incluir.:) 16 sep. 132013-09-16 07:02:50

+1

Sin embargo, uno podría enumerar todas las tablas para excluir y volcaría solo las restantes :-) 07 ene. 152015-01-07 18:17:40