删除名称与模式匹配的多个数据库

时间:2011-03-28 09:51:43

标签: mysql

我想删除所有以单词开头的数据库。

abc
xyz
cms_db1
cms_db2
cms_xyz
pqr

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

10 个答案:

答案 0 :(得分:57)

这是两个查询中的纯mySQL解决方案:

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

然后复制并粘贴生成的记录集并运行

答案 1 :(得分:17)

我必须改进neurinos脚本,因为我的密码中有特殊的字符,丢失了“DATABASE ...'并且没有对DB_STARTS_WITH表达式进行比较。以下脚本适用于Ubuntu Server:

#!/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

答案 2 :(得分:10)

我会使用类似的东西:

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

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

(编辑 - 将-n arg添加到尾部。)

答案 3 :(得分:9)

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部分需要您自担风险;)

答案 4 :(得分:2)

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

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;

答案 5 :(得分: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

答案 6 :(得分:0)

我喜欢这个答案,建议" for"从shell循环。在我的例子中,我有与我的数据库名称匹配的子目录名称,所以我创建了数组,然后在命令中使用它们。

(我可以使用mysql数据目录来实现这一点,即使我没有进行过我的设置。在我的bitnam VM上这是 的/ opt / bitnami / MySQL的/数据。)

  1. 从文件子集创建数组:tbtdirs =(tbt * 2015 *)

  2. 在$ {tbtdirs [@]}中测试了一个潜在的幽灵般的命令w /" echo":d做echo mysql -pPASS -e" drop database $ d&#34 ;;完成

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

  4. 像魅力一样工作!还修改了循环以删除子目录。在学习bash命令的有用之前,我使用Linux命令行已经有一段时间了。

答案 7 :(得分:0)

使用@léo-alves-de-araujo我已将其修改为从命令行(使用linux)询问用户/密码(更安全的方式)

#!/bin/bash 
echo -n "Enter Mysql User:"
read user
echo -n "Enter Mysql Password:"
read -s password
for db_name in $(mysql -u $user --password=$password -e "SHOW DATABASES LIKE 'cms_%'" -ss 2>/dev/null)
do
        mysql -u $user --password=$password -e "DROP DATABASE ${db_name}" 2>/dev/null;
done

答案 8 :(得分:0)

改进了@neurino解决方案,以避免在脚本中存储MySQL凭据并通过命令行传递它们(它可能在进程列表中可见)

#!/bin/bash

DB_STARTS_WITH="cms"
MYSQL="mysql"

read -p "Enter MySQL user name: " MYSQL_USER
read -s -p "Enter password: " MYSQL_PASSWORD

CREDENTIALS_FILE="$(mktemp)"
chmod 600 $CREDENTIALS_FILE
cat > $CREDENTIALS_FILE <<- EOM
[client]
user=$MYSQL_USER
password=$MYSQL_PASSWORD
EOM

trap "{ rm -f $CREDENTIALS_FILE; }" EXIT

DATABASES="$(echo "show databases;" | $MYSQL --defaults-file=$CREDENTIALS_FILE)"

for DATABASE in $DATABASES; do
    if [[ $DATABASE =~ ^${DB_STARTS_WITH} ]]; then
        echo Removing $DATABASE...
        echo "drop database $DATABASE" | $MYSQL --defaults-file=$CREDENTIALS_FILE
    fi
done

答案 9 :(得分:0)

通过{em> @cloakedninjas 在excellent answer上进行改进,以便更轻松地检索所有查询以在单个字符串中执行。

首先,您可以为此特定会话将group_concat_max_len的最大值设置为可能的最大值:

SET SESSION group_concat_max_len = @@max_allowed_packet;

现在,您可以使用SQL准备查询字符串(稍后执行)。使用information_schema,我们可以获得与模式匹配的所有数据库的名称。现在,使用Concat()准备单个DROP DATABASE ..查询,然后利用Group_Concat()将它们全部合并为一个字符串,以便于检索。

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

现在将字符串复制到query_to_execute中并单独运行。