预防介质失败的措施有:
。在archivelog模式中运行数据库
。复用控制文件、联机重做日志文件和归档日志文件。
。备份数据文件和归档日志文件。
与实例恢复相比,介质恢复是手动过程。
1 恢复结构和进程
受损的控制文件的恢复方法:
。替换为某个复用副本
。使用create control命令重建
。从备份中还原控制文件
受损的重做日志文件:
。使用alter database clear logfile group#命令重建日志文件组的成员。在archivelog模式下必须先归档再执行命令重建。
。使用alter database clear unarchived logfile group#命令日志文件,执行该命令后必须对数据库进行备份。
受损的数据文件:
使用备份和归档日志
有完全恢复和不完全恢复之分
完全恢复:
。在备份中还原受损文件;
。使用归档日志文件进行恢复。
在oracle中,还原意味着使用备份替换受损的或丢失的文件;恢复意味着通过归档日志文件来同步受损文件与数据库的剩余部分。
任何控制文件副本受损、system表空间和活动的撤销表空间一步分的数据文件受损会导致实例立即终止。
2 介质失败后的恢复
2.1 恢复受损的复用控制文件
丢失复用控制文件的一个副本:只要将其替换为幸存的控制文件副本。
步骤:
1、 复制一个幸存的控制文件到一个新的文件。
2、 修改ontrol_files参数文件,从而将对受损文件的引用替换为新文件的引用。
3、 删除受损的控制文件。
例子
1 查看控制文件是否复用 sys@ORCL> select * from v$controlfile;
STATUS ------- NAME -------------------------------------------------------------------------------- -------------------- IS_ BLOCK_SIZE FILE_SIZE_BLKS --- ---------- --------------
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROLFILE\O1_MF_7RBDCXXS_.CTL NO 16384 430
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROLFILE\O1_MF_7RBDCXXS_1.CTL NO 16384 430
E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\CONTROLFILE\O1_MF_7RBDCY2G_.CT L YES 16384 430 2 模拟控制文件受损,使用startup 命令,启动操作会停止在nomount模式中 sys@ORCL> startup force; ORACLE 例程已经启动。
Total System Global Area 532676608 bytes Fixed Size 1249968 bytes Variable Size 188747088 bytes Database Buffers 335544320 bytes Redo Buffers 7135232 bytes ORA-00205: ?????????, ??????, ??????? 3 将幸存的控制文件复制至新的目录,并重命名其文件 4 编辑control_file 参数 sys@ORCL> alter system set control_files = 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROLFILE\ O1_MF_7RBDCXXS_.CTL', 'E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\CONTROLFILE\ O1_MF_7RBDCY2G_.CTL', 'E:\ORACLE\controlfile\control03_.CTL' scope=spfile; 系统已更改。 5 重启实例 sys@ORCL> startup force; ORACLE 例程已经启动。
Total System Global Area 532676608 bytes Fixed Size 1249968 bytes Variable Size 188747088 bytes Database Buffers 335544320 bytes Redo Buffers 7135232 bytes 数据库装载完毕。 数据库已经打开。 6 删除受损的控制文件 |
2.2 恢复受损的复用联机重做日志文件
在数据库打开时可以恢复复用的联机重做日志文件,因此不会造成数据库的停机。
例子
1 查询联机日志文件的状态 sys@ORCL> select group#, status, member from v$logfile order by group#;
GROUP# STATUS ---------- ------- MEMBER -----------------------------------------------------------------------------------
1 E:\ORACLE\PRODUCT\10.2.0\ORADATA\REDO001B.LOG
1 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_1_7RBDCY8S_.LOG
1 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_1_7RBDCYRW_.LOG
2 STALE E:\ORACLE\PRODUCT\10.2.0\ORADATA\REDO002B.LOG
2 STALE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_2_7RBDCZFO_.LOG
2 STALE E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_2_7RBDCZX9_.LOG
3 STALE E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_3_7RBDD21Y_.LOG
3 STALE E:\ORACLE\PRODUCT\10.2.0\ORADATA\REDO003B.LOG
3 STALE E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_3_7RBDD0Y8_.LOG
已选择9行。 2 模拟删除一个日志文件成员来模仿介质失败 sys@ORCL> alter system switch logfile;
系统已更改。
sys@ORCL> alter system switch logfile;
系统已更改。
sys@ORCL> alter system switch logfile; 系统已更改。 sys@ORCL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 sys@ORCL> host del E:\ORACLE\PRODUCT\10.2.0\ORADATA\REDO001B.LOG 3 查询联机日志文件的状态,丢失的文件会标志invalid。 sys@ORCL> startup ORACLE 例程已经启动。
Total System Global Area 532676608 bytes Fixed Size 1249968 bytes Variable Size 192941392 bytes Database Buffers 331350016 bytes Redo Buffers 7135232 bytes 数据库装载完毕。 数据库已经打开。 sys@ORCL> alter system switch logfile;
系统已更改。
sys@ORCL> alter system switch logfile;
系统已更改。
sys@ORCL> alter system switch logfile;
系统已更改。
sys@ORCL> select group#, status, member from v$logfile order by group#;
GROUP# STATUS ---------- ------- MEMBER ----------------------------------------------------------------------------------
1 INVALID E:\ORACLE\PRODUCT\10.2.0\ORADATA\REDO001B.LOG
1 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_1_7RBDCY8S_.LOG
1 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_1_7RBDCYRW_.LOG
2 E:\ORACLE\PRODUCT\10.2.0\ORADATA\REDO002B.LOG
2 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_2_7RBDCZFO_.LOG
2 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_2_7RBDCZX9_.LOG
3 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_3_7RBDD21Y_.LOG
3 E:\ORACLE\PRODUCT\10.2.0\ORADATA\REDO003B.LOG
3 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_3_7RBDD0Y8_.LOG
已选择9行。 4 修复受损的重做日志 sys@ORCL> select group#, sequence#, members, archived, status from v$log;
GROUP# SEQUENCE# MEMBERS ARC STATUS ---------- ---------- ---------- --- ---------------- 1 118 3 YES INACTIVE 2 119 3 NO CURRENT 3 117 3 YES INACTIVE
sys@ORCL> alter system switch logfile;
系统已更改。
sys@ORCL> select group#, sequence#, members, archived, status from v$log;
GROUP# SEQUENCE# MEMBERS ARC STATUS ---------- ---------- ---------- --- ---------------- 1 118 3 YES INACTIVE 2 119 3 YES ACTIVE 3 120 3 NO CURRENT
sys@ORCL> alter system checkpoint global;
系统已更改。
sys@ORCL> select group#, sequence#, members, archived, status from v$log;
GROUP# SEQUENCE# MEMBERS ARC STATUS ---------- ---------- ---------- --- ---------------- 1 118 3 YES INACTIVE 2 119 3 YES INACTIVE 3 120 3 NO CURRENT
sys@ORCL> alter database clear logfile group 1;
数据库已更改。 注:只有当group 1的status为 inactive时,才能执行alter database clear logfile group 1命令。 sys@ORCL> select group#, status, member from v$logfile order by group#;
GROUP# STATUS ---------- ------- MEMBER ----------------------------------------------------------------------------------
1 E:\ORACLE\PRODUCT\10.2.0\ORADATA\REDO001B.LOG
1 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_1_7RBDCY8S_.LOG
1 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_1_7RBDCYRW_.LOG
2 E:\ORACLE\PRODUCT\10.2.0\ORADATA\REDO002B.LOG
2 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_2_7RBDCZFO_.LOG
2 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_2_7RBDCZX9_.LOG
3 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_3_7RBDD21Y_.LOG
3 E:\ORACLE\PRODUCT\10.2.0\ORADATA\REDO003B.LOG
3 E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_3_7RBDD0Y8_.LOG
已选择9行。 |
5 恢复受损的数据文件
a) noarchivelog模式中数据文件的恢复
在noarchivelog模式中无法执行恢复操作,只有一个唯一选项就是还原整个数据库,并且还原了整个数据库后,那么在打开数据库之前必须执行eliminate 联机日志。
b) archivelog模式中非重要文件的恢复
在数据库处于online进行还原和恢复。
例子:
1 新建表空间,并备份 Create tablespace ts1 datafile ‘e:\oracle\ts.dbf’ size 2m;
2 模拟数据文件损坏,使用notepad编辑。 3 查询表,确认数据文件已损坏 Select * from t2; 4 还原和恢复数据文件 恢复管理器: Release 10.2.0.1.0 - Production on 星期三 5月 2 17:05:06 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
RMAN>
连接到目标数据库: ORCL (DBID=1308114557)
使用目标数据库控制文件替代恢复目录
RMAN>
回显已打开
RMAN> run {
2> restore datafile 9;
3> recover datafile 9;
4> sql 'alter database datafile 9 online';
5> }
启动 restore 于 02-5月 -12
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=129 devtype=DISK
通道 ORA_DISK_1: 正在开始恢复数据文件备份集
通道 ORA_DISK_1: 正在指定从备份集恢复的数据文件
正将数据文件00009恢复到E:\ORACLE\TS1.DBF
通道 ORA_DISK_1: 正在读取备份段 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2012_05_02\O1_MF_NNNDF_BACKUP_ORCL_000001_0_7T1XF2J3_.BKP
通道 ORA_DISK_1: 已恢复备份段 1
段句柄 = E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2012_05_02\O1_MF_NNNDF_BACKUP_ORCL_000001_0_7T1XF2J3_.BKP 标记 = BACKUP_ORCL_000001_050212045130
通道 ORA_DISK_1: 恢复完成, 用时: 00:00:02
完成 restore 于 02-5月 -12
启动 recover 于 02-5月 -12
使用通道 ORA_DISK_1
正在开始介质的恢复
介质恢复完成, 用时: 00:00:04
完成 recover 于 02-5月 -12
sql 语句: alter database datafile 9 online
RMAN> exit;
恢复管理器完成。 5 查询是否已恢复 sys@ORCL> select * from t2;
D1 -------------- 02-5月 -12 |
a) 恢复受损的重要数据文件
在数据库处于mount模式中进行还原和恢复。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9537053/viewspace-722657/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9537053/viewspace-722657/