Redo日志文件是Oracle数据库中的非常重要的文件,它记录了对数据库所做的所有更改操作,当事务对数据库进行修改时,Oracle首先将更改写入到REDO日志文件,然后再修改应用到数据文件中。这样可以确保在发生故障时,Oracle可以使用REDO日志来恢复已提交的事务。
REDO日志和Archive日志区别
- REDO日志:
REDO日志(也称为在线REDO日志或重做日志)是一组循环使用的文件,用于记录已提交的事务对数据库所做的所有更改。当事务对数据库进行修改时,Oracle首先将更改写入REDO日志文件,然后才将修改应用到数据文件中。REDO日志可用于实例故障恢复和实例恢复。- 归档日志:
归档日志(也称为归档的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文件状态
- CURRENT
- 表示该REDO日志文件是当前正在使用的日志文件。
- 数据库实例正在向该日志文件写入REDO记录。
- 在任一时刻只有一个REDO日志文件处于CURRENT状态。
- ACTIVE
- 表示该REDO日志文件没有被使用,可以在日志组切换时被循环使用。
- ACTIVE状态的日志文件不包含任何需要的REDO记录,可以被安全地覆写。
- 当需要切换到新的日志组时,Oracle会从ACTIVE状态的日志文件中选择一个作为新的CURRENT日志文件。
- INACTIVE
- 表示该REDO日志文件已经不再是当前日志文件,数据库实例已停止向该日志文件写入新的REDO记录。
- INACTIVE日志文件需要等待归档(如果启用了归档模式)或覆写(如果没有启用归档模式)。
- 当该日志文件被归档或覆写后,它将重新变为ACTIVE状态。
- INVALIDATED
- 表示该REDO日志文件已经失效,不能被使用。
- 这可能是由于日志文件损坏或者其他原因导致的。
- INVALIDATED状态的日志文件需要被重建。
其他补充
Oracle归档模式
归档模式查询
archive log list;
select log_mode from v$database;
归档模式修改
开启
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;
REDO刷入时机
在Oracle数据库中,REDO日志的写入和事务提交遵循以下顺序:
- 事务开始时,更改会首先在内存中的REDO日志缓冲区中记录下来。
- 当事务执行DML操作(如INSERT、UPDATE、DELETE)时,相应的REDO记录会立即写入REDO日志缓冲区中。
- 当事务准备提交时,Oracle会强制将REDO日志缓冲区中所有未持久化的REDO记录写入当前REDO日志文件中。这个过程称为”日志切换”。
- 日志切换完成后,Oracle会将事务修改后的数据文件块写入数据文件。
- 最后,Oracle会将事务状态标记为已提交,该过程包括生成一个COMMIT记录并将其写入REDO日志文件。
总的来说,写入REDO日志的顺序是:
- 更新REDO日志缓冲区
- 写入REDO日志文件(日志切换)
- 写入数据文件
- 记录COMMIT记录到REDO日志文件
这种先写REDO日志,后写数据文件的方式被称为”写前日志记录(Write-Ahead Logging, WAL)”。它确保了在任何时候,REDO日志中都包含了足够的信息来重做已提交的修改,从而保证了数据库的可恢复性。
如果在写入数据文件之前发生了实例崩溃,Oracle可以使用REDO日志来恢复所有已提交的事务。但如果在写入REDO日志之前发生崩溃,则这些未提交的事务将会自动回滚。
通过这种方式,Oracle既确保了已提交事务的持久性,又避免了部分提交的数据导致数据库不一致的问题。
REDO和UNDO区别
- REDO日志:
- REDO日志用于记录对数据库所做的所有永久性更改,如INSERT、UPDATE、DELETE等。
- 当事务对数据库进行修改时,Oracle首先将更改写入REDO日志文件,然后再将修改应用到数据文件中。
- REDO日志的主要作用是用于数据库恢复,如实例故障恢复和介质恢复。在发生故障后,Oracle可以使用REDO日志来重新应用已提交的事务。
- REDO日志是循环使用的,旧的REDO日志会被覆盖或者归档。
- UNDO数据:
- UNDO数据用于维护读一致性和回滚未提交的事务。
- 当事务对数据库进行修改时,Oracle会在UNDO段中保存原始数据的副本,以便在事务回滚时能够恢复到原始状态。
- UNDO数据还用于提供读一致性视图,允许其他事务在未提交的事务修改数据时仍能看到原始数据。
- UNDO数据存储在UNDO表空间中,并且是只写入的,不会被覆盖。
总的来说,REDO日志和UNDO数据有以下区别:
- 作用不同:REDO用于恢复已提交的事务,而UNDO用于回滚未提交的事务和维护读一致性。
- 存储位置不同:REDO日志存储在REDO日志文件中,而UNDO数据存储在UNDO表空间中。
- 数据写入方式不同:REDO日志是循环写入的,而UNDO数据是只写入的。
REDO日志管理和维护
REDO日志文件组
- REDO日志文件通常被划分为多个日志文件组。
- 每个日志文件组至少包含一个REDO日志文件成员。
- 通过增加日志文件组的数量和每个组中成员的数量,可以提高REDO日志的写入性能。
REDO日志文件大小
- REDO日志文件的大小会影响REDO日志的切换频率。
- 太小的日志文件会导致频繁切换,增加系统开销。太大的日志文件则会增加故障恢复时间。
- 适当调整REDO日志文件大小对系统性能和恢复时间都很重要。
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日志生成速率,判断是否需要增加日志文件组的数量。
日志切换操作
- 在高并发场景下,REDO日志可能需要频繁切换。
- 可以通过ALTER SYSTEM SWITCH LOGFILE语句手动触发日志切换。
- 还可以设置MAX_LOGFILE_SIZE参数自动触发日志切换。
REDO日志清理
- 如果REDO日志文件由于损坏或其他原因进入INVALIDATED状态,需要通过重建来清理。
- 当数据库处于归档模式时,归档的REDO日志文件需要定期删除或备份,以释放磁盘空间。
REDO日志备份
- 及时备份REDO日志文件对于数据库恢复非常重要。
- 在发生介质故障时,如果没有可用的REDO日志,将无法进行恢复。
- 建议将REDO日志文件和数据文件分开存储,并定期备份。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。