为了防止控制文件出现介质失败,应该多元化控制文件;为了提高DB 安全运行时间(MTBF),应该多元化重做日志;为了降低例程恢复时间,需要合理地配置初始化参数。
2.3.1 多元化控制文件
控制文件不仅记载了DB的物理结构及状态,还记载了与备份和恢复相关的动态信息。如果DB 只包含一个控制文件,并且控制文件出现介质失败,那么会导致数据库无法装载,此时DBA 必须要重新建立控制文件或者恢复控制文件。ORACLE 建议每个DB 至少包含两个或两个以上控制文件,并且部署到不同的磁盘上。在多元化控制文件之后,它们互为镜像,内容保持一致。此时如果某个控制文件出现介质失败,那么此时DB也无法装载,但DBA 只要从初始化参数 control_files 中去掉损坏的控制文件即可。
示例:为示例数据库增加一个控制文件
(1)确定已存在的控制文件。
SQL> conn / as sysdba
已连接。
SQL> select * from v$controlfile;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ------------------------------ --- ---------- --------------
D:\DEMO\CONTROL01.CTL NO 16384 430
(2)修改初始化参数control_files。
SQL> ALTER SYSTEM SET CONTROL_FILES =
2 "D:\DEMO\CONTROL01.CTL", "C:\DEMO\CONTROL02.CTL"
3 SCOPE=SPFILE;
系统已更改。
(3)关闭数据库并复制控制文件。
SQL> SHUTDOWN IMMEDIATE
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host copy D:\DEMO\CONTROL01.CTL C:\DEMO\CONTROL02.CTL
(4)启动数据库
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 71304548 bytes
Database Buffers 92274688 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
数据库已经打开。
SQL> SELECT * FROM V$CONTROLFILE;
STATUS NAME IS_ BLOCK_SIZE FILE_SIZE_BLKS
------- ------------------------------ --- ---------- --------------
D:\DEMO\CONTROL01.CTL NO 16384 430
C:\DEMO\CONTROL02.CTL NO 16384 430
2.3.2 多元化重做日志
重做日志用于记录数据库变化。
在ORACLE 中至少要包含两个或两个以上的日志组。当建立日志组时至少要指定一个日志成员。
如果日志组只有一个日志成员,并且该成员出现损坏,那么当LGWR 切换到该日志组时,ORACLE DB 会停止运行。当该组有多个日志成员时,LGWR 将事务变化写入到没有损坏的日志成员。
示例:增加日志成员
(1)确定原有成员的位置
SQL> conn / as sysdba
已连接。
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
------- ------- ------- ------------------------------ -------------------------
3 ONLINE D:\DEMO\REDO03.LOG NO
2 ONLINE D:\DEMO\REDO02.LOG NO
1 ONLINE D:\DEMO\REDO01.LOG NO
(2)增加日志成员
SQL> alter database add logfile member
2 'C:\DEMO\REDO01_2.LOG' TO GROUP 1,
3 'C:\DEMO\REDO02_2.LOG' TO GROUP 2,
4 'C:\DEMO\REDO03_2.LOG' TO GROUP 3;
数据库已更改。
SQL> select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_RECOVERY_DEST_FILE
------- ------- ------- ------------------------------ -------------------------
3 ONLINE D:\DEMO\REDO03.LOG NO
2 ONLINE D:\DEMO\REDO02.LOG NO
1 ONLINE D:\DEMO\REDO01.LOG NO
1 INVALID ONLINE C:\DEMO\REDO01_2.LOG NO
2 INVALID ONLINE C:\DEMO\REDO02_2.LOG NO
3 INVALID ONLINE C:\DEMO\REDO03_2.LOG NO
已选择6行。
2.3.3 配置例程恢复参数
例程恢复是指当出现例程失败时由后台进程SMON 自动同步数据文件、控制文件和重做日是志并打开DB的过程。主要有以下几种情况:
- 电源断电导致ORACLE SERVER 不可用。
- 硬件故障导致ORACLE SERVER 不可用,例如CPU失败、内存损坏。
- 某个必需的后台进程(DBWR、LGWR、PMON、SMON、CKPT)出现失败。
例程恢复时间由需要应用的脏缓冲区块个数确定,脏缓冲区块个数的最大值由检查点来确定,而以下初始化参数可以用于控制检查点:
- fast_start_mttr_target:用于指定例程恢复的最大时间(单位:秒)。
- log_checkpoint_timeout:用于指定发出检查点的时间间隔(单位:秒)。
- log_checkpoint_inteval:用于指定发出检查点的重做日志块间隔(单位:OS块)。
初始化参数log_checkpoint_timeout 和 log_checkpoint_inteval 是为了与早期版本兼容而保留,建议使用fast_start_mttr_target 控制例程恢复时间。
示例:将例程恢复时间控制在10分钟之内
SQL> alter system set fast_start_mttr_target=600 ;
系统已更改。
通过查询动态性能视V$INSTANCE_RECOVERY,可以监视例程恢复的动态信息。
SQL> select actual_redo_blks, target_redo_blks, estimated_mttr from v$instance_recovery;
ACTUAL_REDO_BLKS TARGET_REDO_BLKS ESTIMATED_MTTR
---------------- ---------------- --------------
24 140 11
ACTUAL_REDO_BLKS : 用于标识当前情况下例程恢复实际需要应用的重做块个数
TARGET_REDO_BLKS : 用于标识当前情况下例程恢复最多需要应用的重做块个数
ESTIMATED_MTTR : 用于标识例程恢复的预计时间。
因为例程恢复时间主要由REDO 时间和UNDO 时间确定,所以为了降低例程恢复的实际时间,应该调整REDO 和 UNDO 的时间。
1,调整REDO时间
为了降低例程恢复的REDO时间,可以启动多个SLAVE 进程。通过配置初始化参数recovery_parallelism,可以指定SLAVE 进程个数(该参数是静态的,修改后要重新启动例程)。
SQL> conn / as sysdba
已连接。
SQL> Alter System Set Recovery_parallelism=3 Scope=spfile;
系统已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 79693156 bytes
Database Buffers 83886080 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
数据库已经打开。
2,调整UNDO时间
为了降低例程恢复的UNDO时间,可以启动多个SLAVE进程,参数fast_start_parallel_rollback 可以控制SLAVE进程的个数。如果设置为FALSE,则不会启动SLAVE进程;如果设置为LOW,则SLAVE进程个数为2倍的CPU个数;如果设置为HIGH,则SLAVE进程个数为4倍的CPU个数。
SQL> alter system set fast_start_parallel_rollback=low;
系统已更改。
当执行例程恢复时,通过查询动态性能视图v$fast_start_servers可以用于监视UNDO 操作的进程信息。
SQL> select pid, state, undoblocksdone from v$fast_start_servers;
未选定行
当执行例程恢复时,通过查询动态性能视图v$fast_start_transactions 可以用于监视事务恢复的信息。
SQL> select * from v$fast_start_transactions;
未选定行