说明:项目生产环境所使用的rman备份脚本使用的是incremental level 0进行全库备份。这里是使用了生产环境所用的备份脚本进行测试。1-3为测试步骤:
1. backup database use rman
oracle@train_ocsdb[/]$ rman target /
Recovery Manager: Release 12.2.0.1.0 - Production on Mon Jan 6 17:29:00 2020
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
connected to target database: CC (DBID=2213285106)
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/ccbackup/cf_%F';
RMAN> run {
allocate channel 'dev1' type disk;
allocate channel 'dev2' type disk;
allocate channel 'dev3' type disk;
allocate channel 'dev4' type disk;
backup incremental level 0 tag 'dbL0' format '/ccbackup/%d_Incr0_%T_%s_%u' database INCLUDE CURRENT CONTROLFILE;
backup format '/ccbackup/%d_log_%T_%U' archivelog until time 'sysdate' delete all input ;
release channel 'dev1';
release channel 'dev2';
release channel 'dev3';
release channel 'dev4';
delete noprompt obsolete;
}
2. drop database
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
SQL> alter system enable restricted session;
SQL> drop database;
3. recover database
- database started to nomount
RMAN> startup nomount - Restore spfile from backup
RMAN> restore spfile from '/archcc/fast_recovery_area/CC/autobackup/2020_01_07/o1_mf_s_1029092020_h19zh4nw_.bkp';
RMAN> shutdown immediate;
RMAN> startup nomount - Restore control file from backup
RMAN> restore controlfile from '/ccbackup/cf_c-2213285106-20200107-04';
RMAN> alter database mount; - Setting recovery catalog
RMAN> catalog start with '/ccbackup/'; - RMAN restore and recover database
RMAN>run {
allocate channel 'd1' type disk;
allocate channel 'd2' type disk;
allocate channel 'd3' type disk;
allocate channel 'd4' type disk;
restore database;
recover database;
release channel d1;
release channel d2;
release channel d3;
release channel d4;
}
6.open database
RMAN> alter database open resetlogs;
4. 问题描述
在recover database时报错如下:
这是因为控制文件太旧而导致的报错,找不到归档日志。
一般情况下,recover database都会出现以上的报错,因为归档的备份没有记录在控制文件中,alter database open resetlogs 可以打开数据库,而在incremental 0全库备份的情况下,alter database open resetlogs 会提示报错。
5. 问题分析
1. 分析备份脚本
backup incremental level 0 tag 'dbL0' format '/ccbackup/%d_Incr0_%T_%s_%u' database INCLUDE CURRENT CONTROLFILE;--- 全库备份,也备份控制文件
backup format '/ccbackup/%d_log_%T_%U' archivelog until time 'sysdate' delete all input ; ---删除现有的归档日志,然后备份新产生的归档日志。
2. 查看备份文件
由于测试rman备份期间,数据库没有任何操作,所以没有产生归档日志,rman只备份了数据文件和控制文件,没有备份归档日志。进而在恢复时会报错。
3. rman恢复步骤
首先恢复spfile,然后恢复controlfile,然后根据controlfile的信息来恢复数据文件,最后根据归档来恢复controlfile没有记录到的数据变化。
incremental 0的备份方式在恢复全库时,会去查找备份的归档日志,如果不存在,则会报错。
由于在测试时,数据库没有任何操作,没有产生新的归档日志,所以在alter database open时报错。
6. 问题解决
- 在rman备份期间,手动切归档:alter system switch logfile
- 更改脚本
run {
allocate channel 'dev1' type disk;
allocate channel 'dev2' type disk;
allocate channel 'dev3' type disk;
allocate channel 'dev4' type disk;
backup incremental level 0 format '/oradata/export/rman/%d_Incr0%T%s_%u' database;
sql 'alter system archive log current';
backup format '/oradata/export/rman/%d_log%T%U' archivelog until time 'sysdate' delete all input ;
release channel 'dev1';
release channel 'dev2';
release channel 'dev3';
release channel 'dev4';
delete noprompt obsolete;
}
- 总结:
1) 在生产环境中,数据库会产生归档日志,所以不会出现恢复时报错的问题。
2) backup database和incremetal 0虽然都是备份全库的命令,但是在恢复时backup database即使没有归档也能恢复,incremetal 0则必须要有归档日志。