2009-01-19 6 views
48

Ich führe mySQL in einem Server, wo ich Tonnen von Datenbanken (nach einigen Tests mit dem Server) fallen lassen muss. Alle Datenbanken, die ich löschen muss, haben das gleiche Präfix "Whatever_".Lassen Sie MySQL-Datenbanken mit einigen Platzhaltern übereinstimmen?

Nach dem Präfix sind die Namen zufällig. Also hast du dein Was auch immer, Was auch immer, Was auch immer, Was immer es ist.

Ich werde diesen Job einige Male machen, also fragte ich mich, was wäre der beste Weg, dies zu tun?

EDIT: Ich kann jede Art von Sprache oder Plug-in für MySQL verwenden ... so können wir dies in gewisser Weise tun. Im Moment habe ich den Typ, der die Datenbanken erzeugt, gebeten, mir eine .txt mit jedem Namen in einer Zeile zu geben ... also ich schreibe einen schnellen PHP, der eine Datei nimmt und alle Datenbanken löscht, später werde ich es versuchen die% Antwort (wenn es funktioniert, nimmt es die richtige Antwort, es ist der leichtere Weg). Auf jeden Fall würde Ich mag diese der einfachere Weg Coz tun, ich in der Lage sein werde nicht diesen Code zu unterstützen (andere Jungs und Sie wissen, ...)

bearbeiten 2: Die Verwendung eines Wildcard hat nicht funktioniert: # 1008 - Die Datenbank 'whatever_%' kann nicht gelöscht werden. Datenbank existiert nicht

Antwort

78

Die Grundidee besteht darin, "show tables" in Ihrer Datenbank auszuführen und die Ergebnisse daraus zu verwenden, um die gewünschten Tabellen auszuwählen. Ich glaube nicht, dass MySQL Sie etwas mit der Ergebnismenge von "Tabellen anzeigen" tun kann, aber ich bin wahrscheinlich falsch.

Hier ist eine schnelle und unsaubere Lösung mit der Schale:

mysql -u your_user -D your_database_name -e "show tables" -s | 
    egrep "^Whatever_" | 
    xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@" 

, dass all Shell wird auszudrucken Befehle, um die Tabellen mit „Whatever_“ beginnen zu fallen. Wenn Sie möchten, dass diese Befehle tatsächlich ausgeführt werden, entfernen Sie das Wort "echo".

EDIT: Ich habe vergessen, das oben zu erklären! Ich weiß nicht, wie vertraut Sie mit Shell-Skripten, aber hier geht:

mysql -u your_user -D your_database_name -e "show tables" -s 

druckt eine Liste aller Tabellen, mit dem Header „Tables_in_your_database_name“.Der Ausgang von dem geleitet wird (das | Symbol bedeutet „verrohrt“, wie in vergangen-on) durch den nächsten Befehl:

egrep "^Whatever_" 

sucht nach allen Zeilen, die beginnen, (d^Symbole bedeuten „Wesen“), das Wort "Whatever_" und druckt nur diese. Schließlich haben wir Rohr, das Liste der „Whatever_ *“ Tabellen über den Befehl:

xargs -I "@@" echo mysql -u your_user -D your_database_name -e "DROP TABLE @@" 

, das jede Zeile in der Liste der Tabellennamen nimmt, und fügt sie statt dem „@@“ in dem Befehl

echo mysql -u your_user -D your_database_name -e "DROP TABLE @@" 

Also, wenn Sie eine Reihe von Tabellen mit dem Namen "Whatever_1" haben, "Whatever_2", "Whatever_3", würden die erzeugten Befehle:

echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1" 
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2" 
echo mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3" 

welcher Ausgang des folgenden würde:

mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_1" 
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_2" 
mysql -u your_user -D your_database_name -e "DROP TABLE Whatever_3" 

Ich hoffe, das war genug Detail, und dass ich nicht nur jemanden mit zu vielen Informationen über den Kopf schlagen. Viel Glück, und seien Sie vorsichtig, wenn Sie den Befehl "DROP TABLE" verwenden!

+0

Bei mir es nicht geben die Anführungszeichen ('" ') nach' -e' Es gibt Zeilen wie diese:. 'mysql -u root -D joomla_test -e DROP TABLE bak_xlr1q_weblinks' Ihren genauen bash-Skript verwenden. ich verwende bash 4.1.5 (1) -release. – Hubro

+0

@Codemonkey die Zitate erscheinen zu lassen, können Sie sie entweichen können. Ersetzen Sie ' "DROP TABLE @@"' mit '\ „DROP TABLE @@ \“ ' – scraimer

-4

Sie können versuchen, die mysql 5 general purpose routine library (downloadbar von here). Wenn Sie es verwenden, können Sie mehrere Tabellen löschen, die einem regulären Ausdruck entsprechen. Ich schlage vor, den regulären Ausdruck sorgfältig zu überprüfen, um zu verhindern, dass Sie Tische fallen lassen, die Sie benötigen.

+0

