1.Mysql鎖概述
鎖是計算機協調多個進程或線程並發訪問某一資源的機制。在數據庫中,除傳統的計算資源(如CPU、RAM、I/O等)的爭用以外,數據也是一種供許多用戶共享的資源。如何保證數據並發訪問的一致性、有效性是所有數據庫必須解決的一個問題,鎖沖突也是影響數據庫並發訪問性能的一個重要因素。MySQL的鎖機制比較簡單,其最顯著的特點是不同的存儲引擎支持不同的鎖機制。比如,MyISAM和MEMORY存儲引擎采用的是表級鎖;BDB存儲引擎采用的是頁面鎖,但也支持表級鎖;InnoDB存儲引擎既支持行級鎖,也支持表級鎖,但默認情況下是采用行級鎖。
2.鎖表及解鎖
客戶端連接Mysql時會產生一個connection,當多個連接(數據庫連接)同時對一個表的數據進行更新操作,那么速度將會越來越慢,執行一段時間后將出現數據表被鎖的現象,從而影響到其它的查詢及更新。尤其當我們使用循環的時候更加容易出現鎖表這種情況,導致其它連接無法讀寫此表。一旦遇到無法對某張表進行讀寫操作時,而其它表可以正常讀寫,就要檢查是不是該表被鎖了,如果被鎖住就要解鎖,解鎖方式有以下兩種。
-
show processlist
該命令是顯示用戶正在運行的線程,默認只顯示前100條數據,如果要顯示全部線程,執行show full processlist。需要注意的是只有root用戶能看到所有正在運行的線程外,其他用戶都只能看到自己正在運行的線程,看不到其它用戶正在運行的線程。show processlist 顯示的信息都是來自MySQL系統庫information_schema中processlist表,執行select * from information_schema.processlist語句也能顯示相同的數據。顯示結果如圖:
參數解釋如下:
Id:就是這個線程的唯一標識,當我們發現這個線程有問題的時候,可以通過kill命令將這個線程殺掉。
User: 就是指啟動這個線程的用戶。
Host: 記錄了發送請求的客戶端的 IP 和 端口號。通過這些信息在排查問題的時候,我們可以定位到是哪個客戶端的哪個進程發送的請求。
DB: 當前執行的命令是在哪一個數據庫上。如果沒有指定數據庫,則該值為NULL。
Command: 是指此刻該線程正在執行的命令。
Time: 表示該線程處於當前狀態的時間。
State: 線程的狀態。
Info: 線程執行的語句。
需要關注的是state列的值,不同值如下:
Checking table:正在檢查數據表。
Closing tables:正在將表中修改的數據刷新到磁盤中,同時正在關閉已經用完的表。
Connect Out:從服務器正在連接主服務器。
Copying to tmp table on disk:由於臨時結果集大於tmp_table_size,正在將臨時表從內存存儲轉為磁盤存儲以此節省內存。
deleting from main table:服務器正在執行多表刪除中的第一部分,剛刪除第一個表。
deleting from reference tables:服務器正在執行多表刪除中的第二部分,正在刪除其他表的記錄。
Locked:被其他查詢鎖住了。
Sending data:正在處理SELECT查詢的記錄,同時正在把結果發送給客戶端。
Sleeping:正在等待客戶端發送新請求。
如果發現state值為Locked,找到Id值,Kill掉就行。 -
select * from information_schema.innodb_trx
需要看trx_rows_locked和trx_mysql_thred_id,如果trx_rows_locked里的值不為0,說明有阻塞數據,執行Kill trx_mysql_thred_id。
煩請各位看官覺得有用就給個推薦吧!