维护在线重做日志

学习目标

  • 解释在线重做日志文件的目的概述
  • 在线重做日志文件的结构
  • 控制日志开关和检查点
  • 多路复用和维护在线重做日志文件
  • 使用OMF管理在线重做日志文件
  • 获取在线重做日志文件信息

在线重做日志文件提供了在数据库发生故障时重做事务的方法。

每个事务都同步写入重做日志缓冲区,然后刷新到在线重做日志文件,以便在媒体失败时提供恢复机制。

(除了在启用了NOLOGGING子句的对象中直接加载插入等例外情况。)

这包括尚未提交的事务、撤消段信息以及模式和对象管理语句。

在线重做日志文件用于实例失败时恢复未写入数据文件的已提交数据的情况。

在线重做日志文件仅用于恢复。

在线重做日志文件具有以下特点
  • 记录对数据所作的所有更改
  • 提供恢复机制
  • 可以组织成小组
  • 至少需要两组

重做日志文件结构

重做日志文件组的工作原理
  1. 多个重做日志组:Oracle数据库可以配置多个在线重做日志组,每个重做日志组包含一个或多个在线重做日志文件。这样可以提高数据库的并发性和容错性。

  2. 轮流写入:当数据库进行修改操作时,这些操作会首先写入当前活跃的在线重做日志组中的重做日志文件。如果当前的重做日志文件写满了,数据库会自动切换到下一个在线重做日志组中的重做日志文件继续记录修改操作。

  3. 循环使用:在线重做日志组是循环使用的,当一个重做日志文件写满后,数据库会自动切换到下一个重做日志文件继续记录修改操作。这样可以确保数据库的重做日志不会无限增长,同时保证了数据库的持久性和一致性。

  4. 保证数据完整性:通过多个在线重做日志组的轮流写入,Oracle数据库可以确保即使在一个重做日志组发生故障或损坏时,仍然可以继续记录修改操作,保证数据库的数据完整性和可靠性。

  5. 性能优化:合理配置和管理多个在线重做日志组可以提高数据库的性能和并发能力,确保数据库的稳定性和可靠性。

联机重做日志文件的结构
  • 数据库管理员可以设置Oracle数据库维护在线重做日志文件的副本,以避免由于单点故障而丢失数据库信息。

  • 联机重做日志文件组

    在线重做日志文件的一组相同的副本称为在线重做日志文件组。LGWR后台进程并发地将相同的信息写入组中的所有在线重做日志文件。

    Oracle服务器至少需要两个在线重做日志文件组来保证数据库的正常运行。

  • 联机重做日志文件成员

    组中的每个在线重做日志文件称为一个成员。

    组中的每个成员具有相同的日志序列号和相同的大小。

    每次Oracle服务器写入日志组时,都会分配日志序列号,以唯一标识每个在线重做日志文件。当前日志序列号存储在控制文件和所有数据文件的头文件中。

  • 联机重做日志文件的结构

    创建初始在线重做日志文件

    在线重做日志文件组和成员的初始集是在创建数据库时创建的。

    以下参数限制在线重做日志文件的数量:

  • CREATE DATABASE命令中的MAXLOGFILES参数指定在线重做日志文件组的绝对最大值。

  • MAXLOGFILES的最大值和默认值取决于您的操作系统。

  • 在CREATE DATABASE命令中使用的MAXLOGMEMBERS参数决定每个组的最大成员数。

    MAXLOGMEMBERS的最大值和默认值取决于您的操作系统。

多路复用重做日志文件

为了防止涉及重做日志本身的故障,Oracle数据库允许多路重做日志,这意味着可以在不同的位置自动维护两个或多个相同的重做日志副本。为了获得最大的好处,这些位置应该位于单独的磁盘上 。但是,即使重做日志的所有副本都在同一个磁盘上,冗余也可以帮助防止I/O错误、文件损坏等。当重做日志文件多路复用时,LGWR并发地将相同的重做日志信息写入多个相同的重做日志文件,从而消除了重做日志的单点故障。

多路复用是通过创建重做日志文件组来实现的。组由重做日志文件及其多路副本组成。每一个相同的副本都被认为是这个群体的一个成员。每个重做日志组由一个数字定义,例如组1、组2,等这等。

注意:Oracle建议您将重做日志文件多路复用。如果需要恢复,日志文件数据的丢失可能是灾难性的。注意,当您复用重做日志时,数据库必须增加它执行的1/0量。根据您的配置,这可能会影响整体数据库性能。

在线重做日志文件是如何工作的

在线重做日志文件以循环的方式使用。

转到下一个日志组。

当在线重做日志文件已满时,LGWR将移动

  • 称为日志开关
  • 检查点操作也会发生
  • 写入控制文件的信息

