【さらっと解説】MySQL の slow.log ファイルをログローテーションする方法
こんにちは。
見習いエンジニアの卵の
システムソリューション部のほとです。
みなさんもこんな時ありませんか??
「さてさて暇だし、dfコマンドでも打ってみるか~」
「あれ、/ディレクトリの使用量95%??なんで??」
「どれどれ、何が多いのかな~」
「い、い、いつの間に!?MySQLのslow.logファイルがこんなに溜まってるん!?」
「なんとかしなきゃ...でもどうしたらいいんや!!!」
そんなときは ログローテーション です。
ログローテーションとは
まずは言葉の意味からおさえてみましょう。
log…「記録」
rotate…「循環する、交替する」
上記を踏まえて、記録を交替させる=「ログファイルを交替させる」という意味になります。
またmanコマンドの結果にはこう書かれていました。
logrotateは、大量のログファイルを生成するシステムの管理を容易にするために設計されています。
管理しやすくするために設計されています。 ログファイルの自動回転、圧縮、削除、メール送信が可能です。
ログファイルの自動回転、圧縮、削除、郵送が可能です。 各ログファイルは、毎日、毎週、毎月、または大きくなりすぎたときに処理されます。
各ログファイルは、毎日、毎週、毎月、または大きくなりすぎたときに処理されます。
つまり大量のログファイルを圧縮したり削除することでディスクの容量圧迫しないようにする術なのですね。
目標
本記事では、MySQLのスロークエリが保存されているスローログを圧縮します。
設定内容としては下記のとおりです。
設定内容 | 値 |
保持するログ | /var/lib/mysql/localhost-slow.log |
ローテート期間 | daily |
保持世代数 | 7(世代) |
スローログの判定時間 | 1.0(秒) |
環境
OS/パッケージ | バージョン |
カーネル | 3.10.0 |
Cent OS | 7.2.1 |
MySQL | 8.0.31 |
logrotate | 3.8.6 |
具体的な流れ
MySQL のスロークエリログの出力設定編
※MySQL インストールについては省略しております。
初期時の設定確認
MySQL にログインした状態で下記コマンドを入力します。
SHOW VARIABLES LIKE "%slow%";
○出力結果例
+-----------------------------+-----------------------------------+ | Variable_name | Value | +-----------------------------+-----------------------------------+ | log_slow_admin_statements | OFF | | log_slow_extra | OFF | | log_slow_replica_statements | OFF | | log_slow_slave_statements | OFF | | slow_launch_time | 2 | | slow_query_log | OFF | | slow_query_log_file | /var/lib/mysql/localhost-slow.log | +-----------------------------+-----------------------------------+ 7 rows in set (0.31 sec)
このうち slow_query_log を ON にすることで、/var/lib/mysql/localhost-slow.log へスローログが出力されるようです。
スロークエリとしての判定時間を設定
SET GLOBAL long_query_time = 1.0;
下記コマンドで変更されていることを確認します
SHOW GLOBAL VARIABLES LIKE '%query_time%';
○出力結果
+-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 1.000000 | +-----------------+----------+ 1 row in set (0.01 sec)
スロークエリログの出力設定をONにします
SET GLOBAL slow_query_log = 'ON';
下記コマンドの出力が出力結果例のようになっていればOK
SHOW GLOBAL VARIABLES LIKE '%slow_query%';
○出力結果例
+---------------------+-----------------------------------+ | Variable_name | Value | +---------------------+-----------------------------------+ | slow_query_log | ON | | slow_query_log_file | /var/lib/mysql/localhost-slow.log | +---------------------+-----------------------------------+ 2 rows in set (0.03 sec)
FLUSH LOG 用ユーザの作成
create user 'flush'@'localhost' identified by '[任意のパスワード]';
作成できたかの確認は下記コマンドの出力に当該ユーザが存在することに加えて、実際にログインしてみて成功すればOKです
select user,host from mysql.user;
FLUSH LOG 用ユーザに権限付与
GRANT RELOAD ON *.* TO 'flush'@'localhost';
作成できたかの確認は下記コマンドの出力で意図した権限が付与されているかを見てください
SHOW GRANTS FOR 'flush'@'localhost';
○出力結果例
+-----------------------------------------------------+ | Grants for flush@localhost | +-----------------------------------------------------+ | GRANT RELOAD, PROCESS ON *.* TO `flush`@`localhost` | +-----------------------------------------------------+ 1 row in set (0.04 sec)
作成した flush ユーザのログイン時の権限調整
vi /var/lib/mysql/.my.cnf
○編集内容
[client] user=flush password=[4.1.4. で入力したパスワード]
ログファイルを開き直します
mysql --defaults-extra-file=/var/lib/mysql/.my.cnf -e "FLUSH SLOW LOGS;"
特にエラーが出力されなければ成功です!
ログローテート設定編
- slow.log のローテート設定ファイルの編集
- テスト実行
slow.log のローテート設定ファイルの編集
作業ディレクトリまで移動
cd /etc/logrotate.d/
設定ファイルの記述
※root ユーザで作成してください
(必要な要件は①ファイルの所有者/グループが root:root ②ファイルのパーミッションが644 となっていることです)
vi mysql
↓記述内容
/var/lib/mysql/*slow.log { daily rotate 7 dateext missingok notifempty sharedscripts delaycompress copytruncate compress postrotate # just if mysqld is really running if test -x /usr/bin/mysqladmin /usr/bin/mysqladmin --defaults-extra-file=/var/lib/mysql/.my.cnf ping &> /dev/null then mysql --defaults-extra-file=/var/lib/mysql/.my.cnf -e "FLUSH SLOW LOGS;" fi endscript }
※解説
上記の設定例での解説を行います。
※オプションはもっとたくさんあるので気になる方は調べてみてください。実行したい条件や状況に合わせることが可能です。
- daily (デフォルトは weekly)
ローテーションを毎週実行 - rotate [任意の数字] ※今回は7
保持したい世代数を決定 - missingok
ログファイルが存在しなくてもエラーを出さずに処理を続行 - notifempty
ログファイルが空ならローテーションしない - delaycompress ※compress とセットで使います
ログの圧縮作業を次回のローテーション時まで遅らせる。compress と共に指定 - copytruncate
ログファイルをコピーし、コピー元の内容を削除 - compress
ローテーションしたログを gzip で圧縮 - postrotate ~ endscript
あいだに記述されたコマンドをログローテーション後に実行。
(今回の例では mysql への ping疎通が取れている場合にslow.logファイルを再読み込みするというものです)
テスト実行
さあ、あとはエラーが出ないことを祈るのみですね。
logrotate -dv /etc/logrotate.d/mysql
実行する内容などが出力されるので、エラー文などが特に出ていなければOKです。
さいごに
今回は MySQL の slow.log ファイルをローテートする方法を紹介しました!
サービスが稼働していると、必然的にログは溜まっていきます。
みなさんがみなさんディスク容量を無限に拡張できるわけではありませんし、上手にローテーションしてよい節約ライフを送ってください!