我想刪除以單詞開頭的所有數據庫。刪除名稱與模式匹配的多個數據庫
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