Eu preciso soltar todas as tabelas em um banco de dados sem saber seus nomes antes. O procedimento típico é descartar e recriar o banco de dados, mas essa não é uma opção. Qual é a melhor maneira de fazer isso?
Eu preciso soltar todas as tabelas em um banco de dados sem saber seus nomes antes. O procedimento típico é descartar e recriar o banco de dados, mas essa não é uma opção. Qual é a melhor maneira de fazer isso?
Respostas:
Existe uma linha simples do bash usando mysqldump (do Thingy Ma Jig Blog ).
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]
Se você está recebendo este erro:
ERROR 1217 (23000) at line 1: Cannot delete or update a parent row:
a foreign key constraint fails
Tente o seguinte:
(echo 'SET foreign_key_checks = 0;';
(mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] |
grep ^DROP);
echo 'SET foreign_key_checks = 1;') | \
mysql -u[USERNAME] -p[PASSWORD] -b [DATABASE]
Agora ele ignora as restrições.
Você deve usar as tabelas information_schema para buscar os metadados sobre o banco de dados e soltar as tabelas listadas lá.
Você também pode tentar um script rápido do shell:
#!/bin/bash
IFS=$'\n'
for table in `mysql <databaseName> -N -e 'show tables'`; do
echo mysql <databaseName> -e "drop table $table"
done
Remova echo
depois de verificar se ele fará o que você espera.
$''
faz com que o bash interprete sequências com barra invertida em vez de interpretá-las literalmente. '\n'
conteria exatamente \ n, exatamente assim, que $IFS
entenderia estar dividindo \ n caracteres. $'\n'
conteria um caractere de nova linha, 0x0D. Dê uma olhada aqui para obter mais informações: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Houve recentemente uma entrada no blog do Xaprb que aborda isso muito bem.
Inclui por que o uso INFORMATION_SCHEMA
nem sempre é uma coisa boa e faz referência a uma ferramenta dessas pessoas adoráveis do Maatkit .
Tente o seguinte com mk-find
:
mk-find '<database>' --printf 'DROP TABLE %D.%N'
Se você está satisfeito com os resultados, então:
mk-find '<database>' --exec 'DROP TABLE %D.%N'
Se você tiver acesso ao sistema de arquivos, apenas rm -rf databasename/*
:).
A instrução Drop database faz o mesmo ... Trecho do manual MySQL:
A instrução DROP DATABASE remove do diretório de banco de dados especificado os arquivos e diretórios que o próprio MySQL pode criar durante a operação normal: