目的
なんかスロークエリのログ出してって言われたのですぐ忘れるからやったこと書きます…。
(私の周りには優秀な人しかいないのでこうなる)
スロークエリログはMYSQLに投げられたSQL(クエリ)で遅いSQLを保存しておいてくれる仕組みです。
あとあと速度が問題になった時にログを見れば問題のSQLが特定しやすくて改善しやすいわけですね。
検証環境
mysql Ver 14.14 Distrib 5.6.37, for Linux (x86_64) using EditLine wrapper
CentOS release 6.9 (Final)
コード
やる気がないのでrootになってルートディレクトリからmysqlの設定ファイルを検索します。
(全ファイル検索しているわけです…、同名のファイルがあっりしたら終わりだ)
find / -name 'my.cnf' /etc/my.cnf
直接編集するのは怖いので、なにかあったときに戻せるようにコピーしておきます
それからviエディタで編集します
cp /etc/my.cnf /etc/my.cnf.org vi /etc/my.cnf
[mysqld]の下に下記のようにslow_query_log=ONから追加します
(なんらかの事情があって同じ文章があったら片方コメントつけるなりしましょう)
[mysqld] slow_query_log=ON long_query_time=0.5 slow_query_log_file=/var/lib/mysql/slow_query.log log-queries-not-using-indexes max_allowed_packet=32M
書き終わったら保存
設定の意味は下記のとおりです
slow_query_log=ON
→遅いクエリを保存して
long_query_time=0.5
→0.5秒以下なら保存して
slow_query_log_file=/var/lib/mysql/slow_query.log
→この場所にログを書き出して、別にログの場所とか名前変えたくなければかかなくて大丈夫
log-queries-not-using-indexes
→indexついてないクエリも書き出して(indexついてないのは早くても記録されるのでお好みで)
以下は直接スロークエリに関係ないので設定しなくてもいいです
max_allowed_packet=16M →一回のSQLで投げられるデータ量(パケット)の最大値を変更(初期値1Mなので変更)
mysqlを再起動します
service mysqld restart
mysqlにログイン
mysql -u ユーザー名 -p
スロークエリの設定確認(ログ位置も表示される)
> show variables like 'slow%'; +---------------------+--------------------------------+ | Variable_name | Value | +---------------------+--------------------------------+ | slow_launch_time | 2 | | slow_query_log | ON | | slow_query_log_file | /var/lib/mysql/slow_query.log | +---------------------+--------------------------------+
ついでに変更したmax_allowed_packetも確認
> SHOW VARIABLES LIKE 'max_allowed_packet'; +--------------------+-----------+ | Variable_name | Value | +--------------------+-----------+ | max_allowed_packet | 524288000 | +--------------------+-----------+ 1 row in set (0.02 sec)
exit叩いてmysqlから出ます
> exit Bye
記録されてるクエリを見てみる
cat /var/tmp/slow_query.log
実行例
テキストにはこういう形で記録されます
# Time: 180427 4:07:24 # User@Host: root[root] @ localhost [] Id: 23 # Query_time: 0.000774 Lock_time: 0.000090 Rows_sent: 0 Rows_examined: 475 SET timestamp=1524802044; select * FROM table1 WHERE column = 'values' AND deleted = 0;
まとめ
my.cnfに設定書いて再起動するだけでいいのか…