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ć?


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.



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.


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'

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.