Bootstrap

维护在线重做日志(二)

迁移和重命名

  • 可以使用操作系统命令重新定位重做日志,然后使用ALTER DATABASE语句使数据库知道它们的新名称(位置)。这个过程是必要的,例如,如果当前用于一些重做日志文件的磁盘将被删除,或者如果数据文件和许多重做日志文件存储在同一个磁盘上,并且应该分开以减少争用。
  • 要重命名重做日志成员,您必须具有ALTER DATABASE系统权限。此外,您可能还需要操作系,统特权来将文件复制到所需的位置,并需要特权来打开和备份数据库。
  • 在重新定位重做日志或对数据库进行任何其他结构更改之前,请完全备份数据库,以防在执行操作时遇到问题。作为预防措施,在重命名或重定位一组重做日志文件后,应立即备份数据库控制文件。
实际操作
详细步骤解释
  1. 关闭数据库

    • 在操作重做日志文件之前,必须关闭数据库(正常关闭或立即关闭),以确保没有正在使用这些日志文件。
    • 命令:
      SHUTDOWN IMMEDIATE;
      
  2. 将在线重做日志文件复制到新位置

    • 使用操作系统命令(如 cpmv 或其他工具),将重做日志文件从原位置复制到新位置或重命名。
    • 示例(Linux/UNIX 环境):
      mv /old_location/redo01.log /new_location/redo01.log
      
  3. 将数据库置于 MOUNT 模式

    • 将数据库从关闭状态启动到 MOUNT 模式,这样数据库实例能够访问控制文件,但不会打开数据库。
    • 命令:
      STARTUP MOUNT;
      
  4. 执行 ALTER DATABASE RENAME FILE 命令

    • 使用 ALTER DATABASE RENAME FILE 命令更新控制文件中记录的重做日志文件路径。
    • 示例:
      ALTER DATABASE RENAME FILE '/old_location/redo01.log' TO '/new_location/redo01.log';
      
  5. 打开数据库

    • 最后,打开数据库,使其进入正常运行状态。
    • 命令:
      ALTER DATABASE OPEN;
      

为什么要这么做?
  • 重新定位:磁盘空间不足或需要更高性能的存储时,可能需要将重做日志文件移动到其他位置。
  • 重命名:文件命名规范改变或需要清晰标识文件时,可能需要对重做日志文件重命名。
  • 恢复或调整配置:例如,发生磁盘故障后,你可能需要重建文件到其他路径。

注意事项:

  • 操作前务必备份数据库,避免因操作错误导致数据丢失。
  • 如果有多个重做日志组,每个文件都需要按照上述步骤进行更新。
  • 如果数据库是 RAC(Real Application Clusters)环境,需在所有节点执行操作。
完整操作

以下是补全的完整步骤,包括每个步骤的命令,以便重新定位或重命名 Oracle 数据库的在线重做日志文件


完整操作步骤

1. 关闭数据库

关闭数据库,确保没有会话在使用数据库资源。

SHUTDOWN IMMEDIATE;

2. 将在线重做日志文件复制到新位置或重命名

使用操作系统命令,将重做日志文件移动到目标位置或重命名文件。

例如,在 Linux/UNIX 系统上:

mv /old_location/redo01.log /new_location/redo01.log
mv /old_location/redo02.log /new_location/redo02.log

3. 将数据库置于 MOUNT 模式

启动数据库到 MOUNT 模式,允许访问控制文件,但不打开数据文件。

STARTUP MOUNT;

4. 执行 ALTER DATABASE RENAME FILE 命令

使用 ALTER DATABASE RENAME FILE 命令,将控制文件中记录的在线重做日志文件路径更新为新路径。

对于每个重做日志文件,执行如下命令:

ALTER DATABASE RENAME FILE '/old_location/redo01.log' TO '/new_location/redo01.log';
ALTER DATABASE RENAME FILE '/old_location/redo02.log' TO '/new_location/redo02.log';

5. 打开数据库

完成重做日志文件更新后,打开数据库恢复正常运行。

ALTER DATABASE OPEN;

完整示例

假设需要将 /u01/app/oracle/oradata/old_logs/redo01.log/u01/app/oracle/oradata/old_logs/redo02.log 重定位到 /u02/app/oracle/oradata/new_logs/,以下是完整操作:

