MySQL 中有 4 中不一样的日志,分别是错误日志、二进制日志(binlog 日志)、查询日志和,慢查询日志,应该充分利用这些日志对数据库进行各类维护和调优。mysql
错误日志时 MySQL 中最重要的日志之一,它记录了当 mysqld 启动和中止时,以及服务器在运行过程当中发生任何严重错误时的相关信息。当数据库出现任何故障致使没法正常使用时,能够首先查看此日志。sql
二进制日志(binlog) 记录了全部 DDL 语句和 DML 语句,可是不包括数据查询语句。语句以“事件”的形式保存,它描述了数据的更改过程。此日志对于灾难时的数据恢复起着极其重要的做用。数据库
当用 --log-bin[=file_name] 选项启动时,mysqld 开始将数据变动状况写入日志文件。若是灭有给出 file_name 值,默认名为主机名后面跟“-bin”。若是给出了文件名,但没有包含路径,则文件默认被写入参数 datadir(数据目录)指定的目录。 安全
二进制日志的格式分为 3 种:statement、row、mixed,能够在启动时经过参数 --binlog_format 进行设置,这 3 种格式的区别以下:服务器
mysql 5.1 以前的版本都采用这种方式,日志中记录的都是语句(statement),每一条对数据形成修改的sql语句都会记录到日志中,经过 mysqlbinlog 工具,能够清晰的看到每条语句的文本。主从复制时,从库(slave)会将日志解析为原文本,并在从库中从新执行一次。这种格式的优势的日志记录清晰易读,日志量少,对 I/O 影响较小。缺点是在某些状况下 slave 的日志复制会出错。session
mysql 5.1.11 以后,出现了这种新的日志格式,它将每一行的变动记录到日志中,而不是记录sql语句,好比一个简单的跟新sql:
update emp set name='abc'
若是是 statement 格式,日志中会记录一行 sql 文本;
若是是 row 格式,因为是对全表进行更新,也就是每一行记录都会发生改变,若是是一个 100 万行的大表,则日志中会记录 100万条记录的变化状况。日志量大大增长。 函数
这种格式的优势是会记录每一行数据变化的细节,不会出现某些状况下没法复制的状况,缺点是日志量大,对 I/O 影响较大。工具
这是目前 MySQL 默认的日志格式,即混合了 statement 和 row 两种日志。默认状况下采用 statement,但在一些特殊状况下采用 row 来进行记录,好比
采用 NDB 存储引擎,此时对表的 DML 语句所有采用 row;
客户端使用了临时表;
客户端采用了不肯定函数,好比 current_user() 等; 性能
由于这种不肯定函数在主从中获得的值可能不一样,致使主从数据产生不一致。mixed 格式能尽可能利用两种模式的优势,而避开他们的缺点。 日志
注意:能够在 global 和 session 级别对 binlog_format 进行日志格式设置,但必定要谨慎操做,确保从库的复制可以正常进行。
因为日志以二进制方式存储,不能直接读取,须要用 mysqlbinlog 工具来查看,对于 statement 格式的文件能够用工具直接查看,对于 row 格式的要加 -v 或 -vv 参数进行读取。
对于比较繁忙的系统,天天产生大量日志,这些日志若是长时间不清除,将会对磁盘空间带来极大的浪费,所以,须要按期删除日志。
执行 “reset master;” 命令将删除全部 binlog 日志,新日志编号从“000001”开始
执行 “purge master logs to 'mysql-bin.'”命令,将删除编号以前的全部日志(不删除命令中指定的文件)
执行 “purge master log before 'yyyy-mm-dd hh24:mi:ss'” 命令将删除指定日期前的全部日志
在配置文件的[mysqld]中设置参数 expire_logs_days=#
, 此参数的含义是设置日志的过时天数,过了指定的天数后日志将会被自动删除。
二进制日志记录了数据的变化过程,对于数据的完整性和安全性起着很是重要的做用。所以,MySQL 还提供了一些其余参数选项来进行更小粒度的管理
该选项告诉主服务器,若是当前的数据库(即 use 选定的数据库)是 db_name, 应将更新记录到二进制文件中,其余全部么有显式指定的数据库更新将被忽略,不记录在日志中。
该选项告诉主服务器,若是当前的数据库(即 use 选定的数据库) 是 db_name,不该将更新保存到二进制日志中,其余没有显式忽略的数据库都将进行记录。
若是想记录或忽略多个数据库,能够对上面两个选项分别使用屡次。
此选项常常和 --sync-binlog = N (每写 N 第二天志同步磁盘)一块儿配合使用,使得事务在日志中的记录更加安全。
查询日志记录了客户端的全部语句,而二进制日志不包含只查询数据的语句。
查询日志和慢查询日志均可以选择保存在文件或者表中,使用参数 --log-output[=value]来进行控制,value 值能够是table、file、none 的一个或者多个组合,中间用逗号进行分割,分别表示日志保存在表、文件、不保存在表和文件中,这里的表指的是 mysql 库中的 general_log (慢查询日志是 slow_log) 表。
其中 none 的优先级最高,好比:
--log-output = table, file 表示日志能够同时输出到表和文件中
--log-output = table, none 因为 none 的优先级高,表示日志不保存在表和文件中。
若是不显示设置此参数,则默认输出到文件。
能够经过参数 --general_log[={0|1}] 和 --general_log_file=file_name 来进行控制。
--general_log 设置为1或者不带值均可以启用查询日志;设置为0表示关闭查询日志,若是不指定此参数也不会启用。
若是没有指定 --general_log_file=file_name 的值,且没有显式设置 --log-output 参数,那么日志将写入参数 datadir(数据目录)指定的路径下,默认文件名为 host_name.log。
这两个参数都是 global 类型,能够在系统启动时或者系统运行时进行动态修改,若是想在 session 级别控制,则经过在 session 中设置参数 sql_log_off 为 on 或者 off。
查询日志记录的格式是纯文本,因此能够直接进行读取。
注意: log 日志中记录了全部数据库的操做,对于访问频繁的系统,此日志对系统性能的影响较大,建议通常状况下关闭。
慢查询日志记录了全部执行时间超过参数 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 进行控制。
经过如下两个参数开启慢查询日志:
若是不指定值或者指定值为 1 都会打开慢查询;
指定慢查询日志的路径
注意: 可使用 --log-output 参数来指定日志的输出方式,默认会输出到文件,固然也能够选择输出到表,须要注意的是,若是选择输出到表,则表中的记录只能精确到秒,而日志文件中能够精确到微秒。
和错误日志、查询日志同样,慢查询日志记录的格式也是纯文本,能够被直接读取。
若是要设置微秒级的慢查询,能够 set global long_query_time=0.01
若是慢查询日志中记录内容不少,可使用 mysqldumpslow 工具对慢查询日志进行分类汇总。对于 sql 文本彻底一致,只是变量不一样的语句,mysqldumpslow 将会自动视为同一个语句进行统计,变量值用 N 来代替。这个统计结果将大大增长用户阅读慢查询日志的效率,迅速定位系统的 sql 瓶颈。
注意: 慢查询日志对于发现应用中有性能问题的 sql 颇有帮助,正常状况下,打开此日志并常常查看分析。