MySQL日志(1)- 介绍

最后更新:2018-06-25

MySql 中有六种日志文件,分别是:

  • 重做日志(redo log) :解决数据库宕机重启丢失数据的问题
  • 回滚日志(undo log) :实现事务的回滚操作
  • 二进制日志(binlog) :主要用来做复制、数据备份等操作
  • 错误日志(errorlog)
  • 慢查询日志(slow query log)
  • 一般查询日志(general log)
  • 中继日志(relay log)

重做日志(redo log)

重做日志用来确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log 进行重做,从而达到事务的持久性这一特性。

存储在ib_logfile[number]文件中

innodb实现

https://edgar615.github.io/innodb-redo-log.html

回滚日志(undo log)

回滚日志保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读

存储在共享表空间里面的ibdata*文件中

innodb实现

https://edgar615.github.io/mysql-mvcc.html

二进制日志(binlog)

二进制日志(binlog) 记录了所有 DDL 语句和 DML 语句,但是不包括数据查询语句。语句以“事件”的形式保存,它描述了数据的更改过程。在主从复制中,从库利用主库上的binlog进行重播,实现主从同步;此日志对于灾难时的数据恢复起着极其重要的作用。

server层实现的,意味着所有引擎都可以使用binlog日志

https://edgar615.github.io/mysql-binlog.html https://edgar615.github.io/mysql-binlog-event.html

三、查询日志

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

日志的位置和格式

查询日志和慢查询日志都可以选择保存在文件或者表中,使用参数 –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。

错误日志(errorlog)

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

慢查询日志(slow query log)

https://edgar615.github.io/mysql-slow-sql.html

一般查询日志(general log)

中继日志(relay log)

参考资料

https://www.jianshu.com/p/a807181d1a47

https://segmentfault.com/a/1190000011322006

Edgar

Edgar
一个略懂Java的小菜比