风君雪科技博客

  • 首页
  • 业界
  • 前端
  • 运维
  • 建站
  • 软件
  • 生活
  • 后端
  • 创投
  • 运营
  • 程序人生
    • 影视
    • 游戏
    • 句子
    • 资源
  • 其他
    • 说说
  • 关于本站
  1. 首页
  2. 软件
  3. 正文

MySQL事务日志

2023年9月19日 5点热度 0人点赞 0条评论

MySQL事务日志

     我们知道,MySQL事务有4个特性:隔离性、持久性、原子性、一致性。事务的隔离性是由锁来实现的。原子性、一致性、持久性通过数据库的redo log和undo log来完成。redo log称为重做日志,用来保证事务的原子性和持久性。undo log用来保证事务的一致性。事务要保证 ACID 的完整性必须依靠事务日志做跟踪。

     至关重要的三种日志:

     binlog 二进制日志
     redo log 重做日志
     undo log 回滚日志

     一、redo log

     重做日志用来实现事务的持久性,即事务ACID中的D。

     1、作用

     redo通常是物理日志,记录的是页的物理修改操作,数据库崩溃则用其重做。

     2、组成

     其由两部分组成:

     1)内存中的重做日志缓冲(redo log buffer),其是易失的

     2)重做日志文件(redo log file),其是持久的

     3、如何保证事务的持久性?

     通过Force Log at Commit 机制,即当事务commit提交时,innodb引擎先将 redo log buffer 写入到 redo log file 进行持久化,待事务的commit操作完成时才算完成。这种做法也被称为 Write-Ahead Log(预先日志持久化),在持久化一个数据页之前,先将内存中相应的日志页持久化。

     4、工作流程

     1)事务开启时,事务中的操作,都会先写入存储引擎的日志缓冲。

     2)在事务提交之前,缓冲的日志都需要提前刷新到磁盘上持久化,这就常说的“日志先行”(Write- Ahead-Logging)。

     3)当事务提交之后,在Buffer Pool 中映射的数据文件才会慢慢刷新到磁盘。

     4)此时如果数据库崩溃或者宕机,那么当系统重启进行恢复时,就可以根据 redo log 中记录的日志,把数据库恢复到崩溃前的一个状态。

     5)未完成的事务,可以继续提交,也可以选择回滚,这基于恢复的策略而定。

     说明:在系统启动的时候,就已经为 redo log 分配了一块连续的存储空间,以顺序追加的方式记录 redo log,通过顺序 IO来改善性能。所有的事务共享 redo log 的存储空间,它们的 Redo Log 按语句的执行顺序,依次交替的记录在一起。

     5、持久化策略

     为了确保每次日志都能写入到重做日志文件中,在每次将 log buffer 中的日志写入日志文件的过程中都会调用一次操作系统的 fsync 操作。

     6、重做日志文件写入流程

     先写重做日志文件1,当文件1被顺序写满时,会切换到重做日志文件2,再当重做日志文件2也被写满时,会再切换到重做日志文件1中,依次循环; 所以说重做日志文件是循环覆盖写入的 。

     因为重做日志是循环覆盖写入的,所以不能使用其进行整个数据库的数据恢复,它只能保证数据库宕机时的事务的完整性数据;如果想要恢复全部数据的话,只能使用 binlog 二进制日志(归档日志)进行恢复。

     注意:大家可以手动修改重做日志文件组下的文件数量,并可以指定每个重做日志文件的大小,通过下面的参数:

     1)innodb_log_file_size 指定重做日志文件的大小

     2)innodb_log_files_in_group 重做日志文件组下的文件数量

     二、undo log

     1、作用

      undo log有两个作用:提供回滚和多个行版本控制(MVCC)。

      2、工作流程

      1)逻辑日志

      undo log 和 redo log 记录物理日志不一样,它是逻辑日志,根据每行记录进行记录,因此只是将数据库逻辑得恢复到原来的样子。

      undo log 是逻辑日志,可以理解为:

      当 delete 一条记录时,undo log 中会记录一条对应的 Insert 记录

      当 insert 一条记录时,undo log 中会记录一条对应的 delete 记录

      当 update 一条记录时,它记录一条对应相反的 update 记录

      2)举例

      假设有 2 个数值,分别为 A=1 和 B=2, 然后将 A 修改为 3, B 修改为 4。

      下面是事务的整个工作流程:

       步骤1.  start transaction

       步骤2.  记录 A=1 到 undo log;  

       步骤3.  Update A=3

       步骤4.  记录 A=3 到 redo log

       步骤5.  记录 B=2 到 undo log 

       步骤6.  Update B=4

       步骤7.  记录 B=4 到 redo log

       步骤8.  将 redo log 刷新到磁盘

       步骤9.  Commit

       MySQL事务日志

      在 1-8 步骤的任意一步系统宕机,事务未提交,该事务就不会对磁盘上的数据做任何影响。

      如果在 8-9 之间宕机,恢复之后可以选择回滚,也可以选择继续完成事务提交,因为此时 redo log 已经持久化。

      若在 9 之后系统岩机,内存映射中变更的数据还来不及刷回磁盘,那么系统恢复之后,可以根据 redo log 把数据刷回磁盘

      所以,redo log 其实保障的是事务的持久性和原子性,而 undo log,则保障了事务的一致性。

     三、binlog

      binlog 二进制日志(归档日志),这个日志是由MySql的 server层进行维护的;不管当前MySql使用的是什么存储引擎,binlog归档日志都是支持的.

      1、作用

      1)用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。

      2)数据恢复,用于数据库的基于时间点的还原。

      2、binlog的格式

      binlog 共有三种存储格式: row, statement 和混合模式。

      1)row: 记录哪行数据被修改的

      数据记录方式比较简单,但是可能会产生大量的数据废弃日志(如 更新一个全表)。

      2)statement: 记录修改数据的 SQL ,不记录修改的数据

      记录数据的过程,日志量比较小,IO 读写少。缺点是 有些函数并不支持,为了保证能够一致性,必须还需要有一些上下文的信息。

      3)混合模式:  是以上两种模式的混合使用,MySQL 会根据执行的每一条具体的 sql 语句来区分对待记录的日志形式。

      一般的语句修改使用 statment 格式保存 binlog ,如一些函数,statement 无法完成主从复制的操作,则采用 row 格式保存 binlog。

      3、与 redo 日志的区别

      1)redo 是 Innodb 存储引擎独有的,binlog 是所有引擎都可以使用的

      2)redo 是物理日志,记录的是在某个数据页上做了什么修改,binlog 是逻辑日志,记录的是这个语句的原始逻辑。

      3)redo 是循环写的,空间会用完,binlog 是可以追加写的,不会覆盖之前的日志信息。

      4)Binlog 中会记录所有的逻辑,并且采用追加写的方式

      注意:

      binlog二进制日志文件在默认情况下并没有启动,需要手动进行开启的。根据MySql的官网手册了解到,开启此日志会使性能下降1%左右,这个损失大体上是可以接受的。

 

      参考链接:

      https://cloud.tencent.com/developer/article/1780893

      https://segmentfault.com/a/1190000039715378

