Oracle db 重做日志

来源:互联网 发布:抽风解说 知乎 编辑:程序博客网 时间:2024/05/28 04:52

1.关于重做日志和归档日志

介绍Oracle 数据库重做日志文件和归档日志文件的结构、工作过程以及如何管理重做日志和归档日志。重做日志文件是用于数据库故障恢复的文件,也是Oracle 数据库3 类重要的物理文件之一。

2.重做日志文件

Oracle 作为大型关系数据库管理系统,必须要通过合理的机制确保在任何情况下都不会出现数据丢失,通过合理的配置重做日志可以实现并完成这项任
务。利用重做日志文件,在数据库发生故障时,可以重新处理事务。每个事务在处理的同时也会写入重做日志缓冲区,然后由LGWR 进程写入到重做日志文件,这样,如果发生介质故障,重做日志文件将提供恢复机制。(但也存在例外情况,例如,在启用NOLOGGING 子句的情况下对象中的直接加载插入。)重做日志文件用来在例程失败等情况下恢复尚未写入数据文件的但是已提交的数据。重做日志文件只用于恢复。

在Oracle 当中,事务对数据库所做的修改将以重做记录的形式保存重做日志缓存中。
在提交事务时,由LGWR 进程将缓存中该事务相关的重做记录全部写入重做日志文件,这
时,事务认为已经成功提交。这种机制称为“快速提交”。

3.重做日志结构

重做日志文件具有以下特征:
• 记录对数据所做的所有更改
• 提供恢复机制
• 可以划分成组
• 至少需要两个组

重做日志组是一组相同的重做日志文件副本,LGWR 后台进程向组内所有联机重做日志文件并发写入相同信息,为保证数据库的正常操作,Oracle 服务器最少需要两个联机重做日志文件组。


SQL> SELECT member FROM v$logfile;(可看logfile的位置)


4.日志序列号和日志切换

LGWR 进程将在以下情况下写入:

• 当提交事务处理时(Commit)
• 当重做日志缓冲区被写满三分之一时
• 当重做日志缓冲区内的已更改记录超过1MB 时
• 每隔3 秒
• 在DBWn 将数据库缓冲区高速缓存中修改的块写入数据文件之前


日志切换

LGWR 按顺序向联机重做日志组写入重做信息。一旦当前联机重做日志组被写满,
LGWR 就开始写入下一个组。这称为日志切换(Log Switch)。

当第一个日志组写满后, LGWR 进程自动切换到第二个日
志组,在进行日志切换时,Oracle 服务器完成如下任务:
• 日志序列号自动加1,即当前日志序列号变为57,并且将日志序列号连同SCN 信
息写入到控制文件的日志历史记录中。
• 促使CKPT 进程发出检查点,从而使得后台进程CKPT 将检查点时刻的SCN 信息
写入到控制文件和数据文件头部,并促使后台进程DBWR 将数据高速缓存中的脏
缓冲区写入到数据文件中。
• 当数据库处于ARCHIVELOG 模式时,日志切换还会促使ARCH 进程开始归档。

强制日志切换

ALTER SYSTEM SWITCH LOGFILE。(强制系统进行日志切换,这要求用户必须具有ALTER SYSTEM 系统权限。)

2)显示日志状态
SQL> SELECT GROUP#,SEQUENCE#,MEMBERS,STATUS FROM V$LOG;
GROUP# SEQUENCE# MEMBERS STATUS
---------- ---------- ---------- ----------------
1 306 1 INACTIVE
2 307 1 ACTIVE
3 308 1 CURRENT

由实例可见,数据库工作一共有3 个重做日志组,组号是1、2 和3,每个组有一个成
员。日志切换前,当前日志组为3(状态为CURRENT),对应的最大日志序号为308。

1.生成检查点
检查点(Checkpoint)是一个数据库事件,它用于同步所有数据文件、控制文件以及重做日志文件。当后台进程CKPT 发出检查点时,会执行以下两个任务:
1)后台进程CKPT 会修改控制文件和数据文件头部,并将当前SCN 信息写入到这两种文件中,从而使得数据文件、控制文件和重做日志处于一致状态,这就是为何在执行了SHUTDOWN NORMAL、SHUTDOWN TRANSACTIONAL 和SHUTDOWN IMMEDIATE 之后不需要实例恢复(执行这些操作会发出检点),而执行了SHUTDOWN ABORT(不强制发出检查点)之后需要进行实例恢复的原因。

