必须用awrextr.sql和awrload.sql配合迁移AWR快照,缺一不可;直接expdp/impdp或仅用.dmp文件会因缺失.txt元数据、未初始化AWR_STAGE用户、DBID未注册等导致ORA-01403错误。

不能直接用 expdp 或 impdp 导出导入 AWR 快照数据——AWR 不是普通用户对象,它依赖内部结构、DBID 绑定和快照元数据一致性。必须用 Oracle 官方提供的脚本:源库跑 awrextr.sql,目标库跑 awrload.sql,缺一不可。
为什么直接 @awrload.sql 会报 ORA-01403?
这不是脚本出错,而是你跳过了四个硬性前提:
- 没在源库执行
awrextr.sql,导致缺少配套的awrdat_xxx.dmp、awrdat_xxx.txt、awrdat_xxx.log三件套 - 目标库没提前初始化:没建
AWR_STAGE用户、没在SYSAUX创建awr_*表、没设awr_pdb_load参数(11g 虽无 PDB,但该参数仍需显式置为 0) -
DIRECTORY对象路径权限不对:Oracle 用户需有读权限,路径末尾不能带斜杠,且文件名必须小写(如awrdat_123.dmp,不是AWRDAT_123.DMP) - 源库与目标库
DBID不同,又没运行DBMS_SWRF_INTERNAL.REGISTER_DATABASE注册目标库信息
导出 AW R 快照:只认 awrextr.sql,不接受任何替代
awrextr.sql 是唯一受支持的导出入口,它会生成三个必需文件:
-
awrdat_xxx.dmp:二进制 dump,含快照数据本身 -
awrdat_xxx.txt:纯文本元数据,描述快照范围、DBID、实例号等——awrload.sql启动时第一件事就是读它 -
awrdat_xxx.log:执行过程日志,用于排错
常见错误:手头只有 .dmp 文件,就试图直接加载。这必然失败——awrload.sql 查不到 .txt 就立刻抛 ORA-01403。必须回源库补跑一次 awrextr.sql,哪怕只提取一个快照。
导入 AWR 数据:先停在初始化点,再填参数
别一口气 @?/rdbms/admin/awrload.sql 回车到底。正确流程是:
- 连上目标库后,执行
@?/rdbms/admin/awrload.sql - 让它运行到
PROMPT Enter name of directory object这一步就暂停(此时已建好AWR_STAGE用户、awr_*表、设好参数) - 手动输入
DIRECTORY名(注意大小写,创建时是大写,这里也得大写) - 输入
file_name:只写文件名前缀,不带.dmp后缀(如输入awrdat_123) - 确认
schema_name为AWR_STAGE,default_tablespace选USERS或SYSAUX(推荐SYSAUX)
如果跳过初始化直接走完,脚本会在内部查 dba_hist_snapshot 时发现空表,立即崩出 ORA-01403。
DBID 不一致时必须注册,否则数据无法关联
跨库迁移 AWR 数据,源库和目标库 DBID 几乎一定不同。此时仅靠 awrload.sql 无法自动识别目标库身份。必须在目标库手动注册:
EXEC DBMS_SWRF_INTERNAL.REGISTER_DATABASE( dbid => &source_dbid, db_name => '&source_db_name', db_domain => '&source_db_domain', instance_name => '&source_instance_name' );
其中 &source_dbid 等变量值,全来自源库 awrdat_xxx.txt 文件头部。漏掉这步,即使导入成功,后续查 dba_hist_* 视图也会返回空——因为数据被“挂”在了旧 DBID 下,跟当前库对不上。
最易被忽略的是 .txt 文件的必要性和 REGISTER_DATABASE 的强制性。很多人以为只要 .dmp 能读通就行,结果导入后视图全空,排查半天才发现元数据没绑定、DBID 没注册。











