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

Posted

技术标签:

【中文标题】如何删除具有特定前缀的所有 MySQL 数据库?【英文标题】:How can I drop all MySQL Databases with a certain prefix? 【发布时间】:2013-08-19 05:21:35 【问题描述】:

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

这是我想做的:

DROP DATABASE `database_*`;

我怎样才能有效地丢弃这些?有我可以运行的 MySQL 查询吗?也许是一个 shell 脚本?

【问题讨论】:

SHOW DATABASES LIKE 'database_%' 可能是一个不错的开始我很确定你可以去 Drop Database SHOW DATABASES LIKE "database_%" SHOW DATABASES LIKE "database_%" 有效,但与DROP DATABASE 结合使用时无效。 DROP DATABASE LIKE "database_%" 也不起作用。 @Raymond N:这是可能的。但也有可能这些数据库是由未清理的/用于测试(JUnit 测试)创建的,或者用于测试模式升级和回滚的更改部署的模式。还有一些其他的可能性可以解释为什么有很多(现在不需要)数据库。 @spencer7593 true 从来没有想过感谢您的评论。 SQL: deleting tables with prefix 的可能重复项 【参考方案1】:

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.)

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

【讨论】:

应该是 CONCAT('DROP DATABASE `',schema_name,'` ;') 否则你会在许多不同的场景中得到错误 - 比如当一个数据库名称包含一个破折号时。【参考方案2】:

不需要外部脚本文件。使用准备语句的存储过程可能会解决问题:

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

【讨论】:

是的。但就我个人而言,我认为我晚上难以入睡,白天会紧张不安,像这样的程序潜伏在我的一个 MySQL 实例上。但是DROP PROCEDURE kill_em_all 可以解决这个问题。【参考方案3】:

修改 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;

【讨论】:

嗨,warvariuc,我收到了有关代码的通知,但除了格式之外,我没有找到您更改的任何内容。我在这里想念什么???【参考方案4】:

如果不先创建文件,这个问题就没有答案。

我们的构建服务器会在运行单元测试时自动为每个主题分支创建一个数据库。在 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%

【讨论】:

以上是关于如何删除具有特定前缀的所有 MySQL 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除所有以某个前缀开头的 MySQL 表?

mysql查找一个数据库中所有特定前缀的表

使用 Newtonsoft JObject 中的特定前缀更新所有键

批量删除和修改特定前缀的mysql表

SQL如何查找和删除MYSQL数据库中包含特定字符串的记录

如何在 MySQL 中找到所有具有特定列名的表?