主頁 > 知識(shí)庫 > MySQL 查看鏈接及殺掉異常鏈接的方法

MySQL 查看鏈接及殺掉異常鏈接的方法

熱門標(biāo)簽:地圖標(biāo)注費(fèi)用是多少 啥是企業(yè)400電話辦理 曲靖移動(dòng)外呼系統(tǒng)公司 電話外呼系統(tǒng)改號(hào) 怎樣在地圖標(biāo)注銷售區(qū)域 百應(yīng)電話機(jī)器人優(yōu)勢(shì) 外呼系統(tǒng)打電話上限是多少 武漢網(wǎng)絡(luò)外呼系統(tǒng)服務(wù)商 南昌三維地圖標(biāo)注

前言: 

在數(shù)據(jù)庫運(yùn)維過程中,我們時(shí)常會(huì)關(guān)注數(shù)據(jù)庫的鏈接情況,比如總共有多少鏈接、有多少活躍鏈接、有沒有執(zhí)行時(shí)間過長的鏈接等。數(shù)據(jù)庫的各種異常也能通過鏈接情況間接反應(yīng)出來,特別是數(shù)據(jù)庫出現(xiàn)死鎖或嚴(yán)重卡頓的時(shí)候,我們首先應(yīng)該查看數(shù)據(jù)庫是否有異常鏈接,并殺掉這些異常鏈接。本篇文章將主要介紹如何查看數(shù)據(jù)庫鏈接及如何殺掉異常鏈接的方法。

  1.查看數(shù)據(jù)庫鏈接

查看數(shù)據(jù)庫鏈接最常用的語句就是 show processlist 了,這條語句可以查看數(shù)據(jù)庫中存在的線程狀態(tài)。普通用戶只可以查看當(dāng)前用戶發(fā)起的鏈接,具有 PROCESS 全局權(quán)限的用戶則可以查看所有用戶的鏈接。

show processlist 結(jié)果中的 Info 字段僅顯示每個(gè)語句的前 100 個(gè)字符,如果需要顯示更多信息,可以使用 show full processlist 。同樣的,查看 information_schema.processlist 表也可以看到數(shù)據(jù)庫鏈接狀態(tài)信息。

# 普通用戶只能看到當(dāng)前用戶發(fā)起的鏈接
mysql> select user();
+--------------------+
| user()             |
+--------------------+
| testuser@localhost |
+--------------------+
1 row in set (0.00 sec)

mysql> show grants;
+----------------------------------------------------------------------+
| Grants for testuser@%                                                |
+----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'testuser'@'%'                                 |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `testdb`.* TO 'testuser'@'%' |
+----------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> show processlist;
+--------+----------+-----------+--------+---------+------+----------+------------------+
| Id     | User     | Host      | db     | Command | Time | State    | Info             |
+--------+----------+-----------+--------+---------+------+----------+------------------+
| 769386 | testuser | localhost | NULL   | Sleep   |  201 |          | NULL             |
| 769390 | testuser | localhost | testdb | Query   |    0 | starting | show processlist |
+--------+----------+-----------+--------+---------+------+----------+------------------+
2 rows in set (0.00 sec)

mysql> select * from information_schema.processlist;
+--------+----------+-----------+--------+---------+------+-----------+----------------------------------------------+
| ID     | USER     | HOST      | DB     | COMMAND | TIME | STATE     | INFO                                         |
+--------+----------+-----------+--------+---------+------+-----------+----------------------------------------------+
| 769386 | testuser | localhost | NULL   | Sleep   |  210 |           | NULL                                         |
| 769390 | testuser | localhost | testdb | Query   |    0 | executing | select * from information_schema.processlist |
+--------+----------+-----------+--------+---------+------+-----------+----------------------------------------------+
2 rows in set (0.00 sec)

# 授予了PROCESS權(quán)限后,可以看到所有用戶的鏈接
mysql> grant process on *.* to 'testuser'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants;
+----------------------------------------------------------------------+
| Grants for testuser@%                                                |
+----------------------------------------------------------------------+
| GRANT PROCESS ON *.* TO 'testuser'@'%'                               |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `testdb`.* TO 'testuser'@'%' |
+----------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> show processlist;
+--------+----------+--------------------+--------+---------+------+----------+------------------+
| Id     | User     | Host               | db     | Command | Time | State    | Info             |
+--------+----------+--------------------+--------+---------+------+----------+------------------+
| 769347 | root     | localhost          | testdb | Sleep   |   53 |          | NULL             |
| 769357 | root     | 192.168.85.0:61709 | NULL   | Sleep   |  521 |          | NULL             |
| 769386 | testuser | localhost          | NULL   | Sleep   |  406 |          | NULL             |
| 769473 | testuser | localhost          | testdb | Query   |    0 | starting | show processlist |
+--------+----------+--------------------+--------+---------+------+----------+------------------+
4 rows in set (0.00 sec)

