为了保证数据 库的最大可恢复性,必须使用多路复用控制文件;必须多路复用联机重做日志,必须以归档日志模式运行数据库并多路复用归档日志文件;最后必须作常规备份。
1.保护控制文件
控制文件用于加载数据库,在数据库打开时,可不断地读和写控制文件。最多可有8个控制文件的多路复用副本。每个生产数据库应有3个控制文件在3个不同的磁盘上。要移动或者添加控制文件副本,首先关闭数据库。在数据库打开时不能进行任何控制文件操作。然后,使用操作系统命令移动或复制控制文件。再接着,编辑CONTROL_FILES参数,指向新位置。如果使用静态的initSID.ora参数文件,则可以用文本编辑器进行编辑。如果使用动态的spfileSID.ora参数文件,则以NOMOUNT模式启动数据库,发出alter system命令并把作用域设置为spfile,数据库在下次加载时将会使用新的副本。最后,打开数据库。下面是在linux上添加控制文件副本的完整例程。除了是操作系统的合法名称外,对于控制文件副本的命名没有任何限制,但应遵守一定的标准。
SQL> show parameters control_files;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /u01/app/oradata/oracle/contro
l01.ctl, /u01/app/oradata/orac
le/control02.ctl, /u01/app/ora
data/oracle/control03.ctl
SQL> host cp /u01/app/oradata/oracle/control01.ctl /tmp/control01.ctl
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 96470608 bytes
Database Buffers 184549376 bytes
Redo Buffers 2973696 bytes
SQL> alter system set control_files="/u01/app/oradata/oracle/control01.ctl","/tmp/control01.ctl" scope=spfile;
System altered.
SQL> startup force;
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 96470608 bytes
Database Buffers 184549376 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
SQL> show parameters control_files;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /u01/app/oradata/oracle/contro
l01.ctl, /tmp/control01.ctl
2.保护联机重做日志文件
oracle数据库运行时至少需要两个联机重做日志文件组,从而能够在两个组直接进行切换。为了提高性能,我们往往需要添加更多的联机重做日志文件组。每个联机重做日志文件组都由一个或多个成员组成,这些成员是物理文件。为了安全起见,运行oracle数据库要求每个联机重做日志文件组至少都应具有两个成员。
联机日志文件组的所有成员与实例恢复的关系:实例崩溃后,SMON进程会使用当前联机日志文件组的内容进行前滚恢复,从而修复数据库中的任何损坏。如果当前联机日志文件组由于未被多路复用以及一个成员因介质受损被破坏变得不可用,那么SMON进程无法进行前滚恢复。如果SMON进程无法通过前滚修正数据库的损坏,那么不能打开数据库。如果重做日志文件组的一个成员被损坏或丢失,那么数据库在存在备份成员的情况下仍然会保持打开状态。
2.1使用select group#,status,member from v$logfile;可以查看组的数量、状态及每个组成员的具体信息。
SQL> select group#,status,member from v$logfile;
GROUP# STATUS MEMBER
3 /u01/app/oradata/oracle/redo03.log
2 /u01/app/oradata/oracle/redo02.log
1 /u01/app/oradata/oracle/redo01.log
1 /u01/app/oradata/oracle/redo01b.log
3 /u01/app/oradata/oracle/redo03b.log
2.2使用select group#,sequence#,members,status from v$log;可以查看该数据库具有几个日志文件组及组当前的信息。
SQL> select group#,sequence#,members,status from v$log;
GROUP# SEQUENCE# MEMBERS STATUS
---------- ---------- ---------- ----------------
1 11 2 CURRENT
2 9 1 INACTIVE
3 10 2 INACTIVE
从上面两个查询我们可以看到当前数据库有三个联机重做日志文件组,其中1和3有两个组成员,2只有一个组成员。
2.3 我们可以使用下面的命令来增加组成员
SQL> ALTER DATABASE ADD LOGFILE MEMBER '/u01/app/oradata/oracle/redo02c.log' to group 2;
Database altered.
也可以在EM中通过 数据库实例:实例名 > 重做日志组 > 编辑 重做日志组: 2 进行增加。(在增加或删除时处于CURRENT组不能进行操作)
增加完成后我们可以看到下面的信息
SQL> select group#,status,member from v$logfile;
GROUP# STATUS MEMBER
---------- -------
3 /u01/app/oradata/oracle/redo03.log
2 /u01/app/oradata/oracle/redo02.log
1 /u01/app/oradata/oracle/redo01.log
1 /u01/app/oradata/oracle/redo01b.log
2 INVALID /u01/app/oradata/oracle/redo02c.log
3 /u01/app/oradata/oracle/redo03b.log
其中刚增加的组成员状态为INVALID,之所以这样是因为他从来没被使用过。
使用alter system switch logfile;可以强制执行日志切换。
SQL> select group#,sequence#,members,status from v$log;
GROUP# SEQUENCE# MEMBERS STATUS
---------- ---------- ---------- ----------------
1 11 2 CURRENT
2 9 2 INACTIVE
3 10 2 INACTIVE
SQL> alter system switch logfile;
System altered.
SQL> select group#,sequence#,members,status from v$log;
GROUP# SEQUENCE# MEMBERS STATUS
---------- ---------- ---------- ----------------
1 11 2 ACTIVE
2 12 2 CURRENT
3 10 2 INACTIVE
2.4可以使用下面的命令删除一个组成员
ALTER DATABASE DROP LOGFILE MEMBER '/u01/app/oradata/oracle/redo01b.log';
我们可以使用下面的命令增加/删除(组处于unsed状态)一个组
SQL> ALTER DATABASE ADD LOGFILE GROUP 4 ( '/u01/app/oradata/oracle/redo4.log') SIZE 51200K;
Database altered.
SQL> alter database drop logfile group 4;
Database altered.
3.归档日志模式和归档器进程
为了保证在介质失败后不丢失任何数据,就必须具有一条针对从数据库最近一次备份开始应用于数据库的所有变更的记录。在归档日志模式中,恢复操作可以不丢失直至最近一次提交的数据。大部分生产数据库一归档模式运行。数据库只有在干净关闭后处于加载模式时才能被转换至归档日志模式,并且不许由建立了SYSDBA连接的用户完成。还必须设置若干控制所生成的不能重复的归档日志名称和位置的初始化参数。
归档日志参数

下面演示了开启数据库归档模式的整个过程:
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 13
Current log sequence 15
SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/archive1' scope=spfile;
System altered.
SQL> alter system set log_archive_dest_2='location=/u01/app/oracle/archive2' scope=spfile;
System altered.
SQL> alter system set log_archive_format='arch_%d_%t_%r_%s.log' scope=spfile;
System altered.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 104859216 bytes
Database Buffers 176160768 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/archive2
Oldest online log sequence 13
Next log sequence to archive 15
Current log sequence 15
SQL> select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG
SQL> select archiver from v$instance;
ARCHIVE
-------
STARTED
SQL> alter system switch logfile;
System altered.
SQL> select name from v$archived_log;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/archive1arch_632b054b_1_790686349_15.log
/u01/app/oracle/archive2arch_632b054b_1_790686349_15.log