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