通過 show processlist 所得結(jié)果,我們可以清晰了解各線程鏈接的詳細(xì)信息。具體字段含義還是比較容易理解的,下面具體來解釋下各個(gè)字段代表的意思:

  • Id:就是這個(gè)鏈接的唯一標(biāo)識(shí),可通過 kill 命令,加上這個(gè)Id值將此鏈接殺掉。
  • User:就是指發(fā)起這個(gè)鏈接的用戶名。
  • Host:記錄了發(fā)送請(qǐng)求的客戶端的 IP 和 端口號(hào),可以定位到是哪個(gè)客戶端的哪個(gè)進(jìn)程發(fā)送的請(qǐng)求。
  • db:當(dāng)前執(zhí)行的命令是在哪一個(gè)數(shù)據(jù)庫上。如果沒有指定數(shù)據(jù)庫,則該值為 NULL 。
  • Command:是指此刻該線程鏈接正在執(zhí)行的命令。
  • Time:表示該線程鏈接處于當(dāng)前狀態(tài)的時(shí)間。
  • State:線程的狀態(tài),和 Command 對(duì)應(yīng)。
  • Info:記錄的是線程執(zhí)行的具體語句。

當(dāng)數(shù)據(jù)庫鏈接數(shù)過多時(shí),篩選有用信息又成了一件麻煩事,比如我們只想查某個(gè)用戶或某個(gè)狀態(tài)的鏈接。這個(gè)時(shí)候用 show processlist 則會(huì)查找出一些我們不需要的信息,此時(shí)使用 information_schema.processlist 進(jìn)行篩選會(huì)變得容易許多,下面展示幾個(gè)常見篩選需求:

# 只查看某個(gè)ID的鏈接信息
select * from information_schema.processlist where id = 705207;

# 篩選出某個(gè)用戶的鏈接
select * from information_schema.processlist where user = 'testuser';

# 篩選出所有非空閑的鏈接
select * from information_schema.processlist where command != 'Sleep';

# 篩選出空閑時(shí)間在600秒以上的鏈接
select * from information_schema.processlist where command = 'Sleep' and time > 600;

# 篩選出處于某個(gè)狀態(tài)的鏈接
select * from information_schema.processlist where state = 'Sending data';

# 篩選某個(gè)客戶端IP的鏈接
select * from information_schema.processlist where host like '192.168.85.0%';

  2.殺掉數(shù)據(jù)庫鏈接

如果某個(gè)數(shù)據(jù)庫鏈接異常,我們可以通過 kill 語句來殺掉該鏈接,kill 標(biāo)準(zhǔn)語法是:KILL [CONNECTION | QUERY] processlist_id;

KILL 允許使用可選的 CONNECTION 或 QUERY 修飾符:

  • KILL CONNECTION 與不含修改符的 KILL 一樣,它會(huì)終止該 process 相關(guān)鏈接。
  • KILL QUERY 終止鏈接當(dāng)前正在執(zhí)行的語句,但保持鏈接本身不變。

殺掉鏈接的能力取決于 SUPER 權(quán)限:

  • 如果沒有 SUPER 權(quán)限,則只能殺掉當(dāng)前用戶發(fā)起的鏈接。
  • 具有 SUPER 權(quán)限的用戶,可以殺掉所有鏈接。

遇到突發(fā)情況,需要批量殺鏈接時(shí),可以通過拼接 SQL 得到 kill 語句,然后再執(zhí)行,這樣會(huì)方便很多,分享幾個(gè)可能用到的殺鏈接的 SQL :

# 殺掉空閑時(shí)間在600秒以上的鏈接,拼接得到kill語句
select concat('KILL ',id,';') from information_schema.`processlist` 
where command = 'Sleep' and time > 600;

# 殺掉處于某個(gè)狀態(tài)的鏈接,拼接得到kill語句
select concat('KILL ',id,';') from information_schema.`processlist` 
where state = 'Sending data';

select concat('KILL ',id,';') from information_schema.`processlist` 
where state = 'Waiting for table metadata lock';

# 殺掉某個(gè)用戶發(fā)起的鏈接,拼接得到kill語句
select concat('KILL ',id,';') from information_schema.`processlist` 
 user = 'testuser';

這里提醒下,kill 語句一定要慎用!特別是此鏈接執(zhí)行的是更新語句或表結(jié)構(gòu)變動(dòng)語句時(shí),殺掉鏈接可能需要比較長時(shí)間的回滾操作。

總結(jié): 

本篇文章講解了查看及殺掉數(shù)據(jù)庫鏈接的方法,以后懷疑數(shù)據(jù)庫有問題,可以第一時(shí)間看下數(shù)據(jù)庫鏈接情況。

以上就是MySQL 查看鏈接及殺掉異常鏈接的方法的詳細(xì)內(nèi)容,更多關(guān)于MySQL 查看鏈接及殺掉異常鏈接的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • MySQL手動(dòng)注冊(cè)binlog文件造成主從異常的原因
  • MySQL數(shù)據(jù)庫連接異常匯總(值得收藏)
  • mysql5.7.21啟動(dòng)異常的修復(fù)方法
  • mysql innodb 異常修復(fù)經(jīng)驗(yàn)分享
  • MySQL定義異常和異常處理詳解
  • MySQL存儲(chǔ)過程中一些基本的異常處理教程
  • 分析一個(gè)MySQL的異常查詢的案例
  • MySQL異常處理淺析
  • 分析MySQL拋出異常的幾種常見解決方式

標(biāo)簽:資陽 吉林 滄州 隨州 甘南 荊州 黑河 錦州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL 查看鏈接及殺掉異常鏈接的方法》,本文關(guān)鍵詞  MySQL,查看,鏈接,及,殺掉,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL 查看鏈接及殺掉異常鏈接的方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL 查看鏈接及殺掉異常鏈接的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章