問題的背景:在實際使用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裡對照一下就能看到了。
高效能MySQL讀書筆記 找出誰持有鎖
高效能mysql讀書筆記 找出誰持有鎖 問題的背景 在實際使用mysql時,如果訪問量比較大,那麼很可能會出現大量locked狀態的程序,但是卻不能方便的識別是哪條sql引起的問題,很多人遇到此類問題時,多半是通過phpmyadmin查詢可疑sql,然後kill掉,但問題是可疑sql可能會很多,這樣...
高效能MySQL讀書筆記 找出誰持有鎖
高效能mysql讀書筆記 找出誰持有鎖。問題的背景 在實際使用mysql時,如果訪問量比較大,那麼很可能會出現大量locked狀態的程序,但是卻不能方便的識別是哪條sql引起的問題,很多人遇到此類問題時,多半是通過phpmyadmin查詢可疑sql,然後kill掉,但問題是可疑sql可能會很多,這樣...
高效能MySQL讀書筆記 找出誰持有鎖
問題的背景 在實際使用mysql時,如果訪問量比較大,那麼很可能會出現大量locked狀態的程序,但是卻不能方便的識別是哪條sql引起的問題,很多人遇到此類問題時,多半是通過phpmyadmin查詢可疑sql,然後kill掉,但問題www.cppcns.com是可疑sql可能會很多,這樣逐一嘗試太過...