5. FreeBSD 11.1 RELEASE - MySQL - ログ

 
5.1 参考サイト
5.2 タイムスタンプ
5.3 ログの出力先を変更
5.4 ログローテーション

5.1 参考サイト

 以下のサイトを参考にさせていただきました。  「MySQLにおける4つのログファイルの設定と確認方法」  「MySQLのログに出力されるタイムスタンプがおかしい件

5.2 タイムスタンプ

 MySQL のログはデフォルトで

/var/db/mysql/
 に作成されます。  エラーログは、下記です。

/var/db/mysql/ホスト名.err
 このエラーログに出力されるタイムスタンプがおかしい。あきらかに「UTC - 協定世界時」になっている。  MySQL 自体がおかしいのかと

SELECT NOW();
 で見てみるとずれていないのです。参考サイトを読んでわかりました。

/usr/local/etc/mysql/my.cnf
 の [mysqld] セクションに

[mysqld]									←	一応目印
log_timestamps                  = SYSTEM
 の1行をいれて再起動すると正しい時刻で終了されるようになりました。

5.3 ログの出力先を変更

 参考サイトにならって、ログの出力先を変更してみたいと思います。  バイナリログってのは当面いらないかなぁ。  以下、すべて

/usr/local/etc/mysql/mysql.cnf
 の [mysqld] セクションに書いていきます。  エラーログ。  いわゆるエラーログですな、ワーニングも出そうと思います。

#       エラーログ
log_error="/var/log/mysql/mysql-err.log"
log_warnings=1
 一般ログ?  クエリーを発行する都度に出力するらしい。

#       クエリーログ
general_log=1
general_log_file="/var/log/mysql/mysql-sql.log"
log_output=FILE
 スロークエリーログ。  遅いクエリーやインデックスを使っていないクエリーについて出力するらしい。

#       スロークエリーログ
slow_query_log=1
slow_query_log_file="/var/log/mysql/mysql-slow.log"
log_queries_not_using_indexes
log_slow_admin_statements
 前もって、ディレクトリやファイルの作成を行っておかないと、ログが出力されなかったり、はなはだしいときは起動できなかったりするので、再起動の前に

プロンプト略
mkdir -pv /var/log/mysql
touch /var/log/mysql/mysql-err.log
touch /var/log/mysql/mysql-sql.log
touch /var/log/mysql/mysql-slow.log
chown -Rv mysql:mysql /var/log/mysql
 コンフィグレーションファイルの書き間違いがないことを確認して、再起動。

> /usr/local/libexec/mysqld --verbose --help > /dev/null
> service mysql-server restart
 ログが出力され始めました。  エラーログを見直すと、なんかいっぱいエラーが出力されているんですが、とりあえず、起動できているのでおいておきます。  いずれ何かの機会に詳しく調べたいと思います。

5.4 ログローテーション

 前項で出力先を変えたログですが・・・。  もちろん、データベースの構成や運用で相当違ってくるのは当然です。  アクセス頻度の高いデータベースであれば、クエリーログなんか出してたらすぐにディスクがいっぱいになるかと思います。  わたしの環境では

/var/log/mysql/mysql-err.log	←	少し、めったに増えない
/var/log/mysql/mysql-slow.log	←	まあまあ、案外多いのでびっくりしています
/var/log/mysql/mysql-sql.log	←	ほぼ予想通り、大量に増えます
 とりあえず、ログローテーションを書いて思い通りにならないことがあったので調べたら。  「MySQL - ログローテート [fl8 Wiki]」に納得のいく記事がありました。  mysql ではログのファイルをローテーションさせても mysqladmin flush-logs というコマンドを発行しないと前のログファイルに書き続けるという apache よりさらに面倒な仕掛けがあるようです。  newsyslog.conf でプロセスの再起動はできてもコマンドを発行する仕掛けはないので、ローテーションさせると同時に cron でコマンドを発行するしかないようです。  そうなれば、サイズによるローテーションはできないなぁ・・・。悩ましい。  とりあえず、毎日1時にローテーションさせて、7世代(1週間)管理するようにします。

/usr/local/etc/newsyslogconf.d/mysql.conf
 を作成して、以下のように記述。

# logfilename          [owner:group]    mode count size when  flags [/pid_file] [sig_num]
/var/log/mysql/*.log    mysql:mysql     644  7     *    @T01  BG

/etc/crontab
 に以下の記述を追加。

#minute hour mday month wday who  command
0       1    *    *     *    root /usr/local/bin/mysqladmin -u root -pパスワード flush-logs
 様子を見て調整しようかと思います。