2011-03-28 73 views
16

我想删除以单词开头的所有数据库。删除名称与模式匹配的多个数据库

abc 
xyz 
cms_db1 
cms_db2 
cms_xyz 
pqr 

在上面给出的例子中,我想删除所有以“cms”开头的数据库。 我猜maatkit或shell脚本可以做到这一点。什么是最好的方法?

回答

8

Linux的方法:

#!/bin/bash 

DB_STARTS_WITH="cms" 
MUSER="root" 
MPWD="yourpass" 
MYSQL="mysql" 

DBS="$($MYSQL -u$MUSER -p$MPWD -Bse 'show databases')" 
for db in $DBS; do 

if [[ "$db" =~ "^${DB_STARTS_WITH}" ]]; then 
    echo "Deleting $db" 
    $MYSQL -u$MUSER -p$MPWD -Bse "drop database $db" 
fi 

done 

当然可以用在你自己的风险drop部分;)

+0

为我工作,但需要'drop database $ db',因为'drop $ db'导致语法错误 – 2013-08-15 20:38:02

+1

这对我来说只是默默地失败。 – paulwithap 2014-03-12 23:22:41

+2

正则表达式不起作用 – HorusKol 2014-08-07 23:55:41

10

我会使用类似:

echo "SHOW DATABASES LIKE 'cms_%'" \ 
    | mysql \ 
    | tail -n +2 \ 
    | xargs -n1 mysqladmin -f drop 

如果没有你在~/my.cnf中配置的默认用户名和密码,您可能需要通过-u和提供用户名和密码切换到上面的mysql/mysqladmin命令。

(编辑 - 添加-n ARG到尾。)

+0

请停止使用尾或头来跳过标题,请使用mysql-N代替:-) – Igor 2016-03-02 18:01:45

16

我必须提高,因为我的密码特殊字符的neurinos剧本,缺少“DROP DATABASE ......”而不是DB_STARTS_WITH表达工作比较。下面的脚本做Ubuntu的服务器上的工作:

#!/bin/bash 

DB_STARTS_WITH="grp" 
MUSER="root" 
MPWD="YOUR_PASSWORD" 
MYSQL="mysql" 

DBS="$($MYSQL -u $MUSER -p"$MPWD" -Bse 'show databases')" 
for db in $DBS; do 

if [[ "$db" == $DB_STARTS_WITH* ]]; then 
    echo "Deleting $db" 
    $MYSQL -u $MUSER -p"$MPWD" -Bse "drop database $db" 
fi 

done 
+0

你得到了什么错误? – bsmoo 2013-05-23 08:10:34

+0

对不起,很久以前,我不知道了...为什么? – swarley 2013-05-23 13:30:09

+0

对连字符的数据库名称的任何建议?我有无反引号的语法错误。 – paulwithap 2014-03-12 23:23:34

42

下面是两个查询纯MySQL的解决方案:

SELECT CONCAT('DROP DATABASE `', SCHEMA_NAME, '`;') 
FROM `information_schema`.`SCHEMATA` 
WHERE SCHEMA_NAME LIKE 'cms_%'; 

然后复制并粘贴结果记录和运行

+1

快速而简单 - 并且全部在MySQL命令行内完成。完美工作! – 2015-05-28 03:31:38

+1

比接受的答案好得多。 – SergeyA 2016-01-04 19:29:04

+5

你可以使用'-s'('--silent')标记到'mysql'去除结果周围的网格,使复制和粘贴更容易。 – 2016-06-09 00:05:14

0

一个Linux方式:

for db_name in $(mysql -u USER -pPASS -e "show databases like 'cms_%'" -ss) 
do 
    mysql -u USER -pPASS -e "drop database ${db_name}"; 
done 
1

如果您希望完全保留在MySQL/MariaDB中(即不使用bash scr ipts等)您可以执行以下操作:

DELIMITER // 
CREATE PROCEDURE clean() 
BEGIN 
    SET @query := (SELECT CONCAT('DROP DATABASE ', SCHEMA_NAME, ';') FROM `information_schema`.`SCHEMATA` WHERE SCHEMA_NAME LIKE 'dbtVDB%' LIMIT 1); 
    WHILE @query != '' DO 
     PREPARE stmt FROM @query; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 
     SET @query := (SELECT CONCAT('DROP DATABASE ', SCHEMA_NAME, ';') FROM `information_schema`.`SCHEMATA` WHERE SCHEMA_NAME LIKE 'cms%' LIMIT 1); 
    END WHILE; 
    DELETE FROM mysql.db WHERE mysql.db.Db LIKE 'cms%'; 
END; 
// 
DELIMITER ; 
CALL clean(); 
DROP PROCEDURE clean; 
+0

DELETE FROM mysql.db WHERE mysql.db.Db LIKE'cms%';是无关的 – Igor 2016-03-02 18:14:49

0

我喜欢从shell提示“for”循环的答案。在我的情况下,我有与我的数据库名称匹配的子目录名称,所以我创建了数组,然后在命令中使用它们。

(我本来可以使用mysql数据目录来做这件事,即使我没有安装过,在我的bitnami VM上,这是 /opt/bitnami/mysql/data。)

  1. 从文件的子集

    创建的数组:tbtdirs =(TBT * 2015 *)

  2. 测试潜在的鬼命令第一瓦特/ “回声”:在$ d {tbtdirs [@]};执行echo mysql -pPASS -e“drop database $ d”;完成

  3. 删除数组中的所有数据库:for $ in $ {tbtdirs [@]};做mysql -pPASS -e“drop database $ d”;完成

工作就像一个魅力!还修改了循环以删除子目录。在学习bash命令的有用之前,我使用了Linux命令行了相当长的一段时间。