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

本文主要是介绍【云原生进阶之数据库技术】第二章-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 查看重做日志文件

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理论篇专栏

这篇关于【云原生进阶之数据库技术】第二章-Oracle-原理-4.2.5-联机重做日志文件解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1021194

相关文章

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Redis中Set结构使用过程与原理说明

《Redis中Set结构使用过程与原理说明》本文解析了RedisSet数据结构,涵盖其基本操作(如添加、查找)、集合运算(交并差)、底层实现(intset与hashtable自动切换机制)、典型应用场... 目录开篇:从购物车到Redis Set一、Redis Set的基本操作1.1 编程常用命令1.2 集

Redis中的有序集合zset从使用到原理分析

《Redis中的有序集合zset从使用到原理分析》Redis有序集合(zset)是字符串与分值的有序映射,通过跳跃表和哈希表结合实现高效有序性管理,适用于排行榜、延迟队列等场景,其时间复杂度低,内存占... 目录开篇:排行榜背后的秘密一、zset的基本使用1.1 常用命令1.2 Java客户端示例二、zse

Redis中的AOF原理及分析

《Redis中的AOF原理及分析》Redis的AOF通过记录所有写操作命令实现持久化,支持always/everysec/no三种同步策略,重写机制优化文件体积,与RDB结合可平衡数据安全与恢复效率... 目录开篇:从日记本到AOF一、AOF的基本执行流程1. 命令执行与记录2. AOF重写机制二、AOF的