2011-03-28 66 views
16

我想刪除以單詞開頭的所有數據庫。刪除名稱與模式匹配的多個數據庫

abc 
xyz 
cms_db1 
cms_db2 
cms_xyz 
pqr 

在上面給出的例子中,我想刪除所有以「cms」開頭的數據庫。 我猜maatkit或shell腳本可以做到這一點。什麼是最好的方法?

回答

8

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部分;)

+0

爲我工作,但需要'drop database $ db',因爲'drop $ db'導致語法錯誤 – 2013-08-15 20:38:02

+1

這對我來說只是默默地失敗。 – paulwithap 2014-03-12 23:22:41

+2

正則表達式不起作用 – HorusKol 2014-08-07 23:55:41

10

我會使用類似:

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

如果沒有你在~/my.cnf中配置的默認用戶名和密碼,您可能需要通過-u和提供用戶名和密碼切換到上面的mysql/mysqladmin命令。

(編輯 - 添加-n ARG到尾。)

+0

請停止使用尾或頭來跳過標題,請使用mysql-N代替:-) – Igor 2016-03-02 18:01:45

16

我必須提高,因爲我的密碼特殊字符的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 
+0

你得到了什麼錯誤? – bsmoo 2013-05-23 08:10:34

+0

對不起,很久以前,我不知道了...爲什麼? – swarley 2013-05-23 13:30:09

+0

對連字符的數據庫名稱的任何建議?我有無反引號的語法錯誤。 – paulwithap 2014-03-12 23:23:34

42

下面是兩個查詢純MySQL的解決方案:

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

然後複製並粘貼結果記錄和運行

+1

快速而簡單 - 並且全部在MySQL命令行內完成。完美工作! – 2015-05-28 03:31:38

+1

比接受的答案好得多。 – SergeyA 2016-01-04 19:29:04

+5

你可以使用'-s'('--silent')標記到'mysql'去除結果周圍的網格,使複製和粘貼更容易。 – 2016-06-09 00:05:14

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 
1

如果您希望完全保留在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; 
+0

DELETE FROM mysql.db WHERE mysql.db.Db LIKE'cms%';是無關的 – Igor 2016-03-02 18:14:49

0

我喜歡從shell提示「for」循環的答案。在我的情況下,我有與我的數據庫名稱匹配的子目錄名稱,所以我創建了數組,然後在命令中使用它們。

(我本來可以使用mysql數據目錄來做這件事,即使我沒有安裝過,在我的bitnami VM上,這是 /opt/bitnami/mysql/data。)

  1. 從文件的子集

    創建的數組:tbtdirs =(TBT * 2015 *)

  2. 測試潛在的鬼命令第一瓦特/ 「回聲」:在$ d {tbtdirs [@]};執行echo mysql -pPASS -e「drop database $ d」;完成

  3. 刪除數組中的所有數據庫:for $ in $ {tbtdirs [@]};做mysql -pPASS -e「drop database $ d」;完成

工作就像一個魅力!還修改了循環以刪除子目錄。在學習bash命令的有用之前,我使用了Linux命令行了相當長的一段時間。