高性能MySQL読書ノート:誰が鍵を持っているかを見つける


週末に「高性能MySQL」を読み返したところ、一部の知識点は見たことがあるので忘れてしまった.実際に操作していないと覚えられないので、今日は「誰が鍵を持っているかを見つけて」操作し、実験手順を記録した.興味のあるネットユーザーは1、2を参照することができる.質問の背景:実際に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コマンドライン端末をもう1つ開きます.
   
   
   
   
mysql > USE test;mysql > UPDATE foo SET str = ' bar ' ;

SHOW PROSCESSLISTを実行すると、すでに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 PROSCESSLISTで照らし合わせると見えます.