16

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

这就是我想做的:

DROP DATABASE `database_*`;

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

4

4 回答 4

36

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

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

于 2013-08-16T18:17:26.537 回答
5

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

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
于 2013-08-16T18:59:37.750 回答
2

这个问题没有先创建文件就没有答案。

我们的构建服务器在运行单元测试时自动为每个主题分支创建一个数据库。在 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%
于 2016-05-25T06:51:18.263 回答
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;
于 2016-02-04T05:21:01.580 回答