应解析RMAN日志末尾是否出现“Recovery Manager complete.”,若缺失则判定异常中断;需限定搜索最后200行中“RMAN>”到“Recovery Manager complete.”之间的ERROR,排除重试、跳过归档等低风险提示,并区分BACKUP与VALIDATE模式的不同成功标志。
如何判断RMAN备份日志中真正的失败信号
rman自身不直接返回非零退出码(rman命令即使备份失败,shell里$?也常为0),所以不能靠if [ $? -ne 0 ]简单判断。必须解析日志内容,但注意:不是所有报错都代表备份失败——比如ora-19566(超过损坏块阈值)可能只是警告,而ora-19571(无法读取归档日志)或ora-19563(数据文件头校验失败)往往意味着备份中断。
实操建议:
- 优先监控日志末尾是否出现
Recovery Manager complete.——它只在RMAN正常退出时打印;若缺失,基本可判定流程异常中断 - 搜索连续两行含
ERROR且后一行非channel重试日志(如channel ORA_DISK_1: restoring datafile这类是正常操作,不算失败) - 过滤掉已知低风险关键词,例如
skipping archived log(归档被跳过,可能因DELETE INPUT已执行)、no backup of log
Shell脚本如何安全提取RMAN日志中的关键段落
直接grep -q "ERROR" rman.log容易误报——RMAN日志里大量ERROR出现在调试信息或已恢复的通道重试中。应限定搜索范围:只检查最后200行,并锚定在RMAN>交互提示符之后、Recovery Manager complete.之前的关键执行区。
实操建议:
- 用
awk '/^RMAN>/,/^Recovery Manager complete\./ {print}' rman.log | tail -n 200提取有效上下文段 - 避免用
cat rman.log | grep ERROR——大日志文件会拖慢脚本,且未排除历史残留错误 - 如果RMAN是后台运行(如
nohup rman ... > rman.log 2>&1 &),需加sleep 5 && sync确保日志落盘后再检查,否则可能读到截断内容
报警触发后如何避免重复发送邮件或钉钉消息
一次备份失败,脚本每分钟轮询就会发10次告警,运维人员很快会禁用通知。必须做状态去重。
实操建议:
- 用时间戳文件记录上次报警时间:
touch /tmp/rman_last_alert_,每次触发前先比对find /tmp -name "rman_last_alert_*" -mmin -30,30分钟内不再重复 - 把报警动作封装成函数,开头加
lockfile="/tmp/rman_alert_lock_,用" if mkdir "$lockfile" 2>/dev/null; then ... fi防并发脚本冲突 - 邮件正文必须带
grep -n "ERROR\|ORA-" rman.log | tail -5真实错误行和行号,别只写“备份失败”,否则值班人得登录再查日志
Oracle 19c+使用BACKUP ... VALIDATE时的日志特征差异
VALIDATE模式不生成备份集,但会完整扫描数据块,日志格式与真实备份高度相似,容易被误判为失败。它的成功标志不是piece handle =,而是validation complete和Finished validate。
实操建议:
- 在脚本开头先检查日志是否含
validate database或validate backupset,若是,则切换检测关键词为validation complete和no errors found - 不要依赖
piece handle是否存在来判断——VALIDATE日志里根本不会出现该字段 - 若同一套脚本要兼容
BACKUP和VALIDATE,建议在RMAN命令前用echo "VALIDATE MODE" >> rman.log打标记,后续解析更可靠
真正难处理的是RMAN挂起无输出、或日志被logrotate切走但脚本还在读旧文件——这些情况需要额外加超时控制和日志路径校验,不是单靠关键词能覆盖的。











