【云原生进阶之数据库技术】第二章-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

相关文章

使用Dify访问mysql数据库详细代码示例

《使用Dify访问mysql数据库详细代码示例》:本文主要介绍使用Dify访问mysql数据库的相关资料,并详细讲解了如何在本地搭建数据库访问服务,使用ngrok暴露到公网,并创建知识库、数据库访... 1、在本地搭建数据库访问的服务,并使用ngrok暴露到公网。#sql_tools.pyfrom

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到

IDEA连接达梦数据库的详细配置指南

《IDEA连接达梦数据库的详细配置指南》达梦数据库(DMDatabase)作为国产关系型数据库的代表,广泛应用于企业级系统开发,本文将详细介绍如何在IntelliJIDEA中配置并连接达梦数据库,助力... 目录准备工作1. 下载达梦JDBC驱动配置步骤1. 将驱动添加到IDEA2. 创建数据库连接连接参数

Jmeter如何向数据库批量插入数据

《Jmeter如何向数据库批量插入数据》:本文主要介绍Jmeter如何向数据库批量插入数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Jmeter向数据库批量插入数据Jmeter向mysql数据库中插入数据的入门操作接下来做一下各个元件的配置总结Jmete

MySql中的数据库连接池详解

《MySql中的数据库连接池详解》:本文主要介绍MySql中的数据库连接池方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql数据库连接池1、概念2、为什么会出现数据库连接池3、原理4、数据库连接池的提供商5、DataSource数据源6、DBCP7、C

MySQL的隐式锁(Implicit Lock)原理实现

《MySQL的隐式锁(ImplicitLock)原理实现》MySQL的InnoDB存储引擎中隐式锁是一种自动管理的锁,用于保证事务在行级别操作时的数据一致性和安全性,本文主要介绍了MySQL的隐式锁... 目录1. 背景:什么是隐式锁?2. 隐式锁的工作原理3. 隐式锁的类型4. 隐式锁的实现与源代码分析4