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.
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?
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.
Respostas:
Se você estiver descartando as tabelas t1, t2 e t3 do mydb
Se você possui várias tabelas em mydb e deseja despejar tudo, exceto t1, t2 e t3, faça o seguinte:
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.
fonte
SQL="${SQL} AND table_name NOT IN ('t1','t2','t3')"
paraSQL="${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.).--ignore-table
argumento? E se sim, não seria melhor descartar o script da resposta e apenas recomendar--ignore-table
?Illegal use of option --ignore-table=<database>.<table>
menos que eu especifique a tabela comoschemaname.tablename
.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-table
opção:fonte
Quando você tem mais do que algumas tabelas, é muito melhor executar algo como isto:
Ou algo assim:
Lembre-se de que esses comandos devem ser digitados em apenas uma linha.
fonte
Você pode fazer isso simplesmente usando o comando abaixo:
fonte