3.1 完全恢复;
通过备份、归档日志、currentredo ,将database恢复到failure 前的最后一次commit状态。
3.2 完全恢复的步骤
1)restore: OS拷贝命令cp还原所有或部分datafile
2)recover:SQL*PLUS利用归档日志和当前的redo日志做恢复
3.3 手工完全恢复可以基于三个级别
recover database: 所有或大部分datafile丢失,一般是在mount状态完成 (比如4个关键文件损坏,就进不了open状态)
recover tablespace:非关键表空间损坏,表空间下某些数据文件不能访问,一般是在open下完成
recover datafile: 单一或少数数据文件损坏,可以在mount或open 状态完成
什么是关键文件:如果关键文件损坏,数据库将不能维持在open状态,或崩溃或死机!
考点:哪些文件是关键文件:四个:1)system01.dbf, 2) undotablespace,3)control file 4)current log file(当前日志文件)
3.4 恢复过程可以查看的视图:
1)v$recover_file: 查看需要恢复的datafile
2)v$recovery_log: 查看recover 需要的redo 日志
3)v$archvied_log: 查看已经归档的日志
3.5 非归档模式下只能做全备的完整还原,还原后仍会缺失联机日志文件(因为只备数据文件和控制文件),需要在mount下发出
alter database clear logfile group <组号>. (如果是在RMAN下还原,这一过程是自动完成的)。
3.6 归档模式下手工完全恢复的实验
前提: 1)有一套datafile全备, 2)使用当前控制文件, 3)自上次备份以来的归档日志和当前联机日志是完整的,
范例1:recover database
说明:由于media failure 所有datafile丢失,
sys:
SQL>select * from scott.test;
ID
----------
1
在这个状态下先在OS下做一个数据文件和控制文件的冷备。
SQL>shutdown immediate
[oracle@timran~] $cp /u01/oradata/timran11g/*.dbf /u01/back1
[oracle@timran~] $cp /u01/oradata/timran11g/*.ctl /u01/back1
SQL> startup
SQL>insert into scott.test values(2);
SQL>commit;
SQL>select * from scott.test;
ID
----------
2
1
SQL>insert into scott.test values(3);
SQL>commit;
SQL>select * from scott.test;
ID
----------
2
3
1
1)模拟介质失败,所有数据文件丢失
[oracle@timran~]$ rm /u01/oradata/timran11g/*.dbf //数据库在打开的情况下就删掉了所有dbf文件
SQL>shutdown abort //数据库直接abort了
ORACLEinstance shut down.
2)启动database
SQL>startup
ORACLEinstance started.
TotalSystem Global Area 839282688 bytes
FixedSize 2217992 bytes
VariableSize 603981816 bytes
DatabaseBuffers 230686720 bytes
RedoBuffers 2396160 bytes
Database mounted.
ORA-01157:cannot identify/lock data file 1 - see DBWR trace file
ORA-01110:data file 1: '/u01/oradata/timran11g/system01.dbf'
数据库没有打开,只到了mount状态。
SQL>selectfile#,error from v$recover_file;
或者select * fromv$recover_file;检查数据文件是否存在
FILE# ERROR
---------------------------------------------------------------------------
1 FILE NOT FOUND
2 FILE NOT FOUND
3 FILE NOT FOUND
4 FILE NOT FOUND
5 FILE NOT FOUND
6 FILE NOT FOUND
7 FILE NOT FOUND
查看控制文件scn
SQL>select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
----------------------------
1 2436025
2 2436025
3 2436025
4 2436025
5 2436025
6 2436025
7 2436025
查看数据文件头scn
SQL>select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
----------------------------
1 0
2 0
3 0
4 0
5 0
6 0
7 0
如果此时已经有了日志归档,那么可以使用下面语句来查看需要哪些归档日志。
SQL>select * from v$recovery_log;
3)启动失败,控制文件和数据文件头的scn不一致,需要做介质恢复。
注意:
//此例是数据库open状态在OS下直接删除了所有数据文件,所以这里最好不要做手工日志切换,否则情况复杂。
//控制文件记录的scn 应大于需恢复的数据文件头部的scn,归档日志+当前日志都完整,这样才能满足完全恢复的条件。
首先还原所有数据文件
[oracle@timran~]$ cp /u01/back1/*.dbf /u01/oradata/timran11g
现在再去查看控制文件和数据文件头scn,发现控制文件的新,两个scn号不一致,就需要使用日志来前滚recover database。
4)恢复database
SQL>recover database;
5)打开数据库
SQL>alter database open;
6)验证
SQL>select * from scott.test;
ID
----------
2
3
1
范例2:recover tablespace(状态:database open)
说明:针对的是非关键表空间的损坏,基于表空间的完全恢复实际上还是对其下的datafile的恢复
模拟这种情形非常实用,通常是某个非关键表空间下的数据文件受损,但并没有造成Oracle崩溃, 我们只需针对个别有问题的tablespace去做单独的在线恢复操作,也就是说恢复时数据库整体是online的,而局部表空间是offline的,数据库不需要shutdown。
恢复表空间(删除了tablespace下的所有的datafile)
在这个状态下先在OS下做一个数据文件和控制文件的冷备。如果前面有备份了,就不要做下面的了。
SQL> shutdown immediate
[oracle@timran ~] $cp /u01/oradata/timran11g/*.dbf /u01/back1
[oracle@timran ~] $cp /u01/oradata/timran11g/*.ctl /u01/back1
SQL> startup
1)了解一下当前状态,有个test表空间,
SQL>select file_id,file_name,tablespace_name from dba_data_files;
FILE_ID FILE_NAME TABLESPACE_NAME
------------------------------------------------------------------------------------------
4/u01/oradata/timran11g/users01.dbf USERS
3/u01/oradata/timran11g/sysaux01.dbf SYSAUX
2 /u01/oradata/timran11g/undotbs01.dbf UNDOTBS1
1/u01/oradata/timran11g/system01.dbf SYSTEM
5/u01/oradata/timran11g/example01.dbf EXAMPLE
7/u01/oradata/timran11g/abcd01.dbf ABCD
6/u01/oradata/timran11g/test01.dbf TEST
SQL>conn scott/scott
Connected.
SQL>create table t1 (name char(10)) tablespace test;
SQL>insert into t1 values('a');
SQL>commit;
SQL>select * from t1;
NAME
--------------------------------------------------
a
2)模拟表空间损坏,数据库open下,直接删除表空间下的数据文件
[oracle@timran~]$ rm /u01/oradata/timran11g/test01.dbf
[oracle@timran~]$
3)查证该表空间上的表不可访问了
SQL>alter system flush buffer_cache; //清除data buffer
此时查看t1还是有数据,是以为pga没有清空
SQL>conn / as sysdba //换个session登陆,访问t1表,因内存里已清除了buffer块,只好去做物理读,所以报错!
Connected.
SQL>select * from scott.t1;
select *from scott.t1
*
ERROR atline 1:
ORA-01116:error in opening database file 6
ORA-01110:data file 6: '/u01/oradata/timran11g/test01.dbf'
ORA-27041:unable to open file
LinuxError: 2: No such file or directory
Additionalinformation: 3
4)看看scn的情况
SQL>select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
----------------------------
1 3550907
2 3550907
3 3550907
4 3550907
5 3550907
6 3550339
SQL>select file#,checkpoint_change# from v$datafile_header;
FILE# CHECKPOINT_CHANGE#
----------------------------
1 3550907
2 3550907
3 3550907
4 3550907
5 3550907
6 0
5)表空间offline
SQL>alter tablespace test offline immediate; //immediate使表空间能立即脱机,不等Oracle对任何数据文件做检查,因为此时没有数据文件test01.dbf了,所以使用alter tablespace test offline是会报错的。
6)数据库open下,使用备份还原这个表空间下的所有数据文件
[oracle@timran~]$ cp /u01/back1/test01.dbf /u01/oradata/timran11g
[oracle@timran~]$
7)恢复tablespace
SQL>recover tablespace test;
完成介质恢复。
8)使表空间online
SQL>alter tablespace test online; //注意:此时数据库状态一直是open的。
9) 验证
SQL>select * from scott.t1;
NAME
--------------------------------------------------
a
再去查看一下控制文件和数据文件头的scn
SQL>alter system checkpoint; 可以将所有scn同步。
范例3:(recover datafile,database mount或open状态)
恢复datafile, 同范例2不同的是模拟UNDO文件损坏: 因UNDO数据文件也是关键文件,所以只能在mount状态下恢复。
在这个状态下先在OS下做一个数据文件和控制文件的冷备。如果前面有备份了,就不要做下面的了。
SQL> shutdown immediate
[oracle@timran ~] $cp /u01/oradata/timran11g/*.dbf /u01/back1
[oracle@timran ~] $cp /u01/oradata/timran11g/*.ctl /u01/back1
SQL> startup
1) 模拟环境:
SQL>insert into scott.t1 values('b'); //插入一行记录是为了使t1和备份有区别
SQL>commit;
SQL>select * from scott.t1;
NAME
--------------------------------------------------
a
b
SQL>delete scott.t1; //注意:删掉了t1并没有提交,老值在UNDO里。
备份
2)在open 状态下删除datafile
[oracle@timran~]$ rm /u01/oradata/timran11g/undotbs01.dbf
[oracle@timran~]$
3)关闭数据库
SQL>shtudown abort //abort埋下伏笔,等到完全恢复时会做UNDO回滚。
4) 启动数据库mount
SQL>startup mount
...
数据库装载完毕。 (Database mounted)
ORA-01157:无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件
ORA-01110:数据文件 3: '/u01/oradata/timran11g/undotbs01.dbf'
5)还原并恢复UNDO数据文件
[oracle@timrantimran11g]$ cp /u01/back1/undotbs01.dbf ./
SQL>recover datafile 3;
完成介质恢复。
6)打开数据库(会完成UNDO表空间数据的回滚)
SQL>alter database open;
数据库已更改
7) 验证
SQL>select * from scott.t1;
NAME
--------------------------------------------------
a
b
3.7 手工完全恢复特点小结:
3.7.1 recover database (全部或大部分数据文件损坏,mount下进行)
OS: 使用cp 还原受损的dbf(不一定是全部,v$recover_file记录的都需要还原)
SQLPLUS:
1)recoverdatabase;
2)alterdatabase open;
3.7.2 recover tablespace XXX (针对表空间的非关键数据文件损坏,一般是open下进行)
OS:使用cp 还原该表空间XXX下的所有数据文件
SQLPLUS:
1)altertablespace XXX offline; 或者altertablespace XXX offline immediate;
2)recovertablespace XXX;
3)altertablespace XXX online;
3.7.3 recover datafile XXX (单个或几个数据文件损坏,关键文件在mount下进行,非关键文件在open下进行)
OS:cp 还原相关的关键数据文件(mount)
SQLPLUS:
1)recoverdatafile 6,8;
2)alterdatabase open;
OS:cp 还原相关的非关键数据文件(open)
SQLPLUS:
1)alterdatabase datafile 6,8 offline; 或者alter database datafile 6,8 offline immediate;
2)recoverdatafile 6,8;
3)alterdatabase datafile 6,8 online;