RDS:MySQLのクエリログを取得する

記事タイトルとURLをコピーする

こんにちは、開発部の千葉です。

設計が悪いと言われてしまいそうですが、RDBを利用するプロジェクトにて ORMを使って複雑なSELECT文を書くことがあります。

そんな時は、ORMを『信じる気持ち』と『疑う気持ち』が葛藤して どうも実際に発行されているクエリが気になってしまいます。

また、クライアントから『ドコドコの処理が遅い』なんて言われると 経験則から、まずはWHERE句・ORDER句を確認します。

AWSを利用する前は、開発環境で発行されたクエリは全てログファイルへ出力して 同ファイルをtailしながらコーディングしていました。

しかし、RDSインスタンスではssh接続は許可されていない為、ファイルをtailすることはできません。 その代わり、ログファイルに出力していた内容を、あるテーブルに出力するパラメータが用意されていました。

設定手順は以下のとおりです。 ※{}内は、適切な値を指定してください。

パラメータの変更

$ rds-modify-db-parameter-group {DB Parameter Group} -p "name=general_log, value=1, method=immediate"

確認

直近10件のクエリを時系列に表示してみます。

$ mysql -h exampledb.xxxxxxx.ap-northeast-1.rds.amazonaws.com -u {DB User} -p
mysql> select event_time, argument from mysql.general_log order by event_time desc limit 10;

ローテート(削除)

mysql.general_logテーブルは、参照権限のみが付与されていてDELETE文を発行することができません。 その代わりに、ローテート用のストアド『mysql.rds_rotate_general_log』が提供されています。

  1. 『mysql.general_log』を『mysql.general_log_backup』にリネームする。
  2. 『mysql.general_log』を作成する。
$ mysql -h exampledb.xxxxxxx.ap-northeast-1.rds.amazonaws.com -u {DB User} -p
mysql> call mysql.rds_rotate_general_log;

まとめ

ログファイルをtailしていた頃から考えると、常に流れていないので少し不便ですが 同等の内容を簡単に確認できるので悪くないかな。