高性能MySQL読書ノート:誰が鍵を持っているかを見つける
週末に「高性能MySQL」を読み返したところ、一部の知識点は見たことがあるので忘れてしまった.実際に操作していないと覚えられないので、今日は「誰が鍵を持っているかを見つけて」操作し、実験手順を記録した.興味のあるネットユーザーは1、2を参照することができる.質問の背景:実際にMySQLを使用する場合、アクセス量が多いと、大量のLocked状態のプロセスが発生する可能性が高いが、どのSQLが引き起こした問題なのかを容易に認識できない.多くの人がこのような問題に遭遇した場合、大半はPhpMyAdminで疑わしいSQLを検索し、KILLを落とすが、問題は疑わしいSQLが多いかもしれない.このように一つ一つ試してみるのはあまりにも不器用で、ある人は怒ってMySQLを再起動する可能性が高いが、このように根本を治す方法はもっと望ましくないに違いない.
実験を開始し、testデータベースにテストテーブルfoo(注意:MyISAMテーブルタイプ)を作成し、いくつかのデータを追加します.
MySQLコマンドライン端末を開きます.
MySQLコマンドライン端末をもう1つ開きます.
SHOW PROSCESSLISTを実行すると、すでにLocked現象が発生していることがわかります.
もちろん、SLEEPがUPDATEを塞いでいることは知っていますが、この実験でなければ、同じ状況に直面しています.例えば、数百のSQLクエリーが同時に目に入ります.私たちはどのように判断しますか.この时、誰も切符を包むことができなくて、でたらめを言うしかありません.経験は时には重要ですが、私たちはまだ明確な命令が必要です.ここでは:
注意:「.my.cnf」プロファイルを設定していない場合は、ユーザー名とパスワードパラメータコマンドを入力して実行する必要がある場合があります.明確な出力はありません.焦らないでください.価値のあるものはエラーログに保存されています.
エラー・ログの特定のパスが見つかったら、開いてログの最後の部分を表示します.
これにより、idが10のSQLがidが20のSQLを塞いでいるのが見えますが、具体的なSQLについては、SHOW PROSCESSLISTで照らし合わせると見えます.
実験を開始し、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で照らし合わせると見えます.