Oracle联机重做日志文件

时间:2021-07-06 21:59:25

一、Oracle中的几类日志文件

Redo log files —->联机重做日志
Archive log files —->归档日志
Alert log files —->告警日志
Trace files —->跟踪日志
User_dump_dest —->用户跟踪日志
Backupground_dump_dest —->进程跟踪日志

二、联机重做日志的规划管理
1.联机重做日志
记录了数据的所有变化(DML,DDL或管理员对数据所做的结构性更改等)
提供了恢复机制(对以外删除宕机利用日志文件实现数据恢复)
可以被分组管理

2.联机重做日志组
由一个或多个相同的联机日志文件组成一个联机重做日志组
至少两个日志组,每组至少一个成员
由LGWR后台进程同时将日志内容写入到一个组的所有成员
PS:LGWR的触发条件
在事务提交的时候
Redo Log Buffer 三分之一满
Redo Log Buffer 多于1M的变化记录

3.联机重做日志成员
重做日志组内的每一个联机日志文件称为一个成员
一个组内的每一个成员具有相同的日志序列号(log sequence number),且成员的大小相同
每次日志切换时,Oracle服务器分配一个新的LSN号给即将写入日志的日志文件组
LSN号用于唯一区分每一个联机日志组和归档日志
处于归档模式的联机日志,LSN号在归档时也被写入到归档日志之中

4.日志文件的工作方式
日志文件采用按顺序循环写的方式
当一组联机日志组写满,LGWR则将日志写入到下一组,当最后一组写满则从第一组开始写入
写入下一组的过程称为日志切换
切换时发生检查点过程

5.联机日志文件的规划
分散放开,多路复用
日志所在的磁盘应当具有较高的I/O
一般日志组大小应满足自动切换间隔至少15-20分钟左右业务需求
建议使用rdo结尾的日志文件名,避免误删日志文件。如redo01.rdo,redo02.rdo

6.日志切换和检查点切换
ALTER SYSTEM SWITCH LOGFILE

7.添加日志文件组

    ALTER DATABASE ADD LOGFILE [GROUP n]
('$ORACLE_BASE/oradata/orcl/redo01.rdo',
'$ORACLE_BASE/oradata/orcl/redo02.rdo')
SIZE nM;

8.添加日志成员

    ALTER DATABASE ADD LOGFILE MEMBER
'$ORACLE_BASE/oradata/orcl/redo01.rdo' TO GROUP 1,
'$ORACLE_BASE/oradata/orcl/redo02.rdo' TO GROUP 2;

9.删除日志成员
不能删除组内的唯一一个成员
不能删除处于active 和current 状态组内的成员
删除处于active 和current 状态组内的成员,应使用日志切换使其处于INACTIVE状态后再删除
对于组内如果一个成员为NULL 值,一个为INVALID,且组处入INACTIVE,仅能删除INVALID状态成员
删除日志成员,物理文件并没有真正删除,需要手动删除
删除日志文件后,控制文件被更新
对于处于归档模式下的数据库,删除成员时确保日志已被归档,查看v$log视图获得归档信息

    ALTER DATABASE DROP LOGFILE MEMBER '$ORACLE_BASE/oradata/orcl/redo01.rdo'

11.日志的重命名

CURRENT状态组内的成员不能被重命名
建议该行为之前备份数据库
重命名或重定位之后建议立即备份控制文件
重定位及重命名的两种方法
添加一个新成员到日志组,然后删除一个旧的成员
使用ALTER DATABASE RENAME FILE 命令(不区分归档与非归档模式)
复制联机日志文件到新路径:

ho cp 'oldfile' 'newfile'

执行

ALTER DATABASE RENAME FILE 'oldfile' TO 'newfile'

对于处于CURRENT状态的需要改名且不切换的情况下
办法是切换到MOUNT状态下再执行上述操作

12.清空日志文件组

    ALTER DATABASE CLEAR LOGIFLE GROUP n
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP n

13.日志的监视
查看日志视图中的物理日志文件是否存在、位置、大小等

        SELECT 'ho cp '||member FROM v$logfile;

查看日志文件所处的磁盘空间是否足够

        SQL> ho df -h

查看组内是否存在多个成员,如为单一成员应考虑增加日志成员
日志切换的间隔时间,应满足15-20分钟业务需求,如果切换间隔很短,应当增加日志文件的大小
增加方法:先删除日志组,再重建该组(对于current和active的需要切换再做处理)

查看切换时间间隔

SELECT TO_CHAR(first_time,'yyyy-mm-dd hh24:mi:ss'),group# FROM v$log;

15.日志的异常处理
不一致的情况(启动时)

   ALTER DATABASE CLEAR LOGFILE GROUP n
ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP n

使用隐藏参数来解决(使用完记得删除隐藏参数)
步骤:

        alter system set "_allow_resetlogs_corruption" = true scope = spfile;

recover database using bakcup controlfile;

alter database open resetlogs;

shutdown immediate;

startup mount;

alter database open resetlogs;

alter system reset "_allow_resetlogs_corruption" scope = spfile sid = '*'

三、与日志有关的动态性能视图

    V$LOG
V$LOGFILE

V$LOG中STATUS的状态值

        UNUSED: 从未对该联机日志写入任何内容,一般为新增加联机日志文件或是使用resetlog后的状态
CURRENT:当前重做日志文件,表示该重做日志文件为活动状态,能够被打开和关闭
ACTIVE:处于活动状态,不属于当前日志,崩溃恢复需要该状态,可用于块恢复,可能归档,也可能未归档
CLEARING:表示在执行alter database clear logfile命令后正将该日志重建为一个空日志,重建后状态变为unused
CLEARING_CURRENT:当前日志处于关闭线程的清除状态。如日志某些故障或写入新日志标头时发生I/O错误
INACTIVE:实例恢复不在需要联机重做文件日志组,可能归档也可能未归档

V$LOGFILE中STATUS的状态值

        INVALID :表明该文件不可访问
STALE :表明文件内容不完全
DELETED : 表明该文件不再使用
NULL :表明文件正在使用

本人写博客主要为了对学习的知识点的巩固,若文中有什么不足的地方欢迎提出!