当启动Oracle 服务器时,后台进程SMON 总是会检查控制文件、数据文件以及重做日志的一致性:
• 如果数据文件、控制文件、重做日志的当前SCN 值完全一致,则系统会直接打开
所有数据文件和重做日志。
• 如果控制文件和数据文件的当前SCN 值完全一致匹配,并小于重做日志的当前SCN,则需要进行实例恢复(例如执行SUHTDOWN ABORT 后)。

(总做日志文件scn大于数据文件和控制文件的scn , 则进行实例恢复)

• 如果控制文件和数据文件的当前SCN 值不匹配,则表示数据文件或控制文件存在
损坏,此时就需要进行介质恢复,以恢复损坏的物理文件。(介质恢复)

2)当后台进程CKPT 工作时,同时会促使后台进程DBWn 开始工作,并且将数据库高速缓存中的脏缓冲区(Dirty Buffer )写入到数据文件中。
检查点可发生在下面情况中:
• 每次日志切换时
• 当使用NORMAL、TRANSACTIONAL、IMMEDIATE 选项关闭例程时
• 通过设置初始化参数FAST_START_MTTR_TARGET 强制执行时
• 数据库管理员通过手动方式请求时
• ALTER TABLESPACE [OFFLINE NORMAL|READ ONLY|BEGIN BACKUP] 命令
导致对特定数据文件执行检查点操作时。

2.强制检查点
假定数据库包含两个日志组,每个日志组尺寸为100MB,并且初始阶段只有在日志切
换时才会发出检查点。假定当前日志组为日志组一,当该日志组写满之后,系统会自动切换
到日志组二,并发出检查点将SCN 信息写入到数据文件和控制文件。如果在日志组二记载
了90MB 事务变化之后,系统出现断电。可以设想一下,数据库还能使用吗?答案是肯定的,
将来在重新启动Oracle Server 时后台进程SMON 会自动执行实例恢复,最终将数据文件、
控制文件、重做日志转变为一致状态。当进行实例恢复时, SMON 首先重新执行事务,然
后打开数据库,最后回退未提交的事务。因为SMON 需要重新执行日志组二所记载的90MB
事务变化,从而会使得实例恢复需要很长时间。为了降低实例恢复时间,必须要增加检查点
次数。

日志切换和检查点操作是在数据库运行中的某些特定点自动执行的,但DBA 可以强制
执行日志切换或检查点操作。强制执行检查点有两种方式:
1)设置FAST_START_MTTR_TARGET(可以设置实例恢复所用时间)
可以在初始化参数文件中设置此参数,代表实例恢复所用时间,单位为秒。例如:设置FAST_START_MTTR_TARGET=300,代表如果数据库需要实例复,那么恢复的时间不超过300 秒。系统会根据300 秒时间自动计算可以保留的脏块的数目,如果超过则自动发出检查点。

2)ALTER SYSTEM CHECKPOINT 命令
必要时,DBA 也可以手动发出检查点命令,命令如下:
ALTER SYSTEM CHECKPOINT.

1.1.4 日志管理策略
要确定一个数据库例程的联机重做日志文件的合适数量,必须测试不同的配置。在规划
重做日志的配置时,需考虑如下几点:
1)重做日志组的个数
在某些情况下,数据库例程可能只需要两个组。在其它情况下,数据库例程可能需要更
多的组以保证各个组始终可供LGWR 进程使用。例如,如果跟踪文件或警告文件中出现如
下消息:Checkpoint not complete 或Redo Log Group not archived,表明LGWR 经常不得不
因为检查点操作尚未完成或者日志组尚未归档而等待,这时就需要添加日志组。

2)重做日志文件的复用
重做日志对于数据库正常运作和维护都是至关重要,因此建议创建复用重做日志文件来
提高重做日志的可靠性。即一个重做日志组中包含多个互为镜像的重做日志成员。复用重做
日志文件后,LGWR 进程将同步写入位于一个重做日志组中的多个成员日志文件,即多个
日志成员是互为镜像的关系,因此,即使由于某个单独的日志文件破坏或丢失,数据库运行
和恢复也不受任何影响。

