必须先运行awrextr.sql导出三件套,再在目标库执行awrload.sql初始化环境,而非直接运行_awrload.sql;directory路径需正确配置且文件放对位置;dbid不一致时须调用DBMS_SWRF_INTERNAL.register_database注册源dbid。

直接运行 _awrload.sql 报 ORA-01403: no data found 怎么办
这不是脚本 bug,而是你跳过了必须的前置步骤。Oracle 的 AWR 快照导入不是“扔个 dmp 就能跑”,_awrload.sql 本身不校验源数据是否存在,它只管查 dba_hist_snapshot 或临时表——如果没提前建好 schema、没放对文件、没配好 directory,一执行就崩。
- 必须先在源库运行
awrextr.sql,导出完整三件套:awrdat_*.dmp(二进制)、awrdat_*.txt(metadata)、awrdat_*.log - 目标库要先执行
@?/rdbms/admin/awrload.sql到交互提示前(即建AWR_STAGE用户、建表空间、初始化sysaux下的awr_*表结构) - 别用
@_awrload.sql直接硬跑——这个脚本是加载阶段专用,没有初始化能力
directory 对象路径写错导致 ORA-39001 和 ORA-39000
Oracle 不允许直接读文件系统路径,所有文件访问必须经由 directory 对象映射。但路径细节极易出错,尤其末尾斜杠和权限。
- 确认路径:用
SELECT * FROM dba_directories WHERE directory_name = 'AWR_DIR';查真实路径;Linux 下必须带尾斜杠(如/u01/app/oracle/awr_dump/),Windows 下也需C:\awr_dump\ - 文件放对位置:把
awrdat_*.dmp和awrdat_*.txt放到该路径下,且 Oracle 进程用户(如oracle)对该目录有读权限 - 输入文件名时只写
awrdat_123456.dmp,不加路径——路径由directory决定 - 若用 ASM,
directory必须指向 ASM 别名,且数据库为 12c+、asm_diskstring配置正确
目标库 dbid 不同导致 ORA-13516 加载失败
AWR 数据严格绑定源库 dbid。克隆库、复制库或新库的 dbid 通常与生产库不同,_awrload.sql 默认拒绝加载。
- 先查两边
dbid:SELECT dbid FROM v$database; - 若不一致,必须在目标库执行:
EXEC DBMS_SWRF_INTERNAL.register_database(<i>source_dbid</i>);(注意:该包无公开文档,仅限 Oracle Support 授权场景使用) - 强行绕过注册可能造成快照时间线错乱、
begin_interval_time偏移,甚至后续awrrpt.sql生成报告失败 - 更稳妥的做法:用 RMAN duplicate 创建测试库时加
SET NEWDBID保留原dbid,或从源头确保克隆方式兼容 AWR 导入
用 DBMS_WORKLOAD_REPOSITORY.awr_report_html 批量导出报告时卡住或报错
这个函数返回的是嵌套表,不能直接 SELECT * FROM ... 然后拷文本——大范围快照或 RAC 多实例下容易内存溢出或超时。
- 单次调用建议跨度 ≤ 2 小时(即
end_snap - begin_snap ≤ 2),否则可能触发ORA-04030或长时间无响应 - RAC 环境下必须指定
instance_number,不能只靠dbid;多实例批量导出需循环dba_hist_snapshot中各instance_number - 写入文件推荐用
UTL_FILE,别依赖 SQL*Plus spool——后者对 HTML 标签转义不可控,易损坏格式 - 示例关键片段:
FOR cur_rep IN (SELECT output FROM TABLE(DBMS_WORKLOAD_REPOSITORY.awr_report_html(<i>dbid</i>, <i>inst_num</i>, <i>start_snap</i>, <i>end_snap</i>))) LOOP UTL_FILE.put_line(l_file, cur_rep.output); END LOOP;
实际操作中最容易被忽略的,是 awrextr.sql 导出时的快照范围完整性验证——很多人只看 dmp 文件大小,却没检查 awrdat_*.txt 里是否真包含所选区间的所有快照元数据。一旦缺 snap,_awrload.sql 后续任何步骤都白忙。


















