CentOS6でMySQL Slow query logの出力及びlogrotate

#はじめに
ローカル環境(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を設定しないと
外に出れない事が多いと思います。私の環境もそうでした。
じゃあ、設定します。

①/etc/yum.confがある事を確認します。　　
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/9cf823b9-6475-cd50-4513-f213dbc003eb.jpeg)

②/etc/yum.confにproxy設定を追記します。
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/4a5e981c-6b60-c2fe-79c1-9a9fd30a1713.jpeg)
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/721e45f7-ccb7-beff-1c5a-1f4dc1cad781.jpeg)

もし、proxyサーバからusernameとuserpasswordの認証が必要な場合
下記の記述も追加してください。
※ユーザー名やパスワードに「@」が含まれている場合、proxy認証が失敗するので注意。
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/d1c2544f-af8f-164a-5e19-490fd79a637c.jpeg)

これでもyumで外への接続が失敗するなら、VMware playerのネットワーク設定でアダプタがNATになっていないかもしれません。

#MySQL5.7をyumでインストール
1. Yumリポジトリを追加
   * CentOS6でのデフォルトリポジトリはMySQL5.1なので、ダウンロード先を指定する必要があります。
   * 該当リポジトリは公式ページで確認。
     http://dev.mysql.com/downloads/repo/yum/  
   * 追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/247617/a1302dd9-6a9e-30ce-7493-a03b386c8dbc.png)
2. 該当のリポジトリにて、MySQLのバージョンが5.7になってるか確認
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/48337178-2a8a-58b5-160e-e6067efc85d2.jpeg)
![キャプ2チャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/e829dcdb-b6ae-1760-0a76-562f9389e449.jpeg)
3. MySQL5.7をインストール  
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/0da4c911-9674-55d4-77fe-3beb57259687.jpeg)　　
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/84dd2251-307b-8aee-0d40-497ae8931860.jpeg)
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/e5e6b2c0-ab98-3672-5416-2b3a1e313f90.jpeg)
4. インストール確認  
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/9bf95de8-5e79-ed11-89fa-de1490abf1a3.jpeg)

#MySQLのログイン
1.  サービスの起動  
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/3d2db4e2-c05d-d4d0-dbf0-26bff4d63ece.jpeg)
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/8ab2111f-a546-7487-ebc7-b908277662d7.jpeg)
2.  パスワードの確認  
MySQL5.7では初回起動と同時に、ランダムな文字列がパスワードとして設定されます。  
CentOSだと/var/log/mysqld.logに書き込まれます。では確認します。  
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/9e84d3f6-6e10-84a2-5e9c-db6920dfac65.jpeg)
![キャプチャ1.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/4db9ac8e-d93e-caed-fc42-391c1553d125.jpeg)
3.  ログイン
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/db307e40-739d-e734-278f-fdf3084ca31d.jpeg)

#MySQLのパスワード再設定
1. パスワードの再設定  
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/d61da1d5-c730-aaa7-c5ac-91e8fa8f15ed.jpeg)
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/5de600e9-a268-95ea-b34a-46bc24e76e54.jpeg)  
※5.7からパスワードポリシーが厳しくなったので注意

#Slow query log出力の設定
1.  my.cnfファイルの設定
   *  設定ファイルに書き込む方法で設定します。
   *  3行追加します。
 ![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/2233ef7d-9dec-a1e9-6ed1-8a8685431cad.jpeg)
2.  出力先の準備  
   *  設定ファイルで指定した/var/log/mysqlのディレクトリとmysql_slow.logのファイルを作成し、mysqlが書き込めるように、ファイルの権限を設定します。
   *  ディレクトリの作成  
   ![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/be98a86e-b659-cb61-c9d2-f52c9e9157ed.jpeg)
   *  ファイルの作成  
 ![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/b24fb9f6-2d73-7fba-e2b6-51199f7c9ab9.jpeg)
   *  ファイルの権限設定  
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/76e73448-9408-7da5-2368-b9d777633aa0.jpeg)
   *  サービスの再起動　　
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/47824c75-2b19-a890-4ba1-502f4fddd9c1.jpeg)
   *  ログの書き込みを確認
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/aa59fcb2-5822-528c-8ae3-117c14e4abd8.jpeg)

#時間のかかるSQLを実行
知識ないんで、この方の記事を参考にして実行しました。  https://qiita.com/tt2004d/items/3983234eee51dc036bb0
  
