首页 > 数据库 >MySQL(十九)MySQL事务日志(一)RedoLog

MySQL(十九)MySQL事务日志(一)RedoLog

时间:2023-05-09 14:00:54浏览次数:49  
标签:事务 log buffer RedoLog 写入 MySQL 日志 redo

MySQL(十九)MySQL事务日志(一)RedoLog


​ 事务的四种特性:原子性一致性持久性和隔离性都是基于什么机制实现的?

  • 事务的隔离性由锁机制实现

  • 而事务的原子性一致性持久性则由事务的 redoundo 日志来实现的

    • redo log重做日志,提供再写入操作,恢复提交事务修改的页的操作,保证了事务的持久性

      一般情况下,事务中的操作都是先对内存中的数据页进行的操作,只有内存的数据刷回磁盘中才能叫做持久化,这时候redo log就是为了恢复因为宕机导致内存中修改但是没能刷回磁盘的情况

    • undo log回滚日志,回滚行记录到某个特定的版本,用来保证事务的原子性一致性

​ undo不是redo的逆过程,两者都可以被视作恢复操作redo log是恢复磁盘记录保证数据持久性,undo log则是将操作恢复成之前的状态),但是:

  • redo log存储引擎层生成的日志,记录的是物理级别上的页修改操作,比如页号xxx,偏移量yyy写入了zzz数据。主要是为了保证数据的可靠性。
  • undo log也是存储引擎层生成的日志,但是记录的是逻辑操作的日志,比如对某一行数据进行了insert操作,则undo log就是与之相反的delete语句,即每个操作的逆操作。主要用于事务的回滚一致性非锁定读(undo log 回滚到某种特定的版本--MVCC多版本并发控制

1 Redo Log概述

​ InnoDB存储引擎是以为单位来管理存储空间的。在真正访问页面之前,需要把磁盘上的页缓存到内存中的buffer Pool中才可以访问。之后所有的变更(指事务commit后)必须先更新缓冲池中的数据,然后缓冲池中的脏页会以一定的频率刷入磁盘(Check Point机制,这么做的目的是优化CPU和磁盘之间IO速度的鸿沟,保证整体的性能不会下降太多。

1.1 为什么需要redo日志
  • 一方面,缓冲池可以帮助优化CPU和磁盘之间IO速度的鸿沟,Check Point机制可以保证所修改的页面都能刷回磁盘,然而由于Check Point机制不是每次变更都会触发,而是master线程隔一段时间去处理。所以最坏的情况就是,事务刚提交完写完缓冲池就宕机了,Check Point机制来不及刷盘操作。

  • 另一方面,事务要求应该有持久性特性,即一个更新提交完成的事务,即使数据库发生崩溃,这个事务对数据库的更改也不能消失

    那么,能通过更新一次就刷一次盘的方式来保证一致性吗?显然是不能的:这种简单粗暴的方式存在两个问题:

    修改量和磁盘刷新量不成正比,由于存储引擎是以页为单位来管理存储空间的,因此哪怕每次只是修改了一个页的一条记录的一个字段,也会将整个数据页刷回磁盘

    随机IO速度慢:一个事务会包含很多SQL语句,因此会牵扯到修改很多页面,这些修改的页面可能并不相邻,这也就意味着将某个事务的buffer pool中的页面刷回磁盘的时候,需要进行很多的随机IO

  • 因此redo日志的思路是:并不需要把所有修改的数据页全部刷回磁盘,只需要记录修改的地方即可。InnoDB引擎采用了WAL(Write Ahead Logging)技术,即先写日志再写磁盘,只有写入redo log成功,才算事务提交成功,当发生数据库宕机且未刷新回磁盘的时候,就可以通过redo log恢复。

image-20230504201039092
1.2 redo log的优点
  • 降低了刷盘频率
  • 占用空间小(只需要存储表空间id、页号、偏移量以及需要更新的值)
1.3 redo log的特点
  • redo log是顺序写入磁盘的:在执行事务的过程中,每执行一条语句,就可能产生若干条redo日志,这些日志是按照产生的顺序写入磁盘的,也就是顺序IO效率要比随机IO快很多(这里的IO不是指的刷盘IO!!!而是写入内存的缓冲池和写入磁盘redo log的对比
  • 事务执行过程中redo log不断记录:redo log是存储引擎层产生的,bin log是数据库层产生的,因此redo log 会在事务的操作执行期间不断写入日志,bin log则是事务执行完成之后一次性写入(用于主从复制)
1.4 redo log的组成

​ redo log 可以简单分为一下两个部分:

  • 重做日志的缓存(redo log buffer):保存在内存中,是易失的。在mysql启动的时候,就向操作系统申请了一大片称为redo log buffer的连续内存空间,这段内存空间被划分为了连续的redo log block。一个redo log block512字节的大小。

    image-20230504211620900

    参数设置:innodb_log_buffer_size,默认为15M

    mysql> select @@innodb_log_buffer_size
        -> ;
    +--------------------------+
    | @@innodb_log_buffer_size |
    +--------------------------+
    |                 16777216 |
    +--------------------------+
    1 row in set (0.00 sec)
    
    
  • 重做日志文件(redo log file):保存在硬盘中,是持久的。如下面的ib_logfile0ib_logfile1,这两个文件大小是相等的,是因为这个空间是先开辟出来的,防止无线扩大。

    image-20230504212320008

2

标签:事务,log,buffer,RedoLog,写入,MySQL,日志,redo
From: https://www.cnblogs.com/tod4/p/17384658.html

相关文章

  • mysql 索引
    mysql索引按存储方式区分: 一:b树,通常是使用b树这种方式,只有一个根节点,叶子节点之间彼此相连 二:hash,首先不能使用hash索引排序,并且它只支持等值索引,比如"=""in()""<=>"。 不支持键的部分匹配,因为计算hash值的时候是根据整体索引值来计算的。 建立hash索引相比b树需要更长的......
  • MySQL(十九)MySQL事务日志(二)UndoLog
    MySQL(十九)MySQL事务日志(二)UndoLog1undo日志概述​ redolog是事务持久性的保障,而undolog则是事务原子性和一致性的保证,如上图,在事务中更新数据的前置操作其实是需要将数据写入到undolog方便回滚。​ 事务需要保证原子性,也就是事务中的操作要么全部完成、要么全部不做。......
  • You have an error in your SQL syntax; check the manual that corresponds to your
    问题描述显示在条件查询的sql语句那里报错问题解决本来我是习惯了使用servlet写数据库操作的,然后就直接忽略掉了,或者说,直接忘记了在jsp里面的sql语句怎么正确书写了;经过查阅资料发现,查询语句是这样写的:Stringsql="select*frombookwhereid="+id;......
  • Centos7安装MySQL详细步骤(配置开机自启)
    MySQL检查系统是否安装过mysql//检查系统中有无安装过mysqlrpm-qa|grepmysql//查询所有mysql对应的文件夹,全部删除whereismysqlfind/-namemysql卸载CentOS7系统自带mariadb#查看系统自带的Mariadb[root@CDH-141~]#rpm-qa|grepmariadbmariadb-libs-5.5......
  • MYSQL查询【全部表】和表【所有字段】
    最近在做一些关于BI的东西。记录下。数据库查询全部表名称和备注信息只能查询表名SHOWTABLES; 查询表名和表备注SELECTTABLE_NAMEtablename,TABLE_COMMENTremarkFROMINFORMATION_SCHEMA.TABLESWHEREtable_schema="xxxx_xxxx"andT......
  • HTAP for MySQL 在腾讯云数据库的演进
    摘要:MySQL在充分利用多核计算资源方面比较欠缺,无法同时满足在线业务和分析型业务的客户需求,而单独部署一套专用的分析型数据库意味着额外的成本和复杂的数据链路。本次主题将介绍腾讯云数据库为满足此类场景而在HTAPforMySQL产品方面进行的尝试。2023首届云数据库技术沙龙MySQ......
  • mysql主从复制
    一、概述将主库的数据变更同步到从库,从而保证主库和从库数据一直。主要功能:数据备份、失败迁移、读写分离、降低单库读写压力二、原理1.主库会把数据变更记录在二进制日志文件Binlog中。2.从库连接主库,读取Binlog日志,并写入自身中继日志relaylog。3.slave重做中继日志,将......
  • mysql 8 安装
    1环境说明(1)基础环境操作系统:CentOSLinuxrelease7.4.1708(Core)配置:4c8GB100GBmysql版本:mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz备份工具:percona-xtrabackup-8.0.32-26-Linux-x86_64.glibc2.17.tar.gz软件下载:wgethttps://downloads.percona.com/downloads/Per......
  • mysql 移动数据目录data后启动失败
    ###############################一、需要更改my.cnf中所有关于路径的参数二、更改binlog.index中的路径信息三、更改relaylog.index中的路径信息                   ###########################......
  • MySQL 中读写分离数据延迟
    MySQL中读写分离可能遇到的问题前言读写分离的架构基于客户端实现读写分离基于中间代理实现读写分离MySQL中如何保证主从数据一致循环复制问题主从同步延迟主从同步延迟的原因主从延迟如何处理强制走主库方案Sleep方案判断主从无延迟方案配合semi-sync......