一、MySQL的日志文件有哪些?

  • MySQL常见的日志文件有:
  • 错误日志(error log)
  • 慢查询日志(slow query log)
  • 查询日志(query log)
  • 二进制文件(bin log)
  • 重做日志(redo log)
  • 回滚日志(undo log)
  • 本文不讲解每个日志文件的具体细节,详情可参阅给出的每个链接

错误日志

  • 该日志比较简单,对MySQL的启动、运行、关闭都进行了记录
  • 遇到问题时应该首先查看该日志,以便定位问题
  • 该文件不仅记录了所有的错误信息,还给出了警告信息或者正确信息

慢查询日志

  • 慢查询日志可以帮你定位可能存在问题的SQL语句,从而进行SQL语句的优化
  • 当运行时间超过指定时间的SQL语句会被记录到慢查询日志中

查询日志

  • 查询日志记录了所有对MySQL数据库请求的信息,无论这些请求是否得到了正确的执行

二进制文件

  • 二进制日志记录了对MySQL数据库执行更改的所有操作
  • 若操作本身没有导致数据库发生变化,该操作可能也会写入二进制文件(但是不包括select、show这类操作,因为它们不会对数据库进行修改)
  • 二进制的主要作用有:
  • 恢复(recovery):些数据的恢复需要二进制日志,例如,在一个数据库全备文件恢复后,用户可以通过二进制文件进行point-in-time的恢复
  • 复制(replication):其原理与恢复类似,通过复制和执行二进制日志使一台远程的MySQL数据库(一般称为slave或standby)与一台MySQL数据库(一般称为master或primary)进行实时同步
  • 审计(audit):用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击

重做日志

  • MySQL会将事务记录在重做日志中,用来保证事务的原子性和持久性
  • 当事务提交(commit)的时候,必须先将事务的所有日志写入重做日志文件进行持久化,待事务的commit操作完成才算完成
  • 当实例或介质失败时,重做日志文件就能派上用场。例如,数据库由于所在主机掉电导致实例失败,InnoDB存储引擎会使用重做日志文件恢复到掉电前的时刻,以此来保证数据的完整性
  • 重做日志缓冲:
  • 并不是每次提交事务时都立即将内容立即写入重做日志中,而是先保存到重做日志缓冲中,等到特定的时机再将重做日志缓冲中的内容写入重做日志(checkpoint技术)

回滚日志

  • 重做日志记录了事务的行为,可以很好地通过其对页进行“重做”操作
  • 但是事务有时还需要进行回滚操作,这时就需要undo。因此在对数据库进行修改时,InnoDB存储引擎不但会产生redo,还会产生一定量的undo。这样如果用户执行的事务或语句由于某种原因失败了,又或用户用一条rollback语句请求回滚,就可以利用这些undo信息将数据回滚到修改之前的样子

二、redo log与bin log的区别是什么?

  • 二进制日志其用来进行POINT-IN-TIME(PIT)的恢复以及主从复制(Replication)环境的建立。从表面上看其和重做日志非常相似,都是记录对于数据库操作的日志。然而,从本质上看,两者有着非常大的不同

不同点①

  • redo log是在InnoDB存储引擎层产生
  • bin log是在MySQL数据库的上层产生的,并且二进制日志不仅仅针对于InnoDB而言,MySQL数据库中的任何存储引擎对于数据库的更改都会产生二进制日志

不同点②

  • 两种日志记录的内容形式不同:
  • 二进制日志是一种逻辑日志,其记录的是对应的SQL语句
  • 重做日志是物理格式日志,其记录的是对于每个页的修改

不同点③

  • 两种日志记录写入磁盘的时间点不同:
  • 二进制日志只在事务提交完成后进行一次写入
  • 重做日志在事务进行中不断地被写入,这表现为日志并不是随事务提交的顺序写入的
  • 从下图可以看出:
  • 二进制日志仅在事务提交时记录,并且对于每一个事务,仅包含对应事务的一个日志
  • 重做日志其记录的物理操作日志,因此每个事务对应多个日志条目,并且事务的重做日志写入是并发的,并非在事务提交时写入,故其在文件中记录的顺序并非是事务开始的顺序(下图中带有*的,意为该事务的提交)

面试冲刺:21---MySQL的日志文件你有了解吗?有哪些?redo log与bin log的区别是什么呢?_重做日志