Mysql 事务日志 redo log
事务有4种特性:原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现的呢?
事务的隔离性由锁机制实现。而事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证。
REDO LOG 称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。
UNDO LOG 称为回滚日志,回滚行记录到某个特定的版本,用来保证事务的原子性、一致性。
REDO和UNDO都可以视为一种恢复操作,但是:
redo log:是存储引擎层生成的日志,记录的是物理级别上的页修改操作,比如页号xxx,偏移量yyy。主要是为了保证数据的可靠性。
undo log:是存储引擎层生成的日志,记录的是逻辑操作的日志。比如对某一行数据进行了INSERT的操作,那么undo log就记录一条与之相反的DELETE操作。主要用于事务的回滚(undo log记录的是每个修改操作的逆操作)和一致性非锁定读(undo log 回滚记录到某种特定的版本…MVCC 即多版本并发控制)
redo 日志
InnoDB存储引擎是以页为单位来管理存储空间的,再真正访问页面之前,需要把磁盘上的页缓存到内存中的Buffer Pool之后才可以正常访问呢。所有的变更都必须先更新缓冲池中的数据,然后缓冲池中的脏页会以一定的频率被刷入磁盘(checkpoint机制),通过缓冲池来优化CPU和磁盘之间的鸿沟,这样可以保证整体的性能不会下降的太快。
为什么需要redo 日志
另外一个解决的思路:
InnoDB引擎的事务采用了WAL技术(Write-Ahead Logging)。这种技术的思想就是先写日志,再写磁盘,只有日志写入成功,才算事务提交成功。这里的日志就是redo log.当发生宕机且数据未刷到磁盘的时候,可以通过redo log来恢复,保证ACID中的D,这就是redo log的作用。
REDO 日志的好处、特点
好处
redo 日志降低了刷盘频率
redo 日志占用的空间非常小
特点
redo 日志是顺序写入磁盘的
事务执行过程中,redo log不断的记录
redo的组成(内存层面与磁盘层面)
参数设置:innodb_log_buffer_size
默认大小为16M
SHOW VARIABLES LIKE 'innodb_log_buffer_size'
重做日志文件(redo log file) 保存在磁盘中,是持久的
redo的整体流程
以一个更新事务为例:
体会:Write-Ahead Log(预先日志持久化),在持久化一个数据页之前,先将内存中相应的日志页持久化。
redo log的刷盘策略
也就是说,一个没有提交事务的redo log记录,也可能会刷盘。因为事务执行过程redo log 记录是会写入 redo log buffer 中,这些redo log 记录会被后台线程刷盘
不同刷盘策略的演示(流程图)
默认情况
默认情况小结:
值为2的情形
值为2的小结:
值为0的情形
值为0的小结:
三种刷盘策略:
效率0>1>2,一致性1>2>0
写入redo log buffer 过程
redo日志写入log buffer
redo log block的结构图
redo log file
位置
SHOW VARIABLES LIKE 'innodb_log_group_home_dir'
日志文件组
checkpoint
relog小结
深入学习可参考B站链接
B站链接–MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板