必须提前配置DB_FILE_NAME_CONVERT,否则主库添加数据文件后备库无法自动创建对应文件,将报ORA-01119或挂起恢复;需确保参数成对、路径严格匹配,并在主库操作前完成配置。
不能直接在主库加数据文件就自动同步到备库——必须提前配置 db_file_name_convert,否则备库会报 ora-01119 或挂起恢复。
主库添加数据文件前,必须确认备库参数已生效
主库执行 ALTER TABLESPACE ... ADD DATAFILE 后,备库不会自动创建对应路径的文件。它依赖 DB_FILE_NAME_CONVERT 参数做路径映射。若该参数未设或值错误,备库 RFS 进程写归档时就会失败,MRP(Managed Recovery Process)卡住,V$ARCHIVE_DEST_STATUS 中 STATUS 显示 ERROR,ERROR 列出现 ORA-01119 或 ORA-17627。
检查方式:
- 主备库都运行:
SHOW PARAMETER db_file_name_convert,确认非空且格式为'/old/path/', '/new/path/'(成对出现,单引号+逗号分隔) - 若用的是 spfile,修改后需重启备库或执行
ALTER SYSTEM SET DB_FILE_NAME_CONVERT=... SCOPE=SPFILE再重启 - 注意大小写和末尾斜杠:Linux 下
/u01/oradata/primary/和/u01/oradata/standby/必须严格匹配,多一个空格或少一个/都会导致转换失败
主库添加数据文件的正确操作顺序
不是加完就完事——要确保归档能被备库识别、转换、应用。关键点在于“先有路径,再有文件”。
- 主库上先创建目录(如果还没建):
mkdir -p /u01/oradata/ora11g/new_tbs/ - 主库执行添加语句,显式指定绝对路径:
ALTER TABLESPACE users ADD DATAFILE '/u01/oradata/ora11g/new_tbs/users02.dbf' SIZE 100M; - 立即切一次归档:
ALTER SYSTEM ARCHIVE LOG CURRENT;,触发日志传输 - 在备库查:
SELECT NAME FROM V$DATAFILE WHERE NAME LIKE '%new_tbs%';—— 若返回空,说明转换失败;若返回路径是主库路径,说明DB_FILE_NAME_CONVERT没生效 - 若失败,可临时在备库手动创建(仅应急):
ALTER DATABASE CREATE DATAFILE '/u01/oradata/ora11g/new_tbs/users02.dbf' AS '/u01/oradata/ora11g_standby/new_tbs/users02.dbf';,再继续恢复
常见坑:RMAN DUPLICATE 或 ADG 初始化后漏配转换规则
很多团队用 RMAN DUPLICATE FOR STANDBY 搭建备库,但默认不生成 DB_FILE_NAME_CONVERT。尤其当主备路径不一致(比如主库在 /oradata/,备库在 /u01/oradata/),这个参数就是刚需。
- 主库参数中必须含:
DB_FILE_NAME_CONVERT='/oradata/','/u01/oradata/'(注意结尾斜杠) - 若主库用 ASM,备库用文件系统,则必须写成:
DB_FILE_NAME_CONVERT='+DATA/ora11g/','/u01/oradata/ora11g/' - 不要试图用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT强行跳过——它不会帮你建文件,只会报错停住 - Oracle 11g 不支持
STANDBY_FILE_MANAGEMENT=AUTO自动创建数据文件(那是 12c+ 的功能),所以人工配参是唯一可靠方式
验证是否真正同步成功
别只看 MRP 进程在跑,要确认新文件已被打开且可读写。
- 主备库分别查:
SELECT FILE_NAME, STATUS, ENABLED FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'USERS';,对比文件名和状态 - 在备库启用只读模式后(ADG 场景),执行:
SELECT COUNT(*) FROM V$DATAFILE WHERE NAME LIKE '%new_tbs%';应返回 1 - 最硬核验证:主库往新数据文件所在表空间插入测试数据,然后在备库只读状态下查询该表——能查到才叫真同步
- 特别注意:如果备库用了
LOG_ARCHIVE_DEST_n中的NOREGISTER,归档可能没传过去,DB_FILE_NAME_CONVERT再对也没用
最易被忽略的是:主库加完文件后,没人去查备库的 ALERT.log。里面一句 WARNING: File #N added to control file as 'UNNAMED'. 就意味着转换彻底失败,但数据库表面还在“恢复中”。











