美文网首页技术分享转载部分
Mysql学习之undo log与redo log

Mysql学习之undo log与redo log

作者: 先生zeng | 来源:发表于2019-10-23 10:59 被阅读0次

    Undo Log

    undo意为取消,以撤销为目的,返回指定某个状态的操作。
    undo log 是指事务开始之前,在操作任何数据之前,首先将需操作的数备份到一个地方(undo log)

    Undo log 是为了实现事务的原子性而出现的产物。

    1. Undo Log 实现事务原子性

    事务处理过程中,如果出现了错误或者用户执行了ROLLBACK语句,Mysql可以利用Undo log中的备份将数据恢复到事务开始之前的状态。

    1. UndoLog在Mysql innodb存储引擎中用来实现多版本并发控制

    Undo log实现多版本并发控制:事务未提交之前,Undo保存了未提交之前的版本数据,Undo 中的数据可作为数据旧版本快照供其他并发事务进行快照读。

    其工作的原理如下图:

    快照读:

    SQL读取的数据是快照版本,也就是历史版本,普通的SELECT就是快照读innodb快照读,数据的读取将由 cache(原本数据) + undo(事务修改过的数据) 两部分组成

    当前读:

    SQL读取的数据是最新版本。通过锁机制来保证读取的数据无法通过其他事务进行修改UPDATE、DELETE、INSERT、SELECT … LOCK IN SHARE MODE、SELECT … FOR UPDATE都是当前读。

    Redo log

    Redo,顾名思义就是重做,以恢复操作为目的,重现操作。
    Redo log是指事务中操作的任何数据,将最新的数据备份到一个地方(Redo log).

    Redo log的持久化(持久化,简单理解,就是将数据存入磁盘,无论宕机等等情况,数据都会存在):

    不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo中。具体的落盘策略可以进行配置。

    Redo log是为了实现事务的持久性而出现的产物。

    Redo log实现事务持久性:

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

    指定Redo log 记录在{datadir}/ib_logfile1&ib_logfile2 可通过innodb_log_group_home_dir 配置指定目录存储

    一旦事务成功提交且数据持久化落盘之后,此时Redo log中的对应事务数据记录就失去了意义,所
    以Redo log的写入是日志文件循环写入的

    指定Redo log日志文件组中的数量 innodb_log_files_in_group 默认为2
    指定Redo log每一个日志文件最大存储量innodb_log_file_size 默认48M
    指定Redo log在cache/buffer中的buffer池大小innodb_log_buffer_size 默认16M

    Redo buffer 持久化Redo log的策略, Innodb_flush_log_at_trx_commit:

    取值 0 每秒提交 Redo buffer --> Redo log OS cache -->flush cache to disk[可能丢失一秒内的事务数据]

    取值 1 默认值,每次事务提交执行Redo buffer --> Redo log OS cache -->flush cache to disk

    [最安全,性能最差的方式]
    取值 2 每次事务提交执行Redo buffer --> Redo log OS cache 再每一秒执行 ->flush cache todisk操作。

    相关文章

      网友评论

        本文标题:Mysql学习之undo log与redo log

        本文链接:https://www.haomeiwen.com/subject/cmicvctx.html