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

2021-12-30 12:28:49 字數 1379 閱讀 8806

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

高效能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可能會很多,這樣逐一嘗試太過...