如果将素有脏缓冲区都写入磁盘,就会出现完整检查点。在常规运行中,缓存中可能存在一百万个脏缓冲区,但对于增量检查点,DBWn只写入其中的数百条。而对于完整检查点,它将写入这些内容。为此,必须完成大量的工作:在执行检查点时,需要非常高的CPU使用率和磁盘使用率,用户会话的性能会随之降低。完整检查点会对业务产生负面影响。鉴于此,只有在两种情况下才执行完整检查点,第一种情况是有序关闭,第二种情况是DBA要求这么做。
当使用NORMAL、IMMEDIATE或TRANSACTIONAL选项关闭数据库时,都会执行检查点:在关闭和卸载数据库之前,DBWn会将所有的脏缓冲区刷新到磁盘中。这意味着,再次打开数据库时,不需要执行任何���复操作。在执行某些操作(如启用归档日志模式)前,始终希望(也有必要)执行干净关闭。使用以下命令,可以在任何时间发出完整检查点信号:
alter system check point;
对于某些操作而言,局部检查点是必须的,并会自动执行。局部检查点影响的缓冲区因操作而异:
操作 从缓存中刷新哪些缓存区使表空间脱机 表空间中的所有块
使数据文件脱机 数据文件中的所有块
删除区间 区间中的所有块
截断表 表中的所有块
将表空间置于备份模式 表空间中的所有块
用RMAN备份数据文件 数据文件中的所有块
只有在执行有序关闭或发出请求时,以及应DBA请求时才会执行完整检查点。而局部检查点将根据需要自动执行。
保护联机重做日志文件
Oracle数据库运行时至少需要两个联机重做日志文件组, 从而能够在两个组之间进行切换。考虑到性能因素,可能需要添加更多的联机重做日志文件组,但两组是必需的。每个组都由一个或多个成员组成,这些成员是物理文件。运行Oracle数据库只要求每个组有一个成员,但是为了安全起见,每个组至少都应当具有两个成员。
DBA不允许丢失当前联机日志文件组的所有备份。如果出现这种情况,就会丢失数据。在丢失当前联机日志文件组的素有成员时,不丢失数据的唯一方法是,配置一个无数据 损失的Data Guard环境,不过比较复杂。为什么说不丢失但钱联机日志文件组的所有成员直观重要呢?答案与实例恢复有关。实例崩溃后,SMON进程会使用当前联机日志文件组的内容进行前滚恢复,从而修复数据库中的任何损坏。如果当前联机日志文件组不可同,可能是由于未被多路复用,一个成员因介质受损而被破坏,那么SMON进程无法进行前滚恢复。如果SMON进程无法通过前滚修正数据库的损坏,那么不能打开数据库。
如果重做日志文件组的一个成员被损坏或丢失,那么数据库在存在备份成员的情况下,仍然会保持打开状态。这与控制文件不同,控制文件任何副本的损坏都会使数据库立即崩溃。同样,只要存在至少两个重做日志文件组,每个组都至少有一个有效的成员,那么在数据库打开时,也可以添加或移动重做日志文件组以及组中的成员。
在打开数据库时,无须停机,联机重做日志就可以重新配置,而数据库在非加载模式下或完全关闭时,才能执行控制文件中的操作。
V$LOG视图给每个组显示一行,V$LOGFILE视图给每个日志文件成员显示一行。
SYS@ prod>select group#,sequence#,members,status from v$log;
GROUP# SEQUENCE# MEMBERS STATUS
---------- ---------- ---------- ----------------
1 10 1 CURRENT
2 8 1 INACTIVE
3 9 1 INACTIVE
SYS@ prod>select group#,status,member from v$logfile;
GROUP# STATUS MEMBER
---------- ------- ------------------------------
3 /u01/oradata/prod/redo03.log
2 /u01/oradata/prod/redo02.log
1 /u01/oradata/prod/redo01.log
SYS@ prod>alter system switch logfile;
System altered.
SYS@ prod>select group#,sequence#,members,status from v$log;
GROUP# SEQUENCE# MEMBERS STATUS
---------- ---------- ---------- ----------------
1 10 1 ACTIVE
2 11 1 CURRENT
3 9 1 INACTIVE
SYS@ prod>