Twitter Facebook github

MySQLでプロセスリストを見る権限の話

サービスのパフォーマンス低下原因を探るとき、MySQL側はスロークエリを調査したりしますが今回はプロセスリストの話。

知ってる人も多いと思いますが、mysqlにログインしてSHOW PROCESSLISTで実行中のプロセスリストを表示できます。

これを元に詰まっているSQLを見つけたり、サービスインしているサーバーで実際の処理状態をモニタしたりする訳ですが、MySQLで閲覧用のユーザを切って使っている場合など、その結果が本当にすべてのプロセスではないことがあるので気をつけましょう、という話です。

 

MySQLのコマンドについての説明は大抵公式のリファレンスマニュアルにあるので、該当箇所を引用します。

13.7.5.29 SHOW PROCESSLIST Syntax

If you have the PROCESS privilege, you can see all threads.
Otherwise, you can see only your own threads (that is, threads associated with the MySQL account that you are using).

つまり「(SHOW PROCESSLISTを実行したユーザーが)PROCESS権限を持ってたら全部のスレッドを見れるけど、持ってないならそのユーザーのスレッドしか表示しないよ」ということになります。

 

普通の運用では、rootユーザーをそのまま使い回している人は論外として、別のユーザーを作り [GRANT ALL PRIVILEGES ON service_a.*] (または ALL PRIVILEGES の代わりにSELECTなどの閲覧のみ)のような権限を設定しているところが多いと思いますが、前述した PROCESS権限はMySQL全体にグローバルなものであるため、特定のデータベースへの全権限を付与したユーザーであってもこの権限は持っていません。

つまり、このGRANTを施しただけのユーザーからは他ユーザーが実行したプロセスは閲覧できないことになります。たまにPROCESS権限のないユーザーから SHOW PROCESSLIST を実行して、「待機中や実行に時間のかかっているプロセスはありませんでした!」と言ってくる人がいるのですが、本当に調べるためにはPROCESS権限を持っていないと意味がないということです。

 

特定のユーザーがPROCESS権限を持っているかどうかは、mysql.userテーブルの Process_priv を確認します。

Process_privはENUM(‘Y’,’N’)ですので、Yが返されればそのユーザーはPROCESS権限を持っています。もし指定したユーザーでNが返され、そのユーザーに権限を付与したい場合は次の通り。

 

殴り書きだけども 備忘録として。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください