程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 高性能MySQL讀書筆記:找出誰持有鎖

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

編輯:MySQL綜合教程

高性能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 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裡對照一下就能看到了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved