第 46.1 节:慢查询日志
慢查询日志对于找出需要调优的查询非常有用。以下是一种典型的使用方法:
SET GLOBAL slow_query_log = 0; -- 关闭慢查询日志
-- 备份慢查询日志文件,然后删除它
SET GLOBAL slow_query_log = 1; -- 重新开启(会创建新的空文件)
设置 long_query_time 的值,开启慢查询日志数小时,然后关闭(或调高阈值),再使用 pt-query-digest 找出最“糟糕”的几个查询。
第 46.2 节:日志文件列表
start/stop日志mysql.log(不太重要)log_error—— 错误日志- InnoDB 重做日志(
ib_logfile*)
查看变量 basedir 和 datadir 可以找到许多日志的默认位置。
有些日志通过其他变量控制开关。有些日志要么写入文件,要么写入表。
(注:此处需要更多细节和说明,例如各类日志在 Windows 和 Linux 下的默认位置和名称。)
第 46.3 节:通用查询日志
通用查询日志包含客户端连接、断开和查询的常规信息。它对于调试非常宝贵,但会影响性能。
通用查询日志的内容示例:
36 Query insert questions_c23(qId,ownerId,title,votes,answers,isClosed,closeVotes,views,ownerRep,comments,answeredAccepted,askDate,closeDate,lastScanDate,ign,bn,pvtc,mainTagForImport,prepStatus,touches,status,status_bef_change,cv_bef_change,max_cv_reached) values(38666373,1322183,'How to post a numeric value in c#',0,1,0,0,50,1,0,0,2016-07-29 19:40:32,null,now(),0,0,0,0,0,0,0,0,0,0,0,0,0,0) on duplicate key update title='How to post a numeric value in c#',votes=0,answers=1,views=50,ownerRep=1,answeredAccepted=0,lastScanDate=now(),touches=touches+1,status='0'
判断通用查询日志是否开启
SELECT @@general_log; -- 1 = 开启捕获;0 = 未开启
查看捕获文件的名称
SELECT @@general_log_file; -- 捕获文件的完整路径
如果未显示完整路径,文件位于 datadir 目录下。
Windows 示例:
+---------------------+--------------------------------------------------+
| @@general_log_file | |
+---------------------+--------------------------------------------------+
| C:\ProgramData\MySQL\MySQL Server 5.7\Data\GuySmiley.log |
+---------------------+--------------------------------------------------+
Linux 示例:
+---------------------+----------------------------------+
| @@general_log_file | |
+---------------------+----------------------------------+
| /var/lib/mysql/ip-ww-xx-yy-zz.log |
+---------------------+----------------------------------+
当更改 general_log_file 全局变量时,新日志保存在 datadir 中。但变量中可能不再显示完整路径。
如果配置文件中没有 general_log_file 条目,默认值为 @@hostname.log 位于 datadir 下。
最佳实践:关闭捕获,将日志文件备份到备份目录,文件名包含捕获的开始/结束日期时间,然后删除旧文件,设置新的日志文件名并开启捕获。通常只在调试时开启捕获。
备份日志文件的典型文件名:
/LogBackup/GeneralLog_20160802_1520_to_20160802_1815.log
Windows 动态更改示例:
SELECT @@general_log; -- 0,未捕获
SELECT @@general_log_file; -- C:\ProgramData\MySQL\MySQL Server 5.6\Data\GuySmiley.log
SELECT @@datadir; -- C:\ProgramData\MySQL\MySQL Server 5.7\Data\
SET GLOBAL general_log_file = 'GeneralLogBegin_20160803_1420.log'; -- 包含日期时间提示
SET GLOBAL general_log = 1; -- 开启捕获,文件在 datadir 下创建
SET GLOBAL general_log = 0; -- 关闭日志记录
Linux 类似。配置文件中相关变量示例:
[mysql]
general_log_file = /path/to/currentquery.log
general_log = 1
此外,变量 log_output 可以配置为 TABLE 输出,而不仅仅是文件。更多信息请查看 MySQL 手册《通用查询日志》。
第 46.4 节:错误日志
错误日志记录了服务器的启动、停止信息以及遇到的关键事件。
内容示例:
2016-08-02 20:40:39 2420 [Note] Shutting down plugin 'binlog'
2016-08-02 20:40:39 2420 [Note] mysqld: Shutdown complete
2016-08-02 20:43:11 2888 [Note] Plugin 'FEDERATED' is disabled.
2016-08-02 20:43:11 2888 [Note] InnoDB: Using atomics to ref count buffer pool pages
2016-08-02 20:43:11 2888 [Note] InnoDB: The InnoDB memory heap is disabled
变量 log_error 保存错误日志文件的路径。
如果没有在配置文件中设置 log_error,系统默认值为 @@hostname.err 位于 datadir 下。注意 log_error 不是动态变量,更改需要通过配置文件并重启服务器(或通过“刷新和重命名错误日志文件”方法,见手册)。
错误日志不能禁用,它们对系统健康排查问题非常重要。而且其条目比通用查询日志少得多。
全局变量 log_warnings 设置详细级别,随版本不同而变化。示例:
SELECT @@log_warnings; -- 记录你之前的设置
SET GLOBAL log_warnings = 2; -- 设置为大于 1 会增加输出(取决于服务器版本)
log_warnings 是动态变量。
配置文件中的示例:
[mysql]
log_error = /path/to/CurrentError.log
log_warnings = 2
MySQL 5.7.2 将警告级别扩展到 3,并增加了全局变量 log_error_verbosity(5.7.2 引入)。可以动态设置或通过配置文件设置。
从 MySQL 5.7.2 开始:
[mysql]
log_error = /path/to/CurrentError.log
log_warnings = 2
log_error_verbosity = 3
请参阅 MySQL 手册《错误日志》以了解刷新和重命名错误日志文件的方法,以及各版本中 log_warnings 和 error_log_verbosity 的相关说明。