日志物理结构和逻辑结构的不同

从逻辑上来讲,日志就是一个无限延长的字节流,从数据库安装好并启动的时间点开始,日志便源源不断地追加,永无结束

但从物理上来讲,日志不可能是一个永不结束的字节流,日志的物理结构和逻辑结构,有两个非常显著的差异点:
(1)磁盘的读取和写入都不是按一个个字节来处理的,磁盘是“块”设备,为了保证磁盘的I/O效率,都是整块地读取和写入。对于Redo Log来说,就是RedoLog Block,每个Redo Log Block是512字节。为什么是512字节呢?因为早期的磁盘,一个扇区(最细粒度的磁盘存储单位)就是存储512字节数据。
(2)日志文件不可能无限制膨胀,过了一定时期,之前的历史日志就不需要了,通俗地讲叫“归档”,专业术语是Checkpoint。所以Redo Log其实是一个固定大小的文件,循环使用,写到尾部之后,回到头部覆写(实际Redo Log是一组文件,但这里就当成一个大文件,不影响对原理的理解)。之所以能覆写,因为一旦Page 数据刷到磁盘上,日志数据就没有存在的必要了。

图6-8展示了Redo Log逻辑与物理结构的差异,LSN(Log Sequence Number)是逻辑上日志按照时间顺序从小到大的编号。在InnoDB中,LSN是一个64位的整数,取的是从数据库安装启动开始,到当前所写入的总的日志字节数。实际上LSN没有从0开始,而是从8192开始,这个是InnoDB源代码里面的一个常量LOG_START_LSN。因为事务有大有小,每个事务产生的日志数据量是不一样的,所以日志是变长记录,因此LSN是单调递增的,但肯定不是呈单调连续递增。

物理上面,一个固定的文件大小,每 512 个字节一个 Block,循环使用。显然,很容易通过LSN换算出所属的Block。反过来,给定Redo Log,也很容易算出第一条日志在什么位置。假设在Redo Log中,从头到尾所记录的LSN依次如下所示:(200,289,378,478,30,46,58,69,129)
很显然,第1条日志是30,最后1条日志是478,30以前的已经被覆盖。

什么是Physiological Logging?

知道了Redo Log的整体结构,下面进一步来看每个Log Block里面Log的存储格式。这个问题很关键,是数据库事务实现的一个核心点。

1)记法1。类似Binlog的statement格式,记原始的SQL语句,insert/delete/update。

(2)记法2。类似Binlog的RAW格式,记录每张表的每条记录的修改前的值、修改后的值,类似(表,行,修改前的值,修改后的值)。

(3)记法3。记录修改的每个Page的字节数据。由于每个Page有16KB,记录这16KB里哪些部分被修改了。一个Page如果被修改了多个地方,就会有多条物理日志,如下所示:

(Page ID,offset1,len1,改之前的值,改之后的值)(Page ID,offset2,len2,改之前的值,改之后的值)

前两种记法都是逻辑记法;第三种是物理记法。

Redo Log采用了哪种记法呢?它采用了逻辑和物理的综合体,就是先以Page为单位记录日志,每个Page里面再采取逻辑记法(记录Page里面的哪一行被修改了)。这种记法有个专业术语,叫Physiological Logging。要搞清楚为什么要采用Physiological Logging,就得知道逻辑日志和物理日志的对应关系:

(1)一条逻辑日志可能产生多个Page的物理日志。比如往某个表中插入一条记录,逻辑上是一条日志,但物理上可能会操作两个以上的Page?为什么呢,因为一个表可能有多个索引,每个索引都是一颗B+树,插入一条记录,同时更新多个索引,自然可能修改多个Page。如果Redo Log采用逻辑日志的记法,一条记录牵涉的多个Page写到一半系统宕机了,要恢复的时候很难知道到底哪个Page写成功了,哪个失败了。

(2)即使1条逻辑日志只对应一个Page,也可能要修改这个Page的多个地方。因为一个Page里面的记录是用链表串联的,所以如果在中间插入一条记录,不仅要插入数据,还要修改记录前后的链表指针。对应到Page就是多个位置要修改,会产生多条物理日志。

所以纯粹的逻辑日志宕机后不好恢复;物理日志又太大,一条逻辑日志就可能对应多条物理日志。Physiological Logging综合了两种记法的优点,先以Page为单位记录日志,在每个Page里面再采用逻辑记法

