恢复阶段
1、损坏或丢失文件从备份中还原
2、从归档和在线日志文件必要的被应用来改变数据,回滚块也在这时生成,这个称为前滚或恢复缓存
3、数据库可能包含提交、不提交的改变数据
4、回滚块被使用于任何未提交的数据被回滚,这个称为回滚或事务恢复
5、数据库现在为恢复状态
无开启归档模式恢复
A、好处:
执行简单,出错率低
恢复时间就是还原所有的文件花费的时间
B、不利:
数据丢失,必须手工应用
整个数据库被还原到关闭备份的最后一个时间点
带有重做日志文件的备份非归档的恢复
SQL>SHUTDOWN ABORT
还原数据:
UNIX: cp /BACKUP/* /databases/db01/ORADATA
NT: copy d:\disk1\backup\*.* d:\disk1\data\
复制完成,开启实例
CONN /AS SYSDBA
STARTUP
不带有重做日志文件的备份非归档的恢复
关闭数据库
shutdown immediate
还原数据文件和控制文件
数据文件的恢复 cp /db01/backup/*dbf /ORADATA/*
控制文件恢复 cp /db01/backup/*.ctl /ORADTA
没有备份在线日志,无法应用在线日志
recover database until cancel
SQL> shutdown immediate; 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> startup mount; ORACLE 例程已经启动。 Total System Global Area 612368384 bytes Fixed Size 1250428 bytes Variable Size 239078276 bytes Database Buffers 364904448 bytes Redo Buffers 7135232 bytes 数据库装载完毕。 SQL> alter database open; alter database open * 第 1 行出现错误: ORA-00338: 日志 1 (用于线程 1) 比控制文件更新 ORA-00312: 联机日志 1 线程 1: ‘D:\ORADATA\ORCL\REDO01.LOG‘ SQL> recover database until cancel; 完成介质恢复。 SQL> alter database open; alter database open * 第 1 行出现错误: ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项 SQL> alter database open restlogs; alter database open restlogs * 第 1 行出现错误: ORA-02288: 无效的 OPEN 模式 SQL> alter database open resetlogs; 数据库已更改。
查看数据字典-哪个文件需要恢复
V$RECOVER_FILE决定哪个文件需要恢复 V$ARCHIVED_LOG罗列全部的归档日志 V$RECOVERY_LOG罗列全部归档日志需要恢复的 SQL> create tablespace tbs datafile ‘/u01/test01.dbf‘ size 100M; 表空间已创建。 #在归档模式下 alter DATABASE datafile ‘/u01/test01.dbf‘ offline; #不在归档下 alter DATABASE datafile ‘/u01/test01.dbf‘ offline DROP ; SQL> select * from v$recover_file; FILE# ONLINE ONLINE_STA ERROR CHANGE# TIME ---------- ---------- ---------- ---------- ---------- --------------- 5 OFFLINE OFFLINE 1093567 05-4月 -15 ERROR列有两种可能 为NULL错误为止 如果恢复不需要OFFLINE NORMAL CHANGE#列返回SCN从恢复开始 例子阐述:归档模式下 SQL> alter system switch logfile; 系统已更改。 SQL> alter system switch logfile; 系统已更改。 SQL> alter system switch logfile; 系统已更改。 我只有3组日志组,最旧的会被替换掉。 在查看v$recovery_log SQL> select * from v$recovery_log; THREAD# SEQUENCE# TIME ARCHIVE_NAME ---------- ---------- -------------- ------------------------------ 1 3 02-4月 -15 D:\FLASH_RECOVERY_AREA\ORCL\AR CHIVELOG\2015_04_06\O1_MF_1_3_ BL4WZX0Z_.ARC 说明:v$log之前sequence=3的已经被替换了,只能在归档在恢复 SQL> alter database datafile 7 online; alter database datafile 7 online * 第 1 行出现错误: ORA-01113: 文件 7 需要介质恢复 ORA-01110: 数据文件 7: ‘D:\ORADATA\ORCL\GULL01.DBF‘ SQL> recover datafile 7; ORA-00279: 更改 1129093 (在 04/02/2015 21:26:50 生成) 对于线程 1 是必需的 ORA-00289: 建议: D:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2015_04_06\O1_MF_1_3_%U_.ARC ORA-00280: 更改 1129093 (用于线程 1) 在序列 #3 中 指定日志: {<RET>=suggested | filename | AUTO | CANCEL} auto 已应用的日志。 完成介质恢复。 SQL> alter database datafile 7 online; 数据库已更改。 备注说明: 也可以使用 直接使用recover automatic datafile 7; 再次把归档备份的另外的目录下,可以采用指定归档文件的位置恢复 SQL> recover automatic datafile 7; ORA-00279: 更改 1143303 (在 04/06/2015 20:11:52 生成) 对于线程 1 是必需的 ORA-00289: 建议: D:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2015_04_06\O1_MF_1_6_%U_.ARC ORA-00280: 更改 1143303 (用于线程 1) 在序列 #6 中 ORA-00278: 此恢复不再需要日志文件 ‘D:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2015_04_06\O1_MF_1_6_BL4Y290Z_.ARC‘ ORA-00308: 无法打开归档日志 ‘D:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2015_04_06\O1_MF_1_6_BL4Y290Z_.ARC‘ ORA-27041: 无法打开文件 OSD-04002: 无法打开文件 O/S-Error: (OS 2) 系统找不到指定的文件。 指定日志: {<RET>=suggested | filename | AUTO | CANCEL} filename ORA-00308: 无法打开归档日志 ‘filename‘ ORA-27041: 无法打开文件 OSD-04002: 无法打开文件 O/S-Error: (OS 2) 系统找不到指定的文件。 指定日志: {<RET>=suggested | filename | AUTO | CANCEL} D:\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\O1_MF_1_6_BL4Y290Z_.ARC 已应用的日志。 完成介质恢复。 SQL>
可以通过v$datafile_header的checkpoint_change#到v$archived_log.FIRST_CHANGE#和next_change#,确定需要恢复那些归档
RECOVER 命令的使用
A、在mount状态下
recover [AUTOMATIC] database或recover [AUTOMATIC] datafile ‘/u01/test01.dbf‘;
B、数据库打开下的恢复
recover [AUTOMATIC] tablespace users或recover [AUTOMATIC] datafile 3;
AUTOMATIC自动应用归档日志和重做日志文件,不使用AUTOMATIC只会应用重做日志
更改普通数据文件(不是系统用的)的目录
SQL> alter database datafile 7 offline; 数据库已更改。 SQL> alter database rename file ‘D:\ORADATA\ORCL\GULL01.DBF‘ to ‘D:\ORADATA\GULL 01.DBF‘ 2 ; 操作系统中拷贝文件的指定的目录 SQL> recover datafile 7; 完成介质恢复。 SQL> alter database datafile 7 online; 数据库已更改。
系统文件的恢复
在使用过程无法使系统数据文件脱机
SQL> alter database datafile 1 offline; alter database datafile 1 offline * 第 1 行出现错误: ORA-01541: 系统表空间无法脱机; 如有必要请关闭
需要更改系统文件system的路径,只能在mount状态下进行。
SQL> shutdown immediate; 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 操作系统数据文件拷贝 SQL> startup mount; ORACLE 例程已经启动。 Total System Global Area 612368384 bytes Fixed Size 1250428 bytes Variable Size 234883972 bytes Database Buffers 369098752 bytes Redo Buffers 7135232 bytes 数据库装载完毕。 SQL> alter database datafile 1 offline; 数据库已更改。 SQL> alter database rename file ‘D:\ORADATA\ORCL\SYSTEM01.DBF‘ to ‘D:\ORADATA\SY STEM01.DBF‘; 数据库已更改。 SQL> alter database datafile 1 oNline; 数据库已更改。 SQL> alter database open; 数据库已更改。 SQL>
数据文件丢失无备份的恢复数据文件
如数据库关闭状态下,数据库MOUNT状态下,使数据文件(无备份)OFFLINE,打开数据库,用户只能使用这个表空间。
如数据库在打开状态,立即把对应的表空间offline状态
SQL> alter TABLESPACE GULL OFFLINE IMMEDIATE; 表空间已更改。 SQL> select * from v$recover_file; FILE# ONLINE ONLINE_ ERROR CHANGE# TIME ---------- ------- ------- -------------------- ---------- -------------- 7 OFFLINE OFFLINE FILE NOT FOUND 0 8 OFFLINE OFFLINE 1147508 06-4月 -15 SQL> alter database create datafile ‘D:\ORADATA\GULL01.DBF‘; 数据库已更改。 SQL> select * from v$recover_file; FILE# ONLINE ONLINE_ ERROR CHANGE# TIME ---------- ------- ------- -------------------- ---------- -------------- 7 OFFLINE OFFLINE UNKNOWN ERROR 579936 03-3月 -15 8 OFFLINE OFFLINE 1147508 06-4月 -15 归档文件需要都在才能恢复 SQL> recover automatic tablespace gull; 表空间在线 alter tablespace gull online;
只读表空间的恢复
1、备份之前的表空间是read-only,现在还是read-only。
这样恢复不需要任何的redo log
SQL> alter tablespace gull read only; 表空间已更改。 把表空间的数据文件gull01备份 SQL> alter system switch logfile; 系统已更改。 SQL> alter system switch logfile; 系统已更改。 SQL> alter system switch logfile; 系统已更改。 把之前备份的gull01直接替换 不需要做任何恢复就可以使用
2、表空间现在是read-wirte,备份是通过read-only,需要应用redo和归档
SQL> create tablespace gull datafile ‘d:\oradata\gull01.dbf‘ size 20M; 表空间已创建。 SQL> alter tablespace gull read only; 表空间已更改。 备份数据文件gull01 SQL> alter tablespace gull read write; 表空间已更改。 SQL> conn gull/oracle 已连接。 SQL> create table test0408 as select *from dba_objects; 表已创建。 SQL> alter system checkpoint; 系统已更改。 SQL> alter system checkpoint; 系统已更改。 SQL> alter system checkpoint; 系统已更改。 SQL> alter system switch; alter system switch * 第 1 行出现错误: ORA-01900: 需要 LOGFILE 关键字 SQL> alter system switch logfile; 系统已更改。 SQL> alter system switch logfile; 系统已更改。 SQL> alter system switch logfile; 系统已更改。 SQL> alter database datafile 7 online; alter database datafile 7 online * 第 1 行出现错误: ORA-01113: 文件 7 需要介质恢复 ORA-01110: 数据文件 7: ‘D:\ORADATA\GULL01.DBF‘ SQL> recover automatic datafile 7; 完成介质恢复。 SQL> alter database datafile 7 online; 数据库已更改。 SQL> select count(*) from test0408; COUNT(*) ---------- 50365 SQL>
3、现在为read-only,之前为read-write
先要把对应的文件改为offline,在恢复
SQL> create table test040801 as select *from dba_objects; 表已创建。 SQL> alter tablespace gull read only; 表空间已更改。 SQL> create table test040802 as select *from dba_objects; create table test040802 as select *from dba_objects * 第 1 行出现错误: ORA-01647: 表空间 ‘GULL‘ 是只读, 无法在其中分配空间 SQL> alter tablespace gull read write; alter tablespace gull read write * 第 1 行出现错误: ORA-01122: 数据库文件 7 验证失败 ORA-01110: 数据文件 7: ‘D:\ORADATA\GULL01.DBF‘ ORA-01208: 数据文件是旧的版本 - 不能访问当前版本 SQL> recover datafile 7; ORA-00283: 恢复会话因错误而取消 ORA-01124: 无法恢复数据文件 7 - 文件在使用中或在恢复中 ORA-01110: 数据文件 7: ‘D:\ORADATA\GULL01.DBF‘ SQL> alter database datafile 7 offline; 数据库已更改。 SQL> recover automatic datafile 7; 完成介质恢复。 SQL> alter tablespace gull read write; alter tablespace gull read write * 第 1 行出现错误: ORA-01135: DML/query 访问的文件 7 处于脱机状态 ORA-01110: 数据文件 7: ‘D:\ORADATA\GULL01.DBF‘ SQL> alter database datafile 7 online; 数据库已更改。 SQL> alter tablespace gull read write; 表空间已更改。 SQL> select count(*) from test040801; COUNT(*) ---------- 50366 SQL>