这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战。
日志是 mysql
数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql
日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。作为开发,我们重点需要关注的是二进制日志( binlog
)和事务日志(包括
redo log
和 undo log
),本文接下来会详细介绍这三种日志。
一、日志定义
binlog二进制日志是server层的无论MySQL用什么引擎,都会有的,主要是左主从复制,时间点恢复使用;
redo log重做日志是InnoDB存储引擎层的,用来保证事务安全;
undo log回滚日志保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。undolog用来保证事务的一致性,在事务回滚的时候会查询对应的undolog,进行回滚。
undolog分为两种,一种是insert undolog,这种是插入语句对应的的undo log,他不会被作为mvcc,于是在提交之后这个log直接释放。
还有另外一种就是update undolog 这种是会以用于mvcc的,于是这种undolog是会用链表串起来的,知道没有开启的事务早于当前undolog的创建时间,这个时候这个undolog就可以删除了。
复制代码
日志 | 物理日志 | 逻辑日志 | 定义 | 作用 |
---|---|---|---|---|
redo log | InnoDB存储引擎层的日志 | N | 重做日志 | 事务的原子性和持久性 |
undo log | N | Y | 回滚日志 | 事务一致性,事务的回滚和实现mvcc |
binlog | N | MySQL Server层记录的日志 | 归档日志 | 主从数据同步,数据恢复 |
- 逻辑日志:可以简单理解为记录的就是sql语句 。
- 物理日志:
mysql
数据最终是保存在数据页中的,物理日志记录的就是数据页变更
二、日志作用
redo log日志模块
redo log
包括两部分:一个是内存中的日志缓冲( redo log buffer
),另一个是磁盘上的日志文件( redo log file
)。mysql
每执行一条 DML
语句,先将记录写入 redo log buffer
,后续某个时间点再一次性将多个操作记录写到 redo log file
。这种 先写日志,再写磁盘 的技术就是 MySQL
里经常说到的 WAL(Write-Ahead Logging)
技术。
redo log是InnoDB存储引擎层的日志,又称重做日志文件,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。在实例和介质失败(media failure)时,redo log文件就能派上用场,如数据库掉电,InnoDB存储引擎会使用redo log恢复到掉电前的时刻,以此来保证数据的完整性。
在一条更新语句进行执行的时候,InnoDB引擎会把更新记录写到redo log日志中,然后更新内存,此时算是语句执行完了,然后在空闲的时候或者是按照设定的更新策略将redo log中的内容更新到磁盘中,这里涉及到WAL
即Write Ahead logging
技术,他的关键点是先写日志,再写磁盘。
有了redo log日志,那么在数据库进行异常重启的时候,可以根据redo log日志进行恢复,也就达到了crash-safe
。
redo log日志的大小是固定的,即记录满了以后就从头循环写。
binlog日志模块
- 主从复制 :在
Master
端开启binlog
,然后将binlog
发送到各个Slave
端,Slave
端重放binlog
从而达到主从数据一致。 - 数据恢复 :通过使用
mysqlbinlog
工具来恢复数据。
binlog是属于MySQL Server层面的,又称为归档日志,属于逻辑日志,是以二进制的形式记录的是这个语句的原始逻辑,依靠binlog是没有crash-safe
能力的;
binlog 可以用于主从复制中,从库利用主库上的 binlog 进行重播,实现主从同步。用于数据库的基于时间点、位点等的还原操作。binlog 的模式分三种:Statement、Row、Mixed。
在 MySQL 5.7.7
之前,默认的格式是 STATEMENT
, MySQL 5.7.7
之后,默认值是 ROW
。日志格式通过 binlog-format
指定。
undo log日志模块
数据库事务四大特性中有一个是 原子性 ,具体来说就是 原子性是指对数据库的一系列操作,要么全部成功,要么全部失败,不可能出现部分成功的情况。实际上, 原子性 底层就是通过 undo log
实现的。undo log
主要记录了数据的逻辑变化,比如一条 INSERT
语句,对应一条 DELETE
的 undo log
,对于每个 UPDATE
语句,对应一条相反的 UPDATE
的 undo log
,这样在发生错误时,就能回滚到事务之前的数据状态。
此外,保存了事务发生之前的数据的一个版本,作用:
- 可以用于回滚;
- 同时可以提供多版本并发控制下的读(MVCC),也即非锁定读;
- 事务开始之前,将当前事务版本生成 undo log,undo log 也会产生 redo log 来保证 undo log 的可靠性;
- 当事务提交之后,undo log 并不能立马被删除,而是放入待清理的链表;
- 由 purge 线程判断是否有其它事务在使用 undo 段中表的上一个事务之前的版本信息,从而决定是否可以清理 undo log 的日志空间。