从一个日志文件组切换到另一个日志文件组的行为称为日志切换。

检查点是将脏(修改)块从缓冲缓存写到磁盘的过程。

LGWR(Log Writer)是Oracle数据库中的一个重要后台进程,负责将数据库缓冲区中的修改操作写入在线重做日志文件中。

  1. 写入重做日志:LGWR负责将数据库缓冲区中的修改操作(如插入、更新、删除)写入在线重做日志文件中,确保数据库的修改操作被持久化到磁盘,以保证数据库的一致性和持久性。
  2. 控制提交:LGWR在事务提交时负责将事务的修改操作写入重做日志文件,并生成提交记录,以确保事务的提交状态能够被恢复。
  3. 性能优化:LGWR通过批量写入和异步写入的方式优化性能,减少磁盘I/O的开销,提高数据库的性能和并发能力。
  4. 故障恢复:LGWR在数据库发生故障或崩溃时起着重要作用,通过重放在线重做日志中的操作,可以帮助数据库恢复到一致的状态。
  5. 保证数据完整性:LGWR的工作确保了数据库的数据完整性,即使在异常情况下,也可以通过重做日志文件中的记录来恢复数据库到一致的状态。
Oracle服务器将对数据库的所有更改顺序记录在Redo Log Buffer中。重做条目由LGWR进程从重做日志缓冲区写入当前在线垂做日志文件组。LGWR在以下情况下写入
  • 当事务提交时
  • 当重做日志缓冲区满三分之一时
  • 当重做日志缓冲区中有超过1兆字节的更改记录时
  • 在DBWn将数据库Buffer Cache中的修改块写入数据文件之前在线重做日志文件以循环方式使用。每个在线重做日志文件组由日志序列号标识,该序列号在日志每次被重用时被覆盖。
日志切换

LGWR按顺序写入在线重做日志文件。当当前在线重做日志文件组被填满时,LGWR开始向下一个组写入。这被称为日志开关。

当最后一个可用的在线重做日志文件被填满时,LGWR返回到第一个在线重做日志文件组并开始再次写入。

日志交换机和日志序列号
  • 日志切换是数据库停止写入一个重做日志文件并开始写入另一个重做日志文件的点。通常,当当前重做日志文件被完全填满,并且必须继续写入下一个重做日志文件时,会发生日志切换。但是,您可以将日志开关配置为定期发生,而不管当前的重做日志文件是否被完全填充。您也可以手动强制记录交换机日志。
  • Oracle数据库在每次发生日志切换和LGWR开始写入时,为每个重做日志文件分配一个新的日志序列号。当数据库归档重做日志文件时,归档日志保留其日志序列号。当重做日志文件被循环使用时,将给出下一个可用的日志序列号。
  • 每个在线或归档的重做日志文件由其日志序列号唯一标识。在崩溃、实例或介质恢复期间,数据库通过使用必要的归档和重做日志文件的日志序列号,以升序正确地应用重做日志文件。
检查点

在检查点期间:

  • DBWn将许多脏数据库缓冲区写入数据文件,这些缓冲区由正在被检查点的日志所覆盖。
    检查点后台进程CKPT更新控制文件,以反映它已成功完成检查点。如果检查点是由日志切换引起的,CKPT还会更新数据文件的头。
  • 检查点可以发生在数据库中的所有数据文件上,也可以只发生在特定的数据文件上。
    例如,在以下情况下会出现检查点:
  • 在每个日志开关处
  • 当使用正常、事务或立即选项关闭实例时
  • 当通过设置FAST_START_MTTR_TARGET初始化参数强制时当数据库管理员手动请求时
  • 当ALTER TABLESPACE [OFFLINE | NORMALIREAD ONLY|BEGIN BACKUP]命令对特定的数据文件进行校验时
    每个检查点的信息记录在alert_SID.log中。如果初始化参数LOG_CHECKPOINTS_TO_ALERT设置为TRUE,则日志文件将被删除。该参数的默认值FALSE不记录检查点。
强制

与在线重做日志相关的视图

sql 复制代码
desc v$log
select group# ,group#,sequence#,status from v$log;
FAST_START_MTTR_TARGET

FAST_START_MTTR_TARGET是Oracle数据库中一个重要的参数,用于指定数据库的自动内存调整目标,以便在数据库发生故障时快速恢复到一致的状态。在您提供的情况下,FAST_START_MTTR_TARGET = 600表示设置了数据库的自动内存调整目标为600秒。

具体来说,FAST_START_MTTR_TARGET参数的作用是控制数据库的自动内存调整过程,以确保在数据库发生故障时,数据库可以在指定的时间内(以秒为单位)快速恢复到一致的状态。通过调整这个参数的值,可以影响数据库的恢复速度和性能。

