首先是使用incremental增量备份刷新standby步骤。此方法在archive已经被删除时经常会用到。
1. 获得当前standby的最小scn
SQL> select to_char(CURRENT_SCN) FROM V$DATABASE;
TO_CHAR(CURRENT_SCN)
----------------------------------------
9266396404266
SQL> select to_char(min(checkpoint_change#)) from v$datafile_header ;
TO_CHAR(MIN(CHECKPOINT_CHANGE#))
----------------------------------------
9266396404267
选择使用最小的SCN在主库上做一个增量备份。如果文件头的scn与v$database中的scn差别非常大,有可能是由于部分数据文件出现问题,比如曾出现过如下操作:如果增量备份集不包含某一个数据文件N,但是恢复时使用了restore datafile N,此时N文件将被重写为最开始创建时的SCN。针对此类问题,可以单独备份datafile而不是使用全库的增量备份去解决。
run{
allocate channel prmy1 type disk maxpiecesize=16g;
allocate channel prmy2 type disk maxpiecesize=16g;
allocate channel prmy3 type disk maxpiecesize=16g;
allocate channel prmy4 type disk maxpiecesize=16g;
backup as compressed backupset incremental from scn 9266396404260 database format '/oradump/db_incre%T_%d_%p_%s.dmp';
RELEASE CHANNEL prmy1;
RELEASE CHANNEL prmy2;
RELEASE CHANNEL prmy3;
RELEASE CHANNEL prmy4;
}
2. 将备份集传输到standby并在控制文件中注册备份集
catalog backuppiece '/rman/db_incre20181210_orcl_1_66032.dmp';
catalog backuppiece '/rman/db_incre20181210_orcl_1_66033.dmp';
catalog backuppiece '/rman/db_incre20181210_orcl_1_66034.dmp';
catalog backuppiece '/rman/db_incre20181210_orcl_1_66035.dmp';
3. 使用增量备份restore备库
run{
allocate channel prmy1 type disk;
...
allocate channel prmy8 type disk;
RECOVER DATABASE NOREDO;
RELEASE CHANNEL prmy1;
....
RELEASE CHANNEL prmy8;
}
如果相差时间不大,或者中间不曾添加过数据文件,此时直接
RECOVER MANAGED STANDBY DATABASE DISCONNECT;
就可以启动数据库同步了。否则还需要更新新的控制文件。此时启动standby同步时仍会提示缺少旧的archivelog。可以使用查询查看是否添加过文件。
SELECT FILE#, NAME FROM V$DATAFILE WHERE CREATION_CHANGE# > 9266396404266;
4. 更新控制文件
a. 主库备份控制文件
BACKUP CURRENT CONTROLFILEFOR STANDBYFORMAT '/oradump/control_bak.bck';
b. copy到备库并且restore
spool datafile_names_step6.txt
set lines 200
col name format a60
select file#, name from v$datafile order by file# ;
spool off
shutdown immediate ;
startup nomount;
restorestandby controlfilefrom '/arch/rman/control_bak.bck';
alter database mount;
c. 备库上注册数据文件
CATALOG START WITH '/DB_DATA/DB_DATA/DATAFILE/';
SWITCH DATABASE TO COPY;
正常情况下standby就可以正常恢复了
RECOVER MANAGED STANDBY DATABASE DISCONNECT;
问题:
启动recover后alert出现大量错误:
Errors in file u01/app/oracle/diag/rdbms/DB_DATA/DB_DATA/trace/DB_DATA_dbw0_68939.trc:
ORA-01157: cannot identify/lock data file 50 - see DBWR trace file
ORA-01110: data file 50: '/DB_DATA/DB_DATA/datafile/int_data.528.993504119'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
通过对比发现原controfile中50的路径为:
/DB_DATA/DB_DATA/datafile/DB_DATA/datafile/o1_mf_int_data_g00pd5tk_.dbf
同时所有报错文件都在/DB_DATA/DB_DATA/datafile/DB_DATA/datafile路径下。
原因:
db_create_file_dest=/DB_DATA/DB_DATA/datafile/
db_file_name_convert='+DB_DATA/orcl/datafile/,/DB_DATA/DB_DATA/datafile/,+BUSDB_DATA/orcl/tempfile/,/DB_DATA/DB_DATA/datafile/'
首先ASM不会出现这个问题。此问题只出现在使用文件系统的dataguard中。如果同时设置了db_create_file_dest 和 db_file_name_convert参数,并且主备库文件路径不一致时就会发生。当standby可以正常工作时,经过archivelog的恢复,创建的新文件将使用db_create_file_dest参数值,OMF将在此文件夹下创建SID/datafile/new_file_name文件。而在使用ramn进行restore中,只有db_file_name_convert参数起作用。此时即便单独catalog数据库也是无法识别的。
RMAN> CATALOG START WITH '/DB_DATA/DB_DATA/datafile/DB_DATA/datafile/';
searching for all files that match the pattern DB_DATA/DB_DATA/datafile/DB_DATA/datafile/List of Files Unknown to the Database=====================================
File Name: DB_DATA/DB_DATA/datafile/DB_DATA/datafile/o1_mf_int_data_g00pd5tk_.dbf
解决办法:
mv ./datafile/DB_DATA/datafile/o1_mf_int_data_g00pd5tk_.dbf ./
run{
set newname for datafile 49 to '/DB_DATA/DB_DATA/datafile/app_legal_tbs.845.993503729';
restore datafile 49;
switch datafile 49;
}
然后重启standby recover apply就可以了。为了避免以后出现同样的问题,此时应该将db_create_file_dest置为空。
alter system set db_create_file_dest='' scope=both;
注:
如果standby可以正常运行,而检查发现相同的问题,则不应该使用相同的rman解决方案。原因:
1. 因为rman使用的是restore命令基于备份集,如果控制文件中没有相关的备份信息或者找不到备份集,此时restore datafile不会报错,而是在指定目录下生成一个空DB文件,此文件的scn为主库当时创建文件时的SCN,通过v$datafile_header可以看到相关信息。
2. 因为standby正常运行,所以实际上此数据文件是和主库保持一致的,此时只需要控制文件中rename即可。
解决方法:
RECOVER MANAGED STANDBY DATABASE cancel;
mv ./datafile/DB_DATA/datafile/o1_mf_int_data_g00pd5tk_.dbf ./
alter database datafile 'old_path' rename to 'new_path';
RECOVER MANAGED STANDBY DATABASE DISCONNECT;