2009-01-19 99 views
48

在我需要丢弃大量数据库的服务器上运行mySQL(在对服务器进行一些测试之后)。我需要删除的所有数据库都有相同的前缀“Whatever_”。删除与某些通配符匹配的MySQL数据库?

在前缀后面,名称是随机的。所以你有你的Whatever_something,Whatever_232,Whatever_blabla,....,Whatever_imthelast。

我会做这个工作很多次,所以我想知道什么是最好的方法来做到这一点?

编辑: 我可以用任何一种语言或插入MySQL的...所以我们可以在某些方面做到这一点。现在,我问那个正在生成数据库的人给我一个.txt,每行的名字都是一行...所以即时编码一个快速的PHP,将采取一个文件,并删除其中的所有数据库,后来我会尝试答案的百分比(如果它的工作,它确实需要正确的答案,更简单的方法)。无论如何,我想这样做的更简单的方法怎么我将无法支持此代码(其他人会和你知道...)

编辑2: 使用通配符没有工作的:#1008 - 不能删除数据库'whatever_%';数据库不存在

回答

78

最基本的想法是在数据库中运行“show tables”,并使用其中的结果来选择你想要的 表。我不认为MySQL可以让你对“show tables”, 的结果集做任何事情,但我可能是错的。

下面是使用shell一个快速和肮脏的解决方案:

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 @@" 

这将打印出所有的shell命令来删除与“Whatever_”开头的表。如果您希望它实际执行这些命令,请删除单词“echo”。

编辑:我忘了解释上述!我不知道你是怎么熟悉shell脚本,但这里有云:

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

打印出所有表的列表,与标题“Tables_in_your_database_name”。从该输出通过管道(|符号的意思是“管道”,如在传入上)至下一个命令:

egrep "^Whatever_" 

搜索与开始的行(即^符号的意思是“像用”)的单词“Whatever_”,只打印这些。最后,我们管道将通过命令“Whatever_ *”表列出:

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

这需要在表名的列表中的每一行,并在命令插入它,而不是“@@”

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

所以,如果你有一堆名为 “Whatever_1”, “Whatever_2”, “Whatever_3” 表,生成的命令是:

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" 

这将输出如下:

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" 

我希望这是足够的细节,而且我不只是在信息太多的情况下殴打任何人。祝你好运,使用“DROP TABLE”命令时要小心!

+0

与我一样,它不会在`-e`后输出引号(```),它会输出这样的行:`mysql -u root -D joomla_test -e DROP TABLE bak_xlr1q_weblinks` using your exact bash script。I'm using Bash 4.1.5(1)-release。 – Hubro 2013-02-27 19:48:16

+0

@Codemonkey为了让引号出现,你可以将它们转义。用`\ DROP TABLE @@“替换` “DROP TABLE @@ \”` – scraimer 2013-02-28 09:35:28

-4

您可以尝试mysql 5 general purpose routine library (可从here下载)。使用它,你可以删除多个匹配正则表达式的表。我建议仔细检查正则表达式,以防止丢弃需要的表。

+0

我想你没看完整个问题。他想删除多个“数据库”而不是多表“表”。 – Xn0vv3r 2009-01-19 07:22:42

-1

抱歉,我们无法在使用SQL一次删除多个数据库命令

+1

我们可以使用sql命令一次删除多个表 – Adnan 2011-10-21 19:34:53

+0

DROP table table1,table2 ... – Adnan 2011-10-21 19:35:16

-7

使用

DROP {DATABASE | SCHEMA} [IF EXISTS] db_name 

语句described here

我不知道是否可以使用wildcars做这样的事情

DROP DATABASE Whatever_% 

,但我认为你应该尝试一下。

+0

#1008 - 无法删除数据库'whatever_%';数据库不存在aparently它只能在SELECT中工作 – DFectuoso 2009-01-19 07:20:28

1

以及我认为你不能删除MySql中的多个数据库。

但我有一个非常令人讨厌的解决方案。您可以使用C/C++/C#/ JAVA进行编程,在记事本或任何文本编辑器中多次打印“DROP DATABASE WHATEVER_<name>;”。之后,您可以将粘贴复制到MySql的客户端命令提示符中,然后就可以开始了。在每个DROP命令之后不要忘记“;”。

我相信这是可能的。试着写这个。

25

答案由scraimer的原则是正确的,但因为这个问题是有关数据库中删除数据库不是表,正确的命令应该是:

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

对于命令的解释,看看scraimer的解释。

最后一位...... \`@@ \` 我们有我们所得到的数据库名引述bacticks(')的情况下,我们的数据库名有特殊字符,如`-`

干杯

-1
DROP DATABASE `any-database_name`; 

我只是在我的数据库名称前后使用这个字符`(反向)。

11

我们可以用存储过程来做到这一点。下面是一个:

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 ; 

用数据库名称替换database_name(需要写入权限)。 放弃与模式XYZ电话,接着通过外卡输入作为XYZ的程序表,如下所示:

call droplike("XYZ%"); 
0

万一有人正在寻找一个简单的答案,反映scraimer浏览器

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(); 
    } 
} 

警告:但使用JDBC(我知道我是),这里有一个快速和肮脏的一个了,我所做的工作用Java编写的,不要表面上看这对客户甚至其他开发人员,如果你不要你的SQL服务器遭到洗劫。

1

这个(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)