MySQL5.1.50 / CentOS5.5(64bit) 環境下での、
ログ出力とログローテーションの設定についてメモ。
ログ出力設定
/var/log/配下にmysqlディレクトリを作成して、以下3つのログを格納する。
error.log(mysqldエラーログ)、query.log(全ての発行クエリログ)、slow.log(スロークエリのログ)
(前準備)
# mysql -V mysql Ver 14.14 Distrib 5.1.50, for redhat-linux-gnu (i686) using readline 5.1 # mkdir /var/log/mysql/ # touch /var/log/mysql/error.log # touch /var/log/mysql/query.log # touch /var/log/mysql/slow.log # chmod 755 /var/log/mysql/ # chmod 666 /var/log/mysql/* # chown -R mysql. /var/log/mysql/
(my.cnf設定)
# vi /etc/my.cnf [mysqld] #query log log=/var/log/mysql/query.log #slow query log slow_query_log=ON slow_query_log_file=/var/log/mysql/slow.log long_query_time=0.5 [mysqld_safe] log-error=/var/log/mysql/error.log [mysqladmin] password = <*mysql password*> user= root
(mysqld起動設定: ログ出力オプションの指定)
# vi /etc/rc.d/init.d/mysqld $exec --datadir="$datadir" --socket="$socketfile" \ ↓ $exec --log --datadir="$datadir" --socket="$socketfile" \
(設定反映)
# service mysqld restart
ログ確認
それぞれのログは下記のようにして確認。
# tail -fn10 /var/log/mysql/error.log # tail -fn10 /var/log/mysql/query.log # tail -fn10 /var/log/mysql/slow.log
ログローテーション
上記設定のままだと、膨大なログがたまるのでログローテーションを行うように、設定しておく。
ログローテーションを行う際に、mysqladminからflush-logsを利用する為、予めPATHを確認しておく。
# which mysqladmin /usr/bin/mysqladmin
ローテートファイルの作成
# vi /etc/logrotate.d/mysql-log-rotate /var/log/mysql/error.log { # create 600 mysql mysql notifempty daily rotate 3 missingok compress postrotate # just if mysqld is really running if test -x /usr/bin/mysqladmin && \ /usr/bin/mysqladmin ping &>/dev/null then /usr/bin/mysqladmin flush-logs fi endscript } /var/log/mysql/query.log { # create 600 mysql mysql notifempty daily rotate 3 missingok compress postrotate # just if mysqld is really running if test -x /usr/bin/mysqladmin && \ /usr/bin/mysqladmin ping &>/dev/null then /usr/bin/mysqladmin flush-logs fi endscript } /var/log/mysql/slow.log { # create 600 mysql mysql notifempty daily rotate 3 missingok compress postrotate # just if mysqld is really running if test -x /usr/bin/mysqladmin && \ /usr/bin/mysqladmin ping &>/dev/null then /usr/bin/mysqladmin flush-logs fi endscript }
動作テスト
# logrotate -dv /etc/logrotate.d/mysql-log-rotate
query.logあたりは、膨大なログになるので、あくまで開発・デバッグやチューニング時の、一時利用がよい気がする。
それからMySQL5.1系から、クエリログをMySQLテーブルに保存することもできるみたい。
ただこの場合、無駄にMySQLコネクションが食ってしまうので、潤沢なメモリがないのなら常用しないほうがいいかな。
Pingback: MySQLのログファイルを設置