Ist es möglich, alle leeren Tabellen aus meiner riesigen Datenbank (MySQL) zu löschen?
Ich suche nach einem SQL-Befehl, um alle diese leeren Tabellen automatisch zu entfernen.
Derzeit habe ich 305 Tabellen in meinem Datensatz, und ungefähr 30% davon sind alte leere Tabellen, die in meiner neuen Anwendung nicht verwendet werden.
Nur um klarzustellen; Alle Tabellen sind vom Typ = MyISAM
Antworten:
Die Idee wäre wahrscheinlich, mit nach den leeren Tabellen zu suchen
INFORMATION_SCHEMA.TABLES
Dann können Sie möglicherweise eine SQL-Abfrage mit erstellen
Schnell und etwas schmutzig, sollte aber eigentlich funktionieren.
quelle
Da alle Tabellen MyISAM sind, ist meine Antwort leichter auszudrücken.
Zunächst müssen Sie INFORMATION_SCHEMA nach Tabellen mit null Zeilen abfragen:
Formulieren Sie als Nächstes die Abfrage, um die leeren Tabellen zu löschen:
Speichern Sie nun die Befehle in einer externen SQL-Textdatei.
Schauen Sie sich den Inhalt mit einer der folgenden Möglichkeiten an
less DropTables.sql
cat DropTables.sql
Wenn Sie mit dem Inhalt zufrieden sind, führen Sie das Skript aus:
oder melden Sie sich bei MySQL an und führen Sie es folgendermaßen aus:
Versuche es !!!
CAVEAT : Diese Technik funktioniert nur mit der MyISAM-Tabelle, da die Zeilenanzahl einer MyISAM-Tabelle physisch in der Tabelle gespeichert ist
.MYD
. Die Metadatentabelle INFORMATION_SCHEMA.TABLES liest dies immer und wird aktualisiert. VERSUCHEN SIE DAS NICHT MIT INNODB !!!UPDATE 05.02.2014 11:46 EST
Es gibt einen Grund, den ich ausgeschlossen habe
('information_schema','mysql','performance_schema')
Das
mysql
Schema enthält leere Tabellen. EinigeMyISAM
, einigeInnoDB
, einigeCSV
.Hier sind zum Beispiel meine Tabellen im MySQL-Schema für MySQL 5.6.15 auf meinem Desktop
Wenn einige dieser Tabellen verschwinden würden (wie
columns_priv
,proc_priv
,tables_priv
usw.), arbeitet die Gewährung Mechanismus möglicherweise nicht richtig oder verursachen kann mysqld nicht zu starten. Sie möchten auch mysql.proc nicht schlagen, da es die physische Heimat von gespeicherten Prozeduren ist. Andere Mechanismen funktionieren möglicherweise auch nicht, wenn Sie sie verwenden möchten, z. B. CrashSafe Replication mithilfe der InnoDB-Tabellen im MySQL-Schema, oder wenn Sie Zeitzoneninformationen einfügen möchten.UPDATE 05.02.2014 12:36 EST
Ich möchte Tom Desp aus einem bestimmten Grund für seine Antwort loben: Seine Syntax könnte das Löschen ohne Verwendung eines externen Skripts durchführen . Lassen Sie mich anhand seiner Idee den Befehl DROP TABLE in einer benutzerdefinierten Variablen erfassen.
Wenn die Ausgabe von
SELECT @DropCommand;
korrekt ist, führen Sie den folgenden Befehl aus:Dies eliminiert zwei Dinge:
quelle