Como soltar todas as tabelas em um banco de dados MySQL sem soltar o banco de dados?

12

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?

Angel Chiang
fonte
1
Provavelmente deveria ter perguntado isso antes, mas antes tarde do que nunca, suponho: Qual SO?
Jeff Snider
Unix / Linux como sistema operacional.
Angel Chiang

Respostas:

18

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.

Angel Chiang
fonte
5

Você deve usar as tabelas information_schema para buscar os metadados sobre o banco de dados e soltar as tabelas listadas lá.

Joril
fonte
3

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 echodepois de verificar se ele fará o que você espera.

Jeff Snider
fonte
A propósito, por que você escreve '$' antes do valor do IFS? Por que não se parece com "IFS = '\ n'"?
Kolypto #
@o_OTync O uso $''faz com que o bash interprete sequências com barra invertida em vez de interpretá-las literalmente. '\n'conteria exatamente \ n, exatamente assim, que $IFSentenderia 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 .
9139 Jeff Snider
Eu acho que isso é mais simples do que usar o INFORMATION_SCHEMA.
Angel Chiang
0

Houve recentemente uma entrada no blog do Xaprb que aborda isso muito bem.

Inclui por que o uso INFORMATION_SCHEMAnem 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'
Dan Carley
fonte
-2

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:

Jauzsika
fonte
2
Extremamente má idéia para qualquer configuração não-trivial como MySQL não está esperando esses arquivos para desaparecer de repente e poderia estar no meio de qualquer número de operações, transações, replicação, fechaduras ...
bot403
Você consideraria revisar sua resposta para incluir os comandos e procedimentos adequados?
Bot403