为了保证数据库具有最大程度的可恢复性,必须复用控制文件与联机重做日志,必须在archivelog模式中运行数据库,同时也必须复用归档日志文件,此外还必须定期备份数据库。
1、保护控制文件
控制文件用于加载数据库,并且在数据库打开时被频繁地读写。控制文件最多具有8个被复用的副本。在理想情况下,不仅控制文件的每个副本都位于不同的磁盘上,而且每个磁盘在硬件允许的情况下都应当位于不同的通道和控制器上。
如果复用了控制文件,那么恢复由于介质损害而丢失的一个控制文件就十分容易。
SQL> show parameters control_files; NAME TYPE VALUE -------------------------- ----------- ------------------------------ control_files string /u01/db/oracle/oradata/ora/con trol01.ctl, /u01/db/oracle/ora data/ora/control02.ctl, /u01/d b/oracle/oradata/ora/control03 .ctl SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. SQL> host cp /u01/db/oracle/oradata/ora/﹡.ctl /u02/oradata/ora/ SQL> startup nomount; ORACLE instance started. Total System Global Area 264241152 bytes Fixed Size 1218868 bytes Variable Size 75499212 bytes Database Buffers 184549376 bytes Redo Buffers 2973696 bytes SQL> alter system set control_files = '/u02/oradata/ora/control01.ctl', 2 '/u02/oradata/ora/control02.ctl', 3 '/u02/oradata/ora/control03.ctl' 4 scope = spfile; System altered. SQL> startup force; ORACLE instance started. Total System Global Area 264241152 bytes Fixed Size 1218868 bytes Variable Size 75499212 bytes Database Buffers 184549376 bytes Redo Buffers 2973696 bytes Database mounted. Database opened. SQL> show parameters control_files; NAME TYPE VALUE -------------------------- ----------- ------------------------------ control_files string /u02/oradata/ora/control01.ctl , /u02/oradata/ora/control02.c tl, /u02/oradata/ora/control03 .ctl |
2、保护联机重做日志文件
Oracle数据库运行时至少需要两个联机重做日志文件组,从而能够在两个组之间进行切换。与复用控制文件副本一样,一个日志文件组中的多个成员在理想情况下应当位于不同的磁盘上和不同的控制器上。不过在考虑磁盘策略时,还应当考虑性能与容错。
数据库只有在关闭后位于加载模式中时才能被转换至archivelog模式,并且必须由建立了SYSDBA连接的用户完成。此外,还必须设置若干控制所生成的归档日志名称和位置的初始化参数。这些名称必须是唯一的,否则会重写归档日志。为了确保唯一的文件名,可以在归档日志文件名中嵌入某些变量。
执行COMMIT命令时,在LGWR进程将日志缓冲区的内容写至磁盘之前,指定会话将被挂起。只有向用户返回“commit complete”消息后,指定会话才会继续进行。意味着,联机重做日志文件的写操作最终将成为Oracle环境中的一个瓶颈:执行DML语句的速度不能快于LGWR进程将变化写至磁盘的速度。相关的是,尽量不将任何数据文件放置在与重做日志文件相同的设备中。如果一个LGWR进程不得不与DBWn进程以及许多服务器进程竞争磁盘I/O资源,那数据库的性能就可能退化。
如果重做日志文件组的一个成员被损坏或丢失,那么数据库在存在幸存成员的情况下仍然保持打开状态。
SQL> select group#, sequence#, members, status from v$log; GROUP# SEQUENCE# MEMBERS STATUS ---------- ---------- ---------- ---------------- 1 58 1 INACTIVE 2 59 1 CURRENT 3 57 1 INACTIVE SQL> select group#, status, member from v$logfile; GROUP# STATUS MEMBER ---------- ------- ------------------------------ 1 STALE /u01/db/oracle/oradata/ora/red o01.log 2 /u01/db/oracle/oradata/ora/red o02.log 3 STALE /u01/db/oracle/oradata/ora/red o03.log SQL> alter system switch logfile; System altered. SQL> select group#, sequence#, members, status from v$log; GROUP# SEQUENCE# MEMBERS STATUS ---------- ---------- ---------- ---------------- 1 58 1 INACTIVE 2 59 1 ACTIVE 3 60 1 CURRENT |
第一个查询说明该数据库具有3个日志文件组。此晨LGWR进程正在写当前组的组2,其他两个组是不活动的。SEQUENCE#列说明从数据库创建开始总共发生过59次日志切换。MEMBERS列说明每个联机重做日志都只有由一个成员组成。
第二个查询说明不同的联机重做日志文件。
执行alter system switch logfile;命令可以实施一次日志切换。
最后一个查询说明在日志切换后,组3成为了当前组。先前的组2状态变化ACTIVE,意味着如果些时现实实例失败,SMON进程仍然需要全用组2进来实例恢复。由于检查点位置前移,因此这个组的状态不久就会变为INACTIVE,执行命令使检查点位置是最近的。
SQL> alter system checkpoint; System altered. SQL> select group#, sequence#, members, status from v$log; GROUP# SEQUENCE# MEMBERS STATUS ---------- ---------- ---------- ---------------- 1 58 1 INACTIVE 2 59 1 INACTIVE 3 60 1 CURRENT SQL> alter database add logfile member 2 '/u01/db/oracle/oradata/ora/redo01b.log' to group 1; Database altered. SQL> alter database add logfile member 2 '/u01/db/oracle/oradata/ora/redo02b.log' to group 2; Database altered. SQL> alter database add logfile member 2 '/u01/db/oracle/oradata/ora/redo03b.log' to group 3; Database altered. SQL> select group#, sequence#, members, status from v$log; GROUP# SEQUENCE# MEMBERS STATUS ---------- ---------- ---------- ---------------- 1 64 2 INACTIVE 2 65 2 CURRENT 3 63 2 INACTIVE SQL> select group#, status, member from v$logfile; GROUP# STATUS MEMBER ---------- ------- -------------------------------------- 1 /u01/db/oracle/oradata/ora/redo01.log 2 /u01/db/oracle/oradata/ora/redo02.log 3 /u01/db/oracle/oradata/ora/redo03.log 1 INVALID /u01/db/oracle/oradata/ora/redo01b.log 2 INVALID /u01/db/oracle/oradata/ora/redo02b.log 3 INVALID /u01/db/oracle/oradata/ora/redo03b.log 6 rows selected. |
3、archivelog模式与归档器进程
在切换日志时,会重写联机重做日志文件。将数据库移至archivelog模式能够确保如果联机重做日志文件没有首先被复制为归档日志,那么就不能被重写。
一旦数据库被转换至archivelog模式,就会自动启动一个新的后台进程:归档器进程ARCn。
可用于在归档日志文件名中嵌入唯一值的变量
变量 | 说明 |
%d | 唯一的数据库标识符。在多个数据库被归档至相同目录的情况下需要此变量 |
%t | 线程号,显示为V$INSTANCE视图的THREAD#列。除了在RAC数据库使用之外,这个变量没有任何意义 |
%r | 场景号。如果进行了不完全恢复,这个变量就十分重要 |
%s | 日志切换序列号。这个变量能够保证任何一个数据库中的归档日志都不会彼此重写 |
为了确保从一个还原的备份中进行恢复,就需要最小化归档,也就是设置一个归档目的地。不过为了安全起见,通常需要通过指定两个或多个目的地来复用归档日志文件。在理想情况下,这些归档日志文件应当位于不同控制器所服务的不同磁盘上。关键之处:重做流通过网络传送至一个远程数据库,这个远程数据库会应用重做流得到实时的备份。此外,远程数据库还可以根据需要作为数据仓库被配置和打开,这意味着为了最优化查询工作,所有查询处理都会从主数据库移至辅助数据库。
$ mkdir /u02/oradata/archive1 $ mkdir /u02/oradata/archive2 $ sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on Sat Oct 11 22:05:25 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SQL> alter system set log_archive_dest_1 = 2 'location=//u02/oradata/archive1/' scope = spfile; System altered. SQL> alter system set log_archive_dest_2 = 2 'location=//u02/oradata/archive2/' scope = spfile; System altered. SQL> alter system set log_archive_format = 2 '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 264241152 bytes Fixed Size 1218868 bytes Variable Size 83887820 bytes Database Buffers 176160768 bytes Redo Buffers 2973696 bytes Database mounted. SQL> alter database archivelog; Database altered. SQL> alter database open; Database altered. 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 -------------------------------------------------------------------- /u02/oradata/archive1/arch_4c841e78_1_665498552_65.log /u02/oradata/archive2/arch_4c841e78_1_665498552_65.log |