Redo日志文件是Oracle数据库中的非常重要的文件,它记录了对数据库所做的所有更改操作,当事务对数据库进行修改时,Oracle首先将更改写入到REDO日志文件,然后再修改应用到数据文件中。这样可以确保在发生故障时,Oracle可以使用REDO日志来恢复已提交的事务。

  • REDO日志和Archive日志区别

    1. REDO日志:
      REDO日志(也称为在线REDO日志或重做日志)是一组循环使用的文件,用于记录已提交的事务对数据库所做的所有更改。当事务对数据库进行修改时,Oracle首先将更改写入REDO日志文件,然后才将修改应用到数据文件中。REDO日志可用于实例故障恢复和实例恢复。
    2. 归档日志:
      归档日志(也称为归档的REDO日志)是REDO日志的副本,它们包含了数据库在某个时间点之前的所有REDO信息。当REDO日志文件被Oracle实例填满时,如果数据库处于归档模式,Oracle会自动将该REDO日志文件复制到另一个称为”归档日志”的文件中。归档日志可用于介质恢复和不完全恢复。
  • REDO日志和Archive日志关系

    • REDO日志是在线的,用于记录正在进行的数据库更改。
    • 当REDO日志文件被填满时,如果启用了归档模式,Oracle会自动将其复制到归档日志中。
    • 归档日志是REDO日志的历史副本,用于介质恢复(如磁盘失败或损坏)和不完全恢复(如用户错误)。
    • 在数据库恢复过程中,Oracle首先应用归档日志,然后应用未归档的REDO日志(如果有)。
  • 日志查询

    • 查看在线日志

      select l.STATUS, lf.MEMBER from v$log l, v$logfile lf where l.GROUP# = lf.GROUP#;

    • 查询已归档日志

      select recid, stamp, thread#, sequence#, name from v$archived_log;

    • 查看默认归档路径

      show parameter db_recovery_file_dest;

    • REDO文件状态

      1. CURRENT
        • 表示该REDO日志文件是当前正在使用的日志文件。
        • 数据库实例正在向该日志文件写入REDO记录。
        • 在任一时刻只有一个REDO日志文件处于CURRENT状态。
      2. ACTIVE
        • 表示该REDO日志文件没有被使用,可以在日志组切换时被循环使用。
        • ACTIVE状态的日志文件不包含任何需要的REDO记录,可以被安全地覆写。
        • 当需要切换到新的日志组时,Oracle会从ACTIVE状态的日志文件中选择一个作为新的CURRENT日志文件。
      3. INACTIVE
        • 表示该REDO日志文件已经不再是当前日志文件,数据库实例已停止向该日志文件写入新的REDO记录。
        • INACTIVE日志文件需要等待归档(如果启用了归档模式)或覆写(如果没有启用归档模式)。
        • 当该日志文件被归档或覆写后,它将重新变为ACTIVE状态。
      4. INVALIDATED
        • 表示该REDO日志文件已经失效,不能被使用。
        • 这可能是由于日志文件损坏或者其他原因导致的。
        • INVALIDATED状态的日志文件需要被重建。
  • 其他补充

    1. Oracle归档模式

      1. 归档模式查询

        archive log list;

        select log_mode from v$database;

      2. 归档模式修改

        开启

        SQL> shutdown immediate;

        SQL> startup mount

        SQL> alter database archivelog;

        SQL> alter database open;

        SQL> archive log list;

        关闭

        SQL> shutdown immediate;

        SQL> startup mount

        SQL> alter database noarchivelog;

        SQL> alter database open;

    2. REDO刷入时机

      在Oracle数据库中,REDO日志的写入和事务提交遵循以下顺序:

      1. 事务开始时,更改会首先在内存中的REDO日志缓冲区中记录下来。
      2. 当事务执行DML操作(如INSERT、UPDATE、DELETE)时,相应的REDO记录会立即写入REDO日志缓冲区中。
      3. 当事务准备提交时,Oracle会强制将REDO日志缓冲区中所有未持久化的REDO记录写入当前REDO日志文件中。这个过程称为”日志切换”。
      4. 日志切换完成后,Oracle会将事务修改后的数据文件块写入数据文件。
      5. 最后,Oracle会将事务状态标记为已提交,该过程包括生成一个COMMIT记录并将其写入REDO日志文件。

      总的来说,写入REDO日志的顺序是:

      1. 更新REDO日志缓冲区
      2. 写入REDO日志文件(日志切换)
      3. 写入数据文件
      4. 记录COMMIT记录到REDO日志文件

      这种先写REDO日志,后写数据文件的方式被称为”写前日志记录(Write-Ahead Logging, WAL)”。它确保了在任何时候,REDO日志中都包含了足够的信息来重做已提交的修改,从而保证了数据库的可恢复性。

      如果在写入数据文件之前发生了实例崩溃,Oracle可以使用REDO日志来恢复所有已提交的事务。但如果在写入REDO日志之前发生崩溃,则这些未提交的事务将会自动回滚。

      通过这种方式,Oracle既确保了已提交事务的持久性,又避免了部分提交的数据导致数据库不一致的问题。

    3. REDO和UNDO区别

      1. REDO日志:
        • REDO日志用于记录对数据库所做的所有永久性更改,如INSERT、UPDATE、DELETE等。
        • 当事务对数据库进行修改时,Oracle首先将更改写入REDO日志文件,然后再将修改应用到数据文件中。
        • REDO日志的主要作用是用于数据库恢复,如实例故障恢复和介质恢复。在发生故障后,Oracle可以使用REDO日志来重新应用已提交的事务。
        • REDO日志是循环使用的,旧的REDO日志会被覆盖或者归档。
      2. UNDO数据:
        • UNDO数据用于维护读一致性和回滚未提交的事务。
        • 当事务对数据库进行修改时,Oracle会在UNDO段中保存原始数据的副本,以便在事务回滚时能够恢复到原始状态。
        • UNDO数据还用于提供读一致性视图,允许其他事务在未提交的事务修改数据时仍能看到原始数据。
        • UNDO数据存储在UNDO表空间中,并且是只写入的,不会被覆盖。

      总的来说,REDO日志和UNDO数据有以下区别:

      1. 作用不同:REDO用于恢复已提交的事务,而UNDO用于回滚未提交的事务和维护读一致性。
      2. 存储位置不同:REDO日志存储在REDO日志文件中,而UNDO数据存储在UNDO表空间中。
      3. 数据写入方式不同:REDO日志是循环写入的,而UNDO数据是只写入的。
    4. REDO日志管理和维护

      1. REDO日志文件组

        • REDO日志文件通常被划分为多个日志文件组。
        • 每个日志文件组至少包含一个REDO日志文件成员。
        • 通过增加日志文件组的数量和每个组中成员的数量,可以提高REDO日志的写入性能。
      2. REDO日志文件大小

        • REDO日志文件的大小会影响REDO日志的切换频率。
        • 太小的日志文件会导致频繁切换,增加系统开销。太大的日志文件则会增加故障恢复时间。
        • 适当调整REDO日志文件大小对系统性能和恢复时间都很重要。
      3. REDO日志文件监控

        • 使用V$LOG和V$LOG_FILE视图监控REDO日志文件的状态、大小和使用情况。

          V$LOG(提供了有关REDO日志组的信息)

          • GROUP# – 日志组编号

          • THREAD# – 线程编号

          • SEQUENCE# – 日志序列号

          • BYTES – 日志组大小(字节)

          • MEMBERS – 日志组成员数量

          • ARCHIVED – 标识日志组是否已归档

          • STATUS – 日志组当前状态

          V$LOGFILE(提供了有关单个REDO日志文件成员的详细信息)

          • GROUP# – 日志组编号
          • THREAD# – 线程编号
          • SEQUENCE# – 日志序列号
          • MEMBERS – 日志组成员编号
          • BYTES – 日志文件大小(字节)
          • BLOCKSIZE – 日志文件块大小
          • MEMBER – 日志文件成员名称(路径)
          • STATUS – 日志文件当前状态
        • 定期检查是否有INACTIVE状态的日志文件,并及时进行归档或覆写。

        • 监控REDO日志生成速率,判断是否需要增加日志文件组的数量。

      4. 日志切换操作

        • 在高并发场景下,REDO日志可能需要频繁切换。
        • 可以通过ALTER SYSTEM SWITCH LOGFILE语句手动触发日志切换。
        • 还可以设置MAX_LOGFILE_SIZE参数自动触发日志切换。
      5. REDO日志清理

        • 如果REDO日志文件由于损坏或其他原因进入INVALIDATED状态,需要通过重建来清理。
        • 当数据库处于归档模式时,归档的REDO日志文件需要定期删除或备份,以释放磁盘空间。
      6. REDO日志备份

        • 及时备份REDO日志文件对于数据库恢复非常重要。
        • 在发生介质故障时,如果没有可用的REDO日志,将无法进行恢复。
        • 建议将REDO日志文件和数据文件分开存储,并定期备份。