-- 1. 关闭数据库
SHUTDOWN IMMEDIATE;

-- 2. 使用操作系统命令移动文件
-- 在终端执行:
mv /u01/app/oracle/oradata/old_logs/redo01.log /u02/app/oracle/oradata/new_logs/redo01.log
mv /u01/app/oracle/oradata/old_logs/redo02.log /u02/app/oracle/oradata/new_logs/redo02.log

-- 3. 启动数据库到 MOUNT 模式
STARTUP MOUNT;

-- 4. 更新控制文件中的重做日志文件路径
ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/old_logs/redo01.log' 
                          TO '/u02/app/oracle/oradata/new_logs/redo01.log';
ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/old_logs/redo02.log' 
                          TO '/u02/app/oracle/oradata/new_logs/redo02.log';

-- 5. 打开数据库
ALTER DATABASE OPEN;

注意事项
  1. 备份数据库:在操作前备份控制文件和数据库,避免意外损坏。
  2. 多日志组:如果有多个重做日志文件组,请逐个更新路径。
  3. 权限问题:确保新的目标位置有适当的读写权限。
  4. 检查重做日志状态:在更新后,可以通过以下命令验证重做日志路径是否正确:
    SELECT GROUP#, MEMBER FROM V$LOGFILE;
    

在线重做日志多路复用

上述内容描述了**在线重做日志文件(Online Redo Log Files)**的多路复用和存储布局策略,以及它们在数据库中的重要性和优化方式。下面分步骤解释,并结合实例帮助理解:


什么是在线重做日志文件?

  1. 功能

    • 在线重做日志文件用于记录数据库的所有更改操作(事务日志)。
    • 它们是 Oracle 数据库事务恢复的重要组件。如果系统崩溃,可以通过这些日志恢复未提交的事务或回滚未完成的更改。
  2. 多路复用(Multiplexing)

    • 多路复用指的是每个重做日志组有多个成员,每个成员是相同日志内容的副本。
    • 目的:提供冗余。如果一个磁盘或成员发生故障,另一个成员仍然可以保障日志的写入和事务的持续性。

问题背景

  1. 磁盘故障的影响

    • 如果某个磁盘故障导致重做日志成员不可用,而没有多路复用,就会导致事务中断。
    • 通过多路复用,即使单个成员不可用,数据库实例仍然可以正常运行,因为其他成员继续接受写操作。
  2. 性能瓶颈:LGWR 与 ARCn 的争用

    • LGWR(日志写入器)后台进程负责写入重做日志文件。
    • ARCn(归档进程)后台进程负责将重做日志归档到目标位置。
    • 如果 LGWR 和 ARCn 在同一个磁盘上读写,会产生磁盘 I/O 争用,导致性能下降。

优化策略

  1. 多路重做日志文件的分布

    • 将一个组的多个成员放置在不同的物理磁盘上。
    • 这样,即使一个磁盘发生故障,LGWR 仍然可以写入组中其他成员。
  2. 归档目标的优化

    • 如果启用了归档日志模式(ARCHIVELOG),建议将归档目标(归档文件存储位置)放置在专用磁盘上。
    • 避免 LGWR 写成员和 ARCn 读成员同时争用同一个磁盘。
  3. 数据文件和重做日志分离

    • 数据文件和重做日志文件分布在不同的磁盘上。
    • 这样,写入数据块的操作(DBWR)和写入重做记录的操作(LGWR)不会在同一磁盘上发生争用。

实际设计建议

假设场景:
  • 有两个重做日志组,每组有两个成员。
  • 归档目标存储在专用磁盘上。
  • 数据文件与重做日志分布在不同磁盘上。
磁盘分布:
磁盘编号文件类型描述
磁盘 1redo01.log (成员1)第一组的第一个成员
磁盘 2redo01.log (成员2)第一组的第二个成员
磁盘 3redo02.log (成员1)第二组的第一个成员
磁盘 4redo02.log (成员2)第二组的第二个成员
磁盘 5归档日志归档目标,专用于归档日志存储
磁盘 6数据文件存储数据库表空间和其他数据块文件