在这种情况下,设置FAST_START_MTTR_TARGET = 600表示数据库的自动内存调整目标为600秒,即数据库在发生故障时,会尽力在600秒内完成恢复操作,以确保数据库的一致性和可用性。

show parameter fast可以查询当前参数

强制日志开关和检查点

日志切换和检查点在数据库操作的某些点自动执行,如前所述。但是,DBA可以强制执行日志切换或检查点。迫使检查点

FAST START MTTR TARGET参数取代了已弃用的参数:FAST_START_IO-TARGET LOG_CHECKPOINT_TIMEOUT如果使用了参数FAST START MTTR TARGET,则不能使用这些已弃用的参数。

在上面的示例中,已经设置了FAST-START_MTTR_TARGET参数,以便实例恢复不超过600秒。数据库将根据这一目标调整其他参数。

增加在线重做日志数量

在线重做日志组数量
  1. 确定当前的在线重做日志组数量:首先,您可以查询数据库的参数设置或查看数据库的配置文件,确认当前的在线重做日志组数量。

  2. 备份数据库:在进行任何更改之前,请务必备份数据库,以防意外发生。

  3. 添加新的在线重做日志组:您可以使用ALTER DATABASE ADD LOGFILE GROUP命令来添加新的在线重做日志组。例如,您可以执行类似以下的SQL语句:

sql 复制代码
ALTER DATABASE ADD LOGFILE GROUP 4 ('/path/to/logfile_group_4a.log', '/path/to/logfile_group_4b.log') SIZE 100M;

在上面的示例中,我们添加了一个新的在线重做日志组,包含两个重做日志文件,并指定了每个文件的大小为100M。您可以根据实际需求和数据库配置进行调整。

  1. 激活新的在线重做日志组:添加新的在线重做日志组后,您需要激活这些新的重做日志组,以便数据库开始使用它们记录修改操作。您可以执行以下SQL语句来激活新的重做日志组:
sql 复制代码
ALTER DATABASE ADD LOGFILE GROUP 4 ('/path/to/logfile_group_4a.log', '/path/to/logfile_group_4b.log') SIZE 100M;
  1. 验证和监控:添加新的在线重做日志组后,您可以验证数据库是否正常工作,并监控数据库的性能和日志记录情况,以确保新的重做日志组被正确使用。
在线重做日志组内数量
  1. 确定当前的在线重做日志组文件数量 :首先,您可以查询数据库的参数设置或查看数据库的配置文件,确认每个在线重做日志组中当前的文件数量。

    sql 复制代码
    SELECT COUNT(*) AS "Number of Redo Log Groups" FROM V$LOG;   # 查看重做日志组数量
    SELECT * FROM V$PARAMETER WHERE NAME LIKE '%log_file%';   # 查看数据库的参数设置
    1. 备份数据库:在进行任何更改之前,请务必备份数据库,以防意外发生。

    2. 修改在线重做日志组文件数量:您可以使用ALTER DATABASE ADD LOGFILE MEMBER或ALTER DATABASE DROP LOGFILE MEMBER命令来增加或减少每个在线重做日志组中的文件数量。以下是一些示例SQL语句:

    • 增加文件数量
    sql 复制代码
    ALTER DATABASE ADD LOGFILE MEMBER '/path/to/new_logfile.log' TO GROUP 1;

在上面的示例中,我们向第一个重做日志组添加了一个新的重做日志文件。

  • 减少文件数量
sql 复制代码
ALTER DATABASE DROP LOGFILE MEMBER '/path/to/logfile_to_be_dropped.log';

在上面的示例中,我们从数据库中删除了一个特定的重做日志文件。

  1. 激活修改:在修改每个在线重做日志组中的文件数量后,您可能需要重新启动数据库实例或执行适当的命令来激活这些更改。

  2. 验证和监控:修改每个在线重做日志组中的文件数量后,您可以验证数据库是否正常工作,并监控数据库的性能和日志记录情况,以确保修改生效并不会影响数据库的稳定性。

查看重做日志位置

sql 复制代码
SELECT MEMBER FROM V$LOGFILE;   # 获取重做日志文件的位置
SELECT * FROM V$LOG;      # 查看所有重做日志文件的相关信息,包括位置、大小等

