データベース - MySQL - ログの出力・ローテーション


 


1. 概要
2. ログ出力用のディレクトリ作成
3. /usr/local/etc/mysql/my.cnf 編集
4. ログローテーション
5. 参考サイト

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 コマンドを実行すると表示されるワーニングを回避

audiobook.jp
ハイスピードプラン
ベルリッツ
Amazonギフトカード
ネットオークションの相場、統計、価格比較といえばオークファン
U-NEXT
サウンドハウス
葬送のフリーレン Prime Video
アフィリエイトのアクセストレード
TikTok Shop 【リピート用プログラム】
それがだいじWi-Fi
JETBOY
【usus ウズウズ】
損保との違い
EaseUS
薬屋の独り言
5G CONNECT
earthcar(アースカー)
健康サポート特集