Jak usunąć wszystkie tabele z bazy danych MySQL bez upuszczania bazy danych?

12

Muszę upuścić wszystkie tabele w bazie danych, nie znając wcześniej ich nazw. Typową procedurą jest upuszczenie, a następnie odtworzenie bazy danych, ale nie jest to opcja. Jak najlepiej to zrobić?

Angel Chiang
źródło
1
Prawdopodobnie powinienem był o to zapytać wcześniej, ale lepiej późno, niż przypuszczam: jaki system operacyjny?
Jeff Snider
Unix / Linux jak OS.
Angel Chiang

Odpowiedzi:

18

Istnieje prostszy bash one-liner za pomocą mysqldump (z Thingy Ma Jig Blog ).

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

Jeśli pojawia się ten błąd:

ERROR 1217 (23000) at line 1: Cannot delete or update a parent row: 
    a foreign key constraint fails

Spróbuj wykonać następujące czynności:

(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]

Teraz ignoruje ograniczenia.

Angel Chiang
źródło
5

Powinieneś użyć tabel Information_schema, aby pobrać metadane dotyczące bazy danych, a następnie upuścić wymienione tam tabele.

Joril
źródło
3

Możesz również wypróbować szybki skrypt powłoki:

#!/bin/bash

IFS=$'\n'
for table in `mysql <databaseName> -N -e 'show tables'`; do
    echo mysql <databaseName> -e "drop table $table"
done

Usuń echopo sprawdzeniu, że zrobi to, czego oczekujesz.

Jeff Snider
źródło
Nawiasem mówiąc, dlaczego piszesz „$” przed wartością IFS? Dlaczego to nie wygląda jak „IFS = '\ n”?
kolypto
@o_OTync Użycie $''powoduje, że bash interpretuje sekwencje odwrócone zamiast traktować je dosłownie. '\n'zawiera dokładnie \ n, dokładnie tak, co $IFSrozumiałoby podział na znaki \ in. $'\n'będzie zawierał znak nowej linii 0x0D. Zajrzyj tutaj, aby uzyskać więcej informacji: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Jeff Snider,
Myślę, że jest to prostsze niż użycie Information_SCHEMA.
Angel Chiang
0

Niedawno na blogu Xaprb pojawił się wpis, który ładnie to opisuje.

Obejmuje to, dlaczego używanie INFORMATION_SCHEMAnie zawsze jest dobrą rzeczą i odwołuje się do narzędzia od tych uroczych ludzi w Maatkit .

Spróbuj wykonać następujące czynności z mk-find:

mk-find '<database>' --printf 'DROP TABLE %D.%N'

Jeśli jesteś zadowolony z wyników, to:

mk-find '<database>' --exec 'DROP TABLE %D.%N'
Dan Carley
źródło
-2

Jeśli masz dostęp do systemu plików, to po prostu rm -rf databasename/*:).

Instrukcja Drop bazy danych robi to samo ... Fragment podręcznika MySQL:

Instrukcja DROP DATABASE usuwa z podanego katalogu bazy danych te pliki i katalogi, które sam MySQL może utworzyć podczas normalnej pracy:

Jauzsika
źródło
2
Niezwykle zły pomysł na jakąkolwiek nietrywialną konfigurację, ponieważ MySQL nie spodziewa się, że te pliki nagle znikną i może być w trakcie dowolnej liczby operacji, transakcji, replikacji, blokad ...
bot403
Czy w takim razie zastanowiłbyś się nad poprawieniem swojej odpowiedzi w celu uwzględnienia odpowiednich poleceń i procedury?
bot403