快速定位mysql持有鎖

轉自:http://www.52sql.com/?p=195mysql

夜深,回想這段時間常常遇到的mysql Locked狀態的進程,有的是由於代碼中事務沒有提交(鄙視)致使此條sql一句一直處於掛起狀態,這類還好查。若是訪問量比較大致使的,那麼極可能會出現大量Locked狀態的進程。可是卻不能方便的識別是哪條SQL引發的問題。不少人遇到此類問題時,多半是經過PhpMyAdmin查詢可疑SQL,而後KILL掉,但問題是可疑SQL可能會不少,這樣逐一嘗試太過笨拙,有的人一怒之下極可能會重啓MySQL,但如此治標不治本的方法確定更不可取。sql

開始實驗,在test數據庫先創建一個測試表foo(注意:是MyISAM表類型),添加若干數據:數據庫

 

CREATE TABLE IF NOT EXISTS `foo` (ide

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,測試

`str` varchar(100) NOT NULL,命令行

PRIMARY KEY (`id`)debug

) ENGINE=MyISAM;日誌

INSERT INTO `foo` (`id`, `str`) VALUES進程

(1, 'a'),事務

(2, 'b');

打開一個MySQL命令行終端:

mysql> USE test;

mysql> SELECT SLEEP(12345) FROM foo;

再打開一個MySQL命令行終端:

mysql> USE test;

mysql> UPDATE foo SET str='bar';

此時執行SHOW PROCESSLIST,能夠看到已經出現Locked現象了:

10 User sleep SELECT sleep(12345) FROM foo
20 Locked UPDATE foo SET str = ‘bar’

固然,咱們知道是SLEEP堵塞了UPDATE,但若是不是這個實驗,面對一樣的狀況,好比說幾百個SQL查詢同時映入眼簾,咱們如何來判斷呢?此時沒人能打包票,只能瞎蒙了,經驗有時候很重要,但咱們還須要明確的命令,在這裏就是:

mysqladmin debug

注意:如何你沒有設定「.my.cnf」配置文件的話,可能須要輸入用戶名和密碼參數

命令執行後,不會有任何明確的輸出,不要着急,有價值的東西此時已經被保存到了錯誤日誌裏:

mysql> SHOW VARIABLES LIKE ‘log_error’;

找到錯誤日誌的具體路徑後,打開,查看日誌的最後部分:

10 test.foo Locked - read Low priority read lock

20 test.foo Waiting - write High priority write lock

如此,咱們就能看到id是10的SQL堵塞了id是20的SQL,至於具體的SQL,到SHOW PROCESSLIST裏對照一下就能看到了。

相關文章
相關標籤/搜索