Wie lösche ich alle MySQL-Tabellen von der Kommandozeile?

29

Normalerweise öffne ich Terminal.app und verbinde mich mit einer entfernten MySQL-Datenbank.

Dann benutze ich diesen Befehl, um eine Tabelle zu löschen:

mysql> drop table [table name];

Aber was ich brauche, ist die Befehlszeile, um alle Tabellen in der Datenbank zu löschen.

Wenn ich benutze:

mysql> drop database [database name];

Ich werde die Datenbank komplett zerstören und keine Tabellen mehr erstellen können. Habe ich recht?

chefnelone
quelle

Antworten:

27

Sie können die Datenbank löschen und sofort neu erstellen:

mysql> drop database [database name];
mysql> create database [database name];

Sie können auch ein Skript verwenden, um jede Tabelle in der Datenbank zu löschen.

William Jackson
quelle
OK, nur um sicherzugehen: Ich verbinde mich mit der entfernten Datenbank im Terminal mit folgender Zeile: / Applications / MAMP / Library / bin / mysql -h 80.54.554.10 -u adm_user -p my_db . Muss ich nach dem Löschen und Erstellen der Datenbank diese Verbindungswerte ändern oder bleiben sie gleich?
Chefnelone
1
@chef - Das Löschen aller Tabellen und der gesamten Datenbank hat nicht den gleichen Effekt. Wenn Sie nur die Tabellen löschen, bleiben alle datenbankweiten Berechtigungen erhalten, nicht jedoch, wenn Sie die Datenbank löschen / neu erstellen.
Nifle
10
@chefnelone: ​​Sei vorsichtig !!! Durch das Löschen einer Datenbank werden auch gespeicherte Prozeduren und benutzerdefinierte Ansichten gelöscht.
RolandoMySQLDBA
Für mich ganz klar. Ich werde mit dem Skript gehen, um jede Tabelle zu löschen.
Chefnelone
1
Es ist völlig unsicher, siehe die Kommentare http://stackoverflow.com/a/12403742/1713660
Vladkras
10

Sie können den folgenden Befehl versuchen:

mysqldump --no-data --add-drop-table DB_NAME | grep ^DROP | mysql -v DB_NAME

Oder:

mysql --silent --skip-column-names -e "SHOW TABLES" DB_NAME | xargs -L1 -I% echo 'DROP TABLE `%`;' | mysql -v DB_NAME

Wo DB_NAMEist Ihr Datenbankname? Datenbankanmeldeinformationen können Sie entweder in angeben ~/.my.cnfoder dem Befehl hinzufügen (z -uroot -proot. B. ).

Diese Methode bietet einige Vorteile gegenüber dem Löschen und Erstellen der Datenbank, falls Ihr Datenbankbenutzer nicht berechtigt ist, die Datenbank zu löschen.

Kenorb
quelle
1
Zweites Beispiel bestätigt, genial. In db Referenzen als zusätzliche Flags vor --silentund -v/ --verbosebzw. wie:--user=username --password=password --host=host.name
hier
Gute Idee. Habe aber ein Problem, wenn es FOREIGN KEY gibt. Ich füge | sort -rzu Reverse Line, aber immer noch nicht kompatibel einige db.
Fancyoung
2

mysql -u USERHERE -pPASSWORDHERE --silent --skip-column-names -e "SHOW TABLES" DATABASENAMEHERE | xargs -L1 -I% echo 'SET FOREIGN_KEY_CHECKS = 0; DROP TABLE%;' | mysql -u USERHERE -pPASSWORDHERE -v DATABASENAMEHERE

sveilleux2
quelle
2
Willkommen bei Super User! Während dies die Frage beantworten mag, wäre es eine bessere Antwort, wenn Sie erklären könnten, warum dies so ist. Wir suchen nach umfassenden und qualitativ hochwertigen Antworten, die einige Erklärungen und Zusammenhänge enthalten. Geben Sie nicht nur eine einzeilige Antwort; Erklären Sie, warum Ihre Antwort richtig ist, idealerweise mit Zitaten. Antworten, die keine Erklärungen enthalten, werden möglicherweise entfernt. Überprüfen Sie auch Ihre Formatierung.
G-Man sagt, dass Monica
Vergessen Sie nicht, nach dem Löschen von Tabellen foreign_key_checks = 1 zu setzen: siehe stackoverflow.com/a/2873991/4306855 mysql -u USERHERE -pPASSWORDHERE --silent --skip-column-names -e "SHOW TABLES" DATABASENAMEHERE | xargs -L1 -I% echo 'SET FOREIGN_KEY_CHECKS = 0; DROP TABLE%; SET FOREIGN_KEY_CHECKS = 1; ' | mysql -u USERHERE -pPASSWORDHERE -v DATABASENAMEHERE
toto21