總所周知,mysql下要想刪除某個庫下的某張表,只需要切換到該庫下,執行語句"drop table tablename"即可刪除!但若是該庫下有成百上千張表,要是再這樣一次次執行drop語句,就太費勁了!
正確的批量刪除某個庫下的所有表的方法只需如下兩步:
1)第一步(只需將下面的"庫名"替換成實際操作中的庫名即可)
select concat('drop table ',table_name,';') from information_schema.TABLES where table_schema='庫名';
2)第二步
切換到這個庫下,把第一步的執行結果匯出,然後全部執行
例如:
批量刪除kevin庫下的所有表
mysql> select concat('drop table ',table_name,';') from information_schema.TABLES where table_schema='kevin'; +--------------------------------------+ | concat('drop table ',table_name,';') | +--------------------------------------+ | drop table haha; | #只需要複製這裡的drop語句,放在一起批量貼上執行即可!(這裡kevin庫下就2張表,如果是N張表,就執行復制->貼上執行) | drop table heihei; | +--------------------------------------+ 2 rows in set (0.00 sec) mysql> use kevin; #切換到kevin庫下,然後執行將上面複製的drop語句,直接貼上執行即可! Database changed mysql> drop table haha; Query OK, 0 rows affected (0.09 sec) mysql> drop table heihei; Query OK, 0 rows affected (0.08 sec)
確實採用上面直接複製拼接語句查詢出來結果的方法,在多表情況下比較複雜,卻需要調整格式。優化方案是:將查詢結果直接匯出到檔案,再直接source 執行檔案。做法如下:
1)在mysql配置檔案裡新增資料匯出匯入許可權。 [root@localhost ~]# vim /etc/my.cnf ....... [mysqld] secure_file_priv=/opt/mysql/data //表示開啟mysql資料匯出匯入許可權,且限制匯出匯入只能發生在/opt/mysql/data目錄下 給指定的/opt/mysql/data目錄授予sql使用者許可權 [root@localhost ~]# chown -R mysql.mysql /opt/mysql 重啟mysql服務 [root@localhost ~]# /etc/init.d/mysqld restart Stopping mysqld: [ OK ] Starting mysqld: [ OK ] 將kevin庫下的所有表匯出到授權的/opt/mysql/data目錄下 mysql> select concat('drop table ',table_name,';') from information_schema.TABLES where table_schema='kevin'; +--------------------------------------+ | concat('drop table ',table_name,';') | +--------------------------------------+ | drop table anan; | | drop table beibei; | | drop table haha; | | drop table hehe; | | drop table heihei; | | drop table huihui; | | drop table huohuo; | | drop table jiajia; | | drop table jingjing; | | drop table liuliu; | | drop table popo; | | drop table qiuqiu; | | drop table renren; | | drop table youyou; | +--------------------------------------+ 14 rows in set (0.00 sec) 現在開始批量刪除kevin庫下的所有表 [root@localhost ~]# cat /opt/mysql/data/table.txt drop table anan; drop table beibei; drop table haha; drop table hehe; drop table heihei; drop table huihui; drop table huohuo; drop table jiajia; drop table jingjing; drop table liuliu; drop table popo; drop table qiuqiu; drop table renren; drop table youyou; mysql> select concat('drop table ',table_name,';') from information_schema.TABLES where table_schema='kevin' into outfile '/opt/mysql/data/table.txt'; Query OK, 14 rows affected (0.00 sec) mysql> source /opt/mysql/data/table.txt; Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> show tables; Empty set (0.00 sec) mysql>
==================關於Mysql資料匯出匯入引數secure_file_priv說明===================
MySQL 5.7版本後引入了secure_file_priv引數,這個引數用來限制資料匯入和匯出操作的效果,比如用來限制LOAD DATA, SELECT ... OUTFILE, and LOAD_FILE()傳到哪個指定目錄的,這些操作需要使用者具有FILE許可權。 在mysql配置檔案my.cnf的[mysqld]區域下配置:
1)如果這個引數設為空或"/",則MySQL服務允許將將資料匯出到任意目錄。
2)如果這個引數設為一個具體的目錄名,則MySQL服務只允許在此目錄中執行檔案匯入和匯出操作。這個目錄必須存在且設定為mysql使用者許可權,MySQL服務不會建立它;
3)如果這個引數為NULL,則MySQL服務會禁止匯入和匯出操作。
4)如果沒有這個引數配置,則Mysql服務預設是沒有開啟這個功能,即不能進行資料匯入匯出操作。
配置示例:
1)允許mysql資料匯入匯出,且匯出到任意目錄(注意匯出到的目錄許可權要是mysql.mysql) [root@localhost ~]# vim /usr/local/my.cnf [mysqld] ...... secure_file_priv= //或者配置成secure_file_priv="/" [root@localhost ~]# /etc/init.d/mysqld restart Stopping mysqld: [ OK ] Starting mysqld: [ OK ] 比如匯出到/mnt/data目錄下,則 [root@localhost ~]# mkdir /mnt/data [root@localhost ~]# chown -R mysql.mysql /mnt/data/ 登入mysql檢視secure-file-priv引數的值: mysql> select version(); +------------+ | version() | +------------+ | 5.6.39-log | +------------+ 1 row in set (0.02 sec) mysql> show global variables like '%secure%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | secure_auth | OFF | | secure_file_priv | / | +------------------+-------+ 2 rows in set (0.00 sec) 匯出到指定的/mnt/data/data.txt檔案中,該檔案不能是已存在狀態,mysql資料匯出的時候會自動建立該檔案。 [root@localhost ~]# mysql -p123456 mysql> select concat('drop table ',table_name,';') from information_schema.TABLES where table_schema='kevin' into outfile '/mnt/data/table.txt'; 刪除kevin庫下的所有表 mysql> use kevin; mysql> source /mnt/data/table.txt; mysql> show tables; //查詢kevin庫,發現所有表已經被刪除。 2)如果允許mysql資料匯出匯入,並限制匯出到指定的/opt/kevin/data下,則配置: [root@localhost ~]# vim /usr/local/my.cnf [mysqld] ...... secure_file_priv= /opt/kevin/data [root@localhost ~]# mkdir -p /opt/kevin/data [root@localhost ~]# chown -R mysql.mysql /opt/kevin/data 3)禁止mysql服務進行資料匯出匯入操作。 [root@localhost ~]# vim /usr/local/my.cnf [mysqld] ...... secure_file_priv= NULL [root@localhost ~]# mkdir -p /opt/kevin/data [root@localhost ~]# chown -R mysql.mysql /opt/kevin/data mysql> select concat('drop table ',table_name,';') from information_schema.TABLES where table_schema='kevin' into outfile '/opt/data/table.txt'; ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement mysql> 4)如果my.cnf裡沒有secure_file_priv這個引數配置,則預設是關閉這個功能,即不允許資料匯入匯出操作。 mysql> select concat('drop table ',table_name,';') from information_schema.TABLES where table_schema='kevin' into outfile '/opt/data/table.txt'; ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement