01

概述

    日志是记录了MySQL数据库的各种类型活动的数据。DBA可以利用这些日志文件定位故障,优化性能等。

02

分类

    在MySQL中,有4种不同的日志,分别是:错误日志(errorlog)、二进制日志(binlog)、查询日志(log)和慢查询日志(slow query log)。

    2.1  错误日志

    1、概述

    错误日志记录了当mysqld进程启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。

    2、设置

    查看:

    SHOW VARIABLES LIKE ‘log_error’\G;

    路径设置:

    可以使用—log-error=[file_name]选项来指定mysqld(MySQL服务器)保存错误日志文件的位置。如果没有给定file_name值,mysqld使用错误日志名host_name.err并默认在参数DATADIR(数据目录)指定的目录中写入日志文件。

    在实际应用中,如果数据库启动报错或者crash,或者出现告警信息等,可以通过查看错误日志获取必要的信息。

2.2 二进制日志

    1、概述

    二进制文件记录了对MySQL数据库的所有更新操作(其中还包括执行更新操作的时间等额外信息),不包括查询和SHOW这类操作(binlog作用就是备份恢复使用的,所以只需要记录修改操作即可)。

    二进制文件默认关闭,需要手动指定参数启动。根据MySQL官方手册的测试数据,开启二进制日志会使性能下降1%,但是考虑到可以使用复制(replication)和point-in-time的恢复,这些性能的损失绝对是可以接受的。

    查看:

    SHOW BINLOG EVENT IN ‘mysqld.00001’\G;

    配置:

    通过参数log-bin[=name]可以开启二进制日志,如果不指定name,默认二进制日志文件名为主机名,后缀名为二进制日志的序列号,所在路径为数据库所在目录(datadir)。

    查看datadir:show variables like ‘datadir’;

    2、参数

    max_binlog_size:指定了单个二进制日志文件最大值,如果超过该值,则产生新的二进制日志文件后缀名+1,并记录到.index文件。

    binlog_cache_size:控制缓冲大小,默认大小32K,基于会话的,因此每开启一个事务就分配一个binlog_cache_size大小的缓存,所以不能设置过大。当一个事务的记录大于binlog_cache_size时,MySQL会把缓冲中的日志写入一个临时文件中,因此该值又不能设置太小。

    sync_binlog:表示每写缓冲多少次就要同步到磁盘。如果设置为1,表示采用同步写磁盘的方式来写二进制日志,这时候写操作不使用操作系统的缓冲来写二进制日志。sync_binlog的默认值为0,如果使用InnoDB存储引擎进行复制,并且想得到最大的可用性,建议将该值设置为ON(对数据库IO系统带来一定影响)。

    binlog-do-db:表示需要写入哪些库的日志,默认为空,表示需要同步所有库的日志到二进制日志。

    binlog-ignore-db:表示需要忽略写入哪些库的日志,默认为空,表示需要同步所有库的日志到二进制日志。

    log-slave-update:如果当前数据库是复制中的slave节点,则它不会将从master取得并执行的二进制日志写入自己的二进制文件中。

    binlog_format:记录二进制日志的格式。在MySQL5.1之前,没有这个参数,所有二进制文件的格式都是基于SQL语句(statement)级别的,因此基于这个格式的二进制日志文件的复制(Replication)和Oracle的逻辑Standby有点类似。

    该值可以设置为STATEMENT、ROW和MIXED。

    1、STATEMENT格式下,记录的是逻辑SQL语句。

    2、ROW格式下,记录表的行更改情况。

    3、MIXED格式下,MySQL默认采用STATEMENT格式进行二进制文件记录,但是在一些情况下会使用ROW格式,这些情况包括:

    1)表的存储引擎为NDB,这时对表的DML操作都会以ROW格式记录;

    2)使用了UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不确定函数;

    3)使用了INSERT DELAY语句;

    4)使用了用户定义函数(UDF);

    5)使用了临时表(temporary table)。

    此外,binlog_format参数还有对于存储引擎的限制。

    在通常情况下,我们将参数binlog_format设置为ROW,这可以为数据库的恢复和复制带来更好的可靠性,但是这会带来二进制文件大小的增加

    要查看二进制日志文件内容,必须通过MySQL提供的工具mysqlbinlog。对于STATEMENT格式的二进制日志文件,在使用mysqlbinlog后,看到的就是执行的逻辑SQL语句。但是,如果使用ROW格式记录,会发现mysqlbinlog的结果变得“不可读”,其实只要加上参数-v或-vv就能清楚地看到执行的具体信息了(-vv会比-v显示更新的类型)。

    3、作用

    二进制日志的主要作用如下:

    1)恢复(recovery):某些数据的恢复需要二进制日志,例如,如果需要恢复数据库全量备份的文件,可以通过二进制日志进行point-in-time恢复。

    2)复制(replication):通过复制和执行二进制日志slave与master进行实时同步。

    3)审计(audit):用户通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。

    2.3 查询日志

    1、概述

    查询日志记录了所有对MySQL数据库的请求信息,不论这些请求是否得到正确的响应。

    默认文件名为:主机名.log。

    2、区别

     二进制日志与查询日志区别:

    二进制日志不包含只查询数据的语句,查询日志记录了客户端的所有语句。

    2.4 慢查询日志

    1、概述

    慢查询日志记录了所有执行时间超过参数long_query_time(单位:秒,运行时间等于long_query_time的情况不会被记录)设置值并且扫描记录数不小于min_examinied_row_limit的所有SQL语句的日志(注意,获得表锁定的时间不算做指定时间)。

    慢查询日志默认关闭,需要手动开启。

    MySQL5.1开始,支持将慢查询日志记录到表中,这样用户查询就更加方便直观了。慢查询表在MySQL架构下,名称为slow_log。

    2、参数

    set slow_query_log:是否开启慢查询日志,通过set slow_query_log=on;开启。

    long_query_time:阈值。long_query_time默认为10秒,最小为0,从MySQL5.1开始,精度可以到微秒。

    min_examinied_row_limit:允许扫描的最小行数。

    long_queries_not_using_indexes:如果运行SQL未命中索引,则MySQL数据库同样会将这条SQL语句记录到慢查询日志中(这样方便后续优化)。

    MySQL5.6新增一个参数log_throttle_queries_not_using_indexes,用来表示每分钟允许记录到slow log且未命中索引的SQL语句次数。

    long_query_io:将超过指定逻辑IO次数的SQL语句记录到slow_log中,该值默认为100。

    为了兼容原MySQL数据库的运行方式,还添加了参数slow_query_type,用来表示启用slow log的方式。可选的值为:

    0:表示不把SQL语句记录到slow log

    1:表示根据运行时间将SQL语句记录到slow log

    2:表示根据逻辑IO次数将SQL语句记录到slow log

    3:表示根据运行时间及逻辑IO次数将SQL语句记录到slow log

    3、分析

    如果在慢查询日志中搜索,则会非常不方便,分析起来很麻烦,MySQL提供了mysqldumpslow工具帮助分析慢查询日志。

    指令:mysqldumpslow ***-slow.log

    如果希望得到执行时间最长的5条SQL语句,操作如下:

    mysqldumpslow -s -al -n 5 ***-slow.log