RMAN中的恢复对应两个操作:数据库修复(restore)和数据库恢复(recover)
数据库修复(restore):是指利用备份集的数据文件来替换已经损坏的数据库文件或者将其恢复到一个新的位置.RMAN在进行修复操作时,会利用恢复目录(没有建立恢复目录就使用目标数据库的控制文件)来获取备份信息
,并从中选择合适的备份进行恢复
数据库修复(recover):是指应用所有重做日志,将数据库恢复到崩溃前的状态,或者应用部分REDO,将数据库恢复到指定的时间点.
9.1RMAN恢复操作扫盲
恢复分三个步骤
将数据库置于正确的状态
执行完全或者不完全恢复
打开数据库
1.RMAN如何选择备份集
RMAN一开始也不知道,它只遵循固定的规则,按照你的要求去寻找合适的备份集,首先寻找最近的可用备份集
2.RMAN恢复中的自动化
恢复中如果备份片段出现错误,会自动寻找备份片段的冗余
3.增量恢复和应用重做日志
执行rescover命令时,如果创建了增量备份,则RMAN优先选增量备份镜像恢复.
9.2.1对数据库进行完全介质恢复
(1)启动数据库到加载状态
startup mount
(2)执行恢复操作
restore database
recover database
(3)打开数据库
alter database open
上述操作是假设数据库是在归档模式下进行,如果是非归档模式,在执行restore命令前,首先需要恢复之前备份的控制文件,并且执行了restore好recover命令后,必须以open resetlogs方式打开数据库
9.3RMAN恢复实例
9.3.1归档模式有备份丢失数据文件的恢复
1,构造数据
使用scott登录新建表及插入几行数据
create table tmp1 (name varchar2(20));
insert into tmp1 values('test1');
insert into tmp1 values('test2');
insert into tmp1 values('test3');
commit;
查询
2,备份(backup database)
3,模拟数据文件丢失
shundown immediate;
删除数据文件
rm -rf /home/oracle/app/oracle/oradata/orcl/system01.dbf
无法登录数据库了
在sql启动的时候提示无法锁定数据文件1 我们不需要全库恢复只恢复数据文件1即可
rman target/
startup mount;
restore datafile 1;
recover datafile 1;
alter database open;
数据回来了
9.3.2归档模式无备份丢失数据文件的恢复
创建一个表空间books和用户并授予相应权限
create tablespace books datafile '/home/oracle/app/oracle/oradata/orcl/BOOKS01.DBF' size 100m;
create user jss identified by jss default tablespace books quota unlimited on books;
grant connect,resource to jss;
初始化一些数据
conn jss/jss
create table book_list(book_id number primary key,bookname varchar2(100),create_data date);
insert into book_list values (1,'liuyueming',sysdate);
关闭数据库删除数据文件
重启数据库会报错
此时是没有创建备份的
执行修复
首先通过alter database create datafile命令重建一个该文件,如果是由于磁盘损坏导致改文件丢失可能原路径已经无法访问,可以在创建数据文件时,指定一个新的路径.由于这里是模拟丢失,原路径可用,由此在原路径下面创建同名文件:
alter database create datafile '/home/oracle/app/oracle/oradata/orcl/BOOKS01.DBF' as '/home/oracle/app/oracle/oradata/orcl/BOOKS01.DBF';
执行recover命令修复数据文件
recover datafile 5;
打开数据库
alter database open;
测试原数据是否回来了
conn jss/jss
select * from book_list;
丢失的数据文件,从其创建时刻起所有的重做日志文件都还在,由此我们可以在重建改数据文件后,通过recover命令应用所有重做日志文件的方式,重建该数据文件中的内容.
这次修复没有动用RMAN,使用RMAN同样可以处理这种情况,操作步骤是一样的,重建数据文件这一步还是不能少
需要在sql下进行alter database create datafile '/home/oracle/app/oracle/oradata/orcl/BOOKS01.DBF' as '/home/oracle/app/oracle/oradata/orcl/BOOKS01.DBF';
restore datafile 5;
recover datafile 5;
alter database open;
9.3.3丢失控制文件的修复
在nocatalog模式下,RMAN创建的备份信息都将保存在目标数据库的控制文件中,所以一旦控制文件丢失,不仅目标数据库崩溃,连RMAN的备份信息也尽数丢失,如果这时候控制文件有备份,那还有救
1,关闭数据库
shutdown immediate
2,手动删除控制文件
rm -rf control01.ctl
这时候无法启动到mount状态了
3,连接rman
由于目标数据库的控制文件丢失了所以配置也丢失了,全恢复为默认
此时要恢复控制文件,不能直接使用restore controlfile from autobackup;命令了
4,恢复控制文件
restore controlfile from '/home/oracle/rman_backup/cf_c-1486878221-20171108-03';
5,挂载数据库
recover database;
6,打开数据库
alter database open resetlogs;
由于是通过备份的控制文件恢复,由此打开必须指定resetlogs;
验证一下
9.3.4丢失联机重做日志文件的修复
Oracle的联机重做日志文件保存重做信息,用来循环记录oracle数据库的操作,几乎时刻都在写,由此单纯备份某个时间点的联机重做日志文件没有意义,恢复时用不上,强制恢复还可能造成数据丢失.
由于Oracle运行过程中自动对联机重做日志进行锁定,无法通过操作系统命令删除,通常丢失联机重做日志文件是磁盘损坏导致,这里演示是shutdown后手动删除
PS:测试可以在oracle运行中使用rm -rf 删除
9.3.4.1丢失非当前联机重做日志文件
首先查看一下当前的联机重做日志文件是不是当前使用状态
select group#,thread#,sequence#,members,archived,status from v$log;
可以看到日志文件1 是当前状态,2,3从未使用过
查看视图对应的文件
select group#,member from v$logfile;
关闭数据库后删除非当前联机日志文件
rm -rf /home/oracle/app/oracle/oradata/orcl/redo02.log
PS:数据库正常运行,除非是关闭了重启会报错
通过命令重建即可
alter database clear logfile group 2;
对应的文件回来了
9.3.4.2丢失当前的联机重做日志文件
如果丢失的是当前的联机重做日志文件无法通过上述命令修复
执行不完全修复
如果没有最近的备份只能强制修复了
启动到nomount状态,修改一个隐藏的初始化参数
alter system set "_allow_resetlogs_corruption"=true scope=spfile;
设置该参数为true以后,在open时会跳过一些一致性检测
启动到mount状态
对数据库进行不完全修复
recover database until cancel;
打开数据库
alter database open resetlogs;
善后处理
这种恢复办法是没有办法中的办法,通过这种方式恢复可能会导致数据库中数据不一致,如已提交的数据未写入,未提交的已经写入.如果可以顺利打开,强烈建议马上通过export逻辑导出方式执行一次full export.然后新建数据库,再通过import导入之前导出的二进制文件.