1. 概要
ここでの、ログの出力およびローテーションの話は、「FreeBSD 11.2 RELEASE」上の「MySQL 5.7」での話です。
他のプラットフォームやバージョンでは、コンフィグレーションファイルの場所や書式が異なったりしますのでご注意ください。
2026年7月18日、「MySQL 8.4」でも機能することを確認しましたが、記事を更新しました。
デフォルトではどうもログは本体と同じく。
/var/db/mysql
にあるようで、設定していない状態で見ると。
/var/db/mysql/hostname-slow.log
/var/db/mysql/hostname.domainname.err
ってファイルにそれぞれ、スローログ・エラーログってのが出力されているようです。
どんだけ太るかわからんし、ログは。
/var/log
にまとめたいのです。
2. ログ出力用のディレクトリ作成
先にディレクトリと空ファイルを作成しておかないと、「MySQL」のサーバを再起動してもこけたりします。
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
3. /usr/local/etc/mysql/my.cnf 編集
コンフィグレーションファイルを編集します。
[mysqld] ← のセクションに以下を追加
log_timestamps = SYSTEM
# error log
log_error ="/var/log/mysql/mysql-err.log"
# query log
general_log = 1
general_log_file = "/var/log/mysql/mysql-sql.log"
log_output = FILE
# slow query log
slow_query_log = 1
slow_query_log_file = "/var/log/mysql/mysql-slow.log"
log_queries_not_using_indexes
log_slow_admin_statements
「log_timestamps」は、設定しないとログが「UTC」で出力されてしまうので、日時がわかりにくいのです。
日本では「JST」で。
エラーログというのは、そのままずばり、いわゆるエラーログですな、以前は「log_warnings=1」というオプションで、警告を出力するフラグがありましたが、「MySQL 8.4」では使えなくなりました。
クエリーログというのは、クエリーを発行する都度に出力するらしい。
スロークエリーログというのは、遅いクエリーやインデックスを使っていないクエリーについて出力するらしい。
ここでいったん、コンフィグレーションファイルの書き間違いがないことを確認して、再起動します。
/usr/local/libexec/mysqld --verbose --help > /dev/null
service mysql-server restart
ログが出力され始めます。
ls -lh /var/log/mysql/
合計 14K
-rw-r--r-- 1 mysql mysql 3.1K 7月 18 16:55 mysql-err.log
-rw-r--r-- 1 mysql mysql 338 7月 18 16:55 mysql-slow.log
-rw-r--r-- 1 mysql mysql 1.7K 7月 18 16:55 mysql-sql.log
4. ログローテーション
前項で出力先を変えたログですが・・・。
もちろん、データベースの構成や運用で相当違ってくるのは当然です。
アクセス頻度の高いデータベースであれば、クエリーログなんか出してたらすぐにディスクがいっぱいになるかと思います。
わたしの環境では。
/var/log/mysql/mysql-err.log ← 少し、めったに増えない
/var/log/mysql/mysql-slow.log ← まあまあ、案外多いのでびっくりしています
/var/log/mysql/mysql-sql.log ← ほぼ予想通り、大量に増えます
とりあえず、ログローテーションを書いて思い通りにならないことがあったので調べたら。
参考サイトのひとつに納得のいく記事がありました。
「MySQL」では、ログのファイルをローテーションさせても「mysqladmin flush-logs」というコマンドを発行しないと前のログファイルに書き続けるという、面倒な仕掛けがあるようです。
「newsyslog.conf」でプロセスの再起動はできてもコマンドを発行する仕掛けはないので、ローテーションさせると同時に「cron」でコマンドを発行するしかないようです。
そうなれば、サイズによるローテーションはできないなぁ・・・。悩ましい。
とりあえず、毎日1時にローテーションさせて、7世代(1週間)管理するようにします。
/usr/local/etc/newsyslog.conf.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
それで「crontab」に「/usr/local/bin/mysqladmin -u root -pパスワード flush-logs」ってコマンドを発行するようにしていたら・・・。
いつの頃からか。
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
てなエラーになって機能しないようになっていました。
参考サイトで、回避策がわかりました。
とりあえず、「MySQL」のいつだかのバージョン以降、平文のコマンドにパスワードを記述してはいけないそうなのです。
そんで。
/ファイルパス/root.cnf
というファイルを作成して、以下を記述します。
[client]
user = root
password = root のパスワード
でこれを利用して実行するシェルスクリプトを作成(実行権限をつけるのを忘れないように)
/スクリプトパス/mysql-log-update.sh
下記のように記述します。
#!/bin/sh -x
/usr/local/bin/mysqladmin --defaults-extra-file=/ファイルパス/root.cnf flush-logs
次に。
/etc/crontab
に以下の記述を追加。
#minute hour mday month wday who command
0 1 * * * root /スクリプトパス/mysql-log-update.sh
これでローテーションも機能するようになりました。
ローテーションのタイミングについては、様子を見て調整しようかと思います。
5. 参考サイト
本ページは、下記のサイトを参考にさせていただきました。
「MySQL - ログローテート [fl8 Wiki]」
「MySQL における4つのログファイルの設定と確認方法 | サービス | プロエンジニア」
「MySQL のログに出力されるタイムスタンプがおかしい件 - 小さな星がほらひとつ」
「パスワードを指定して mysql コマンドを実行すると表示されるワーニングを回避」