标签: MySQL事务日志
最后更新:2023年9月19日

风君子

独自遨游何稽首 揭天掀地慰生平

点赞
< 上一篇
下一篇 >

猜你喜欢

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

风君子

独自遨游何稽首 揭天掀地慰生平

最新 热点 随机
最新 热点 随机
出生八字算命婚用命理保婚 鼻子长黑头怎么办(去鼻头黑头的方法) Linux下安装Python3.9 胖大海泡水喝的功效?(胖大海泡水喝好处多) git 配置多用户和邮箱 女性春季养生应该注意什么 女人春天这样吃美容养颜 茴香饺子的做法(茴香饺子馅放什么调料) 珊瑚海歌词(珊瑚海歌词男女) 「已回复」士别三日即更刮目相待的意思 高密度板环保系数高吗
常用的四种电脑截图方法如何使用电脑截图Win7密码破解大法如何破译电脑密码消息称英特尔 14 代酷睿 i9 / i7 / i5 桌面处理器 10 月 17 日发布,首发 K 系列和 KF 系列如何绑定电脑和路由器如何绑定路由器管理器梅干菜能用热水泡吗 梅干菜发霉了还能吃吗查全国有多少个重名的(重名查询包括自己吗)RX6800和RTX4060Ti哪款好 RX6800和RTX4060Ti对比评测中国空调排名(中国空调排名前十名)怎么用手机远程控制电脑手机如何远程操控电脑非参数估计——核密度估计(Parzen窗)
刀塔传奇永生梦境玩法详解 永生梦境奖励一览 excel如何使用年级排名公式(Excel如何按班级分别进行成绩排名) 港股教育股重挫 新东方暴跌50%:美股开跌超60% 硬伤终于填补!Win11蓝牙连接可一键切换 美国两大电影院线宣布7月重开:《花木兰》《信条》等率先上映 采埃孚推出加热式安全带,号称可间接提升电动汽车续航 财政性资金是指 jiandongman 马斯克约会“海后”给德普戴绿帽?门房做证经常半夜上门 抖音上线外放默认静音功能:网友力荐 公共场所一定要打开
标签聚合
APP 程序 股票 信用 投资理财 汽车 游戏 秘籍 荣耀 利息 来了 华为 显卡 教程 IT资讯 银行卡 美国 贷款 投资者 支付宝 股价 借款人 马斯克 中国 业界 信用卡 额度 AMD 芯片 处理器 办公软件教程 京东 特斯拉 微软 三星 电动车 理财知识 快科技 手机 iphone 比亚迪 身份证 利率 智能手机 银行 小米 苹果 科技 腾讯 路由器

COPYRIGHT © 2023 风君雪博客园. ALL RIGHTS RESERVED.

粤ICP备2022155369号