Como você mysqldump tabelas específicas?


Respostas:


540

Se você estiver descartando as tabelas t1, t2 e t3 do mydb

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

Se você possui várias tabelas em mydb e deseja despejar tudo, exceto t1, t2 e t3, faça o seguinte:

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

De uma chance !!!

ATUALIZAÇÃO 06-03-2014 10:15 EST

@RoryDonohue apontou para mim que a função GROUP_CONCAT precisa ter seu comprimento máximo estendido. Adicionei a variável de sessão group_concat_max_len à minha resposta com um comprimento máximo de 10K. Obrigado, @RoryDonohue.


43
Para excluir apenas algumas tabelas, você pode usar --ignore-table = Table1 --ignore-table = Table2 --ignore-table = Table3 etc.
codewaggle

@ codecowboy, você pode mudar SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"para SQL="${SQL} AND table_name NOT LIKE 'foo\_%'". Acabei de testar e funciona. Você pode alterar a condição para '% foo%' para obter todas as tabelas que contêm 'foo' em qualquer lugar em seus nomes (incluindo 'comida', 'tolo' etc.).
Buttle Butkus

1
A abordagem para excluir tabelas aqui não é redundante e exagerada, dada a existência do --ignore-tableargumento? E se sim, não seria melhor descartar o script da resposta e apenas recomendar --ignore-table?
Mark Amery

@ codewaggle Isso dá o erro, a Illegal use of option --ignore-table=<database>.<table>menos que eu especifique a tabela como schemaname.tablename.
WAF

coisas legais, qualquer motivo variável SQL não é multi-line?
sdkks

72

Uma observação para expandir a resposta de RolandoMySQLDBA .

O script que ele incluiu é uma ótima abordagem para incluir ( and table_name in) ou excluir ( and table_name NOT in) uma lista de tabelas.

Se você apenas precisar excluir uma ou duas tabelas, poderá excluí-las individualmente com a --ignore-tableopção:

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

29

Quando você tem mais do que algumas tabelas, é muito melhor executar algo como isto:

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 algo assim:

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

Lembre-se de que esses comandos devem ser digitados em apenas uma linha.


11

Você pode fazer isso simplesmente usando o comando abaixo:

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

4
--ignore-table é para excluir certas tabelas do mysqldump, não para incluir. :)
Praveen Prasannan

3
No entanto, pode-se listar todas as tabelas a serem excluídas e despejar apenas as que restam :-)
Colin 'Hart Hart
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.