可用sqlplus -S静默模式配合here-document传参调用awrrpti.sql生成指定日期AWR报告,避免交互式提示阻塞。
如何用 shell 调用 sqlplus 生成指定日期的 AWR 报告
oracle 12c 自带的 awrrpti.sql 脚本支持命令行方式生成 awr 报告,但必须通过 sqlplus 交互式调用——直接传参会卡在提示符(如“enter value for report_type:”)。正确做法是用 sqlplus -s 静默模式 + here-document(
关键点:脚本中不能写死实例号或快照范围,需动态计算昨日的 begin_snap 和 end_snap;否则报告可能为空或跨天。
-
sqlplus -S / as sysdba @?/rdbms/admin/awrrpti.sql是唯一官方支持的批量生成入口 - 必须按顺序提供 7 行输入:报告类型(html)、DBID、实例号、开始快照 ID、结束快照 ID、报告名称(可空)、报告目录(绝对路径)
- DBID 和实例号需提前查出,不能用
0或留空,否则报错ORA-01403: no data found - 报告名建议含日期,例如
awrrpt_$(date -d 'yesterday' +%Y%m%d).html
如何安全获取昨日的 begin_snap / end_snap
AWR 快照不是每小时整点生成,间隔可能为 30 分钟或 1 小时,且存在保留策略清理。硬写“昨天 00:00–23:59 对应的 snap_id”大概率失败。必须用 SQL 查找昨日最早/最晚的快照 ID,且确保它们属于同一实例、同一 DBID。
推荐在 shell 中嵌套执行如下查询:
sqlplus -S / as sysdba <p>注意:<code>v$instance</code> 要加转义 <code>\$</code>,否则 shell 会尝试展开变量;输出需用 <code>SET</code> 关闭格式化,否则多出空行和标题干扰赋值。</p><h3>shell 脚本中如何处理 sqlplus 的错误退出与日志</h3><p><code>sqlplus</code> 执行失败时默认不返回非零退出码(比如参数错、快照不存在),导致 shell 判断不到失败。必须显式检查输出文件是否存在、是否为空、是否含 “ERROR” 字样。</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6971" title="QuantOracle"><img src="https://img.php.cn/upload/skill/000/000/081/179120536643782.jpg" alt="QuantOracle" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill6971" title="QuantOracle" class="overflowclass">QuantOracle</a> <p class="overflowclass">63个确定性量化金融计算器 + 10个通过MCP的复合工作流。期权定价、Greeks、奇异衍生品、风险指标、投资组合优化……</p> </div> <a rel="nofollow" href="/xiazai/skill6971" title="QuantOracle" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div>
- 生成后立即用
if [ ! -s "$report_file" ]检查文件大小 - 用
grep -q "ERROR\|ORA-" "$report_file"扫描 HTML 文件里是否混入错误堆栈(awrrpti.sql出错时仍会生成 HTML,但内容是错误文本) - 务必重定向
sqlplus的 stderr 到日志,例如2>&1 > /tmp/awrrpt_gen.log,否则错误被吞掉 - 不要依赖
$?判断成功,sqlplus即使报错也常返回 0
为什么不能直接用 awrddrpt.sql 或自定义 SQL 替代
awrddrpt.sql 是诊断报告(ADDM),输出结构完全不同,不包含 Top SQL、Wait Events 等健康检查核心项;而纯 SQL 查询 dba_hist_* 视图只能拼数据,无法复现 awrrpti.sql 内部的归一化逻辑(如时间对齐、指标平滑、阈值标记)。
更关键的是:Oracle 官方只保证 awrrpti.sql 输出格式稳定。自行拼 HTML 或 PDF 会随版本升级失效(比如 12.1.0.2 和 12.2.0.1 的 awrrpti.sql 参数顺序不同)。
另外,awrrpti.sql 默认生成 HTML,但若系统没装 X11 或缺少字体,可能报 ORA-20101: Error generating report: java.lang.NullPointerException——这不是脚本问题,而是 Oracle 内部调用 JVM 渲染时失败,此时需改用 report_type=TEXT 保底。