配置命令

创建多路重做日志文件:

假设要创建两组重做日志文件,每组有两个成员,命令如下:

ALTER DATABASE ADD LOGFILE GROUP 1 
('/disk1/redo01.log', '/disk2/redo01.log') SIZE 50M;

ALTER DATABASE ADD LOGFILE GROUP 2 
('/disk3/redo02.log', '/disk4/redo02.log') SIZE 50M;
设置归档目标:

归档目标应设置在专用磁盘上,例如 /disk5/archived_logs

ALTER SYSTEM SET LOG_ARCHIVE_DEST='/disk5/archived_logs';

总结
  1. 多路复用目的
    • 增强数据冗余,避免单点磁盘故障导致数据库宕机。
  2. 分布设计优化性能
    • 重做日志文件的成员分散到不同磁盘,避免 I/O 争用。
    • 归档目标放置在专用磁盘上,避免 LGWR 和 ARCn 并发操作的争用。
    • 数据文件与重做日志文件分离,减少 DBWR 和 LGWR 之间的冲突。

在线重做日志文件的介绍

Oracle 的在线重做日志文件(Online Redo Log Files) 是 Oracle 数据库日志机制的重要组成部分,其主要职责是记录数据库中所有的更改操作。这些日志用于保障数据的可靠性和可恢复性。以下是在线重做日志文件的详细工作机制:


1. 在线重做日志文件的角色与功能

主要功能:
  1. 事务的持久性

    • 在事务提交时,所有事务更改都会被写入在线重做日志文件,确保在系统崩溃或故障后可以恢复这些事务。
  2. 数据恢复

    • 如果数据库崩溃,Oracle 使用在线重做日志文件中的记录重建未完成的事务。
  3. 备份一致性

    • 在恢复或回滚到某个时间点时,在线重做日志文件提供了所有更改的日志记录。

2. 工作机制

日志组与成员
  • 日志组(Log Groups)
    • Oracle 数据库的在线重做日志文件组织成多个组,每个组代表一个日志的逻辑集合。
  • 日志成员(Log Members)
    • 每个组可以包含一个或多个日志成员,存储在不同的物理磁盘上,用于提高数据冗余。
    • 所有成员存储相同的日志内容。
日志循环写入

Oracle 的重做日志文件以循环方式使用:

  1. 日志写入器进程(LGWR)

    • LGWR 是 Oracle 的后台进程,负责将重做日志缓冲区(Redo Log Buffer)中的内容写入在线重做日志文件。
    • 写入的时间点包括:
      • 事务提交时。
      • 重做日志缓冲区快满时。
      • 数据库检查点发生时。
      • 数据库关闭时。
  2. 日志组切换(Log Switch)

    • 当当前使用的日志组写满时,Oracle 自动切换到下一个日志组。
    • 如果启用了归档日志模式(ARCHIVELOG),切换时,归档进程(ARCn)会将已填满的日志文件复制到归档存储。
重做日志缓冲区
  • **重做日志缓冲区(Redo Log Buffer)**位于内存中,记录数据库的更改操作。
  • 在事务提交时或缓冲区快满时,LGWR 将缓冲区的内容刷入在线重做日志文件。

3. 在线重做日志的关键过程

  1. 写入流程

    • 用户执行事务(如 INSERTUPDATEDELETE)。
    • Oracle 将事务的更改写入内存中的重做日志缓冲区。
    • LGWR 将重做日志缓冲区的内容写入在线重做日志文件。
  2. 事务提交

    • 当事务提交时,Oracle 强制 LGWR 将相关重做日志立即写入磁盘,确保事务的持久性。
  3. 日志切换

    • 当前日志组写满后,Oracle 切换到下一个日志组。如果启用了归档日志模式,归档进程将当前日志组复制到归档存储。
  4. 日志回收

    • 当所有日志组都写满且未被归档时,数据库可能会暂停写操作,等待归档完成(ARCHIVELOG 模式)。

4. 常见的配置与优化

日志文件大小
  • 日志文件过小:频繁的日志切换可能导致性能下降。
  • 日志文件过大:日志切换变慢,延迟归档和检查点操作。
  • 一般建议:根据事务量调整日志文件大小。
