【云原生进阶之数据库技术】第二章-Oracle-原理-4.2.5-联机重做日志文件解析

1 联机重做日志文件

联机重做日志是数据库恢复中至关重要的存储结构,由两个或多个预分配的文件组成,其中记录了对数据文件所做的修改。

1.1 日志文件概述

日志文件是Oracle数据库的事务日志,用于记录数据库的变更操作。它包含了所有已提交的事务的更改信息,包括INSERT、UPDATE、DELETE等操作。日志文件的主要作用是支持数据库的恢复和故障恢复。

Oracle数据库有两种类型的日志文件:联机重做日志文件(Online Redo Log File)和归档日志文件(Archive Redo Log File)。

  1. 联机重做日志文件是当前正在使用的日志文件,它记录了正在进行中的事务的更改操作。
  2. 归档日志文件是已经被归档的日志文件,用于时间点恢复,当RedoLogFiles存满时,会对这些日志进行归档备份,以便以后还原数据时使用。

联机重做日志文件是以重做记录的形式记录、保存用户对数据库所进行的变更操作,是数据库中最重要的物理文件。利用重做日志文件可以进行事务的重做(REDO)或回退(UNDO),是数据库实例恢复的基础。每一个数据库至少包含两个日志文件组,每个日志文件组至少包括一个日志文件。日志文件组以循环方式进行写操作。每一个日志文件成员对应一个物理文件。

能够恢复数据的原理:重做日志文件会按时间的顺序,将应用于数据库的一连串的变更向量(做了什么操作)存储起来(即将变更的地方标记起来)。其中包含了所有已经完成操作的信息和完成操作之前的数据库状态。如果数据文件受损,就可以将这些变更向量应用于数据文件备份来进行重做(重建)工作,将它恢复到发生故障的那一刻前的状态。

联机重做日志文件通常存储在操作系统的文件系统中,如$ORACLE_HOME/dbs目录下的redo01.log文件。归档日志文件可以存储在与数据文件不同的磁盘上,以提高可靠性和冗余性。

需要注意的是,日志文件的大小和数量都是可配置的,以适应数据库的需求。Oracle数据库会自动轮换使用在线重做日志文件,并将已满的联机重做日志文件写入归档日志文件以进行数据备份和恢复。

1.2 联机重做日志的用途

数据库维护联机重做日志以抵御数据丢失。如果数据库实例失败了,联机重做日志可以用来恢复已提交但是还未写入数据文件的数据。

服务器进程将每个事务同步写入redo日志缓冲区(redo log buffer),随后 LGWR(log writer process)进程将日志缓冲区的内容写入联机重做日志。联机重做日志的内容包括了未提交的事物、schema、对象管理语句(object management statements)。

当数据库修改 undo段(undo segments)时,所做的修改会被写入联机重做日志。因此,联机重做日志总会包含永久对象的 undo数据。

Oracle 数据库仅在恢复中会用到联机重做日志。但是,数据库管理员可以使用 Oracle LogMiner 来查看联机重做日志文件,以了解数据库的历史活动信息。

1.3 联机重做日志的结构

联机重做日志包含redo记录(redo record)。一条redo记录由一组修改向量(change vectors)组成,其中每个向量都描述了对数据块所做的一次修改。

redo记录中包括以下与数据块修改相关的元数据:

  1. 修改的 SCN 和时间戳;
  2. 执行修改操作的事务ID;
  3. 事务提交的 SCN 和时间戳(如果已提交);
  4. 执行修改的操作类型;
  5. 被修改的数据段的名称和类型。

1.4 怎么写联机重做日志

数据库实例中执行联机重做日志写入的被称为redo线程(redo thread)。

在单实例架构中,只有一个redo线程。在 Oracle RAC(Real Application Clusters)集群中,多个实例同时访问一个数据库,其中每个实例都有自己的redo线程。

一个联机重做日志由两个或多个联机重做日志文件组成。Oracle 数据库需要至少两个文件来保证始终有一个联机重做日志文件可写,以防另一个文件正在被清除或者归档中。

一个数据库实例中有一组或多组联机重做日志组(Redo Log Group),每个联机重做日志组中有一个或多个联机重做日志文件。每一个数据库实例至少需要两个联机日志组,同一组中每个联机日志文件的内容完全相同。

由日志书写进程LGWR负责将日志条目(Redo Records/Redo Entry)写入到联机日志文件中。一个日志条目有一系列的改变因子组成,一个改变因子用于描述一次对某个数据块的改变。

日志条目用于重构对数据库的改变,在进行数据库实例恢复时,Oracle读取日志条目中的改变因子,然后把这些改变因子应用到对应的块。

联机日志文件写入方式

后台进程LGWR负责将日志缓冲区中的日志条目写入到联机日志文件中。当用户commit一个事务,LGWR就将这个事务的回滚条目写入联机日志文件,并赋予一个改变标识(System Change Number 即SCN)用于标识这个事务的日志条目。只有当这个事务的日志条目被成功写到磁盘上的联机日志文件中,这个事务的提交才算完成。

