rman卡住并非死锁,而是明确等待归档切换、asm i/o完成、控制文件扫描或恢复目录sql执行;应先查v$session_longops定位卡点,再按crosscheck→delete expired→delete completed顺序清理归档,后台执行须用-q参数并确保脚本含exit;,杀进程后必须验证控制文件一致性及残留进程。

为什么RMAN卡住不是“死锁”而是等待
RMAN卡住绝大多数情况不是进程僵死,而是明确在等某件事:归档日志切换、ASM磁盘I/O完成、控制文件元数据扫描、或恢复目录SQL执行。它不报错、不退出,只停在starting backup at、reading backup set或validating archive log这类提示后——这说明底层依赖未就绪,而非RMAN自身故障。
先查v$session_longops再动手
别急着kill,先确认卡点在哪:
- 运行
SELECT opname, target, sofar, totalwork, units, elapsed_seconds FROM v$session_longops WHERE opname LIKE '%backup%' OR opname LIKE '%restore%' AND sofar —— 如果<code>sofar长期不动,基本锁定为I/O或归档阻塞 - 若
opname是DBMS_BACKUP_RESTORE且target为空,大概率是控制文件元数据膨胀(尤其BACKUP REDOLOG段),不是磁盘慢 - 配合
SELECT event, p1text, p1, p2text, p2 FROM v$session_wait WHERE sid IN (SELECT sid FROM v$session WHERE module LIKE 'rman%') AND state = 'WAITING';看真实等待事件:比如enq: US - contention指向undo争用,ARCHIVE LOG WAIT说明归档路径满
卡在“正在读取备份集”时别碰磁盘
这个现象90%以上源于控制文件中BACKUP REDOLOG记录段元数据膨胀(records_total超千万)。此时RMAN不是在读磁盘,而是在全量扫描控制文件内部结构。
- 立刻查:
SELECT type, records_total, records_used FROM v$controlfile_record_section WHERE type = 'BACKUP REDOLOG';—— 若records_total> 500万,就是元数据瓶颈 - 不要直接
DELETE ARCHIVELOG ALL:可能误删还在备份链中的归档,引发恢复断裂 - 安全清理顺序:
CROSSCHECK ARCHIVELOG ALL→DELETE NOPROMPT EXPIRED ARCHIVELOG ALL→DELETE NOPROMPT ARCHIVELOG COMPLETED BEFORE 'SYSDATE-7' - 终极手段:
EXEC dbms_backup_restore.resetcfilesection(15);,但必须先停所有RMAN会话,并确认15确实是BACKUP REDOLOG的type#(查v$controlfile_record_section确认)
后台静默执行RMAN时卡住的真凶是stdin
用nohup rman target / @script.rcv &卡住,根本不是脚本问题,而是RMAN默认等待stdin输入。后台进程的stdin被关闭,它就永远挂在那里。
- 必须加
-q参数:rman -q "@script.rcv" > log.log 2>&1 &,-q强制跳过交互提示 -
script.rcv末尾必须写exit;,否则RMAN执行完脚本仍留在交互状态,后台不会自动退出 - 环境变量不能靠shell配置文件继承:命令前显式写
ORACLE_SID=orcl ORACLE_HOME=/u01/app/oracle/product/19c/dbhome_1 rman -q "@script.rcv" - 检查日志里是否含
RMAN-03009(命令失败)或RMAN-00569(错误开始),而不是只看echo $?——RMAN成功失败都常返回0
真正麻烦的从来不是“怎么杀”,而是“杀完之后控制文件有没有损坏”“残留channel进程还在不在写”“归档目录空间释放了没”。每一步操作都得对应到具体视图和命令输出,不能凭感觉。











