Wie lösche ich alle Tabellen in einer MySQL-Datenbank, ohne die Datenbank zu löschen?

12

Ich muss alle Tabellen in einer Datenbank löschen, ohne vorher deren Namen zu kennen. In der Regel wird die Datenbank gelöscht und anschließend neu erstellt, dies ist jedoch keine Option. Wie geht das am besten?

Angel Chiang
quelle
1
Wahrscheinlich hätte ich das vorher fragen sollen, aber besser spät als nie, nehme ich an: Welches Betriebssystem?
Jeff Snider
Unix / Linux-ähnliches Betriebssystem.
Angel Chiang

Antworten:

18

Es gibt einen einfacheren Bash- Einzeiler mit mysqldump (aus Thingy Ma Jig Blog ).

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

Wenn Sie diesen Fehler erhalten:

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

Versuche Folgendes:

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

Jetzt werden die Einschränkungen ignoriert.

Angel Chiang
quelle
5

Verwenden Sie die Tabellen information_schema , um die Metadaten zur Datenbank abzurufen, und löschen Sie die dort aufgelisteten Tabellen.

Joril
quelle
3

Sie können auch ein schnelles Shell-Skript verwenden:

#!/bin/bash

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

Entfernen echoSie, nachdem Sie überprüft haben, dass es das tut, was Sie erwarten.

Jeff Snider
quelle
Warum schreiben Sie übrigens '$' vor den IFS-Wert? Warum sieht es nicht aus wie "IFS = '\ n'"?
kolypto
@o_OTync Using $''bewirkt, dass Bash Sequenzen mit umgekehrten Schrägstrichen interpretiert, anstatt sie wörtlich zu nehmen. '\n'würde genau \ n enthalten, einfach so, was $IFSbedeuten würde, \ n und Zeichen aufzuteilen. $'\n'würde ein Newline-Zeichen enthalten, 0x0D. Weitere Informationen finden Sie hier: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Jeff Snider
Ich denke, das ist einfacher als mit der INFORMATION_SCHEMA.
Angel Chiang
0

Kürzlich gab es einen Eintrag im Xaprb-Blog, der dies sehr gut behandelt.

Dazu gehört, warum das Verwenden INFORMATION_SCHEMAnicht immer eine gute Sache ist und verweist auf ein Tool dieser lieben Leute bei Maatkit .

Versuchen Sie Folgendes mit mk-find:

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

Wenn Sie mit den Ergebnissen zufrieden sind, dann:

mk-find '<database>' --exec 'DROP TABLE %D.%N'
Dan Carley
quelle
-2

Wenn du Zugriff auf das Dateisystem hast, dann einfach rm -rf databasename/*:).

Die Anweisung Drop database macht dasselbe ... Auszug aus dem MySQL-Handbuch:

Die Anweisung DROP DATABASE entfernt aus dem angegebenen Datenbankverzeichnis die Dateien und Verzeichnisse, die MySQL im normalen Betrieb selbst erstellen kann:

Jauzsika
quelle
2
Extrem schlechte Idee für jede nicht-triviale Einrichtung, da MySQL nicht erwartet, dass diese Dateien plötzlich verschwinden und mitten in einer beliebigen Anzahl von Operationen, Transaktionen, Replikation, Sperren sein
könnten
Würden Sie in Betracht ziehen, Ihre Antwort dahingehend zu überarbeiten, dass sie die richtigen Befehle und Prozeduren enthält?
bot403