在myql中,日志有很多种:错误日志,查询日志,慢查询日志,二进制日志,中继日志,事务日志等。

错误日志 error_log

错误日志中不仅仅记录了mysql运行中的错误信息,除此之外,还记录了mysql运行中的警告信息、mysql启动/暂停时输出的信息等等。

  • 错误日志使用变量log_error以及log_warnings记录
  • log_error变量设置log文件保存本地的路径信息;
  • log_warnings变量用于识别警告信息是否也添加到错误日志中,如果log_warnings值为0表示不记录警告信息,值为1表示警告信息记录到错误日志中,大于1表示失败的连接、创建连接拒绝访问等信息也会被记录到错误日志中。
  • 如果需要永久设置这两个变量,需要到my.cnf配置文件中修改。

查询日志 general_log

查询日志也被称为通用日志,因为日志除了记录select语句信息外,还会记录数据库所有执行的命令,不管命令是否正确都会被记录。因为会记录所有的执行语句,所以数据库需要不停的写入信息到查询日志中,会增加系统的开销,查询日志默认是没有开启的。但是查询日志有利于我们对语句的分析。

  • general_log表示查询日志是否开启,默认关闭off
  • log_output表示日志开启后,以哪种形式保存,file、table、file,table、none。file是指存放在指定的文件中,table是指日志保存在mysql的general_log表中。慢查询也是由此参数进行控制的。
  • general_log_file表示log_output为file或file,table时,日志保存的路径,默认/var/lib/mysql下
  • 因为日志保存在文件需要io操作,建议保存在表里。


执行语句后去log文件查看验证

慢查询日志 slow_query_log

某些sql语句的执行时间相对久,我们就将这种响应时间比较慢的语句记录到慢查询日志中,跟查询日志类似,慢查询日志保存的也不仅仅是查询语句,还包括insert、delete、update等等。
那慢查询的这个查询时间多久才算慢呢??
系统默认时间是10s,当然这个时间是可以自定义的。

相关参数:

  • log_output:跟查询日志相同,file、table、file,table、none
  • slow_query_log:是否开启慢查询 on、off
  • slow_query_log_file:file日志文件保存路径
  • long_query_time:过多久时间记录




使用select sleep(4);看看语句有没有记录到log文件和mysql.slow_log表中。

mysqldumpslow工具

如果慢查询日志是以文件的形式保存的话,还可以使用mysqldumpslow命令对慢查询日志文件进行分析

//命令行运行
mysqldumpslow -s t xxx.log
//使用-h查看对应参数意思

二进制日志 binlog

记录了所有修改了数据库的语句,比如说select,show之类不改变数据库的操作语句,二进制日志是不记录的。
基于二进制日志记录改变数据库语句这一特点,binlog就可以用来做时间点数据的恢复。比如说数据库需要在每天的24点进行备份数据操作,如果该数据库在第二天24点之前发生了错误,没有备份成功。那这一天的数据我们要如何恢复呢??这个就是数据时间点恢复。
使用binlog就是把备份后到奔溃前这段时间内的所有数据库操作完完全全地重新执行一遍。

二进制日志有三种记录模式

  • statement模式
    记录对数据库做出修改地语句,比如update 表 set 字段名=xx,如果使用此模式,那么就只将这条操作语句记录到二进制日志中。

  • row模式
    记录对数据库做出修改的语句所影响的行以及这些行的修改,如果使用update 表 set 字段名=xx语句影响到的数据有50行,则这50行数据以及这些数据是怎样被修改的都会被记录到二进制日志中。

  • mixed模式
    混合使用上面两种模式进行开发。但是在实际开发中,一般使用row模式进行开发。

相关参数:

  • log_bin:控制是否开启二进制日志,而且这个变量只能在my.cnf配置文件中进行修改,例如设置为log_bin=mybinlog,这样就会在mysql的数据目录(/var/lib/mysql/)中生成一个已mybinlog为前缀的二进制日志文件,如果需要关闭则直接注释掉或者删除log_bin就行了。
  • binlog_format:设置记录模式。
  • max_binlog_size:单个日志文件大小,以字节为单位

  • 查看二进制日志内容
    show binary logs;//查看二进制日志文件名列表
    show binlog events in '二进制文件名' from 时间点pos limit 显示数量num;
    show binlog events in mybinlog.00000001 from 277 limit 10;

mysqlbinlog工具

//命令行运行
mysqlbinlog 二进制日志文件
mysqlbinlog -h