Ich denke, du hast die ganze Frage nicht gelesen. Er möchte mehrere "Datenbanken" nicht mehrere "Tabellen" fallen lassen. – Xn0vv3r

-1

Leider können wir nicht mehrere Datenbanken gleichzeitig fallen SQL-Befehle

+1

können wir mehrere Tabellen zu einem Zeitpunkt unter Verwendung von SQL-Befehlen – Adnan

+0

DROP Tabelle table1, table2 ... – Adnan

-7

Verwenden Sie die

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name 

Aussage als described here.

Ich weiß nicht, ob Sie wildcars verwenden können, so etwas wie

DROP DATABASE Whatever_% 

zu tun, aber ich denke, man sollte es versuchen.

+0

# 1008 fallen - Kann nicht fallen Datenbank 'whatever_%'; Datenbank nicht aparently existiert es funktioniert nur in der SELECT- – DFectuoso

1

Nun, ich denke, dass Sie nicht mehrere Datenbanken in MySql löschen können.

Aber ich habe eine sehr geeky Lösung. Sie können in C/C++/C#/JAVA programmieren, um oft "DROP DATABASE WHATEVER_<name>;" in einen Notizblock oder einen Texteditor zu drucken. Danach können Sie in die Client-Eingabeaufforderung von MySql einfügen und los gehts. Vergessen Sie nicht die ";" nach jedem DROP Befehl.

Ich glaube, das ist möglich. Versuche es zu schreiben.

25

Das Prinzip der Antwort von scraimer ist richtig, aber da die Frage nach war in einer Datenbank eine Datenbank keine Tabelle löschen, um den richtigen Befehl sein sollte:

mysql -u your_username -p'your password' -e 'show databases' 
| grep Whatever_* 
| xargs -I "@@" mysql -u your_username -p'your password' -e "DROP database \`@@\`" 

Erläuterungen des Befehls , siehe scrimer 's Erklärung.

Das letzte Stück ... \ `@@ \` haben wir unsere resultierenden Datenbanknamen (`) im Falle unserer Datenbank Namen hat Sonderzeichen wie` -`

Prost

+0

Für mich war es besser, Regulärer Ausdruck im grep Teil zu verwenden: |„ * _ backup“' grep -e 'alle Datenbanken mit der Endung‚_backup‘wählt – Yeti

-1
in bacticks zitiert
DROP DATABASE `any-database_name`; 

Ich benutze einfach dieses Zeichen ` (Backtick) vor und nach dem Namen meiner Datenbank.

11

Wir können dies mit gespeicherten Prozeduren tun. Hier ist eine unter:

drop procedure if exists droplike; 
delimiter // 
create procedure droplike(pattern varchar(20)) 
begin 
    set group_concat_max_len = 65535; 
    select @drop:= concat('drop table ', group_concat(table_name) , ';') from information_schema.tables where table_schema = "database_name" and table_name like pattern; 
    prepare statement from @drop; 
    execute statement; 
end // 
delimiter ; 

Ersetzen Sie Datenbankname durch den Namen der Datenbank (Schreibberechtigung erforderlich). Zum Löschen von Tabellen mit Mustern XYZ Aufruf der Prozedur mit dem Eingang als XYZ von Wild Card gefolgt wie unten angegeben:

call droplike("XYZ%"); 
+0

Einige SQL-Dialekte ermöglichen komma separierte Listen wie folgt aus: DROP TABLE "table1_bits", "table2_links", "table3_stuff"; ' – MarkHu

0

Falls jemand für eine einfache Antwort suchen, scraimer und Explorer ‚Spiegel s sondern ist in Java geschrieben JDBC (ich weiß, ich war), hier ist eine schnelle und schmutzige eine, die den Job für mich getan hat:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 

public class DatabaseDeleter { 
    // Pass your database wildcard as the only argument to program ("%MY_CRAZY_PATTERN%") 
    public void main(String[] args) throws SQLException, ClassNotFoundException{ 

     Class.forName("com.mysql.jdbc.Driver"); 
     Connection connection = DriverManager.getConnection("jdbc:mysql://databaseURL"); 
     PreparedStatement pst = connection.prepareStatement("show databases like ?"); 
     pst.setString(1, args[0]); 
     ResultSet rs = pst.executeQuery(); 

     ArrayList<String> databases = new ArrayList<String>(); 
     while (rs.next()) databases.add(rs.getString(1)); 

     for (String s : databases){ 
      Statement st = connection.createStatement(); 
      st.execute("drop database " + s); 
     } 
     connection.close(); 
    } 
} 

Achtung: diese Mitteilung nicht an den Kunden der Oberfläche oder auch andere Entwickler, wenn Sie Ich will nicht dein SQL Server wurde durchsucht.

1

was diesen (Jython)?

rs = stmt.executeQuery("SHOW DATABASES LIKE 'Whatever_%'") 
databases_for_dropping = [] 
while rs.next(): 
    databases_for_dropping.append(rs.getString(1)) 
for database_for_dropping in databases_for_dropping: 
    stmt.execute("DROP DATABASE %s" % database_for_dropping) 
Verwandte Themen