我想删除以单词开头的所有数据库。删除名称与模式匹配的多个数据库
abc
xyz
cms_db1
cms_db2
cms_xyz
pqr
在上面给出的例子中,我想删除所有以“cms”开头的数据库。 我猜maatkit或shell脚本可以做到这一点。什么是最好的方法?
我想删除以单词开头的所有数据库。删除名称与模式匹配的多个数据库
abc
xyz
cms_db1
cms_db2
cms_xyz
pqr
在上面给出的例子中,我想删除所有以“cms”开头的数据库。 我猜maatkit或shell脚本可以做到这一点。什么是最好的方法?
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
部分;)
我会使用类似:
echo "SHOW DATABASES LIKE 'cms_%'" \
| mysql \
| tail -n +2 \
| xargs -n1 mysqladmin -f drop
如果没有你在~/my.cnf
中配置的默认用户名和密码,您可能需要通过-u
和提供用户名和密码切换到上面的mysql/mysqladmin命令。
(编辑 - 添加-n ARG到尾。)
请停止使用尾或头来跳过标题,请使用mysql-N代替:-) – Igor 2016-03-02 18:01:45
我必须提高,因为我的密码特殊字符的neurinos剧本,缺少“DROP DATABASE ......”而不是DB_STARTS_WITH表达工作比较。下面的脚本做Ubuntu的服务器上的工作:
#!/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
你得到了什么错误? – bsmoo 2013-05-23 08:10:34
对不起,很久以前,我不知道了...为什么? – swarley 2013-05-23 13:30:09
对连字符的数据库名称的任何建议?我有无反引号的语法错误。 – paulwithap 2014-03-12 23:23:34
下面是两个查询纯MySQL的解决方案:
SELECT CONCAT('DROP DATABASE `', SCHEMA_NAME, '`;')
FROM `information_schema`.`SCHEMATA`
WHERE SCHEMA_NAME LIKE 'cms_%';
然后复制并粘贴结果记录和运行
快速而简单 - 并且全部在MySQL命令行内完成。完美工作! – 2015-05-28 03:31:38
比接受的答案好得多。 – SergeyA 2016-01-04 19:29:04
你可以使用'-s'('--silent')标记到'mysql'去除结果周围的网格,使复制和粘贴更容易。 – 2016-06-09 00:05:14
一个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
如果您希望完全保留在MySQL/MariaDB中(即不使用bash scr ipts等)您可以执行以下操作:
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;
DELETE FROM mysql.db WHERE mysql.db.Db LIKE'cms%';是无关的 – Igor 2016-03-02 18:14:49
我喜欢从shell提示“for”循环的答案。在我的情况下,我有与我的数据库名称匹配的子目录名称,所以我创建了数组,然后在命令中使用它们。
(我本来可以使用mysql数据目录来做这件事,即使我没有安装过,在我的bitnami VM上,这是 /opt/bitnami/mysql/data。)
创建的数组:tbtdirs =(TBT * 2015 *)
测试潜在的鬼命令第一瓦特/ “回声”:在$ d {tbtdirs [@]};执行echo mysql -pPASS -e“drop database $ d”;完成
删除数组中的所有数据库:for $ in $ {tbtdirs [@]};做mysql -pPASS -e“drop database $ d”;完成
工作就像一个魅力!还修改了循环以删除子目录。在学习bash命令的有用之前,我使用了Linux命令行了相当长的一段时间。
为我工作,但需要'drop database $ db',因为'drop $ db'导致语法错误 – 2013-08-15 20:38:02
这对我来说只是默默地失败。 – paulwithap 2014-03-12 23:22:41
正则表达式不起作用 – HorusKol 2014-08-07 23:55:41