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

T. *_*nes 12 mysql shell

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

这就是我想做的事情:

DROP DATABASE `database_*`;
Run Code Online (Sandbox Code Playgroud)

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

spe*_*593 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
Run Code Online (Sandbox Code Playgroud)

复制该查询的结果,您就拥有了一个SQL脚本.


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

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


Syl*_*oux 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;
Run Code Online (Sandbox Code Playgroud)

完成该程序后,您只需:

CALL kill_em_all();
Run Code Online (Sandbox Code Playgroud)

完成后:

DROP PROCEDURE kill_em_all
Run Code Online (Sandbox Code Playgroud)

  • 是的.但我个人认为我晚上睡不着觉,白天有一个紧张的抽搐,这样的程序潜伏在我的一个MySQL实例上.但是`DROP PROCEDURE kill_em_all`可以解决这个问题. (2认同)