当满足以下条件时,LGWR进程会自动将日志缓冲区中的日志条目写入到联机日志文件中:

  1. 每隔3秒钟
  2. 一个用户提交一个事务
  3. 日志缓冲区被填满1/3
  4. 日志缓冲区的日志大小接近1MB的日志数据
  5. 发生校验点

1.5 联机重做日志切换

Oracle 数据库一次只使用一个联机重做日志文件来存储从redo日志缓冲区写入的记录。日志写进程(LGWR)正在写入的联机重做日志文件被称为当前联机重做日志文件(current online redo log file)。

当数据库停止向一个联机重做日志文件写入,而开始向另一个文件写入时,就会发生日志切换(log switch)。日志切换通常发生在当前联机重做日志文件写满但是仍需要继续写的时候。你也可以人为设置日志切换的频率,而不考虑日志是否已经写满。

LGWR 日志写进程写联机重做日志文件是循环写的(circularly)。当最后一个可用的联机重做日志文件写满后,LGWR 进程就会从头开始写第一个日志文件。

图1 联机重做日志文件循环写

从图1可以看出,在发生日志切换时,数据库会为联机重做日志分配一个新的日志序列号(log sequence number)。已经写满的联机重做日志文件是否可以取决于归档模式:

  • 如果禁用了归档模式(NOARCHIVELOG),写满的联机重做日志文件在经过检查点(checkpoint)被 DBW(database writer)写入磁盘后可用。
  • 如果启用了归档模式(ARCHIVELOG),写满的联机重做日志文件在被写入数据文件并归档后对 log writer 可用。

有时log writer会被禁止复用某个联机重做日志文件。需要利用正在使用的联机重做日志文件(active online redo log file)进行实例恢复。

1.6 联机重做日志文件的多副本

Oracle 数据库会在不同的位置自动维护两个或多个相同的联机重做日志副本。一个联机重做日志组(online redo log group)由一个联机日志文件和它的冗余副本组成。每个日志组都有一个编号。维护联机重做日志组可以防止重做日志丢失。理想情况下,一个日志组的所有成员应该分布在不同的磁盘上。

图2中,A_LOG1 和 B_LOG1 是组1的相同成员,A_LOG2 和 B_LOG2 是组2的相同成员。同一个日志组内的成员大小都必须相等。LGWR 进程并发地写入组1,然后并发地写入组2,再然后并发写入组1,如此交替。LGWR 不会同时并发写入不同日志组的成员。

图2 联机重做日志的多个副本

1.7 查看重做日志文件

bash 复制代码
SQL> select group#,member from v$logfile;

参考链接

Oracle架构_数据库底层原理、机制 (授人以渔)_oracle底层-CSDN博客

Oracle原理大图-CSDN博客

oracle体系结构详解

一篇文章带你了解Oracle的体系结构

ORACLE体系结构逻辑结构-表空间、段、区和数据块 - 知乎

oracle数据库体系架构详解

Oracle数据库体系结构

Oracle架构、原理、进程-腾讯云开发者社区-腾讯云

oracle 数据库体系结构详解_oracle体系结构详解-CSDN博客

Oracle系列十九:Oracle的体系结构_oracle体系结构-CSDN博客

一篇文章带你了解Oracle的体系结构

Oracle数据库体系结构

oracle 数据库体系结构详解_oracle体系结构详解-CSDN博客

Oracle数据库体系结构(二)_物理结构_oracle数据连接-CSDN博客

Oracle物理存储结构

Oracle数据库存储结构:物理存储结构_oracle的物理结构-CSDN博客

Oracle数据库的体系结构(上)------存储结构_oracle存储结构管理-CSDN博客

Oracle第八节-Oracle物理存储结构_orcale物理文件-CSDN博客

【数据库】Oracle存储结构

一篇文章带你了解Oracle底层物理与逻辑存储 - 知乎

Oracle数据库,详解Oracle物理存储结构-腾讯云开发者社区-腾讯云

Oracle理论篇专栏

相关推荐
xiaogengtongxu4 分钟前
Mysql中间件和高可用
数据库·mysql·中间件
java6666688888 分钟前
SQL游标的原理与在数据库操作中的应用
数据库·sql·oracle
2401_8581205325 分钟前
Memcached自动故障转移实现:高可用性策略与实践
数据库·缓存·memcached
Xpccccc25 分钟前
MySQL数据类型
数据库·mysql
.周周1 小时前
mysql数据表时间字段自动存时间
数据库·mysql
哈哈,名字可以改2 小时前
权限表1111111
数据库
passion更好2 小时前
【Pyhton】读取寄存器数据到MySQL数据库
数据库
baozongwi2 小时前
ctfshow sqli-libs web561--web568
数据库·经验分享·python·sql·mysql·web安全
孤傲小二~阿沐2 小时前
PostgreSQL的学习心得和知识总结(一百四十七)|深入理解PostgreSQL数据库之transaction chain的使用和实现
数据库·postgresql
WineMonk2 小时前
Neo4j 图数据库 高级操作
数据库·neo4j