直接运行_awrload.sql报ora-01403,根本原因是漏掉四个硬性前提:未用awrextr.sql导出完整dmp/txt/log三文件包、目标库未执行awrload.sql初始化建表与授权、directory路径权限不匹配(含末尾斜杠及oracle用户读权限)、源库与目标库dbid不一致且未通过dbms_swrf_internal.register_database注册。

直接运行 _awrload.sql 会报 ORA-01403: no data found,这不是脚本坏了,而是你漏了提取、预置、路径、DBID 四个硬性前提。
必须先用 awrextr.sql 导出完整包
AWR 数据不能像普通表那样用 expdp 直接导出。awrextr.sql 是唯一官方支持的提取入口,它会生成三个必需文件:
-
awrdat_<em>xxx</em>.dmp(二进制 dump) -
awrdat_<em>xxx</em>.txt(元数据描述) -
awrdat_<em>xxx</em>.log(执行日志)
缺任意一个,_awrload.sql 在加载时都会因查不到快照元数据而崩出 ORA-01403。别跳过这步——哪怕你手头只有 .dmp 文件,也得回源库补跑一次 awrextr.sql 生成配套的 .txt 文件。
目标库要手动走完初始化流程,不能只 @_awrload.sql
_awrload.sql 脚本本身不建表、不授权、不设参数。它假定你已执行过它的“前半段”:
- 连上目标库后,先运行
@?/rdbms/admin/awrload.sql,让它走到PROMPT Enter name of directory object这一步就停住 - 此时它已创建
AWR_STAGE用户、建好sysaux下的awr_*表、设好awr_pdb_load参数(19c 多租户场景下关键) - 之后再手动输入 directory 名、dump 文件名等,才能继续
如果直接 @_awrload.sql 并一路回车,脚本会在内部查询 dba_hist_snapshot 时发现空表,立刻报 ORA-01403。
directory 路径和权限必须严丝合缝
Oracle 不允许直接读文件系统路径,一切依赖 directory 对象。常见卡点:
- 确认路径末尾有斜杠:
/u01/app/oracle/awr_dump/(Linux),C:\awr_dump\(Windows) -
SELECT * FROM dba_directories WHERE directory_name = 'AWR_DIR'查出的真实路径,必须和你放.dmp+.txt的物理路径完全一致 - Oracle 进程用户(如
oracle)必须对这个目录有r-x(Linux)或读取+遍历权限(Windows) - 执行时输入的
file_name只写awrdat_123456.dmp,不带路径——路径由directory决定
否则会报 ORA-39001: invalid argument value 或 ORA-39000: bad dump file specification,本质是 Oracle 根本没找到文件。
DBID 不一致会导致加载被拒或时间线错乱
AWR 快照严格绑定源库 dbid。目标库若为新库或克隆库,dbid 不同会触发 ORA-13516: AWR snapshot range cannot be loaded into database with different DBID。
- 先查源库
dbid:SELECT dbid FROM v$database - 查目标库
dbid,若不同,需在目标库执行:EXEC DBMS_SWRF_INTERNAL.REGISTER_DATABASE(<em>source_dbid</em>) - 注意:该过程仅注册,不改目标库实际
dbid;但后续_awrload.sql才会接受导入 - 别跳过校验——DBID 错位会导致快照时间戳解析失败,报告里出现负值或全零区间
跨库 AWR 迁移不是文件搬运,而是元数据重建。最容易被忽略的是:你手里的 .dmp 文件是否真来自 awrextr.sql、目标库是否真的完成了初始化建表、directory 是否映射到正确且可读的物理路径、以及 DBID 是否已显式注册。四者缺一,_awrload.sql 就只会给你一个干净利落的 ORA-01403。











