面试冲刺:21---MySQL的日志文件你有了解吗?有哪些?redo log与bin log的区别是什么呢?
原创
©著作权归作者所有:来自51CTO博客作者董哥的黑板报的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、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语句
- 重做日志是物理格式日志,其记录的是对于每个页的修改
不同点③
- 二进制日志只在事务提交完成后进行一次写入
- 重做日志在事务进行中不断地被写入,这表现为日志并不是随事务提交的顺序写入的
- 二进制日志仅在事务提交时记录,并且对于每一个事务,仅包含对应事务的一个日志
- 重做日志其记录的物理操作日志,因此每个事务对应多个日志条目,并且事务的重做日志写入是并发的,并非在事务提交时写入,故其在文件中记录的顺序并非是事务开始的顺序(下图中带有*的,意为该事务的提交)