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?
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?
Antworten:
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.
Verwenden Sie die Tabellen information_schema , um die Metadaten zur Datenbank abzurufen, und löschen Sie die dort aufgelisteten Tabellen.
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 echo
Sie, nachdem Sie überprüft haben, dass es das tut, was Sie erwarten.
$''
bewirkt, dass Bash Sequenzen mit umgekehrten Schrägstrichen interpretiert, anstatt sie wörtlich zu nehmen. '\n'
würde genau \ n enthalten, einfach so, was $IFS
bedeuten 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 .
Kürzlich gab es einen Eintrag im Xaprb-Blog, der dies sehr gut behandelt.
Dazu gehört, warum das Verwenden INFORMATION_SCHEMA
nicht 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'
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: