Redo Log的逻辑与物理结构

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

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

但从物理上来讲,日志不可能是一个永不结束的字节流,日志的物理结构和逻辑结构,有两个非常显著的差异点:
(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里面再采取逻辑记法(为什么?)
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
当谈论Oracle数据库的物理结构和逻辑结构时,可以从以下两个方面进行说明: 1. 物理结构: - 控制文件:控制文件是Oracle数据库的元数据文件,它记录了数据库的结构信息,包括数据库的名称、数据文件的位置、日志文件的位置等。控制文件的作用是确保数据库的一致性和完整性。 - 数据文件:数据文件是用于存储实际数据的文件,它存储了表、索引、视图等数据库对象的数据。数据文件是以数据块为单位进行存储,每个数据块通常为8KB大小。数据文件可以分为表空间,并且可以跨多个物理存储设备。 - 日志文件:日志文件用于记录数据库操作的日志信息,包括事务的开始和提交、数据修改等操作。它有两种类型:重做日志文件(Redo Log)和归档日志文件(Archive Log)。重做日志文件记录了数据库发生的所有变更操作,而归档日志文件用于备份和恢复。 2. 逻辑结构: - 数据块:数据块是Oracle数据库中最基本的单位,用于存储数据和索引。每个数据块通常为8KB大小,可以包含一条或多条记录。 - 段:段是由一个或多个数据块组成的逻辑存储单位,用于存储表、索引、视图等数据库对象的数据。每个段与一个表或索引对象相关联,并具有与之相对应的段名。 - 表空间:表空间是由一个或多个数据文件组成的逻辑存储单位,用于存储数据库中的表、索引等对象。一个表空间可以包含多个段,不同的表空间可以分布在不同的物理存储设备上,提供了对存储空间的管理和控制。 - 用户、角色和权限:用户是数据库中的一个实体,每个用户都有自己的用户名和密码,可以创建和管理自己的对象。角色是一组权限的集合,可以分配给用户,以便管理用户的权限。权限定义了用户或角色对数据库对象的访问和操作权限。 这些是Oracle数据库的基本物理结构和逻辑结构。根据具体的数据库版本和配置,可能还有其他更详细的结构组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值