#はじめに
ローカル環境(VMware player)で、MySQL Slow query log出力とlogrotate(FLUSH_LOG)を検証する事があったので覚書で記載します。
#この記事読んで出来る事
・yum.confのproxy設定
・MySQL5.7をyumでインストール
・MySQLのログイン
・MySQLのパスワード再設定
・Slow query log出力の設定
・時間のかかるSQLを実行
・logrotate(FLUSH_LOG)の実行
#yum.confのproxy設定
yumで外にファイルを取得しにいく場合、proxyを設定しないと
外に出れない事が多いと思います。私の環境もそうでした。
じゃあ、設定します。
もし、proxyサーバからusernameとuserpasswordの認証が必要な場合
下記の記述も追加してください。
※ユーザー名やパスワードに「@」が含まれている場合、proxy認証が失敗するので注意。
これでもyumで外への接続が失敗するなら、VMware playerのネットワーク設定でアダプタがNATになっていないかもしれません。
#MySQL5.7をyumでインストール
- Yumリポジトリを追加
- CentOS6でのデフォルトリポジトリはMySQL5.1なので、ダウンロード先を指定する必要があります。
- 該当リポジトリは公式ページで確認。
http://dev.mysql.com/downloads/repo/yum/ - 追加します。
- 該当のリポジトリにて、MySQLのバージョンが5.7になってるか確認
- MySQL5.7をインストール
- インストール確認
#MySQLのログイン
- サービスの起動
- パスワードの確認
MySQL5.7では初回起動と同時に、ランダムな文字列がパスワードとして設定されます。
CentOSだと/var/log/mysqld.logに書き込まれます。では確認します。
- ログイン
#MySQLのパスワード再設定
#Slow query log出力の設定
- my.cnfファイルの設定
- 出力先の準備
- 設定ファイルで指定した/var/log/mysqlのディレクトリとmysql_slow.logのファイルを作成し、mysqlが書き込めるように、ファイルの権限を設定します。
- ディレクトリの作成
- ファイルの作成
- ファイルの権限設定
- サービスの再起動
- ログの書き込みを確認
#時間のかかるSQLを実行
知識ないんで、この方の記事を参考にして実行しました。 https://qiita.com/tt2004d/items/3983234eee51dc036bb0
#logrotate(FLUSH_LOG)の実行
- そもそもログのローテートとは?
- システムが残す記録(ログ)が際限なく増えることを防ぐために、一定の容量や期間ごとに古いログを削除したり新しいログで上書きすること。
- なので、動きとしては、ローテートされたログは、古いログがクリアされ0バイトから始まったりします。又古いログはログ名-日付とかで、新しく作られます。
- Linuxにおける実行される流れを順々に追っていくと
- crontabに設定されている、設定(時間、パス)を参照してcronが実行される。
- Cronが/etc/cron.daily配下にあるlogrotateを見に行く
logrotateコマンド(/usr/sbin/logrotate)で/etc/logrotate.confを読み込む - logrotate.conf内で、includeで/etc/logrotate.d/ 配下にある各ログ個別の設定を読み込む
- この流れで実行されます。
- ローテートしたいログは一つだけなので、logrotate.d配下にローテート用の設定ファイルを作成します。
- こんな感じです。
- MySQLに渡すDBUSERとPASSは、予め作成したdb_sessionを参照する様にします。
- ローカル環境ですぐ確認したいのでdailyにしてます。
- ログローテート後に、FLUSH LOGする様にしてます。これをしないと、ログの書き込み先が日付で作成されるログを指定したままで、作り直されたログに書き込まれません。
- MYSQL_PWDを使用する事で、セキュアじゃないって怒られるエラーを回避。
- ここまで設定しましたが、crontabに設定した時間が来ても初回のログローテートはされません。
- 一度、/var/lib/logrotate.statusに、ローテートした日時を反映させる必要があります。
- その為、一度手動でローテートさせます。
- 時間を待ってられないので、直で/var/lib/logrotate.statusを編集します。
- logrotateをテストで実行し、ローテートされるか確認します。
- 「log needs rotating」と表示されているので、ローテートはされそうですね。
- 詳細結果が見れるようにコマンド実行
- うまくいったっぽいです、該当ディレクトリ(/var/log/mysql配下)を見てみましょう。
- 2つファイルが出来ている事から、ログのローテートはされました。新しく作られたmysql_slow.logの容量が183とある事から、FLUSH LOGもされてそうです。この状態で時間の掛かるSQLを流して、mysql_slow.logに書き込まれれば、FLUSH LOGは成功しています、やってみます。
- ログの最後に、先ほど実行されたSQLがmysql_slow.logに書き込まれています、成功しました。