RMAN备份到NFS报锁失败因NFS服务器不支持强制锁或rpc.statd未启用;应同时挂载nolock(禁用客户端锁)和noac(禁用属性缓存);还需避免小片备份、禁用VALIDATE、预建目录、实测写入延迟及排查UID映射问题。
为什么RMAN备份到NFS时会报“NFS locking failed”或“unable to lock file”
rman本身不直接处理文件锁,但底层调用flock()或fcntl()做并发保护(比如多个通道写同一备份片、或catalog更新)。nfsv3/v4默认启用强制锁(mandatory locking),而很多nfs服务器(尤其是老版本或配置为只读导出)不支持或禁用了rpc.statd服务,导致锁请求超时失败。错误常表现为:ora-19506: failed to create sequential file, name="...", parms="",伴随系统日志里出现nfs: server x.x.x.x not responding, still trying或lockd: server x.x.x.x not responding。
挂载NFS时必须加noac还是nolock?区别在哪
nolock禁用NFS客户端的本地锁管理(即绕过rpc.statd和rpc.lockd),适合单实例RMAN写入场景;noac(no attribute cache)则关闭属性缓存,避免RMAN读取到过期的文件大小/修改时间——这对增量备份和备份片校验尤其关键。两者不是互斥,而是互补:
-
nolock解决“锁失败”,但若NFS服务器端有缓存,RMAN可能误判文件已存在或大小未更新 -
noac解决“元数据不一致”,但不解决锁冲突本身 - 生产环境建议同时加:
mount -t nfs -o rw,hard,intr,nolock,noac,proto=tcp,rsize=32768,wsize=32768 192.168.1.10:/backup /u01/backup
RMAN备份脚本里还要注意哪些NFS相关设置
即使挂载参数正确,RMAN仍可能因默认行为触发NFS敏感操作:
- 避免使用
MAXPIECESIZE过小(如100M),频繁创建小文件会放大NFS元数据压力 - 禁用
BACKUP ... VALIDATE在NFS上运行——它会反复open/close文件,加剧锁争用 - 不要在
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT中使用动态路径(如含%U但父目录是NFS挂载点),确保所有子目录提前mkdir -p并chown oracle:oinstall - 如果用
SBT_TAPE模拟器(如libobk.so写NFS),需确认其内部是否调用flock()——部分旧版会,此时仅nolock不够,得换用POSIX-compliant替代实现
验证NFS挂载是否真正生效且无隐患
别只看df -h显示正常。要实测RMAN最关心的两个动作:
- 用Oracle用户执行:
touch /u01/backup/testfile && ls -l /u01/backup/testfile,检查时间戳是否实时(noac生效) - 手动模拟RMAN写行为:
dd if=/dev/zero of=/u01/backup/test.dd bs=1M count=100,观察iostat -x 1中await是否持续高于50ms(高延迟说明NFS链路或服务器负载异常) - 查内核日志:
dmesg | grep -i "nfs\|lock",确认无lockd: couldn't bind to RPC server类报错
最麻烦的是NFS服务器端启用了root_squash但没配好UID映射——Oracle进程以oracle用户写文件,结果NFS服务端把它当nobody,权限看似OK,实际锁请求被静默丢弃。这种问题不会报错,只会让RMAN莫名卡住或备份片损坏,得从服务器端/var/log/messages反查。










