深入浅出MySQL中介绍了6种不同的日志,记录着数据库在不同方面的踪迹。

 

MySQL的六种日志:

  • 错误日志(Error Log)
  • 二进制日志(Binary Log、Bin Log)
  • 查询日志(General Query Log)
  • 慢查询日志(Slow Query Log)
  • 中继日志(Relay Log)
  • 元数据日志(DDL Log)

 

平常很少使用到中继日志和元数据日志,所以只介绍前四种日志。

 

一、错误日志

它记录了mysqld(MySQL服务器)启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息。

当数据库出现任何故障导致无法正常使用时,可以首先查看此日志。

 

可以用 –log-err[=file_name]选项来指定mysqld保存错误日志文件的位置。

查看MySQL数据库,错误日志位置的方法:

 

然后切换到这个目录 /usr/local/mysql/var

AMDServer.err就是我们要找的文件。

可以使用vim打开这个文件进行查看。

 

 

二、二进制日志

二进制日志(BinLog)记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句。

不过不包括数据查询语句。

语句以“事件”的形式保存,它描述了数据的更改过程。

此日志对于灾难时的数据恢复起着极其重要的作用。

 

日志的位置

当用–log-bin[=file_name]选项启动时,mysqld开始将数据变更情况写入日志文件。

当没有给出file_name值时,默认名为主机名后面跟-bin选项。

如果给出了文件名,但是不包含路径,则文件默认被写入参数DATADIR(数据目录)指定的目录。

 

日志的格式

二进制日志的格式分为三种,可以在启动时通过参数 –binglog_format进行设置

  • STATEMENT(语句)
  • ROW(每一行的变更记录,默认格式)
  • MIXED(混合模式)

Statement语句模式

在MySQL5.1之前的版本都采用这种方式。

日志中记录的都是语句,每一条对数据造成修改的SQL语句都会记录在日志中。

通过mysqlbinlog工具,可以看到每一条语句的文本。

这种格式的优点是日志记录清晰易读、日志量小,对I/O影响较小。

缺点是在某些情况下slave(从服务器)的日志复制会出错。

 

Row行变更

MySQL目前默认的日志格式,它将每一行的变更记录到日志中。

比如简单的更新SQL: UPDATE emp SET name=’abc’;

如果是Statement格式,日志中会记录一行SQL文本。

如果是Row格式,由于是对全表进行更新,也就是每一行记录都会发生变更,如果是一个100万行的大表,则日志中会记录100万条记录的变化情况,日志量大大增加。

 

这种格式的优点是会记录每一行数据的变化细节,不会出现某些情况下无法复制的情况。

缺点是日志量大,对I/O影响较大。

 

MIXED混合模式

该日志混合了Statement和Row两种日志。默认情况下采用Statement,但在一些特殊情况下采用Row来记录。

比如采用NDB存储引擎,此时对表的DML语句全部采用Row。

客户端使用了临时表,客户端采用了不确定函数,比如current_user()等。

因为这种不确定函数在主从中得到的值可能不同,导致主从数据产生不一致。

MIXED格式能尽量利用这两种格式的优点,而避开它们的缺点。

 

可以在global和session级别对binlog_format进行日志格式的设置,但一定要谨慎操作,确保主从库的复制能够正常进行。

 

查看BinLog日志

1. 使用mysql查看binlog

 

2. 使用mysqlbinlog工具

binlog是二进制存储的,我们可以使用一个查看mysql二进制日志的工具(mysqlbinlog)操作binlog日志文件。

该工具的默认安装路径为:/usr/local/mysql/bin/mysqlbinlog

另外还有一些其他的参数可以使用:

 

删除日志

Reset Master可以删除所有日志

 

 

三、查询日志

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

如果要启用查询日志,可以通过下面两个参数控制:

  • –general_log[={0|1}],控制是否启用日志
  • –general_log_file=file_name,控制日志文件的路径

 

日志的位置

查询日志和慢查询日志都可以选择保存在文件或者表中。

使用参数 –log-output[=value]来控制,value可以是TABLE、FILE、NONE的一个或多个的组合,中间用逗号分隔。

这里的表指的是: general_log 表。

 

P.S. log日志中记录了所有数据库的操作,对于访问频繁的系统,此日志对系统性能的影响较大,建议关闭。

 

四、慢查询日志

慢查询日志记录了所有执行时间超过参数 long_query_time(单位为秒)设置值,并且扫描记录数不少于min_examined_row_limit的所有SQL语句的日志。

获取表锁的时间不算在执行时间内。

 

两类语句不计入慢查询日志:

  1. 管理语句,它使用 –log-slow-admin-statements控制
  2. 不使用索引的查询,它使用 –log-queries-not-using-indexes进行控制

 

慢查询日志默认是关闭的,使用 –slow_query_log[={0|1}]显式指定慢查询状态,如果不指定或者指定值为1都会打开慢查询。

使用slow_query_log_file[=filename]指定慢查询日志的路径。

 

如果没有给定file_name的值,日志将写入DATADIR指定的路径下,默认文件名是[host_name]-slow.log

 

 

小结

这里介绍的四种日志在碰到不同问题时,用途各不同。

  • 系统故障时,优先查看错误日志,迅速定位故障原因。
  • 二进制日志记录数据变更和DDL操作,用于数据备份、数据复制、数据恢复等操作,应默认开启。
  • 如果想看到数据库操作的所有内容,就用查询日志,但是一般情况下建议不要打开,会影响系统整体性能。
  • 如果希望查看系统的性能问题,就用慢查询日志,找到有性能问题的SQL语句,进行针对性优化。
【MySQL】日志
Tagged on:
0 0 vote
Article Rating
订阅
提醒
0 评论
Inline Feedbacks
View all comments