mysql鎖表處理方法


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。

煩請各位看官覺得有用就給個推薦吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM