如何删除具有特定前缀的所有MySQL数据库?

时间:2013-08-16 18:00:42

标签: mysql shell

我需要删除数百个共享公共前缀的mysql数据库,但是随机ID是其名称的其余部分(例如,database_0123456789,database_9876543210)。所有这些数据库都在同一台服务器上。在同一台服务器上还有其他数据库,我不想放弃。

这就是我想要做的事情:

DROP DATABASE `database_*`;

如何有效地放弃这些?我可以运行MySQL查询吗?也许是一个shell脚本?

4 个答案:

答案 0 :(得分:28)

DROP DATABASE语句的语法仅支持单个数据库名称。您需要为每个数据库执行单独的DROP DATABASE语句。

您可以运行查询以返回数据库名称列表,或者可能更有帮助,以生成您需要运行的实际语句。如果要删除以文字字符串database_开头的所有数据库(包括下划线字符),则:

SELECT CONCAT('DROP DATABASE `',schema_name,'` ;') AS `-- stmt`
  FROM information_schema.schemata
 WHERE schema_name LIKE 'database\_%' ESCAPE '\\'
 ORDER BY schema_name

从该查询中复制结果,您就拥有了一个SQL脚本。


(将结果保存为纯文本文件(例如dropdbs.sql),使用您喜欢的文本编辑器查看以删除任何愚蠢的页眉和页脚行,确保脚本看起来正确,保存,然后从mysql命令行工具,mysql> source dropdbs.sql。)

显然,你可能会比这更复杂,但对于一次性拍摄,这可能是最有效的。)

答案 1 :(得分:5)

不需要外部脚本文件。使用prepare语句的存储过程可能会起到作用:

CREATE PROCEDURE kill_em_all()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE dbname VARCHAR(255);
    DECLARE cur CURSOR FOR SELECT schema_name
      FROM information_schema.schemata
     WHERE schema_name LIKE 'database\_%' ESCAPE '\\'
     ORDER BY schema_name;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO dbname;

        IF done THEN
          LEAVE read_loop;
        END IF;

        SET @query = CONCAT('DROP DATABASE ',dbname);
        PREPARE stmt FROM @query;
        EXECUTE stmt;
    END LOOP;
END;

完成该程序后,您只需:

CALL kill_em_all();

完成后:

DROP PROCEDURE kill_em_all

答案 2 :(得分:1)

这个问题在没有先创建文件的情况下缺少答案。

我们的构建服务器在运行单元测试时自动为每个主题分支创建数据库。在information_schema查询之后变得非常慢,导致我们的测试失败。

我创建了一个每天运行的批处理文件。我不想处理临时文件。所以这是我的解决方案。

@ECHO OFF
REM drops all databases excluding defaults
SET user=user
SET pass=pass

mysql ^
-u %user% ^
-p%pass% ^
-NBe "SELECT CONCAT('drop database `', schema_name, '`;') from information_schema.schemata where schema_name NOT IN ('mysql', 'test', 'performance_schema', 'information_schema')" | mysql -u %user% -p%pass%

答案 3 :(得分:0)

修改spencer7593答案

以下是查找所需结果并将其保存在前缀为数据库前缀

的文件中的命令
 SELECT CONCAT('DROP DATABASE ',schema_name,' ;') AS stmt
 FROM information_schema.schemata
 WHERE schema_name LIKE 'prefix\_%' ESCAPE '\\'
 ORDER BY schema_name into outfile '/var/www/pardeep/file.txt';

如果您获得权限被拒绝,则将文件夹权限更改为777或使用此

将文件夹组更改为mysql
chown -R mysql /var/www/pardeep/

然后运行此查询

source /var/www/pardeep/file.txt;