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?


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.



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.


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'

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


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
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.