Twitter Facebook github

Category “データベース”

RDS上のMySQLでKILLは使えない

軽い内容だけど備忘録として。

要はRDSのMySQLでは、プロセスを殺すためのKILLが使えないよーっておはなし。

KILLできない

例えばSleepプロセスを、root以外の管理ユーザーから殺したいと思ってKILLコマンドを許可する SUPER 権限をそのユーザーに与えたかったのだけど、それができない。

今の設定がどうなってるか確認してみると、そもそもroot(※インスタンス起動時に登録したマスターユーザー)にSUPER権限が与えられていない。

試しに他のユーザーのプロセスをKILLしてみる

 
やっぱりダメぽい…。

どうするか

AWS公式のドキュメントでこんなのを見つけた。

mysql.rds_kill – Amazon Relational Database Service

どうやらKILLが使えない代替策で mysql.rds_kill を使えってことらしい。

うまくいった。
これを一般ユーザーで使えるようにするためには、一般的なストアドプロシージャの許可と同じようにする。

補足

上表のユーザーリストで rdsadmin となっているのはAWSがRDSインスタンスの監視に使うユーザーであり、私たちはログインできない。
推測になるが、これらRDS管理系のシステム仕様上SUPER権限はユーザーに与えられていないのだろう。そういった類の特権処理について、AWS側の制約により実行できないものは別途ストアドプロシージャが提供されていて、これを介して使うことができるようだ。

それらのストアドプロシージャーはこのRDSのリファレンスページに纏められている。

所感

シェルからKILLを流し込むスクリプトなど、他の環境で使っていたものを流用するときは十分注意したいです。こういった制約とその代替策がいかにもAWSらしいような、そんな気がします。

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が返され、そのユーザーに権限を付与したい場合は次の通り。

 

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