Undo Log日志
1. 介绍
Undo:意思就是撤销,以撤销操作为目的,返回指定某个状态的操作。
undo log: 数据库事务开始之前,会将修改的记录存放到undo日志里,当事务回滚时或者数据库崩溃时,可以利用undo日志,撤销未提交事务对数据库产生的影响。
undo log产生和销毁:undo log在事务开始前产生,在事务提交时,并不会立刻删除undo log ,innodb会将该事务对应的undo log放入到删除列表中,后面会通过后台线程进行回收处理,undo log 属于逻辑日志,记录一个变化过程,例如执行一个delete,undo log会记录一个insert;执行一个update会记录以恶搞相反的update。
undo log 存储:undo log 采用段的方式管理和记录,在innodb数据文件中包含一种包含rollback segment回滚段,内部包含1024个undo log segment。可以通过下面一组参数控制undo log存储。
show variables like %innodb_undo%
2. 作用
- 实现事物的原子性
undo log 是为了实现事务的原子性而出现的产物。事务处理过程中,如果事务出现了错误或者用户执行了rollback语句,mysql可以利用undo log中的备份将数据恢复到事务开始之前的状态 - 实现多版本并发控制(MVCC)
undo log在mysql innodb存储引导中用来实现多版本并发控制。事务未提交之前,undo log保存了未提交之前的版本数据,undo log中的数据可作为数据旧版本快照其他并发事务进行快照读。
事务A手动开启事务,执行更新操作,首先会把更新命中的数据备份到undo buffer中
事务B手动开启事务,执行查询操作,会读取undo日志数据返回,进行快照读
Redo Log日志
1. 介绍
Redo:意思就是重做,以恢复操作为目的,在数据库发生意外时重现操作。
Redo log:指事务中修改的任何数据,将最新的数据备份存储的位置,被称为重做日志(顺序记录,写满后回溯到第一个文件,进行覆盖写)。
Redo log的生成和释放:随着事务操作的执行,就会生成Redo log,在事务提交时会将产生的Redo log写入到log buffer,并不是随着事务提交就立刻写入到磁盘文件(避免随机io操作,如果直接持久化到磁盘可能会有不连续的数据,而写入到日志文件中可以顺序的写入,效率写入日志文件中低
),等事务的脏页写入到磁盘后,Redo log的使命就完成了,Redo log占用的空间就可以重用(覆盖写入)。
2. 工作原理
redo log 是为了实现事务的持久性而出现的产物,防止在发生故障的时间点,尚有脏页未写入表的IBD文件中,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的未入磁盘数据进行持久化这一特性。
3. 写入机制
底层有两个指针:
- write pos:当前记录的位置,一边写一边后移,写到最后一个文件末尾就回到0号文件开头。
- checkpoint:当前要擦出的位置,往后推并且循环,擦除记录钱啊把记录更新到数据文件中。
4. 相关配置参数
每个innodb存储引擎至少有一个重做文件组,每个组至少有2个重做日志文件,默认为ib_logfile-0和ib_logfile-1,可以通过下面一组参数控制redo log存储:
show variables like %innodb_log%
redo buffer持久化到redo log的策略,可以通过innodb_flush_log_at_trx_commit
设置
- 0:每秒提交redo buffer - >
OS cache - > flush cache to disk,可能丢失一秒内的事务数据,由后台Maste线程每隔一秒执行一次操作。 - 1:(默认值)每次事务提交执行redo buffer - >
OS cache - > flush cache to disk ,最安全,性能最差的方式。 - 2: 每次事务提交执行redo buffer - >
OS cache,然后由Master线程在每隔一秒执行OS cache - > flush cache to disk的操作。
一般选择2,因为mysql挂了数据没有损失,整个服务挂了才会损失1秒事务提交的数据。
网友评论