什么是重做日志?

本文深入探讨Oracle数据库中的重做日志机制,包括重做日志的基本概念、重做记录的内容及其在单实例和集群环境下的管理。此外,还介绍了重做日志的循环写入机制以及日志切换的过程。

恢复操作的最关键结构是重做日志,它由两个或多个预先分配的文件组成,这些文件存储数据库发生的所有更改。 Oracle数据库的每个实例都有一个关联的重做日志,用于在发生实例故障时保护数据库。

重做的线程

在多个数据库实例的环境中讲话时,每个数据库实例的重做日志也称为重做线程。在典型的配置中,只有一个数据库实例访问Oracle数据库,因此只有一个线程存在。但是,在Oracle Real Application Clusters环境中,两个或更多实例同时访问单个数据库,并且每个实例都有自己的重做线程。每个实例都有一个单独的重做线程,可以避免争用一组重做日志文件,从而消除潜在的性能瓶颈。

本章介绍如何配置和管理标准单实例Oracle数据库上的重做日志。在所有讨论和语句示例中,线程数可以假定为1。有关Oracle Real Application Clusters环境中的重做日志组的信息,请参阅Oracle Real Application Clusters管理和部署指南。

重做日志内容

重做日志文件充满重做记录。重做记录也称为重做条目,由一组变化向量组成,每个变化向量描述对数据库中的单个块所做的更改。例如,如果更改员工表中的工资值,则会生成包含更改向量的重做记录,这些更改向量描述对表的数据段块,撤消段数据块以及撤消段的事务处理表的更改。

重做条目记录可用于重建对数据库所做的所有更改(包括还原段)的数据。因此,重做日志还保护回滚数据。当您使用重做数据恢复数据库时,数据库将读取重做记录中的更改向量并将更改应用到相关块。

重做记录以循环方式缓存在SGA的重做日志缓冲区中(请参阅“Oracle数据库如何写入重做日志”),并由日志编写器(LGWR)数据库后台进程写入其中一个重做日志文件。无论何时提交事务,LGWR都会将事务重做记录从SGA的重做日志缓冲区写入重做日志文件,并为每个已提交事务分配一个系统更改编号(SCN)以标识重做记录。只有在联机日志中与给定事务关联的所有重做记录安全地位于磁盘上时,用户进程才会通知事务已提交。

在提交相应的事务之前,重做记录也可以写入重做日志文件。如果重做日志缓冲区填满或其他事务提交,则LGWR会将重做日志缓冲区中的所有重做日志条目刷新到重做日志文件,即使某些重做记录可能未提交。如有必要,数据库可以回滚这些更改。

Oracle数据库如何写入重做日志

数据库的重做日志由两个或更多重做日志文件组成。数据库至少需要两个文件才能保证一个文件可以随时写入而另一个正在归档(如果数据库处于ARCHIVELOG模式)。有关更多信息,请参阅“管理已归档的重做日志”。

LGWR以循环方式写入重做日志文件。当前重做日志文件填满后,LGWR开始写入下一个可用的重做日志文件。当最后一个可用的重做日志文件被填充时,LGWR返回到第一个重做日志文件并写入它,再次启动周期。图12-1显示了重做日志文件的循环写入。每行旁边的数字表示LGWR写入每个重做日志文件的顺序。

根据是否启用归档,填充的重做日志文件可供LGWR重复使用。

  • 如果禁用了存档(数据库处于NOARCHIVELOG模式),则写满的重做日志文件在其中记录的更改已写入数据文件后可用。
  • 如果存档已启用(数据库处于ARCHIVELOG模式),则在LGWR中记录的更改已写入数据文件并且文件已存档后,可以使用写满的重做日志文件。

Figure 12-1 Reuse of Redo Log Files by LGWR

活动(当前)和非活动重做日志文件

Oracle数据库一次仅使用一个重做日志文件来存储从重做日志缓冲区写入的重做记录。 LGWR正在积极写入的重做日志文件称为当前重做日志文件。

实例恢复所需的重做日志文件称为活动重做日志文件。实例恢复不再需要的重做日志文件称为非活动重做日志文件。

如果已启用存档(数据库处于ARCHIVELOG模式),则数据库无法重新使用或覆盖活动的联机日志文件,直到其中一个归档后台进程(ARCn)归档其内容。如果禁用了存档(数据库处于NOARCHIVELOG模式),那么当最后一个重做日志文件已满时,LGWR将继续在序列中的下一个日志文件变为非活动状态时覆盖该日志文件。

日志切换和日志序列号

日志切换是数据库停止写入到一个重做日志文件并开始写入另一个日志文件的位置。通常,当当前重做日志文件被完全填满并且写入必须继续到下一个重做日志文件时,会发生日志切换。但是,无论当前重做日志文件是否完全填满,您都可以将日志切换配置为定期执行。您也可以手动强制日志切换。

每次发生日志切换时,Oracle数据库都会为每个重做日志文件分配一个新的日志序列号,并且LGWR开始写入日志序列号。当数据库归档重做日志文件时,归档日志保留其日志序列号。重新使用的重做日志文件是下一个可用的日志序列号。