总结

  • 日志的物理结构和逻辑结构是不一样的
  • Redo log 先以Page为单位记录日志,每个Page里面再采取逻辑记法(为什么?)

Redo Log的逻辑与物理结构相关推荐

  1. 在文件log 加入commit id_从物理文件理解InnoDB Redo Log

    导读 作为MySQL DBA都应该知道,Redo Log是可被覆盖的,是ACID中的D的最重要的构成部分,也就是关系型数据库中的WAL中的L. Redo Log记录的是redo,那么redo是什么呢? ...

  2. 必须了解的MySQL三大日志:binlog、redo log和undo log

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者: 六点半起床 juejin.im/post/68602522 ...

  3. 精讲 MySQL 事务日志:redo log 和 undo log

    来源:https://blog.csdn.net/demonson/article/details/104369733 innodb事务日志包括redo log和undo log.redo log是重 ...

  4. 必须了解的mysql三大日志-binlog、redo log和undo log

    来源:https://juejin.im/post/6860252224930070536 日志是 mysql 数据库的重要组成部分,记录着数据库运行期间各种状态信息.mysql日志主要包括错误日志. ...

  5. MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结...

    MySQL中有六种日志文件, 分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log). ...

  6. MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结

    前言 1. ''最近公司大佬让我优化sql的时候,说可以通过控制where条件,尽可能的少的较少数据库的开支,少生成一些无用的binlog.由此引出binlog这个概念,大家一起学习一下 关于Binl ...

  7. 说说你对binlog、redo log和undo log的理解

    这里写自定义目录标题 说说你对binlog.redo log和undo log的理解 binlog binlog使用场景 binlog日志格式 redo log 为什么需要redo log redo ...

  8. 一文聊透binlog、redo log、undo log

    今日推荐 Web登录很简单?开玩笑!知乎热问:国家何时整治程序员的高薪现象?太可怕了!注解+反射优雅的实现Excel导入导出(通用版)Fluent Mybatis 牛逼!Nginx 常用配置清单这玩意 ...

  9. MYSQL专题-MySQL三大日志binlog、redo log和undo log

    日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息.mysql日志主要包括重做日志(redo log).回滚日志(undo log).二进制日志(bin log).错误日志(err ...

最新文章

  1. 人工智能基础-向量的基本几何意义
  2. 模拟计算机有声,小年糕有声影集软件电脑版
  3. 存储过程打印超过8000的VARCHAR字符的问题
  4. yaf mysql_Yaf框架的配置
  5. 【做题记录】CF1451E2 Bitwise Queries (Hard Version)
  6. 奇妙的安全旅行之DES算法(一)
  7. 这次,甘肃的老百姓办理就医再也不用等了
  8. HTML 列表 olullidldtdd
  9. Atititi atiitt eam pam资产管理 购物表去年.xlsx
  10. 机器学习落地的五个阶段
  11. CentOS操作系统服务器搭建MYSQL数据库
  12. 转:: 刺鸟:用python来开发webgame服务端(3)
  13. 路飞学城python开发ftp_路飞学城-Python开发集训-第一章
  14. Linux的tomcat文件夹下没有startup.sh
  15. 【Shader特效10】体积雾特效的使用
  16. 自行車基本知識 (zz)
  17. 【Scikit-Learn 中文文档】数据集加载工具 - 用户指南 | ApacheCN
  18. openFeign夺命连环9问
  19. Oracle常用函数总结
  20. 获取top等之类命令的部分打印内容

热门文章

  1. 进阶04 4 Collection集合类+Iterator迭代器+增强for+泛型
  2. 外联样式表添加到html中,CSS联样式表之内联式、外联式和嵌入式
  3. 项目后台运行关闭_iOS到底有没有必要上滑强制关闭APP?
  4. linux系统上安装远程软件下载,如何安装向日葵远程控制软件Linux被控端?
  5. win10 休眠设置无效_睡眠模式在Windows 10系统上不起作用?
  6. 本篇文章使用vue结合element-ui开发tab切换vue的不同组件,每一个tab切换的都是一个新的组件。
  7. oracle 多表查询_【Oracle】多表查询
  8. 大漠综合工具取点阵显示不全_利用pyfolio工具评价回测资金曲线
  9. php spl自动加载类,php – SPL自动加载最佳实践
  10. Oracle 备份shell,oracle数据库shell备份脚本