3.1 完全恢复;通过备份、归档日志、current log ,将database恢复到failure 前的最后一次commit状态。 3.2 完全恢复的步骤 1)restore: OS拷贝命令还原所有或部分datafile 2)recover:
sql*PLUS利用归档日志和当前的redo日志做恢复 3.3 手工完全恢复可以基于三个级别 recover database:
包括system表空间损坏或大部分datafile丢失,一般是在mount状态完成 recover tablespace: 非关键表空间损坏,表空间下某些数据
文件不能访问,一般是在open下完成 recover datafile: 单一或少数数据
文件损坏,可以在mount或open 状态完成 什么是关键
文件:如果关键
文件损坏,
数据库将不能维持在open状态,或崩溃或死机! 注意点:哪些
文件是关键
文件:四个:1)system01.dbf,2) undo tablespace,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 [oracle@timran ~] $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> select * from scott.test; ID ---------- 2 3 //这条记录未提交,恢复时会回滚掉 1 1)模拟介质失败,所有数据
文件丢失 [oracle@timran ~]$ rm /u01/oradata/timran11g/system01.dbf //
数据库在打开的情况下就删掉了所有dbf
文件 $
sqlplus / as sysdba //换个session
登录,然后
关闭数据库 sql> shutdown abort //
数据库直接abort了 2)启动database,报错!
sql> startup
sql>select file#,error from v$recover_file; 3)首先还原system01.dbf数据
文件 [oracle@timran ~]$ cp /u01/back1/system01.dbf /u01/oradata/timran11g 比较控制
文件和数据
文件头的SCN
sql> select file#,checkpoint_change# from v$datafile;
sql> select file#,checkpoint_change# from v$datafile_header; 4)恢复database
sql> recover database; 5)打开
数据库 sql> alter database open; 6)验证
sql> select * from scott.test; ID ---------- 2 1 范例2:recover tablespace(状态:database open) 说明:针对的是非关键表空间的损坏,基于表空间的完全恢复实际上还是对其下的datafile的恢复 模拟这种情形非常实用,通常是某个非关键表空间下的数据
文件受损,但并没有造成Oracle崩溃,我们只需针对个别有问题的tablespace去做单独的在线恢复操作,也就是说恢复时
数据库整体是online的,而局部表空间是offline的,
数据库不需要shutdown。 恢复表空间(
删除了tablespace下的所有的datafile) 1)了解一下当前状态,在test表空间上建立scott.t1表,
sql> conn scott/scott
sql> create table t1 (id int) tablespace test;
sql> insert into t1 values(1);
sql> commit;
sql> select * from t1; NAME -------------------------------------------------- 1 2)模拟表空间损坏,
数据库open下,直接
删除表空间下的数据
文件 [oracle@timran ~]$ rm /u01/oradata/timran11g/test01.dbf [oracle@timran ~]$ 3)查证该表空间上的表不可访问了
sql> alter system flush buffer_cache; //清除data buffer
sql> conn / as sysdba //换个session登陆,访问t1表,因内存里已清除了buffer块,只好去做物理读,所以报错!
sql> select * from scott.t1; 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)test表空间offline
sql> alter tablespace test offline immediate; //immediate使表空间能立即脱机,不等Oracle对任何数据
文件做检查 6)
数据库open下,使用备份还原这个表空间下的所有数据
文件 [oracle@timran ~]$ cp /u01/back1/test01.dbf /u01/oradata/timran11g 7)恢复tablespace
sql> recover tablespace test; 8)使表空间online
sql> alter tablespace test online; //注意:此时
数据库状态一直是open的。 9)验证
sql> select * from scott.t1; ID -------------------------------------------------- 1 范例3:(recover datafile,database mount或open状态) 恢复datafile,同范例2不同的是模拟UNDO
文件损坏: 因UNDO数据
文件也是关键
文件,所以只能在mount状态下恢复。 1) 模拟环境:
sql> insert into scott.t1 values(2); //插入一行记录是为了使t1和备份有区别
sql> commit;
sql> select * from scott.t1; ID -------------------------------------------------- 1 2
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 ...
数据库装载完毕。 ORA-01157: 无法标识/锁定数据
文件 3 - 请参阅 DBWR 跟踪
文件 ORA-01110: 数据
文件 3: '/u01/oradata/timran11g/undotbs01.dbf' 5)还原并恢复UNDO数据
文件 [oracle@timran timran11g]$ cp /u01/back1/undotbs01.dbf ./
sql> recover datafile 3; 完成介质恢复。 6)打开
数据库(会完成UNDO表空间数据的回滚)
sql> alter database open;
数据库已更改 7) 验证
sql> select * from scott.t1; ID -------------------------------------------------- 1 2 3.7 手工完全恢复特点小结: 3.7.1 recover database (system01.dbf或大部分数据
文件损坏,mount下进行) OS: 使用cp 还原受损的dbf(不一定是全部,v$recover_file记录的都需要还原)
sqlPLUS: 1)recover database; 2)alter database open; 3.7.2 recover tablespace (针对表空间的非关键数据
文件损坏,一般是open下进行) OS:使用cp 还原该表空间XXX下的所有数据
文件 sqlPLUS: 1)alter tablespace XXX offline; 2)recover tablespace XXX; 3)alter tablespace XXX online; 3.6.3 recover datafile (单个或几个数据
文件损坏,关键
文件在mount下进行,非关键
文件在open下进行) OS:使用cp 还原相关的关键数据
文件(mount)
sqlPLUS: 1)recover datafile 6,8; 2)alter database open; OS:使用cp 还原相关的非关键数据
文件(open)
sqlPLUS: 1)alter database datafile 6,8 offline; 2)recover datafile 6,8; 3)alter database datafile 6,8 online;
原文链接:https://www.f2er.com/oracle/211612.html