Como posso despejar uma tabela específica ou um conjunto de tabelas sem incluir o restante das tabelas db?
Como posso despejar uma tabela específica ou um conjunto de tabelas sem incluir o restante das tabelas db?
Respostas:
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 !!!
@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.
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.).
--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 como schemaname.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:
mysqldump -u -p etc. --ignore-table=Database.Table1 --ignore-table=Database.Table2 > dump_file.sql
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.
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