尽管Oracle 服务器允许多元备份的组可以包含不同数量的成员,但应该尽量建立对称
配置。不对称配置应只是非常情况(如磁盘故障)的临时结果。在这种情况下,必须先创建
新的不同大小的联机重做日志文件组,然后删除旧组。

3)重做日志文件的位置
复用联机重做日志文件时,最好将组内的成员放置在不同磁盘上。这样即使一个日志成
员所在磁盘发生物理损坏,而其它的日志成员至少还有一个是可用,那么数据库实例不会被
中断动行。将归档日志文件和联机重做日志文件分放在不同磁盘上,以减少ARCn 和LGWR
后台进程之间的争用。数据文件和联机重做日志文件应当放置在不同的磁盘上以减少
LGWR 和DBWn 的争用,并降低发生介质故障时同时丢失数据文件和联机重做日志文件的
风险。

4)重做日志文件的大小
联机重做日志文件最小为50 KB,最大文件大小视操作系统而定。假定日志组尺寸很小
(500KB),那么可能会导致日志切换非常频繁,间接地增加检查点次数,从而降低系统性能;
假定日志组尺寸很大(100MB),那么出现意外情况时可能会导致实例恢复的时间很长。Oracle
推荐日志切换时间应该在20—30min 之间,至于到底应该将日志组尺寸设置为多少,还应
该根据实际情况进行反复测试。

另外,如果数据库处于ARCHIVELOG 模式,还应该考虑存放归档日志的存储介质(磁
带或磁盘),以使得存储介质剩余空间最小。例如,假定磁带空间为100MB,并且该磁带只
能存放两个归档日志,那么设置重做日志的尺寸略低于50MB。
下面的情况可能影响联机重做日志文件的配置:
• 日志切换和检查点的数量
• 重做记录的量和个数
• 存储介质的空间量;例如,启用归档时归档文件所在磁盘上的空间量

1.2.1 增加日志组
要创建一个新的联机重做日志文件组,请使用下面的SQL 命令:
ALTER DATABASE [database]
ADD LOGFILE [GROUP integer] filespec
[, [GROUP integer] filespec]...]
可以通过filespec 来指定成员名称和位置。可以选择每个重做日志文件组的GROUP 参
数值。如果省略了该参数,Oracle 服务器自动生成其值。

添加日志组:

alter database add logfile '地址/redo08.log' size 10M; 

添加日志成员:

alter  database add logfile member  '.地址.../redo09.log' TO GROUP 哪个组; 

删除日志成员 (ALTER DATABASE DROP LOGFILE MEMBER ......)
(注意:不能删除组内的唯一一个成员,不能删除处于active 和current 状态组内的成员(如删除需日志切换使其处于INACTIVE状态后再删除)。对于组内如果一个成员为NULL 值,一个为INVALID,且组处入INACTIVE,仅能删除INVALID状态成员,删除日志成员,物理文件并没有真正删除,需要手动删除。)

alter database drop logfile member '/u01/app/oracle/redo05.log';

删除日志组(CURRENT和ACTIVE状态的不能被删除)(ALTER DATABASE DROP LOGFILE GROUP n;)
(注意:一个实例至少需要两个联机日志文件组,活动或当前的日志组不能被删除,组内成员状态有NULL 值或INVALID状态并存,组不可删除,日志组被删除后,物理文件需要手动删除)

alter database drop logfile group 4;

清空日志文件组(只有非active 和非current状态的组才能被清空)

alter database clear logfile group 3;

--group 3被清空后状态变为unused

复制或移动日志成员到目标位置 

ho mv /u01/app/oracle/redo03.log /u01/app/oracle/oradata/orcl/redo04.log

改变控制文件所记载的重做日志指针 (ALTER DATABASE RENAME FILE ... TO ...;)

alter database rename file '/u01/app/oracle/redo03.log' to '/u01/app/oracle/oradata/orcl/redo03.log';

0 0
原创粉丝点击