zoukankan      html  css  js  c++  java
  • MySQL中的日志文件,有这么两类常常讨论到:undo日志与redo日志。

    参考  :https://blog.csdn.net/yu757371316/article/details/81081669 

    参考  : https://www.jianshu.com/p/20e10ed721d0

    我们都知道事务有4种特性:原子性、一致性、隔离性和持久性,在事务中的操作,要么全部执行,要么全部不做,这就是事务的目的。事务的隔离性由锁机制实现,原子性、一致性和持久性由事务的redo 日志和undo 日志来保证。
    • redo 日志与undo日志分别是什么?
    • redo 如何保证事务的持久性?
    • undo log 是否是redo log的逆过程?

    redo是啥

    重做日志(redo log)用来保证事务的持久性,即事务ACID中的D。实际上它可以分为以下两种类型:

    物理Redo日志
    逻辑Redo日志

    在InnoDB存储引擎中,大部分情况下 Redo是物理日志,记录的是数据页的物理变化。

    Redo log的主要作用是用于数据库的崩溃恢复

    Redo 的组成

    Redo log可以简单分为以下两个部分:

    • 一是内存中重做日志缓冲 (redo log buffer),是易失的,在内存中
    • 二是重做日志文件 (redo log file),是持久的,保存在磁盘中

    redo如何保证 事务的持久性?

    mysql_redo
    • 第一步:先将原始数据从磁盘中读入内存中来,修改数据的内存拷贝
    • 第二步:生成一条重做日志并写入redo log buffer,记录的是数据被修改后的值
    • 第三步:当事务commit时,将redo log buffer中的内容刷新到 redo log file,对 redo log file采用追加写的方式
    • 第四步:定期将内存中修改的数据刷新到磁盘中

    fsync  和  write 操作(系统从内存同步到磁盘的操作)实际上是系统调用函数

    通过Force Log at Commit 机制实现事务的持久性,即当事务提交时,先将 redo log buffer 写入到 redo log file 进行持久化,待事务的commit操作完成时才算完成。
    这种做法也被称为 Write-Ahead Log(预先日志持久化)
    Force Log at Commit机制就是靠InnoDB存储引擎提供的参数
    innodb_flush_log_at_trx_commit来控制的,该参数可以控制 redo log刷新到磁盘的策略
    当参数值为
    默认值 1 :表示事务提交时必须调用一次 fsync 操作,最安全的配置,保障持久性
    参数值为2 :则在事务提交时只做 write 操作,只保证将redo log buffer写到系统的页面缓存中,不进行fsync操作
    参数值为0:等于说是关闭redo log      这个操作仅在master thread 中完成,而在master thread中每1秒进行一次重做日志的fsync操作
    Force Log at Commit机制保证事务的持久性,实际上重做日志的实现还要依赖于mini-transaction。
     
     

    undo是啥

    undo是如何进行回滚的

    undo log主要记录的是数据的逻辑变化,为了在发生错误时回滚之前的操作,需要将之前的操作都记录下来,然后在发生错误时才可以回滚。

    undo日志,只将数据库逻辑地恢复到原来的样子,在回滚的时候,它实际上是做的相反的工作,比如一条INSERT ,对应一条 DELETE,对于每个UPDATE,对应一条相反的 UPDATE,将修改前的行放回去。undo日志用于事务的回滚操作进而保障了事务的原子性。

     

    undo日志用于存放数据修改被修改前的值,假设修改 tba 表中 id=2的行数据,把Name=’B’ 修改为Name = ‘B2’ ,那么undo日志就会用来存放Name=’B’的记录,如果这个修改出现异常,可以使用undo日志来实现回滚操作,保证事务的一致性。

    把Name=’B’ 修改为Name = ‘B2’ ,那么undo日志就会用来存放Name=’B’的记录

    可以使用undo日志来实现回滚操作,保证事务的一致性。

    对数据的变更操作,主要来自 INSERT UPDATE DELETE,而UNDO LOG中分为两种类型,一种是 INSERT_UNDO(INSERT操作),记录插入的唯一键值;一种是 UPDATE_UNDO(包含UPDATE及DELETE操作),记录修改的唯一键值以及old column记录。

     undo 参数:

    innodb_max_undo_log_size​     控制最大undo tablespace文件的大小,

    只有在启动innodb_undo_log_truncate 

    undo tablespace 超过innodb_max_undo_log_size 阀值时才会去尝试truncate(截短)。该值默认大小为1G,truncate后的大小默认为10M

    innodb_undo_tablespaces

    ​ 设置undo独立表空间个数,范围为0-128, 默认为0,0表示表示不开启独立undo表空间 且 undo日志存储在ibdata文件中。该参数只能在最开始初始化MySQL实例的时候指定,如果实例已创建,这个参数是不能变动的,如果在数据库配置文 件 .cnf 中指定innodb_undo_tablespaces 的个数大于实例创建时的指定个数,则会启动失败,提示该参数设置有误。

     每个文件(undo)默认大小为10M.

    什么时候需要来设置这个参数呢?

    ​ 当DB写压力较大时,可以设置独立UNDO表空间,把UNDO LOG从ibdata文件中分离开来,指定 innodb_undo_directory目录存放,可以制定到高速磁盘上,加快UNDO LOG 的读写性能。

  • 相关阅读:
    XP系统无法安装net framework 4.0 解决方法
    StructureMap DI & IoC 工具介绍
    Castle ActiveRecord学习实践(7)级联
    Error.popStackFrame 函数
    抽象泄漏(leaky abstraction)
    [Exception]IIS6:The entry "*" has already been added的解决方法
    ASP.NET 设计模式 读书摘记2
    PHP模块开发(一) PHP环境搭建
    PHP函数HTTP 相关函数
    PHP函数FTP文件传输函数
  • 原文地址:https://www.cnblogs.com/-Aiai/p/15224244.html
Copyright © 2011-2022 走看看