最近遇到了复制数据(DUPLICATE TARGET DATABASE TO xxx)的时候 Oracle 源和目标库目录不一致的问题,比较初级但也踩到一些坑,整理记录一下。主从库搭建的时候注意事项其实也类似,而且更通用,所以标题写的是主从库目录。
优先级:
db_create_file_dest > db_file_name_convert 与 log_file_name_convert > 不设置
为方便理解,从库以下面参数配置为例:
db_create_file_dest='/u01/erpuat/db/apps_st/data/'
db_file_name_convert='/u01/erpdev/db/apps_st/data/erpdev/datafile/','/u01/erpuat/db/apps_st/data/erpuat/datafile/','/u01/erpdev/db/apps_st_02/data/erpdev/datafile/','/u01/erpuat/db/apps_st_02/data/erpuat/datafile/'
log_file_name_convert ='/oracle/fra/erpdev/onlinelog','/oracle/fra/erpuat/onlinelog','/u01/erpdev/db/apps_st/data/erpdev/onlinelog','/u01/erpuat/db/apps_st/data/erpuat/onlinelog'
无论是否设置convert参数,数据文件、redo文件均放在db_create_file_dest目录下(会自动创建子目录)。如果主库数据文件分在多个目录,从库会合并放在该目录,但要特别注意空间问题。
数据文件、redo文件:/u01/erpuat/db/apps_st/data/
数据文件按指定路径替换,redo文件按照主库目录。如果有不存在的,会遇到报错。
数据文件:/u01/erpuat/db/apps_st/data/erpuat/datafile/ 与 /u01/erpuat/db/apps_st_02/data/erpuat/datafile/
redo文件:/oracle/fra/erpdev/onlinelog 与 /u01/erpdev/db/apps_st/data/erpdev/onlinelog
目录不存在报错如下
注意它没有直接报目录不存在,但写出了报错的数据文件路径,可以自己在从库检查。
input datafile file number=00003 name=/u01/erpdev/db/apps_st/data/erpdev/datafile/o1_mf_test_da_os0rabc9_.dbf
RMAN-03009: failure of backup command on c8 channel at 08/18/2023 15:20:40
ORA-17628: Oracle error 19505 returned by remote Oracle server
continuing other job steps, job failed will not be re-run
redo文件按指定路径替换,数据文件按照主库目录。如果有不存在的,会遇到报错。
数据文件:/u01/erpdev/db/apps_st/data/erpdev/datafile/ 与 /u01/erpdev/db/apps_st_02/data/erpdev/datafile/
redo文件:/oracle/fra/erpuat/onlinelog 与 /u01/erpuat/db/apps_st/data/erpuat/onlinelog
目录不存在报错如下
这个倒是直接报目录不存在,但它是在所有数据文件复制完成后,重建控制文件时报的。如果数据量很大,会经过漫长等待之后卡在这步报错然后要重来,尴尬...
RMAN-06136: ORACLE error from auxiliary database: ORA-01503: CREATE CONTROLFILE failed
ORA-00349: failure obtaining block size for '/oracle/fra/erpdev/onlinelog/o1_mf_1_k5abdh25_.log'ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 9
数据文件、redo文件都按指定路径替换。如果有不存在的,会遇到报错。
数据文件:/u01/erpuat/db/apps_st/data/erpuat/datafile/ 与 /u01/erpuat/db/apps_st_02/data/erpuat/datafile/
redo文件:/oracle/fra/erpuat/onlinelog 与 /u01/erpuat/db/apps_st/data/erpuat/onlinelog
数据文件、redo文件都按照主库目录。如果有不存在的,会遇到报错。
数据文件:/u01/erpdev/db/apps_st/data/erpdev/datafile/ 与 /u01/erpdev/db/apps_st_02/data/erpdev/datafile/
redo文件:/oracle/fra/erpdev/onlinelog 与 /u01/erpdev/db/apps_st/data/erpdev/onlinelog
两个convert参数效果都是一样的,这里以 db_file_name_convert 为例。
假如目录结构是这样的
但我是这么设置的(只写到了data目录那级)
db_file_name_convert='/u01/erpdev/db/apps_st/data/','/u01/erpuat/db/apps_st/data/'
同步的时候会不会报错?
答案是会的,因为转换后从库找的是 /u01/erpuat/db/apps_st/data/erpdev/datafile/,因为子目录没有设置转换,它还是会按照原来的erpdev。而从库实际是没有这个目录的,因此会遇到报错。
参考
DATAGUARD中db_file_name_convert和db_create_file_dest_51CTO博客_dataguard_status
https://www.cnblogs.com/xqzt/p/5089826.html
Multiple Standby Databases Dataguard Oracle - EasyOraDBA
RMAN Duplicate failing with RMAN-06136, ORA-01503, ORA-00349 (Doc ID 2206423.1)