RMAN异地备份中断后不能直接重跑,因为网络中断会导致远端备份片不完整但控制文件仍标记为“ACTIVE”,RMAN默认跳过已注册备份集且不校验文件完整性,易引发RMAN-03009、ORA-27070或RMAN-06023等错误;安全恢复需三步:先CROSSCHECK BACKUP更新状态为EXPIRED,再DELETE EXPIRED清除元数据,最后手动删除目标路径中大小异常或无扩展名的残留文件。
RMAN异地备份中断后,为什么不能直接重跑?
因为rman异地备份(比如写到远程nfs或通过sbt写到备份服务器)一旦网络中断,已传输的部分备份片piece很可能不完整,但控制文件仍会记录该piece为“active”或“incomplete”。后续执行相同backup命令时,rman默认跳过已注册的备份集,不会覆盖,也不会自动续传——它既不是断点续传工具,也不校验远端文件完整性。
常见错误现象:RMAN-03009: failure of backup command on ORA_DISK_1 channel + ORA-27070: async read/write failed 或底层报Connection reset by peer;恢复时则可能报RMAN-06023: no backup or copy of datafile found to restore,因为那个“半截备份片”无法用于恢复。
如何安全清理中断残留并重建可恢复备份
必须分三步手动干预,顺序不能错:
- 先在RMAN中运行
CROSSCHECK BACKUP,让RMAN扫描实际存储位置,把已损坏或不完整的piece状态更新为EXPIRED - 再执行
DELETE EXPIRED BACKUP,从控制文件中清除这些无效记录(注意:这不删磁盘文件,只是元数据清理) - 最后手动检查目标路径(如
/backup/rman/),用ls -lt | head -5确认是否有末尾无扩展名、大小异常(如刚过几MB)、或时间戳卡在中断时刻的零散文件,这些必须手工rm——RMAN不会管它们
做完这三步,再跑新备份才真正干净。别跳过手动删文件这步,否则下次CROSSCHECK又会把残留识别成“EXPIRED”,形成循环。
怎么降低网络波动对RMAN的影响
核心思路是:不让单次备份任务跨度过大,同时让失败代价可控。
- 拆大备份为小单元:不用
BACKUP DATABASE PLUS ARCHIVELOG一锅端,改用BACKUP AS COMPRESSED BACKUPSET SECTION SIZE 2G TABLESPACE users, example——分表空间+分段,单个中断只影响一个段,不影响全局 - 归档日志单独备份且高频:用
BACKUP ARCHIVELOG ALL NOT BACKED UP 1 TIMES每小时跑一次,比和全库绑在一起更易重试 - 禁用
PARALLELISM在异地场景:多通道并发写同一远程目录极易触发NFS锁争用或TCP重传风暴,反而放大网络抖动影响 - 在
RMAN脚本开头加SET COMMAND ID TO 'bkp_<date>',方便出事后用V$RMAN_BACKUP_JOB_DETAILS快速定位哪次RUN块挂了
远程存储路径配置的两个硬性前提
很多中断问题其实根子不在网络,而在路径本身不可靠:
- NFS挂载必须含
hard,intr,rsize=32768,wsize=32768,timeo=600,retrans=2——缺hard会导致RMAN静默卡住,缺timeo会让中断响应拖到5分钟以上 - 绝对不要用
SYMLINK指向远程路径:RMAN内部调用stat()和open()时对软链处理不稳定,19c中已多次复现ORA-19504: failed to create file实为符号链接解析失败 - 验证方式很简单:在Oracle用户下执行
dd if=/dev/zero of=/remote/mount/testfile bs=1M count=100 && sync,看是否稳定完成;若中途hang住或报Input/output error,就别上RMAN
网络波动本身没法根治,但RMAN对它的容忍度完全取决于你有没有把存储层的“假稳定”打掉——那些看似能ls、能touch的远程路径,往往在RMAN持续写入时才暴露真问题。


















