三、Performing user-managed restore operations
1.About user-managed restore operations
丢失一个或多个数据文件:恢复+修复
丢失所有控制文件:恢复或重建(都需要手工加上临时表空间中的数据文件),然后以resetlogs打开数据库。
一个控制文件丢失:使用其他控制文件的覆盖,或修改SPFILE
一个或多个归档日志文件丢失:只能做不完全恢复,然后以resetlogs打开数据库。
SPFILE丢失:使用PFILE打开或重建SPFILE。
2.Keeping records for use in a restore scenario
记录如下文件的位置:数据文件(v$datafile)、控制文件(v$controlfile)、在线重做日志文件(v$logfile)、归档日志文件(v$archived_log)、初始化参数文件、密码文件、网络配置文件。
列出表格,将备份文件与系统中文件一一对应上。
3.Determining which datafiles require recovery
查询视图v$recover_file,确定需要recovery的数据文件。若控制文件是从备份中恢复的,或介质错误后重建的,则该视图中不包含如上信息。
4.Restore datafiles
(1)根据3中方法,查询v$recover_file视图,确定需要恢复的文件
(2)将该文件所在表空间OFFLINE
(3)恢复该数据文件
(4)修复数据文件或表空间
(5)将表空间ONLINE
5.Re-creating datafiles when backups are unavailable
数据文件损坏,且备份不可用,也可以恢复该数据文件。条件:
创建该数据文件后的所有归档日志文件可用
控制文件中包含该数据文件的信息(控制文件是当前文件,或从备份中恢复,但备份中也包含该数据文件)
重建数据文件步骤:
(1) 创建一个新的空数据文件替换掉损坏文件。例如文件’/disk1/users1.f’损坏,则在disk2上重建该文件:
Alter database create datafile ‘/disk1/users1.f’ as ‘/disk2/users1.f’;
新创建的文件原来大小相同,原来的数据文件被重命名。
(2) 修复该数据文件
Recover datafile ‘disk2/user1.f’;
(3) 用损坏文件创建后的所有归档日志进行修复。
Note:不可重建system表空间中的数据文件,because the necessary redo data is not available.
6.Restoring and Re-creating control files
若在数据库运行时一个或多个控制文件损坏,则ORACLE继续运行,直到后台进程需要访问控制文件时自动shutdown。
丢失多路控制文件中的一个
使用正常文件覆盖损坏文件,或修改SPFILE。
丢失所有控制文件,有备份
恢复过程取决于在线重做日志文件是否可用
相关在线 日志状态 | 数据文件 状态 | 恢复方式 |
可用 | 当前 | 使用备份恢复控制文件,指定在线日志完全修复,以RESETLOGS打开数据库。 |
不可用 | 当前 | 重建控制文件,以RESETLOGS打开数据库。 |
可用 | 备份 | 使用备份恢复控制文件,指定在线日志完全修复,以RESETLOGS打开数据库。 |
不可用 | 备份 | 使用备份恢复控制文件,执行不完全修复,以RESETLOGS打开数据库。 |
恢复步骤:
(1) 关闭数据库
(2) 使用备份控制文件覆盖到现有位置
(3) 启动数据库到MOUNT
(4) 使用备份控制文件修复,若为不完全修复,则使用until cancel选项
Recover database using backup controlfile [until cancel];
(5) 使用auto选项应用归档日志。若提示无法找到需要的归档日志,则可能该文件尚未归档,一个一个地指定在线重做日志文件,直到找到合适的。
如果由于某些原因,在线重做日志文件无法访问,则可以直接结束修复过程。注意如果所有数据文件为当前文件,且需要在线日志中的REDO信息修复,则必须应用在线日志修复,否则无法打开数据库。若在线重做日志不可用,则必须重建控制文件(相当于丢失所有控制文件且无备份)。
(6) 使用RESETLOGS打开数据库
(7) 添加临时表空间的数据文件
(8) 立即做全库备份
丢失所有控制文件,无备份
此时若在线日志文件完好,则重建控制文件,修复数据库,打开数据库(不需要RESETLOGS)。
步骤:
(1) NOMOUNT数据库
(2) 重建控制文件(默认字符集为US7ASCII,需要指定)
(3) MOUNT数据库后正常修复(不使用控制文件修复)
Recover database;
(4) 打开数据库(不使用resetlogs)
Alter database open;
(5) 立即备份控制文件
Alter database backup controlfile to ‘….’ [reuse];
(6) 添加临时表空间中的数据文件
问题:使用备份控制文件恢复,必须以RESETLOGS打开数据库。则以前的全库备份失效,需要重新进行全库备份;重建控制文件恢复,可以用NORESETLOGS方式打开数据库,此时v$log中日志序列号并未重置,则以前的归档日志仍可用。但v$archived_log中丢失部分记录,是否有影响?
7.Restoring archived redo logs
当执行介质修复时,必须的归档日志文件必须在磁盘上。恢复步骤:
(1) 查询v$archived_log和v$recovery_log视图,确定需要的归档日志。
若某数据文件需要修复,但无备份,则需要自该数据文件创建以来的所有归档日志。
V$archived_log视图保存所有归档日志文件的名称。
V$recovery_log视图列出修复需要的归档日志名称。
(v$recover_file视图列出需要修复的数据文件)
注意:v$recovery_log视图仅仅当oracle发现需要使用归档日志修复时才组装(产生数据)。例如:
--1。初始时该视图中无数据
SQL> select *From v$recovery_log;
未选定行
--2。将表空间t_2立即offline,则online时需要修复
SQL> alter tablespace t_2 offline immediate;
表空间已更改。
--3。此时查询该视图,仍无数据。(因为此时oracle未发现需要修复的数据文件)
SQL> select *From v$recovery_log;
未选定行
--4。触发需要修复的数据文件
SQL> alter tablespace t_2 online;
alter tablespace t_2 online
*
ERROR 位于第 1 行:
ORA-01113: ?? 14 ??????
ORA-01110: ???? 14: 'D:\ORACLE\ORADATA\TEST\TD_2.DBF'
--5。此时查询该视图,仍无数据。(因为需要的日志尚未归档)
SQL> select *From v$recovery_log;
未选定行
--6。交换日志(测试系统中只有2组日志)
SQL> alter system switch logfile;
系统已更改。
SQL> alter system switch logfile;
系统已更改。
--7。再次查询该视图,发现数据。
SQL> select * from v$recovery_log;
THREAD# SEQUENCE# TIME ARCHIVE_NAME
---------- ---------- ---------- ------------------------------------------------------------------
1 11 22-7? -07 D:\ORACLE\ORA92\RDBMS\ARC00011.001
--8。测试完毕,恢复表空间t_2为online状态
SQL> recover datafile 14
ORA-00279: ?? 426418638 (? 07/22/2007 14:02:48 ??) ???? 1 ????
ORA-00289: ??: D:\ORACLE\ORA92\RDBMS\ARC00011.001
ORA-00280: ?? 426418638 ???? 1 ???? # 11 ???
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
已应用的日志。
完成介质恢复。
SQL> alter tablespace t_2 online;
表空间已更改。
(2) 将步骤1中的归档日志文件恢复到参数log_archive_dest_1指定的位置。这样修复时ORACLE会自动从该目录寻找相关的归档日志。
(3) 若2中的目录所在磁盘空间不足,则可将全部或部分归档日志放到新位置。
在介质恢复前或恢复过程中,可用如下两种方法指定归档日志位置:SQL*PLUS中使用SET语句的LOGSOURCE参数,或ALTER DATABASE语句的RECOVER…FROM参数。例如,
Set logsource /disk1/temp
Alter database recover from ‘/disk1/temp’;
删除恢复的归档日志,以释放磁盘空间。