[Docker] MySQLコンテナでスロークエリログを出力する

dockerで構築したMySQLサーバーでスロークエリログを出力&確認する方法をまとめました。docker-composeで構成する形式なので、コピペでもそのまま使えるようになっています。

ファイル構成

はじめに、docker-composeで構築MySQLシステムの概略図です。

設定ディレクトリとログディレクトリをローカルに用意しておきます。コンテナ内においてもいいんですが、コンテナを削除した時にコンテナ内のデータは消えてしまうので、万が一のことを考えてローカルに保存しておく形にしてあります。

mysql-docker
└── config //<--設定ディレクトリ
    └── mysql
         └── my.cnf
└── logs //<--ログディレクトリ
    └── mysql
└── docker-compose.yml

dockerでMySQLコンテナを立ち上げる前の下準備

設定ディレクトリとログディレクトリを用意する

設定ディレクトリとログディレクトリを用意しておきます。

上記のディレクトリ構成図で言うと、

└── config //<--設定ディレクトリ
    └── mysql
└── logs //<--ログディレクトリ
    └── mysql

ここです。

今回の例では、mysql-docker直下にディレクトリを作って、mysql用のディレクトリに格納するようにしてあります。

my.cnfを用意する

続いて、スロークエリログを記録する設定ファイル(my.cnf)を用意します。

中身は以下のようになります。

[mysqld]
slow_query_log=true
slow_query_log-file=/var/log/mysql/mysql-slow.sql
long_query_time =0.5

long_query_timeは、何秒かかったクエリをスロークエリとするかと言う設定です。ここでは0.5秒以上かかったクエリをログに出力します。

docker-compose.ymlにマウントの設定を書く

さて、事前準備の仕上げです。

docker-compose.ymlのmysqlコンテナの部分に、用意したログディレクトリと設定ディレクトリをマウントする設定を書きます。

volumes:
  - ./config/mysql:/etc/mysql/conf.d //my.cnfの置き場所
  - ./logs/mysql:/var/log/mysql //ログファイルの置き場所

ログファイルの置き場所は自由ですが、先ほどのmy.cnfで設定したディレクトリにマウントするようにします。

起動&確認

docker-composeコマンドで起動します。

docker-compose up -d

スロークエリログの設定を確認する

MySQLコンテナが起動したら、mysqlから設定を確認します。

show variables like 'slow%';

show variables like 'long%';

my.cnfの値が入っていればOKです。

スロークエリログを確認する

さて、実際に運用を始めるとスロークエリログがたまっていくので確認します。

「うちはスロークエリなんて発生しないよ!!」という優秀な方は、何か重いクエリを試しに投げてみてください。

cat logs/mysql/mysql-slow.sql

無事表示されればOKです。


大きめのシステムを運用しているとスロークエリとの戦いにもなってくるので、dockerコンテナでMySQLサーバーを動かす際は、ぜひスロークエリをしっかり設定してみてください。