删除Redo文件成员

  • 允许删除重做日志文件,使多路重做日志暂时变得不对称。例如,如果您使用重做日志文件的双工组,您可以删除一个组中的一个成员,即使所有其他组每个都有两个成员。但是,您应该立即纠正这种情况,以便所有组至少有两个成员,从而消除重做日志可能出现的单点故障。

  • 一个实例总是需要至少两组有效的重做日志文件,无论组中有多少成员。(一个小组由一个或多个成员组成。)如果要删除的成员是组的最后一个有效成员,则在其他成员生效之前不能删除该成员。要查看重做日志文件的状态,请使用V$LOGFILE视图。如果数据库无法访问重做日志文件,则重做日志文件变为INVALID。如果数据库怀疑它不完整或不正确,则变为STALE。过时的日志文件在下次将其组设置为活动组时再次有效。


  • 只有当重做日志成员不属于活动组或当前组时,才能删除该成员。如果要删除活动组成员,请首先强制进行日志切换。
  • 在删除重做日志成员之前,请确保重做日志成员所属的组已存档(如果存档已启用)。要查看是否发生了这种情况,请使用V$LOG视图。

当重做日志成员从数据库中删除时,操作系统文件不会从磁盘中删除。相反,将更新关联数据库的控制文件以从数据库结构中删除成员。删除重做日志文件后,确保删除成功完成,然后使用适当的操作系统命令删除被删除的重做日志文件。

设置列格式

sql 复制代码
  COLUMN column_name FORMAT A20     # 这将设置名为column_name的列的宽度为20个字符
  col member format A20
具体删除
  1. 确定要删除的重做日志文件:首先,您需要确定要删除的重做日志文件的位置和名称。您可以使用以下SQL查询语句来查看当前数据库中的重做日志文件信息:
sql 复制代码
SELECT * FROM V$LOGFILE;

这将列出数据库中所有的重做日志文件及其相关信息,包括位置、大小等。

  1. 切换日志文件组:在删除重做日志文件之前,建议首先切换到其他日志文件组,以确保数据库能够继续正常运行。您可以使用以下SQL语句来切换日志文件组:
sql 复制代码
ALTER SYSTEM SWITCH LOGFILE;

这将触发数据库切换到下一个可用的重做日志文件组。

  1. 删除重做日志文件 :一旦切换到其他日志文件组,您可以使用操作系统命令来删除特定的重做日志文件。例如,如果要删除名为redo_logfile_1.log的重做日志文件,您可以使用类似以下的命令:
bash 复制代码
rm /path/to/redo_logfile_1.log

请确保在删除重做日志文件之前已经备份数据库,并且谨慎操作,以避免数据丢失或数据库损坏。

  1. 清除Oracle数据库中的重做日志信息:删除重做日志文件后,您可能需要清除数据库中对应的重做日志信息。您可以使用以下SQL语句来清除已删除的重做日志文件信息:
sql 复制代码
ALTER DATABASE CLEAR LOGFILE GROUP group_number;

请将group_number替换为实际的重做日志组号。

  • 另一种顺序
删除重做日志组
sql 复制代码
SELECT GROUP#, MEMBERS, ARCHIVED, STATUS FROM V$LOG;

查询Oracle数据库中的重做日志组的组号(group#)、成员数(members)、是否已归档(archived)、状态(status)

状态这一列:

CURRENT:表示该重做日志组当前正在被使用,是当前正在写入的重做日志组。

ACTIVE:表示该重做日志组包含尚未归档的重做日志,即这些重做日志还未被归档到归档日志中。

INACTIVE:表示该重做日志组中的重做日志已经被归档,不再处于活动状态。

UNUSED:表示该重做日志组尚未被使用,没有包含任何重做日志。

一个实例至少需要两组在线重做日志文件。

不能删除活动组或当前组。

删除在线重做日志文件组时,不会删除操作系统文件。

应该先删除组4,要保证序号是连续的

迁移和重命名

  • 可以使用操作系统命令重新定位重做日志,然后使用ALTER DATABASE语句使数据库知道它们的新名称(位置)。这个过程是必要的,例如,如果当前用于一些重做日志文件的磁盘将被删除,或者如果数据文件和许多重做日志文件存储在同一个磁盘上,并且应该分开以减少争用。
  • 要重命名重做日志成员,您必须具有ALTER DATABASE系统权限。此外,您可能还需要操作系,统特权来将文件复制到所需的位置,并需要特权来打开和备份数据库。
  • 在重新定位重做日志或对数据库进行任何其他结构更改之前,请完全备份数据库,以防在执行操作时遇到问题。作为预防措施,在重命名或重定位一组重做日志文件后,应立即备份数据库控制文件。
相关推荐
你的微笑,乱了夏天6 分钟前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺17 分钟前
分布式系统架构:服务容错
数据库·架构
独行soc1 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain2 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship2 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站2 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶2 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
梦想平凡3 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
TianyaOAO4 小时前
mysql的事务控制和数据库的备份和恢复
数据库·mysql
Ewen Seong4 小时前
mysql系列5—Innodb的缓存
数据库·mysql·缓存