#logrotate(FLUSH_LOG)の実行
   *  そもそもログのローテートとは？
   *  システムが残す記録(ログ)が際限なく増えることを防ぐために、一定の容量や期間ごとに古いログを削除したり新しいログで上書きすること。
   *  なので、動きとしては、ローテートされたログは、古いログがクリアされ0バイトから始まったりします。又古いログはログ名-日付とかで、新しく作られます。
   *  Linuxにおける実行される流れを順々に追っていくと
1. crontabに設定されている、設定(時間、パス)を参照してcronが実行される。
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/f03338c1-bbfe-7e38-d4ef-e03c4f15076e.jpeg)
2. Cronが/etc/cron.daily配下にあるlogrotateを見に行く
  ![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/ecefdf78-0380-70b3-f635-452caa653df5.jpeg)  
logrotateコマンド(/usr/sbin/logrotate)で/etc/logrotate.confを読み込む
3. logrotate.conf内で、includeで/etc/logrotate.d/ 配下にある各ログ個別の設定を読み込む
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/8b32af8c-d3f7-4f9f-6f73-9307281d317c.jpeg)
![3キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/588f4673-b82f-2fa4-5030-8f403bcc772d.jpeg)
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/31e7be8d-c353-674f-c656-e25e2f195ba3.jpeg)
   *  この流れで実行されます。
   *  ローテートしたいログは一つだけなので、logrotate.d配下にローテート用の設定ファイルを作成します。
   *  こんな感じです。  
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/8e62a908-70a0-65b9-9704-4ae2621c8245.jpeg)
![3キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/c0fcfbbb-c0c9-8c95-dfba-2272217e495d.jpeg)
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/ec00a4d8-691a-aeb9-fd06-ca13b9249846.jpeg)
   *  MySQLに渡すDBUSERとPASSは、予め作成したdb_sessionを参照する様にします。
   *  ローカル環境ですぐ確認したいのでdailyにしてます。
   *  ログローテート後に、FLUSH LOGする様にしてます。これをしないと、ログの書き込み先が日付で作成されるログを指定したままで、作り直されたログに書き込まれません。
   *  MYSQL_PWDを使用する事で、セキュアじゃないって怒られるエラーを回避。
   *  ここまで設定しましたが、crontabに設定した時間が来ても初回のログローテートはされません。
   *  一度、/var/lib/logrotate.statusに、ローテートした日時を反映させる必要があります。
   *  その為、一度手動でローテートさせます。
![3キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/c275050d-5de4-1136-59fe-34c02f93ff87.jpeg)
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/5b4f487a-4067-8861-be99-bc12d657c9cc.jpeg)
   *  時間を待ってられないので、直で/var/lib/logrotate.statusを編集します。
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/2fb43341-343f-0e21-a1e3-3eadf9026418.jpeg)
![3キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/9e558c7d-e7d6-1c1f-9e60-fa6befb94220.jpeg)
   *  logrotateをテストで実行し、ローテートされるか確認します。
![3キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/357189de-5679-222b-db86-2e480facd03e.jpeg)
   * 「log needs rotating」と表示されているので、ローテートはされそうですね。
   * 詳細結果が見れるようにコマンド実行![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/46ebaae1-904a-bc5d-be95-5dcba1ef956f.jpeg)
   * うまくいったっぽいです、該当ディレクトリ(/var/log/mysql配下)を見てみましょう。
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/d1a2b710-4e8b-dd9f-4ade-6304ce4a2295.jpeg)
   * 2つファイルが出来ている事から、ログのローテートはされました。新しく作られたmysql_slow.logの容量が183とある事から、FLUSH LOGもされてそうです。この状態で時間の掛かるSQLを流して、mysql_slow.logに書き込まれれば、FLUSH LOGは成功しています、やってみます。
 ![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/ed0ac993-786f-773e-554d-d31893d595d8.jpeg)
![3キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/d6010159-ecf6-5023-c24b-3f91ce6ab8b7.jpeg)
![2キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/325b1d00-8a2b-c6b6-4c67-733b8fe4fe70.jpeg)
![3キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/247617/05eebdce-a9c0-9b15-b15f-23d757bcff71.jpeg)
   * ログの最後に、先ほど実行されたSQLがmysql_slow.logに書き込まれています、成功しました。