多路复用(Multiplexing)
  • 配置每个日志组有多个成员,分布在不同的磁盘上,避免单点故障。
  • 命令示例:
    ALTER DATABASE ADD LOGFILE GROUP 1 ('/disk1/redo01.log', '/disk2/redo01.log') SIZE 50M;
    
日志组数量
  • 至少需要两个日志组,推荐 3 个或更多,确保切换时总有可用的日志组。
归档模式(ARCHIVELOG)
  • 在归档模式下,填满的日志组会被归档,支持完整的数据恢复。

5. 故障情况下的作用

  • 实例恢复
    • 在实例故障后,Oracle 使用重做日志文件中的信息将未提交的事务回滚,并应用未写入数据文件的已提交事务。
  • 介质恢复
    • 在归档模式下,结合归档日志文件和备份,可以恢复到任意时间点。

6. 日志文件相关的动态视图

  • 查看当前的日志文件及其状态:

    SELECT GROUP#, STATUS, MEMBER FROM V$LOGFILE;
    
  • 查看日志组的使用情况:

    SELECT GROUP#, SEQUENCE#, STATUS FROM V$LOG;
    

总结

Oracle 在线重做日志文件是数据库的核心组件之一,其主要作用是记录所有更改操作,保障数据的持久性和可恢复性。通过循环写入、日志切换、多路复用等机制,Oracle 确保了日志的高效写入和事务的完整性。在实际操作中,合理配置日志文件的数量、大小和存储位置是提高数据库性能与稳定性的关键。

重做线程

重做线程(Redo Thread) 是 Oracle 数据库中与 实例(Instance) 一一对应的概念,用于管理该实例生成的 在线重做日志文件。它在单实例和多实例环境中有不同的应用场景。
什么是重做线程?

当涉及多个数据库实例时,每个数据库实例的重做日志也被称为一个重做线程。在典型配置中,只有一个数据库实例访问Oracle数据库,因此只有一个线程存在。然而,在Oracle真实应用集群环境中,两个或多个实例并发访问一个数据库,每个实例都有自己的重做线程。每个实例单独的重做线程避免了对一组重做日志文件的争用,从而消除了潜在的性能瓶颈。


1. 什么是重做线程?

  • 定义
    重做线程是与 Oracle 数据库的某个实例相关联的一组重做日志文件。

  • 作用
    用于记录该实例的所有事务操作的重做日志信息,保障每个实例的日志写入独立,避免实例之间的冲突。


2. 单实例与多实例的重做线程

单实例数据库
  • 在典型的单实例 Oracle 数据库中,只有一个重做线程。
  • 该线程管理数据库实例的在线重做日志组,没有竞争或共享的情况。
多实例数据库(RAC 环境)
  • 在 Oracle 真实应用集群(Real Application Clusters, RAC) 环境中,多个实例同时访问同一个数据库。
  • 每个实例都有独立的重做线程和一组在线重做日志文件。
  • 每个实例的事务操作写入其专属的重做日志组,避免了不同实例之间的日志写入争用。

示例

  • RAC 环境有 3 个实例(Instance1Instance2Instance3)。
  • 每个实例对应一个重做线程(Thread 1Thread 2Thread 3)。
  • 每个线程管理属于该实例的一组重做日志文件。

3. 重做线程的优势

避免性能瓶颈
  • 如果所有实例共享一个重做日志文件组,多个实例在写日志时会争用 I/O 资源,导致性能下降。
  • 独立的重做线程确保每个实例拥有自己的日志组,不会干扰其他实例的写操作。
日志的独立性和故障隔离
  • 每个实例的事务日志独立于其他实例,即使某个实例发生故障,其他实例仍然可以正常运行。
支持并发和扩展
  • 随着 RAC 集群中的实例数量增加,每个实例通过自己的重做线程独立生成和管理重做日志,确保集群性能线性扩展。

4. 重做线程的组成

一个重做线程包括:

  1. 重做日志组(Redo Log Groups)

    • 每个线程由多个重做日志组组成,每个组至少包含一个成员(文件)。
    • 日志组在同一个线程中循环使用。
  2. 日志成员(Log Members)

    • 每个日志组可以有多个成员,提供数据冗余。

