ORA-01111/UNNAMED错误主因是standby_file_management=MANUAL或db_file_name_convert未配/错配,导致MRP无法自动创建文件而卡在WAIT_FOR_LOG;须先查参数模式与配置,再验证路径、权限、空间,最后人工重定向UNNAMED文件并切回AUTO恢复。
备库报 ora-01111、unnamed 文件,mrp 进程卡在 wait_for_log,八成不是归档断了,而是主库新增数据文件时,备库根本没地方写——db_file_name_convert 配置错或压根没配。
为什么 DB_FILE_NAME_CONVERT 不生效?
这个参数只在 standby_file_management=AUTO 时起作用。如果备库当前是 MANUAL 模式,哪怕你配得再准,Oracle 也完全无视它,直接 fallback 到生成 UNNAMED 占位文件。
- 查当前模式:
SHOW PARAMETER standby_file_management,必须是AUTO - 查是否已配置:
SHOW PARAMETER db_file_name_convert,返回为空就等于没设 - 注意:该参数是字符串对列表,不是正则;路径末尾斜杠必须一致(
/u01/oradata/和/u01/oradata视为不匹配) - 主库路径含空格或特殊字符(如
/data/ora home/)会导致转换失败,日志里只报file creation failed,不提示原因
如何正确配置 DB_FILE_NAME_CONVERT?
必须用单引号包裹整个值,且成对出现;路径顺序是「主库路径, 备库路径」,不能反。
- 示例(主库路径
/u01/oradata/prod/→ 备库路径/u02/oradata/standby/):ALTER SYSTEM SET db_file_name_convert='/u01/oradata/prod/','/u02/oradata/standby/' SCOPE=BOTH; - 若主库有多个表空间目录,需全部列出:
ALTER SYSTEM SET db_file_name_convert='/u01/oradata/prod/','/u02/oradata/standby/','/u01/fast_recovery_area/prod/','/u02/fast_recovery_area/standby/' SCOPE=BOTH; - 切忌混用大小写或相对路径;备库目标路径必须真实存在、oracle 用户可写、空间充足
配完还是报 UNNAMED?立刻检查这三件事
配置只是前提,真正决定能否创建成功的是运行时上下文。
- 确认备库磁盘剩余空间 ≥ 主库对应数据文件大小(
SELECT bytes/1024/1024 FROM v$datafile WHERE file#=xxx) - 检查备库目标目录权限:
ls -ld /u02/oradata/standby/,必须是oracle:oinstall且至少755 - 查告警日志最新几行:
tail -20 $ORACLE_BASE/diag/rdbms/*/alert/*.log,重点找ORA-27040(file create failed)、ORA-27054(NFS option not set)等底层 I/O 错误
已经生成 UNNAMED 文件了,还能自动恢复吗?
不能。一旦 UNNAMED 出现,说明自动创建流程已彻底失败,DB_FILE_NAME_CONVERT 不会回溯重试。必须人工干预。
- 先停 MRP:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; - 切手动模式:
ALTER SYSTEM SET standby_file_management=MANUAL SCOPE=BOTH; - 用
ALTER DATABASE CREATE DATAFILE把UNNAMEDxxx显式重指向正确路径(路径必须和DB_FILE_NAME_CONVERT规则一致) - 完成后切回
AUTO,再启动恢复:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
最易被忽略的点:改完 DB_FILE_NAME_CONVERT 后,不重启备库实例或不重连会话,SHOW PARAMETER 可能仍显示旧值——因为部分参数需要实例级 reload 才生效,别只信内存视图。











