Mysql:大量kill process id

mysql 被搞爛的時候 ex: 下錯 index , alert 錯, 屬性 ...
大量的 process 堆積又不能 stop mysql,我們需要一個大量 kill 的 script
先了解資料該從哪裡來:

mysql> show create table information_schema.processlist \G;
*************************** 1. row ***************************
       Table: PROCESSLIST
Create Table: CREATE TEMPORARY TABLE `PROCESSLIST` (
  `ID` bigint(21) unsigned NOT NULL DEFAULT '0',
  `USER` varchar(32) NOT NULL DEFAULT '',
  `HOST` varchar(64) NOT NULL DEFAULT '',
  `DB` varchar(64) DEFAULT NULL,
  `COMMAND` varchar(16) NOT NULL DEFAULT '',
  `TIME` int(7) NOT NULL DEFAULT '0',
  `STATE` varchar(64) DEFAULT NULL,
  `INFO` longtext,
  `TIME_MS` bigint(21) NOT NULL DEFAULT '0',
  `ROWS_SENT` bigint(21) unsigned NOT NULL DEFAULT '0',
  `ROWS_EXAMINED` bigint(21) unsigned NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8

當然你也可直接用show processlist , 不過還要自己拆解欄位,selete table 篩選語法也很直觀
接著我們可以利用T-SQL 來組合出我們要的語法:

select concat('KILL ',id,';') from information_schema.processlist
where user='root' and time > 200 and info like 'select %' into outfile '/var/lib/mysql-files/kill.txt';
# user =  root
# time  >  200 sec
# info 是 selet 開頭
# 然後寫到 /var/lib/mysql-files/ , 確認無誤後再輸入
  
mysql> source /var/lib/mysql-files/kill.txt;

## 補充知識
/var/lib/mysql-files/ 這個目錄是預設位置,如果你想改,正常會得到以下錯誤

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
執行以下語法查詢目前設定:

mysql> show global variables like '%secure_file_priv%';
# null 表示未設定

但這個值是維讀不能線上修改,必要的話要去改my.cnf ,然後重啟mysql
最無腦的就是設定,請留意安全性

secure_file_priv=''

其次是要寫入的目錄必需是mysql 的user 可寫,如我習慣用 mysql:mysql這個user:group 跑 mysql service ,
就必需 mysql 可以寫入,不然也是出錯

(Visited 60 times, 1 visits today)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *