【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【さらっと解説】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 にログインした状態で下記コマンドを入力します。

1
SHOW VARIABLES LIKE "%slow%";

○出力結果例

1
2
3
4
5
6
7
8
9
10
11
12
+-----------------------------+-----------------------------------+
| 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 へスローログが出力されるようです。

 

スロークエリとしての判定時間を設定

1
SET GLOBAL long_query_time = 1.0;

下記コマンドで変更されていることを確認します

1
SHOW GLOBAL VARIABLES LIKE '%query_time%';

○出力結果

1
2
3
4
5
6
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
1 row in set (0.01 sec)

 

スロークエリログの出力設定をONにします

1
SET GLOBAL slow_query_log = 'ON';

下記コマンドの出力が出力結果例のようになっていればOK

1
SHOW GLOBAL VARIABLES LIKE '%slow_query%';

○出力結果例

1
2
3
4
5
6
7
+---------------------+-----------------------------------+
| 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 用ユーザの作成

1
create user 'flush'@'localhost' identified by '[任意のパスワード]';

作成できたかの確認は下記コマンドの出力に当該ユーザが存在することに加えて、実際にログインしてみて成功すればOKです

1
select user,host from mysql.user;

 

 

FLUSH LOG 用ユーザに権限付与

1
GRANT RELOAD ON *.* TO 'flush'@'localhost';

作成できたかの確認は下記コマンドの出力で意図した権限が付与されているかを見てください

1
SHOW GRANTS FOR 'flush'@'localhost';

○出力結果例

1
2
3
4
5
6
+-----------------------------------------------------+
| Grants for flush@localhost                          |
+-----------------------------------------------------+
| GRANT RELOAD, PROCESS ON *.* TO `flush`@`localhost` |
+-----------------------------------------------------+
1 row in set (0.04 sec)

作成した flush ユーザのログイン時の権限調整

1
vi /var/lib/mysql/.my.cnf

○編集内容

1
2
3
[client]
user=flush
password=[4.1.4. で入力したパスワード]

 

ログファイルを開き直します

1
mysql --defaults-extra-file=/var/lib/mysql/.my.cnf -e "FLUSH SLOW LOGS;"

特にエラーが出力されなければ成功です!

ログローテート設定編

  1. slow.log のローテート設定ファイルの編集
  2. テスト実行

slow.log のローテート設定ファイルの編集

作業ディレクトリまで移動
1
cd /etc/logrotate.d/
設定ファイルの記述

※root ユーザで作成してください
(必要な要件は①ファイルの所有者/グループが root:root ②ファイルのパーミッションが644 となっていることです)

1
vi mysql

↓記述内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/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
}

※解説

上記の設定例での解説を行います。
※オプションはもっとたくさんあるので気になる方は調べてみてください。実行したい条件や状況に合わせることが可能です。

  1. daily (デフォルトは weekly)
    ローテーションを毎週実行
  2. rotate [任意の数字] ※今回は7
    保持したい世代数を決定
  3. missingok
    ログファイルが存在しなくてもエラーを出さずに処理を続行
  4. notifempty
    ログファイルが空ならローテーションしない
  5. delaycompress ※compress とセットで使います
    ログの圧縮作業を次回のローテーション時まで遅らせる。compress と共に指定
  6. copytruncate
    ログファイルをコピーし、コピー元の内容を削除
  7. compress
    ローテーションしたログを gzip で圧縮
  8. postrotate ~ endscript
    あいだに記述されたコマンドをログローテーション後に実行。
    (今回の例では mysql への ping疎通が取れている場合にslow.logファイルを再読み込みするというものです)

テスト実行

さあ、あとはエラーが出ないことを祈るのみですね。

1
logrotate -dv /etc/logrotate.d/mysql

実行する内容などが出力されるので、エラー文などが特に出ていなければOKです。

さいごに

今回は MySQL の slow.log ファイルをローテートする方法を紹介しました!

サービスが稼働していると、必然的にログは溜まっていきます。

みなさんがみなさんディスク容量を無限に拡張できるわけではありませんし、上手にローテーションしてよい節約ライフを送ってください!

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
7
読み込み中...
7 票, 平均: 1.00 / 17
4,801
X facebook はてなブックマーク pocket
【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

この記事をかいた人

About the author

ほと

エンジニア見習いの卵としてやらしてもらってます。