最近做了一次rman的恢复测试,记录一下。
开启两个终端:
rman:rman target /;
sql:sqlplus / as sysdba;
先说一下增量和全量,增量是在全量的基础上做的备份
增量分为差异增量和累计差异增量
差异增量:
备份逻辑:当前level n到最近一次level n 或最近一次小于n期间增加的数据
累计差异增量:
备份逻辑:当前level n到最近一次小于level n期间增加的数据
图片来自:http://blog.sina.com.cn/s/blog_70ca64640100v5g9.html
由于本次备份采用的是周日:全量leve 0,周一~周六 增量leve 1
所以恢复时先restore database(恢复全量),recover database(增量恢复部分,介质恢复)
1.参数文件
由于是异机恢复,内存大小都不一样,一不小心把参数文件也给恢复了(竟然还忘记了备份),最后只得初始化了下参数文件,
其实恢复时参数文件可以先不用恢复,除非环境相同
查询原来的位置:show parameter spfile;
---/home/opt/oracle/11g/dbs/spfilepdm.ora
rman:
restore spfile to '/home/opt/oracle/11g/dbs/spfilepdm1.ora' from '/home/opt/oracle/pdm_recovery_bak/20190609/pdm_lev0_201906092200_c-2539989307-20190610-01'
create pfile from spfile;会生成initxxx.ora的文件
修改pfile
如果还是不成功 从init.ora复制一个模板改一下
2.恢复控制文件
由于本次的备份集的信息时写在控制文件中的,所以需要恢复一下控制文件,这样才能使用list backupset查询备份集信息。(另外备份集还可写在数据库中,一般是多台数据库备份时使用,方便管理)
rman:
alter database mount;
restore controlfile from '/home/opt/oracle/pdm_recovery_bak/20190609/cntl_lev0.bak';
alter database mount时报:
ORACLE报错 ORA-00201: control file version 11.2.0.4.0 incompatible with ORACLE version 11.2.0.0.0
以pfile启动(创建出pfile文件,删除spfile文件即可,create pfile from spfile;会生成initxxx.ora的文件),手动修改pfile文件中的版本为11.2.0.4.0
3.备份的数据集过期
rman:
crosscheck backup;#验证备份集信息是否过期,如果过期,需要删除后重新注册
delete expired backup;#删除过期的备份集信息,这个只是删除了控制文件中的备份信息
rman:
catalog start with '/home/opt/oracle/pdm_recovery_bak/';#重新注册
rman:
list backup summary;查看备份集注册情况
4.恢复数据文件
restore database;如果目录不同会恢复失败执行
圈中的是datafile文件号,由于数据库与备份集数据库的数据文件的存储路径不一致,所以需要设置下路径,运行下面的脚本:
由于数据文件较多,所以只粘了下面的模板:
rman:
{
set newname for datafile 1
to 'C:\oracle\product\10.2.0\oradata\orcl\SYSTEM.DBF'; #实例中SYSTEM.DBF放置的位置
set newname for datafile 2
to 'C:\oracle\product\10.2.0\oradata\orcl\UNDOTBS1.DBF';
set newname for datafile 3
to 'C:\oracle\product\10.2.0\oradata\orcl\SYSAUX.DBF';
set newname for datafile 4
to 'C:\oracle\product\10.2.0\oradata\orcl\USERS.DBF';
set newname for datafile 5
to 'C:\oracle\product\10.2.0\oradata\orcl\PDM_DATA.DBF';
restore database;
recover database;
switch datafile all ;
}
查看恢复进度
sql:
select sid,opname,serial#,context,sofar,totalwork,round(sofar/totalwork*100,2) "%_complete" from v$session_longops where opname like 'RMAN%' and opname not like '%aggregate%' and totalwork != 0 and sofar <> totalwork order by "%_complete" des
可以看到文件正在恢复
实际上由于空间不足的问题,我是分开恢复的,,先恢复的全量大慨600多个G的文件(模板中的set newname 到restore database部分),之后把全量的文件删掉,把控制文件中的全量的备份集注册信息删掉(步骤2),然后(模板中的set newname 到去掉restore database部分)
执行完成后会出现下面的错误:
这是由于数据库重新启动的时候,Oracle将文件头中的那个启动scn(v$datafile_header中记录的scn)与数据库文件检查点scn进行比较,如果这两个值相互匹配,oracle接下来还要比较数据文件头中的启动scn和控制文件中数据文件的终止scn。如果这两个值也一致,就意味着所有数据块多已经提交,所有对数据库的修改都没有在关闭数据库的过程中丢失,因此这次启动数据库的过程也不需要任何恢复操作,此时数据库就可以打开了。当所有的数据库都打开之后,存储在控制文件中的数据文件终止scn的值再次被更改为null,这表示数据文件已经打开并能够正常使用了。如果数据库是异常关闭或者通过不完全恢复过来的,那么终止scn会是null,所以启动数据库时,就需要做实例恢复,利用online redolog来恢复数据库,这也就是实例启动时,SMON进程会去利用redolog做恢复,俗称‘前滚‘数据库。(此段文字摘自:https://blog.csdn.net/qq_22935429/article/details/50558321 )
最后一行的scn就是能恢复到的scn
执行:recover database until scn XXXXX;
这时报redo文件不存在,是因为我的数据库和备份集中redo路径不一致导致的
sql:
select * from v$logfile;-- 查出当前控制文件所记录的redo路径
select sequence#,group#,status from v$log; --当前redo文件的组号和状态
ORA-00349 redo路径不一致报的错误
修改路径:
ALTER DATABASE RENAME FILE '/data/pdm/DATA/pdm/redo04.log' TO '/home/opt/oracle/oradata/pdm/redo001.log';
ALTER DATABASE RENAME FILE '/data/pdm/DATA/pdm/redo05.log' TO '/home/opt/oracle/oradata/pdm/redo002.log';
ALTER DATABASE RENAME FILE '/data/pdm/DATA/pdm/redo06.log' TO '/home/opt/oracle/oradata/pdm/redo003.log';
ora-00392 日志正在清除故障
select group#,bytes/1024/1024||'M',status from v$log;-- 查询清楚状态
根据查出的组号执行下面sql语句
ALTER DATABASE CLEAR LOGFILE GROUP 4;
ALTER DATABASE CLEAR LOGFILE GROUP 5;
ALTER DATABASE CLEAR LOGFILE GROUP 6;
此时rman执行 alter database open resetlogs;启动成功
rman执行的xshell日志在:https://me.csdn.net/download/qq_35201754