zoukankan      html  css  js  c++  java
  • 15.Mysql之undo 日志浅谈02

    1.前言:

      undo 是一个很模糊的概念,往往它在Mysql中是一个玄之又玄的东西,因为我们很少能深入地去了解它。

    2.undo到底是个什么?

      众所周知,我们在面试的时候往往会被问到MVCC机制(该机制后续一节会细讲),有不少小伙伴不太容易回答出来,或者说不全面,因为这里面涉及了小的知识点,比如说锁,比如说undo等等。

      通过上一节,知道了重做日志记录了事务的行为,可以很好的对页进行'重做'操作,但是有时候事务可能需要回滚,这时就需要undo.因此在对数据库进行修改时,innodb存储引擎不但会产生redo,还是产生undo. 需要undo的场景是当用户执行事务或语句用于某种原因失败了,又或者用户执行了一条rollback语句请求回滚,就可以利用这些undo信息将数据回滚到修改之前的样子。

      undo的结构这里暂时不细讲,会在innodb存储引擎一节会说的,这里就将要说一下它是一个特殊的段(segment),位于共享表空间内,当然在5.7版本的时候,它就可以从共享表空间中独立出来了,控制参数会在末尾写出。

      undo是一个逻辑日志,所以它只是将数据库逻辑地恢复到原来的样子,所有的修改都被逻辑地取消了,但是数据结构和页本身在回滚之后可能大不相同。

      当执行一个事务的时候,这个事务会被分配一个新的段,即表空间会增大,当用户执行rollback时,会将插入的事务进行回滚,但是表空间的大小并不会因此而收缩,因此,简而言之,当innodb存储引擎回滚时,它实际做的是与先前相反的工作, 例如:insert -->delete    delete-->insert  update-->update

      除了回滚功能,undo 的另外一个作用就是MVCC,即在innodb存储引擎中MVCC的实现是通过undo来完成,当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以undo 读取之前的行版本信息,以此实现非锁定读

      最后最重要的一点是,undo log 会产生redo log ,也就是undo log 的产生会伴随着redo log的产生,这时应该undo log 也需要持久性保护。

    3.undo参数配置 

    innodb_undo_directory   ##设置undo 日志文件所在的目录,默认在数据目录下
    inodb_undo_logs     ##用来设置rollback segment个数,默认128
    innodb_undo_tablespaces  ##用来设置undo 文件的数量
  • 相关阅读:
    Dockerfile常用指令
    Maven相关命令
    CI-CD平台搭建过程整理
    边工作边刷题:70天一遍leetcode: day 28-1
    边工作边刷题:70天一遍leetcode: day 28
    边工作边刷题:70天一遍leetcode: day 29-1
    边工作边刷题:70天一遍leetcode: day 29
    边工作边刷题:70天一遍leetcode: day 30-1
    边工作边刷题:70天一遍leetcode: day 30
    边工作边刷题:70天一遍leetcode: day 31-4
  • 原文地址:https://www.cnblogs.com/zmc60/p/14957116.html
Copyright © 2011-2022 走看看