每个联机或归档重做日志文件都由其日志序列号唯一标识。在崩溃,实例或介质恢复期间,数据库通过使用必需的归档日志文件和重做日志文件的日志序列号,按升序正确应用重做日志文件。

 

参考资料

https://docs.oracle.com/cd/E11882_01/server.112/e25494/onlineredo.htm#ADMIN11302

转载于:https://www.cnblogs.com/ZeroTiny/p/9229973.html

<think>好的,我现在需要回答用户关于重做日志数据库中的作用和定义的问题。首先,我得回忆一下之前提供的引用内容,看看哪些部分相关。引用[2]提到innodb通过forcelog atcommit机制,使用redolog和undo log来实现事务的持久性。引用[3]详细解释了重做日志的作用,即保存变化的数据,由LGWR进程写入,确保数据库启后能恢复数据。引用[5]中达梦数据库的ROLL表空间用于存储DML操作前的值,这可能与undolog相关,但用户现在问的是重做日志,也就是redolog。接下来,我需要组织答案的结构。首先定义重做日志,然后说明其核心作用,比如持久性、数据恢复和故障恢复。需要结合引用中的内容,比如forcelog atcommit机制,LGWR进程,以及事务提交时的日志写入。另外,可能需要提到重做日志的组成部分,比如redo和undo,但根据引用[2],redo log和undolog都是事务日志的一部分,但用户的问题集中在重做日志,所以可能需要区分清楚。 要注意用户可能混淆redo log和undolog。根据引用[2],事务提交时写入的是redo和undo log,但重做日志主要指redo log,用于更改。而undo log更多用于回滚和一致性读。需要明确这一点,避免混淆。 然后,引用[3]中的LGWR进程负责写重做日志文件,数据库启时读取这些日志恢复数据。这部分需要解释清楚,说明重做日志在故障恢复中的流程。同时,引用[4]提到归档日志,但用户问的是重做日志,可能不需要涉及归档,除非要对比说明,但暂时先不引入,保持答案的专注。 引用[5]中的达梦数据库的ROLL表空间可能与undo相关,而重做日志可能对应其自己的机制,但用户的问题可能不特定于达梦,而是通用概念,所以应保持答案通用,引用相关部分作为例子即可。 最后,生成相关问题,需要围绕重做日志的作用、机制、相关进程、与undo的区别,以及实际应用中的考虑,如性能影响、配置等。确保问题有针对性,帮助用户深入理解。 需要检查LaTeX格式是否正确,所有行内公式用$...$,独立公式用$$...$$,但当前回答中可能没有数学表达式,所以可能不需要。但如果有提到事务ID或公式,需注意格式。目前看来可能不需要使用LaTeX,但需留意。确保用中文回答,结构清晰,分点说明,引用标注正确。比如在提到forcelog atcommit时标注[^2],在LGWR进程部分标注[^3],在事务持久性时引用[^2]和[^3]。总结:重做日志的定义、作用包括持久性、恢复数据、故障恢复,相关机制如forcelog atcommit和LGWR进程,以及与其他日志的区别。生成的问题应涵盖这些方面。</think>### 重做日志的定义与作用 **定义** 重做日志(Redo Log)是数据库系统中记录数据修改操作的核心组件,主要用于**保障事务的持久性**。当用户对数据库进行增删改操作时,这些变更会先以物理形式记录在重做日志文件中,之后再写入数据文件[^2][^3]。 --- #### **核心作用** 1. **事务持久性保证** 通过**force log at commit**机制,确保事务提交(COMMIT)前必须先将所有变更写入重做日志文件。即使系统崩溃,启后也能根据日志恢复未写入数据文件的修改[^2]。 2. **故障恢复** 数据库启时,通过重做日志中的记录**演未持久化的操作**(例如事务提交后未完全刷盘的数据)。例如,Oracle的LGWR进程负责将日志缓冲区内容写入重做日志文件[^3]。 3. **支持数据一致性** 与回滚日志(Undo Log)配合,实现事务的回滚和读一致性视图。重做日志记录“修改后的值”,回滚日志记录“修改前的值”[^2][^5]。 --- #### **工作机制示例** 1. 用户执行更新操作:`UPDATE table SET col=1 WHERE id=10;` 2. 数据库先在内存中修改数据,生成重做日志记录(如“将id=10的col值从0改为1”)。 3. 事务提交时,强制将日志写入磁盘(重做日志文件),之后异步将数据写入数据文件[^2][^3]。 --- ### 相关问题 1. 重做日志和回滚日志(Undo Log)有什么区别? 2. 如何配置重做日志的大小和数量以优化数据库性能? 3. 数据库崩溃后,重做日志如何实现数据恢复? 4. 为什么重做日志需要强制写入磁盘,而数据文件可以异步写入? 5. 达梦数据库中的ROLL表空间与重做日志有何关联?[^5] --- 通过重做日志数据库在性能与可靠性之间取得了平衡,是事务ACID特性中**持久性(Durability)**的关键实现[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值