<br>
Intro
<br>
<br>
之前的一篇分享提到,mysql的日志類型可以分為三種,錯誤日志(error_log),查詢?nèi)罩?query_log),和二進制日志(binary_log),error_log的介紹與用法詳見mysql日志之error_log,本文主要介紹general_log和slow_query_log的原理和用法。
通用查詢?nèi)罩?/strong>
通用查詢?nèi)罩?general_log)主要用于查詢各client連接數(shù)據(jù)庫時的相關信息與在數(shù)據(jù)庫上執(zhí)行的SQL語句,配置方法為:
1、查詢通用查詢?nèi)罩臼欠耖_啟與其存放路徑:
mysql>?show?variables?like?"general_log%"; +------------------+------------------------------+|?Variable_name????|?Value????????????????????????| +------------------+------------------------------+|?general_log??????|?OFF???????????????????????????| |?general_log_file?|?/var/lib/mysql/localhost.log?| +------------------+------------------------------+ 2?rows?in?set?(0.00?sec)
屏幕輸出中general_log和general_log_file記錄了當前通用查詢?nèi)罩镜拈_關狀態(tài)與路徑。
2、開啟通用查詢?nèi)罩?/strong>
????set?global?general_log?=?ON
查詢是否成功:
mysql>?show?variables?like?"general_log%"; +------------------+------------------------------+|?Variable_name????|?Value????????????????????????| +------------------+------------------------------+|?general_log??????|?ON???????????????????????????| |?general_log_file?|?/var/lib/mysql/localhost.log?| +------------------+------------------------------+ 2?rows?in?set?(0.00?sec)
成功。
退出一下看有沒有生成并且正確記錄:
[root@localhost?~]#?cat?/var/lib/mysql/localhost.log /usr/sbin/mysqld,?Version:?5.7.19?(MySQL?Community?Server?(GPL)).?started?with: Tcp?port:?3306??Unix?socket:?/var/lib/mysql/mysql.sock Time?????????????????Id?Command????Argument 2017-08-14T09:33:11.364650Z?????5?Quit?? 2017-08-14T09:33:20.671113Z?????6?Connect???root@localhost?on??using?Socket 2017-08-14T09:33:20.671323Z?????6?Query?select?@@version_comment?limit?1 2017-08-14T09:33:22.964610Z?????6?Query?show?variables?like?'%log%' 2017-08-14T09:33:24.574224Z?????6?Quit
成功,并且我們可以看到,log不僅記錄了SQL命令,同時也包括了執(zhí)行時間、Id、命令類型等相關數(shù)據(jù)
慢查詢?nèi)罩?/strong>
慢查詢?nèi)罩居涗浟薙QL語句時間超過了預設的long_query_time的語句,在數(shù)據(jù)量較大的情況下,可以看看慢查詢?nèi)罩局杏心男┱Z句需要進行優(yōu)化。
1、慢查詢?nèi)罩镜呐渲?/strong>
慢查詢?nèi)罩镜呐渲每梢栽跀?shù)據(jù)庫配置文件my.cnf中查到:
[root@localhost?~]#?cat?/etc/my.cnf?|?grep?-E?'long|slow|not_using_indexes'long_query_time?=?1#log-slow-queries?=?/var/log/mysql/slow.loglog_queries_not_using_indexes
可以看到:
long_query_time = 1的意思是SQL語句執(zhí)行時間超過1s的,對其進行記錄; <br>log-slow-queries = /var/log/mysql/slow.log是對慢查詢?nèi)罩韭窂降脑O置; <br>log_queries_not_using_indexes意思為不使用索引的語句,可以縮小記錄的目標
實際配置與通用查詢?nèi)罩鞠嗤趍ysql交互界面中輸入命令開啟慢查詢?nèi)罩荆?/p>
????set?slow_query_log?=?ON
2、查詢是否成功
[root@localhost?~]#?cat?/var/lib/mysql/localhost-slow.log /usr/sbin/mysqld,?Version:?5.7.19?(MySQL?Community?Server?(GPL)).?started?with: Tcp?port:?3306??Unix?socket:?/var/lib/mysql/mysql.sock Time?????????????????Id?Command????Argument
成功。
但注意,slow_query_log可能會記錄到與用戶權限和密碼相關的語句,因此在使用慢查詢?nèi)罩疚募r請注意日志的安全保存。