MySQL使用的是InnoDB引擎。不同於MyISAM引擎只提供表鎖,InnoDB提供不同級別的鎖。但是在我們日常的操作過程中經常由於對數據庫不當的SQL操作導致出現長時間的鎖,造成其他的SQL語句長期等待執行。這種現象對於數據庫的正常使用帶來的極大的阻礙。接下來我們就來介紹如何排查當前實例是否出現該狀態。
show processlist
如下圖所示
各字段的含義:
id,該進程的標識;
user,顯示當前用戶;
host,顯示來源IP和端口;
db,顯示當前連接的數據庫;
command,顯示當前連接的執行的命令,一般就是休眠(sleep),查詢(query),連接(connect);
time,此這個狀態持續的時間,單位是秒;
state列,顯示使用當前連接的sql語句的狀態,很重要的列;
info,顯示這個sql語句,因為長度有限,所以長的sql語句就顯示不全,但是一個判斷問題語句的重要依據。
當如果用戶某個SQL正在query導致別的SQL等待鎖的時候,別的SQL的state狀態會出現”Waiting for table metadata lock“,如果出現這種情況就會導致大量SQL堆積,實例狀態出現異常,因此這個時候就需要用戶去根據前面的id,去kill掉導致其他SQL等待鎖的正在query的語句,然后其他語句即會正常執行。
