目录
前言
MySQL日志主要包括错误日志、一般查询日志、慢查询日志、事务日志、中继日志、二进制日志、重做日志、回滚日志几大类,其中最为重要的就是二进制日志(bin log)、重做日志(redo log)和回滚日志(undo log),本文主要介绍redo log
、binlog
、两阶段提交和undo log
。
MySQL 主要日志
1.redo log
redo log
(重做日志)是数据库系统中用于支持事务持久性和崩溃恢复的一种重要日志类型,它让MySQL
拥有了崩溃恢复能力。
1.1 redo log作用
-
支持事务的持久性: 当事务提交时,其对数据库的修改会首先被写入 redo log 中,确保事务的提交是持久的。
-
崩溃恢复: 在数据库发生故障或崩溃时,通过 Redo Log 中的信息,数据库可以重新执行已提交的事务,将未写入磁盘的修改重新应用到数据页,从而实现数据库的一致性和恢复。
1.2 redo Log 的工作流程
-
事务修改数据: 当事务对数据库的数据进行修改时,修改的操作首先被写入 InnoDB 存储引擎的 Redo Log 缓冲区。
-
事务提交: 事务提交时,redo log 缓冲区的内容被异步刷新到磁盘的 redo log 文件中。这个操作是一个顺序写入磁盘的过程,相对较快。
-
持久性保证: 即使事务对数据库的数据页的修改尚未写入磁盘,由于 redo log 的存在,数据库可以保证已提交的事务对应的 redo log 记录是持久的。
-
崩溃时的恢复: 在数据库发生崩溃时,通过 redo log 文件中的记录,可以重新执行已提交的事务的修改,以还原数据库状态。
1.3 redo log 怎么刷入磁盘
redo log 的写入不是直接落到磁盘,而是在内存中设置了一片称之为redo log buffer
的连续内存空间,也就是redo 日志缓冲区
。
什么时候会刷入磁盘?
- log buffer 空间不足时
- 事务提交时
- 后台线程输入
- 正常关闭服务器时
- 触发 checkpoint 规则
2.bin log
bin log是 MySQL 中的一种日志类型,用于记录数据库发生的所有更改操作,包括插入、更新、删除等。Binlog 对于数据库备份、复制和恢复是非常重要的。
2.1 bin log 的主要作用
-
数据库复制:Binlog 用于支持 MySQL 的主从复制。在主从复制中,主服务器将其二进制日志的内容传递给从服务器,从服务器根据这些日志来重放主服务器上的更改操作,从而保持主从数据库的一致性。
-
点播恢复:Binlog 可以用于数据库的点播恢复,即将数据库恢复到某个特定的时间点或某个特定的二进制日志文件位置。
-
数据恢复:在某些情况下,如果数据库发生错误,可以使用 Binlog 进行数据恢复,将数据库还原到事故发生前的状态。
-
数据库备份:Binlog 也用于增量备份。通过定期备份 Binlog,可以实现对数据库的增量备份,而不必每次都备份整个数据库。
2.2 bin log 和 redo log 有什么区别
- bin log 会记录所有与数据库有关的日志记录,包括 InnoDB、MyISAM 等存储引擎的日志,而 redo log 只记 InnoDB 存储引擎的日志。
- 记录的内容不同,bin log 记录的是关于一个事务的具体操作内容,即该日志是逻辑日志。而 redo log 记录的是关于每个页(Page)的更改的物理情况。
- 写入的时间不同,bin log 仅在事务提交前进行提交,也就是只写磁盘一次。而在事务进行的过程中,却不断有 redo ertry 被写入 redo log 中。
- 写入的方式也不相同,redo log 是循环写入和擦除,bin log 是追加写入,不会覆盖已经写的文件。
3.两阶段提交
为了解决两份日志之间的逻辑一致问题,InnoDB
存储引擎使用两阶段提交方案。原理很简单,将redo log
的写入拆成了两个步骤prepare
和commit
,这就是两阶段提交。使用两阶段提交后,写入binlog
时发生异常也不会有影响,因为MySQL
根据redo log
日志恢复数据时,发现redo log
还处于prepare
阶段,并且没有对应binlog
日志,就会回滚该事务。
4.undo log
undo log(回滚日志)是 MySQL 中的一种日志类型,主要用于支持事务的回滚和多版本并发控制(MVCC)。在 InnoDB 存储引擎中,每个事务对数据库的修改都会产生相应的 undo log 记录。当我们需要保证事务的原子性时,异常发生时必须对已经执行的操作进行回滚。在 MySQL 中,这一恢复机制是通过回滚日志(undo log)实现的。所有事务进行的修改都会首先记录到回滚日志中,然后再执行相关的操作。如果在执行过程中发生异常,我们可以直接利用回滚日志中的信息将数据回滚到修改之前的状态。值得注意的是,回滚日志的记录会先于数据的持久化到磁盘上。这个机制确保了即使在数据库遇到突然宕机等情况时,当用户再次启动数据库时,数据库能够通过查询回滚日志来回滚未完成的事务,从而保持数据的一致性和完整性。