高性能MySQL讀書筆記:找出誰持有鎖

作者: 老王  來源: 老王的技術手冊  發布時間: 2010-09-14 21:54  閱讀: 973 次  推薦: 0   原文鏈接   [收藏]  

  周末重讀了一遍《高性能MySQL》,發現有些知識點看過便忘了,沒有實際動手操作一遍就是記不牢,所以今天動手操作了一下“找出誰持有鎖”,并把實驗步驟記錄下來,有興趣的網友可以參照一二。
  問題的背景:在實際使用MySQL時,如果訪問量比較大,那么很可能會出現大量Locked狀態的進程,但是卻不能方便的識別是哪條SQL引起的問題,很多人遇到此類問題時,多半是通過PhpMyAdmin查詢可疑SQL,然后KILL掉,但問題是可疑SQL可能會很多,這樣逐一嘗試太過笨拙,有的人一怒之下很可能會重啟MySQL,但如此治標不治本的方法肯定更不可取。

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

 

 
CREATE TABLE IF NOT EXISTS `foo` (
`id`
int(10) unsigned NOT NULL AUTO_INCREMENT,
`
str` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) 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 foo20 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 lock20 test.foo Waiting -write High prioritywrite lock

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

 

0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()