MySQL 日志

MySql 中有六种日志文件:重做日志(redo log),回滚日志(undo log),二进制日志(bin log),错误日志(errlog),慢查询日志(slow query log),一般查询日志(general log),中继日志(relay log)。

这其中重做日志和回滚日志与事务操作息息相关,二进制日志与事务操作有一定关系,这篇文章我们来看看这三种日志能做什么。

重做日志(redo log)

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

内容:物理格式的日志,记录的是物理数据页面的修改信息,其 redo log 是顺序写入 redo log file 的物理文件中去的。

产生时间:事务开始后就产生了 redo log。在事务执行的过程中,便开始写入 redo log 文件中。

释放:当对应事务的脏页写入到磁盘之后,redo log 的使命也就完成了。

回滚日志(undo log)

作用:保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC)。

内容:逻辑格式的日志,在执行 undo 的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现。

产生时间:事务开始之前,将当前版本生成 undo log,undo 也会产生 redo 来保证 undo 的可靠性。

释放:当事务提交后,undo log 并不能立马被删除,而是放入待清理的链表。

二进制日志(binlog)

作用:用于主从复置,从库利用主库上的 binlog 进行重播,实现主从同步。还可以用于数据库基于时间点的还原。

内容:逻辑格式的日志,可以简单认为就是执行过的事务中的 sql 语句。但又不完全是 sql 语句那么简单,而是包括了执行 sql 语句反向的信息,比如 delete 对应着其反向的 insert 等。

产生时间:事务提交的时候,一次性将事务中的 sql 语句按照一定格式记录到 binlog。在开启了 binlog 的情况下,对于大事务的提交,可能会变得比较慢一些,这是因为 binlog 会在事务提交的时候一次性写入造成的。

补充

二进制日志的作用之一是还原数据库的,与 redo log 很类似。

  1. 作用不同:redo log 是保证事务持久性的,是事务层面的,binlog 作为还原的功能,是数据库层面的,虽然都有还原的意思,但是其保护的数据的层次是不一样的。
  2. 内容不同:redo log 是物理日志,是数据页面修改之后的物理记录,binlog 是逻辑日志,可以简单理解为就是 sql 语句。
  3. 恢复数据时的效率,基于物理日志的 redo log 恢复数据的效率要高于逻辑日志的 binlog。
  4. MySql 时通过两阶段提交来保证事务一致性的,也就是 redo log 和 binlog 的一致性,理论上是先写 redo log,再写 binlog,两个日志都写入成功(刷入磁盘),事务才算真正的完成。

你可能感兴趣的:(MySQL 日志)