
MySQL 学习笔记: 二次写
发布日期:2021-05-07 04:23:28
浏览次数:15
分类:精选文章
本文共 1155 字,大约阅读时间需要 3 分钟。
环境
MacBook pro
前言
今天再看MySQL技术内幕
第二版书时,对二次写很疑惑;
查阅资料后,大体了解下,但是依然似懂非懂,做个笔记
日志的数据格式
这里给出网上说法:
物理日志
A. 记录完整的Page
B. 记录Page中被修改的部分(page中的偏移,内容和长度逻辑日志
记录在关系(表)上的一个元组操作。
A. 插入一行记录。 B. 修改一行记录。 C. 删除一行记录。 逻辑日志比起物理的日志,显得简洁的多。而且占用的空间也要小的多。逻辑物理日志
如果一个数据库操作(DDL,DML,DCL)产生的日志跨越了多个页面,那么会产生多个物理页面的日志,但对于每个物理页面日志,里面记录则是逻辑信息。这里我举一个简单的INSERT操作来说明几种日志形式。
举个例子的话就是:
比如:innodb表T(c1,c2, key key_c1(c1)),插入记录row1(1,’abc’)
逻辑日志:
逻辑物理日志:
因为表T含有索引key_c1
, 一次插入操作至少涉及两次B树操作,二次B树必然涉及至少两个物理页面,因此至少有两条日志
物理日志:
由于一次INSERT操作,物理上来说要修改页头信息(如,页内的记录数要加1),要修改相邻记录里的链表指针,要修改Slot属性等,因此对应逻辑物理日志的每一条日志,都会有N条物理日志产生。
< group_id,file_id,page_no,offset1, value1>< group_id,file_id,page_no,offset2, value2>……< group_id,file_id,page_no,offsetN, valueN>
为什么需要二次写
如果是纯物理日志格式,是完全可以做到的,
但是redo采用的是逻辑物理格式。其每页都会才是一个物理日志,但是每个物理日志里面记录的又是逻辑信息。
这就导致,当发生页断裂时,即写某个页到磁盘时,系统断电了,导致只写了一部分,那么就会无法重做redo的情况。
比如 : 由于 innodb page
16K 一般系统是4K,当一个update语句需要对页内记录加1,当第一个4K中记录加1后,
也就是说 类似上面这中操作 页内记录数加1,还有 修改页头信息、slot信息修改
等操作而言,它们都要求页
是处于一个一致性的状态。
参考地址:
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月12日 04时42分03秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Android MediaPlayer setDataSource failed
2019-03-06
ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
2019-03-06
【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
2019-03-06
大前端的自动化工厂(1)——Yeoman
2019-03-06
数据仓库建模方法论
2019-03-06
虚拟机搭建hadoop环境
2019-03-06
DataStax Bulk Loader教程(四)
2019-03-06
.NET应用框架架构设计实践 - 概述
2019-03-06
Rust 内置 trait :PartialEq 和 Eq
2019-03-06
Hibernate(十四)抓取策略
2019-03-06
[菜鸟的设计模式之旅]观察者模式
2019-03-06
Spring-继承JdbcDaoSupport类后简化配置文件内容
2019-03-06
Java基础IO流(一)
2019-03-06
Hibernate入门(四)---------一级缓存
2019-03-06
MySQL事务(学习笔记)
2019-03-06
一个web前端开发者的日常唠叨
2019-03-06
内存分配-slab分配器
2019-03-06
技术写作技巧分享:我是如何从写作小白成长为多平台优秀作者的?
2019-03-06
Jupyter Notebook 暗色自定义主题
2019-03-06