5. 如何管理重做线程?

创建额外的重做线程(RAC 环境)

在 RAC 环境中,必须为每个实例分配自己的重做线程。以下是为实例创建新的重做线程的步骤:

-- 启用新线程(线程 2)
ALTER DATABASE ENABLE PUBLIC THREAD 2;

-- 为线程 2 添加日志文件组
ALTER DATABASE ADD LOGFILE THREAD 2
('/disk2/thread2_redo01.log', '/disk3/thread2_redo01.log') SIZE 50M REUSE;

ALTER DATABASE ADD LOGFILE THREAD 2
('/disk2/thread2_redo02.log', '/disk3/thread2_redo02.log') SIZE 50M REUSE;

-- 分配线程给实例
ALTER SYSTEM SET THREAD=2 SCOPE=SPFILE;
检查线程分配

可以通过动态性能视图 V$THREAD 查看线程的配置信息:

SELECT THREAD#, ENABLED, INSTANCE FROM V$THREAD;

6. 线程切换

在 RAC 环境中:

  • 每个实例在启动时,使用其指定的重做线程。
  • 实例关闭时,其重做线程会被禁用,直到实例重新启动。

7. 应用场景

单实例环境
  • 默认情况下,单实例数据库只使用一个重做线程(Thread 1)。
多实例环境(RAC)
  • 每个实例都有独立的线程和重做日志组,确保高性能和独立性。

8. 总结

  • 重做线程的意义
    • 与实例一一对应,管理该实例的在线重做日志文件。
  • 单实例 vs. 多实例
    • 单实例数据库只有一个线程,多实例数据库(RAC)中,每个实例都有自己的重做线程。
  • 性能优化
    • 独立的重做线程消除了多个实例争用日志的性能瓶颈。
  • 典型用途
    • 适用于 RAC 集群中多个实例并发访问同一个数据库的场景。

重做线程的概念

在RAC系统中,每个实例都必须有自己的重做日志组。一个实例的重做日志文件组统称为一个"线程”,或者更恰当地说,一个"重做日志线程”。
每个实例都有自己的重做线程。重做日志组以真正的循环方式工作;当一个日志填满时,另一个重做日志记录重做条目。在独立实例中,只有一个线程。在RAC系统中,通常具有与实例一样多的线程。线程号标识每个线程。线程可以有不同数量的重做组,但每个组必须至少有两个成员。

重做线程(Redo Thread) 是 Oracle 数据库中一组与实例关联的重做日志文件组,负责记录该实例产生的所有事务更改。在 Oracle RAC(Real Application Clusters)环境中,每个实例都有自己的重做线程,以保证多实例之间的日志操作独立性。以下是详细概念和特点:


1. 重做线程的基本概念

  • 重做线程定义

    • 一个实例的所有重做日志文件组(Redo Log Groups)的集合,被称为一个 “重做线程”。
    • 每个实例在运行时使用自己的重做线程来记录事务的重做条目。
  • 线程数量

    • 单实例环境:只有一个实例,只有一个线程。
    • RAC 环境:多个实例共享一个数据库,每个实例有自己的线程。通常线程数等于实例数。

2. 工作机制

  1. 重做日志的循环使用

    • 一个线程中的重做日志文件组以循环方式工作。当一个日志组填满时,线程自动切换到下一个日志组。
    • 例如:线程 1 使用组 1 -> 组 2 -> 组 3,循环写入。
  2. 日志组的多成员机制

    • 每个日志组至少包含两个成员(Log Members),分布在不同的磁盘上,提供冗余和容错能力。
  3. 独立性

    • 在 RAC 环境中,每个线程的重做日志完全独立,避免了实例之间对重做日志的竞争。
    • 线程的独立性还确保了一个实例的故障不会影响其他实例。

3. 线程标识

  • 每个线程有一个唯一的 线程号(Thread Number),用于区分属于不同实例的重做线程。
  • 在单实例环境中,线程号通常为 1。
  • 在 RAC 环境中,每个实例有自己的线程号,例如:
    • 实例 1 -> 线程 1
    • 实例 2 -> 线程 2
    • 实例 3 -> 线程 3

