MySQL--MySQL 日志
在 MySQL中,有 4 种不同的日志,分别是错误日志、二进制日志(BINLOG 日志)、查询日志和慢查询日志。
1.错误日志
- 错误日志是 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和停止时,以及服务器在运行过程中发生任何严重的相关信息。当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。
- 指定 mysqld(MySQL 服务器)保存错误日志文件的位置:
--log-error[=file_name]
如果没有给定 file_name 值,mysqld 使用错误日志名 host_name.err(host_name 为主机名)并默认在参数 DATADIR(数据目录)指定的目录中写入日志文件。
2.二进制日志
- 二进制日志(BINLOG)记录了所有的 DDL(数据定义语言) 语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。语句以“事件”的形式保存,它描述了数据的更改过程。此日志对于灾难时的数据恢复起着极其重要的作用。
2.1日志的位置和格式
- 当用 --log-bin[=file_name] 选项启动时,mysqld 开始将数据变更情况写入日志文件。如果没有给出 file_name 值,默认名为主机名跟“-bin”。如果给出了文件名,但没有包含路径,则文件默认被写入参数 DATADIR(数据目录)指定的目录。
- MySQL 5.5 中,二进制日志的格式分为 3 种:STATEMENT、ROW、MIXED,可以在启动时通过参数 --binlog_format 进行设置,这 3 种格式的区别如下。
1)STATEMENT
MySQL 5.1 之前的版本都采用这种方式。顾名思义,日志中记录的偶素是语句(statement),每一条对数据造成修改的 SQL 语句都会记录在日志中,通过 mysqlbinlog 工具,可以清晰的看到每条语句的文本。主从复制的时候,从库(slave)会将日志解析为原文本,并在从库重新执行一次。
这种格式的优点是日志记录清晰易读、日志量少,对 I/O 影响较小。
缺点是某些情况下 slave 的日志复制会出错。
2)ROW
MySQL 5.1.11 之后,出现了这种新的日志格式。它将每一行的变更记录到日志中,而不是记录 SQL 语句。
这种格式的优点是会记录每一行数据的变化细节,不会出现某些情况下无法复制的情况。
缺点是日志量大,对 I/O 影响较大。
3)MIXED
这是目前 MySQL 默认的日志格式,即混合了 STATEMENT 和 ROW 两种日志。默认情况下采用 STATEMENT,但在一些特殊情况下采用 ROW 来进行记录,比如采用 NDB 存储引擎,此时对表的 DML 语句全部采用 ROW;客户端使用了临时表;客户端采用了不确定函数,比如 current_user() 等,因为这种不确定函数在主从中得到的值可能不同,导致主从数据产生不一致。MIXED 格式能尽量利用两种模式的优点,而避开它们的缺点。
注意:可以在 global 和 session 级别对 binlog_format 进行日志格式的设置,但一定要谨慎操作,确保从库的复制能够正常进行。
2.2日志的读取
由于日志以二进制的方式存储,不能直接读取,需要用 mysqlbinlog 工具来查看,语法如下:
1 shell > mysqlbinlog log-file;
如果日志是 ROW 格式,则 mysqlbinlog 解析后是一堆无法读懂的字符。此时可以加上 -v 或者 -vv 参数进行读取。
2.3日志的删除
- 方法1
执行
RESET MASTER;
命令,该命令将删除所有 BINLOG 日志,新日志编号从 000001 开始。
- 方法2
执行
PURGE MASTER LOGS TO 'mysql-bin.******'
命令,该命令将删除 “******” 编号之前的所有日志。
- 方法3
执行
PURGE MASTER LOGS BEFORE 'yyyy-mm-dd hh24:mi:ss'
命令,该命令将删除指定日志之前产生的所有日志。
- 方法4
设置参数 --expire_logs_days=#,此参数的含义是设置日志的过期天数,过了指定的天数后日志将会被自动删除,这样将有利于减少 DBA 管理日志的工作量。
- 触发日志文件更新:
mysqladmin flush-log
2.4其他选项
- 二进制日志由于记录了数据的变化过程,对于数据的完整性和安全性起着非常重要的作用。因此,MySQL 还提供了一些其他参数选项来进行更小粒度的管理。
--binlog-do-db=db_name:该选项告诉主服务器,如果当前的数据库(即 USE 选定的数据库)是 db_name,应该更新记录到二进制日志中。其他所有没有显式指定的数据库更新将被忽略,不记录在日志中。
--binlog-ignore-db=db_name:该选项告诉服务器,如果当前的数据库(即 USE 选定的数据库)是 db_name,不应该将更新保存到二进制日志中,其他没有显式忽略的数据库都将进行记录。
如果想记录或忽略多个数据库,可以对上面两个选项分别使用多次,即对每个数据库指定相应的选项。
--innodb-safe-binlog:此选项经常和 --sync-binlog=N(每写 N 次日志同步磁盘)一起配合使用,使得事务在日志的记录更加安全。
SET SQL_LOG_BIN=0:具有 SUPER 权限的客户端可以通过此语句禁止将自己的语句记入二进制记录。这个选项在某些环境下是有用的,但是使用时一定要小心,因为它很可能造成日志记录的不完整或者在复制环境中造成主从数据的不一致。
3查询日志
- 查询日志记录了客户端的所有语句。
3.1日志的位置和格式
- 查询日志和慢查询日志都可以选择保存在文件或者表汇总,并使用参数
--log-output[=value, ...]
来进行控制,value 值可以使 TABLE、FILE、NONE 的一个或者多个组合,中间用逗号进行分割,分别表示日志保存在表、文件、不保存在表和文件中,这里的表指的是 mysql 库中的 general_log(慢查询日志是 slow_log)表。其中 NONE 的优先级最高。
- 在 MySQL 5.5.7 之前的版本中,日志记录到表比记录到文件要占用更多的系统资源,如果需要更高的性能,则建议使用文件来记录日志。
启用查询日志:
--general_log[={0|1}] #控制是否启用日志。1或者不带值可以启用查询日志;0关闭查询日志。不指定该参数也不启用查询日志。
#5.1.29 之前使用 --log[=file_name] 或 -l [file_name]
--general_log_file[=file_name] #控制日志文件的路径。如果没有指定值,且没有显式设置 --log-output参数,那么日志将写入参数 DATADIR(数据目录)指定的路径下,默认文件名是 host_name.log。这两个参数都是 global 类型,可以在系统启动时或者系统运行时进行动态修改,如果想在 session 级别控制日志是否被记录,则通过在 session 中设置参数 sql_log_off 为 on 或者 off 来进行控制。
3.2日志的读取
- 查询日志记录的格式是纯文本,所以可以直接进行读取。
4慢查询日志
- 慢查询日志记录了所有执行时间超过参数 long_query_time(单位:秒)设置值并且扫描记录数不小于 min_examined_row_limit 的所有 SQL 语句的日志(注意:获得表锁定的时间不算作执行时间)。long_query_time 默认为 10 秒,最小为 0,精度可以到微秒。
- 在默认情况下,有两类常见语句不会记录到慢查询日志:管理语句和不使用索引进行查询的语句。这里的管理语句包括 ALTER TABLE、ANALYZE TABLE、CHECK TABLE、CREATE INDEX、DROP INDEX、OPTIMIZE TABLE 和 REPAIR TABLE。如果要监控这两类 SQL 语句,可以分别通过参数 --log-slow-admin-statements 和 log_queries_not_using_indexes 进行控制。
4.1文件位置和格式
- 慢查询日志默认是关闭的。
- 在 MySQL 5.1.29 之前,使用
--log-slow-queries[=file_name]
选项启动 mysqld(MySQL 服务器)时,慢查询日志开始被记录。和前面几种日志一样,如果没有给定 file_name 的值,日志将写入参数 DATADIR(数据目录)指定的路径下,默认文件名是 host_name-slow.log。
- 在 MySQL 5.1.29 之后,--log-slow-queries 已经不推荐使用,而采用两个新的参数来替换:使用
--slow_query_log[={0|1}]
显式指定慢查询的状态,如果不指定值或者指定值为 1 都会打开慢查询;使用
slow_query_log_file[=file_name]
来指定慢查询日志的路径。另外,如前所述,还可以使用 --log-output 参数来指定日志输出方式,默认会输出到文件,当然也可以选择输出到表,需要注意的是,如果选择输出到表,则表中记录的慢查询时间只能精确到秒,而日志文件可以精确到微秒。
4.2日志的读取
- 和错误日志、查询日志一样,慢查询日志记录的格式也是纯文本,可以被直接读取。
- 如果慢查询日志中记录内容很多,可以使用 mysqldumpslow 工具来对慢查询日志进行分类汇总。
- 对于 SQL 文本完全一致,只是变量不同的语句,mysqldunpslow 将会自动视为同一个语句进行统计,变量值用 N 来代替。这个统计结果将大大增加用户阅读慢查询日志的效率,并迅速定位系统的 SQL 瓶颈。
- 慢查询日志对于我们发现应用中有性能问题的 SQL 很有帮助,建议正常情况下打开此日志并经常查看分析。
1 #错误日志 2 log-err=D:/work/mysql/mysql-5.6.28-winx64/mysql-5.6.28-winx64/data/mylogs/err.log 3 #二进制日志 4 log-bin=D:/work/mysql/mysql-5.6.28-winx64/mysql-5.6.28-winx64/data/mylogs/bin 5 #查询日志 6 general_log=1 7 general_log_file=D:/work/mysql/mysql-5.6.28-winx64/mysql-5.6.28-winx64/data/mylogs/query.log 8 #慢查询日志 9 slow_query_log=1 10 slow_query_log_file=D:/work/mysql/mysql-5.6.28-winx64/mysql-5.6.28-winx64/data/mylogs/slow-query.log 11 long_query_time=2
window 下的配置,一定要用 /,用 \ 最后总是被转义。
5.mysqlsla 简介
- mysqlsla 是 MySQL Statement Log Analyzer 的缩写,它可以分析查询日志、慢查询日志(包括微秒日志)、二进制日志和具有固定格式的自定义日志。
- mysqlsla 基本用法:
解析查询日志和慢查询日志:
mysqlsla --log-type slow LOG
mysqlsla --log-type general LOG
解析二进制日志,需要先通过 mysqlbinlog 进行转换:
mysqlbinlog LOG | mysqlsla --log-type binary -
解析微秒日志:
mysqlsla --log-type msl LOG
解析用户自定义日志:
mysqlsla --log-type udl --udl-format FILE
需要注意的是,除二进制日志外,其他类型日志的 --log-type 参数在正常情况下可以省略,mysqlsla 会自动分析日志类型进行解析;而 mysqlsla 无法判断经过标准输出后的日志类型,因此二进制日志通过 mysqlbinlog LOG 解析后mysqlsla 无法判断日志类型,必须加上 --log-type 参数。
- mysqlsla 提供了很多可选参数,下面列出了一些常用的参数:
--statement-filter (-sf) CONDTIONS 用来过滤语句类型,CONDTIONS 前面可以加 + 或者 -,表示报表中 仅显示 或者 仅去掉 后面的语句类型。
--explain (-ex) 用来在报表中显示执行计划。
--sort 是排序方式,慢查询日志和微秒日志默认是按照总执行时间 t_sum 来排序,其他日志都按照执行次数 c_sum 来排序。
--grep PATTERN 用来匹配 SQL 语句中的特定字符串。
- 为了方便使用,可以将 mysqlsla 的常用配置选项写入 ~/.mysqlsla,这个文件是 mysqlsla 的配置文件,mysqlsla 使用时会读取里面的配置。
- 除了 mysqlsla,还有一些常用的日志分析工具,比如 myprofi、mysql-explain-slow-log、mysqllogfilter。
6.小结
- 系统故障时,建议首先查看错误日志,以帮助用户迅速定位故障原因。
- 如果要记录数据的变更、数据的备份、数据的复制等操作时,二进制日志必须打开,以帮助用户进行数据恢复等操作。默认不记录此日志,建议通过 --log-bin 选项将此日志打开。
- 如果希望记录数据库发生的任何操作,包括 SELECT,则需要用 --log 将查询日志打开,此日志默认关闭,一般情况下建议不要打开此日志,以免影响系统整体性能。
- 如果希望查看系统的性能问题,希望找到有性能问题的 SQL 语句,则需要要 --slow_query_log 打开慢查询日志。对于大量的慢查询日志,建议使用 mysqldumpslow 工具来进行汇总查看。