1. 獲取mysql進程Id
ps -ef |grep -i mysql
2. 實時查看mysql進程中占用cpu凡泣,內(nèi)存最多的操作系統(tǒng)線程Id
top -Hp 6132
3. 根據(jù)操作系統(tǒng)線程id蜕猫,查看mysql數(shù)據(jù)庫中對應的線程id门驾,根據(jù)mysql數(shù)據(jù)庫的線程id獲取sql
- 連接mysql呐赡,用root用戶連接
mysql -u root -P 3306 -h 127.0.0.1 -p
一般情況倾芝,root用戶只允許本地登錄憔涉,是不允許遠程登錄订框,為了安全性
- 根據(jù)操作系統(tǒng)的線程id,查詢可疑的mysql的線程id
select thread_id,name ,PROCESSLIST_ID,THREAD_OS_ID from performance_schema.threads where thread_os_id =136942 ;
標紅的是mysql的線程id
- 根據(jù)mysql的線程id兜叨,查詢具體的sql
select sql_text from performance_schema.events_statements_current where thread_id =1254;
- 也可以兩個sql布蔗,一起使用
select sql_text from performance_schema.events_statements_current
where thread_id in ( select thread_id from performance_schema.threads where thread_os_id = 408271);
- 在mysql內(nèi)部藤违,快速查看可疑sql內(nèi)容
show processlist;
ps:Id為mysql線程id
select sql_text from performance_schema.events_statements_current where
thread_id in (select thread_id from performance_schema.threads where processlist_id = 15396);
4. 事務卡住情況
- 查詢當前運行的所有事務
mysql> SELECT * FROM information_schema.INNODB_TRX;
- 當前出現(xiàn)的鎖
mysql> SELECT * FROM information_schema.INNODB_LOCKs;
- 鎖等待的對應關系
mysql> SELECT * FROM information_schema.INNODB_LOCK_waits;
解釋:看事務表INNODB_TRX,里面是否有正在鎖定的事務線程纵揍,看看ID是否在show processlist里面的sleep線程中顿乒,如果是,就證明這個sleep的線程事務一直沒有commit或者rollback而是卡住了泽谨,我們需要手動kill掉璧榄。
搜索的結果是在事務表發(fā)現(xiàn)了很多任務,這時候最好都kill掉吧雹。
批量刪除事務表中的事務
我這里用的方法是:通過information_schema.processlist表中的連接信息生成需要處理掉的MySQL連接的語句臨時文件骨杂,然后執(zhí)行臨時文件中生成的指令。
mysql> select concat('KILL ',id,';') from information_schema.processlist p inner
join information_schema.INNODB_TRX x on p.id=x.trx_mysql_thread_id where db='test';
+------------------------+
| concat('KILL ',id,';') |
+------------------------+
| KILL 588379; |
| KILL 588313; |
| KILL 588275; |
+------------------------+
3 rows in set
kill掉以后再執(zhí)行SELECT * FROM information_schema.INNODB_TRX; 就是空了雄卷。
這時候系統(tǒng)就正常了