4. 配置与管理

单实例
  • 单实例默认只有一个线程,无需特别配置。
  • 使用默认的线程号 1 和一组重做日志文件。
RAC 环境
  • 每个实例需要独立配置自己的重做线程。
  • 配置步骤:
    1. 启用线程
      ALTER DATABASE ENABLE PUBLIC THREAD 2;
      
    2. 为线程添加日志文件组
      ALTER DATABASE ADD LOGFILE THREAD 2 
      ('/disk1/redo2_01.log', '/disk2/redo2_01.log') SIZE 50M;
      
    3. 为线程分配实例
      ALTER SYSTEM SET THREAD=2 SCOPE=SPFILE;
      

5. 动态视图查看重做线程信息

  • 查看所有线程:
    SELECT THREAD#, ENABLED, INSTANCE FROM V$THREAD;
    
  • 查看线程的日志文件组:
    SELECT THREAD#, GROUP#, MEMBER FROM V$LOGFILE;
    

6. 图示化示例

假设在 RAC 环境中有两个实例:

实例线程号重做日志组日志成员
实例 1Thread 1Group 1, Group 2/disk1/redo1_01.log, /disk2/redo1_02.log
实例 2Thread 2Group 3, Group 4/disk3/redo2_01.log, /disk4/redo2_02.log
  • 每个实例的日志独立存储。
  • 日志组在各自线程中循环切换使用。

7. 优势

  1. 性能优化
    • 每个实例拥有独立的日志线程,避免了多实例对日志的写入争用。
  2. 故障隔离
    • 一个实例故障时,其线程独立,不影响其他实例的正常运行。
  3. 扩展性
    • 增加实例时可以直接添加新的线程,每个线程有自己的重做日志文件组。

总结

在 Oracle 数据库中,重做线程是实例与重做日志之间的桥梁。它为每个实例提供独立的重做日志文件组,确保性能和数据的可靠性。特别是在 RAC 环境中,重做线程的独立性是保证多实例高效运行的重要机制。



归档重做日志文件

您提供的图片描述了 归档重做日志文件(Archived Redo Log Files) 的概念,以及数据库以 ARCHIVELOG 模式运行的优点。以下是内容的详细说明:

归档重做日志文件(Archived Redo Log Files)

  • 在线重做日志文件(Online Redo Log Files) 写满后,如果数据库运行在 ARCHIVELOG 模式下,Oracle 会将这些日志文件复制到一个归档位置(即归档重做日志文件)。
  • 归档日志的存在保障了数据库的可恢复性和备份的一致性。

ARCHIVELOG 模式的两大优势

  1. 恢复能力(Recovery)

    • 数据库备份结合 在线重做日志文件归档重做日志文件,可以恢复所有已提交的事务。
    • 即使数据文件丢失或损坏,也能通过归档日志进行完全恢复。
  2. 在线备份(Backup)

    • 在 ARCHIVELOG 模式下,数据库可以在打开(open)状态下执行备份操作,不需要关闭数据库,保障了系统的高可用性。

数据库默认模式

  • 默认情况下,数据库创建时处于 NOARCHIVELOG 模式
  • 在 NOARCHIVELOG 模式下,在线重做日志文件不会被归档,填满后直接被覆盖,无法用于灾难恢复。

ARCHIVELOG 模式的启用

1. 检查当前模式:
ARCHIVE LOG LIST;
2. 将数据库切换到 ARCHIVELOG 模式:
-- 关闭数据库
SHUTDOWN IMMEDIATE;

-- 启动到 MOUNT 模式
STARTUP MOUNT;

-- 切换到 ARCHIVELOG 模式
ALTER DATABASE ARCHIVELOG;

-- 打开数据库
ALTER DATABASE OPEN;
3. 配置归档日志存储位置:
ALTER SYSTEM SET LOG_ARCHIVE_DEST='/path_to_archive_logs';

总结

  • ARCHIVELOG 模式适用于需要高可用性和强数据恢复能力的生产环境。
  • 默认 NOARCHIVELOG 模式适合测试环境,但存在数据丢失风险。
  • 启用 ARCHIVELOG 模式后,可以实现在线备份事务级别恢复的能力。
;