备库报FILE MISSING的根本原因是standby_file_management=AUTO时,主库新增文件的ASM路径在备库不可写或空间不足,导致Oracle用UNNAMED占位;需检查备库ASM磁盘组free_mb≥新增文件大小、state=MOUNTED,并确保OMF路径对应目录存在或统一db_create_file_dest配置。

主库扩容ASM磁盘后,备库本身不需要主动“扩容”,但必须确保后续新增数据文件能正常创建——否则 MRP 进程会卡住,v$recover_file 出现 FILE MISSING,同步中断。关键不是“备库要不要加盘”,而是“备库有没有足够空间+正确路径来承接主库新建的文件”。
为什么备库会报 FILE MISSING 而不是自动创建文件
这是因为 standby_file_management 虽然设为 AUTO,但它只负责按主库发来的重做日志中记录的文件路径去创建文件;一旦备库对应 ASM 磁盘组(如 +DATA)剩余空间不足,或路径在备库 ASM 中根本不可写(比如没挂载、权限不对、别名冲突),Oracle 就会放弃创建,改用临时占位名(如 +DATA/UNNAMED00135),并在告警日志里写 ORA-01119: error in creating database file。
常见诱因包括:
- 主库扩容后建了大表空间,但备库
+DATA磁盘组 free_mb 不足(哪怕只差 1MB) - 主库用 OMF(
db_create_file_dest=+DATA)建文件,而备库该磁盘组未挂载或asm_diskstring配置不一致 - 主库用了自定义别名(
ALTER DISKGROUP ... ADD TEMPLATE ...),但备库没同步该模板
检查备库 ASM 空间与挂载状态
登录备库实例,立刻执行:
SELECT name, state, type, total_mb, free_mb, usable_file_mb
FROM v$asm_diskgroup
WHERE name IN ('DATA', 'FRA'); -- 替换为你实际使用的磁盘组名
重点看 free_mb 是否 ≥ 主库最近一次新增数据文件的大小;同时确认 state = 'MOUNTED'。如果显示 DISMOUNTED,说明 ASM 实例没识别到磁盘或权限问题,需查 grid 用户下 asmcmd lsdg 和 crsctl stat res -t。
另外验证 ASM 路径是否可写:
ASMCMD> mkdir +DATA/ORCLADG/datafile/testdir ASMCMD> ls -l +DATA/ORCLADG/datafile/testdir
失败则说明磁盘组虽挂载,但权限或配额限制了写入。
standby_file_management 切 MANUAL 后怎么补文件
当已出现 FILE MISSING,且确认备库空间/路径没问题,就按标准流程手动补:
- 先停
MRP:ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; - 切手动模式:
ALTER SYSTEM SET standby_file_management=MANUAL SCOPE=BOTH; - 根据主库
v$datafile查出缺失文件原始路径(如+DATA/ORCL/DATAFILE/users.278.1123456789),在备库用ALTER DATABASE CREATE DATAFILE '+DATA/UNNAMED00135' AS '+DATA/ORCLADG/DATAFILE/users.dbf' SIZE 10G;—— 注意这里要显式指定 size,不能依赖 autoextend - 切回自动:
ALTER SYSTEM SET standby_file_management=AUTO; - 重启恢复:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
注意:如果主库文件在 ASM 中用了别名(如 +DATA/ORCL/users01.dbf),备库也得用相同别名格式创建,否则下次主库删文件时,备库可能因找不到对应别名而报错。
ASM 环境下容易被忽略的路径映射细节
主备库的 db_unique_name 不同,但 OMF 默认路径是 db_create_file_dest + db_name + 文件类型。例如主库 db_name=ORCL,备库 db_name=ORCL 但 db_unique_name=ORCL_STBY,OMF 仍会往 +DATA/ORCL/... 写——这要求备库 ASM 中必须存在名为 ORCL 的目录(即 alias),否则就 fallback 成 UNNAMED。解决方案有两个:
- 在备库 ASM 中提前建好对应目录:
ASMCMD> mkalias +DATA/ORCLADG/DATAFILE/system.256.1123456789 +DATA/ORCL/DATAFILE/system.dbf - 或统一用
db_create_file_dest=+DATA(不带子目录),让主备都走根路径,靠文件名区分
真正麻烦的是跨版本或跨平台迁移场景:19c 主库用了 Flex ASM,而 12c 备库还是传统 ASM,CREATE DATAFILE 语句里的 ASM 文件语法可能不兼容——这种时候必须降级用 cp 命令从主库 ASM 拷贝文件到备库本地再 ALTER DATABASE CREATE DATAFILE ... AS ...,不能依赖自动路径解析。











