如何安全删除Oracle指定DBID的AWR数据

胖芳姑娘_6629

胖芳姑娘_6629

2026-08-20

378人浏览

原创

指定dbid的awr删除易出错,因drop_snapshot_range默认仅操作当前实例dbid,传入其他dbid可能静默失败或报ora-13516;且该过程走dml路径,产生大量redo、不释放sysaux物理空间,真正有效清理须定位并drop对应dbid的wrh$分区。

如何安全删除oracle指定dbid的awr数据

不能直接用 dbms_workload_repository.drop_snapshot_range 删除非当前 DBID 的快照——它会报错或静默失败,且不清理底层分区。

为什么指定 DBID 的 AWR 删除容易出错

Oracle 的 drop_snapshot_range 在未显式传入 dbid 时,默认只操作当前实例的 DBID;即使你传了别的 dbid,函数仍可能跳过校验、不生效,或者抛出 ORA-13516: Invalid database ID specified。更麻烦的是:该过程走的是 DML 删除路径(DELETE FROM WRH$_XXX),会产生大量 redo、锁表、执行慢,且无法释放 SYSAUX 表空间物理空间。

  • 常见错误现象:PL/SQL procedure successfully completedWRH$_ACTIVE_SESSION_HISTORY 分区没变、SYSAUX 空间没下降
  • 根本原因:AWR 数据按 DBID + SNAP_ID 分区存储,跨 DBID 的快照实际存于不同分区段,DML 不跨分区生效
  • 真正有效的清理必须落到分区级别,而非快照 ID 范围

查清目标 DBID 对应的 AWR 分区范围

先确认你要删的 DBID 是否真有数据、哪些表/分区属于它:

SELECT owner, table_name, partition_name, high_value
FROM dba_tab_partitions 
WHERE table_name LIKE 'WRH$%' 
  AND table_owner = 'SYS'
  AND high_value LIKE '%4059638244%'; -- 替换为你的真实 DBID

注意:high_value 是 RAW 字符串,DBID 以十进制形式嵌入其中(如 TO_NUMBER('4059638244'))。若查不到结果,说明该 DBID 在当前库中无 AWR 分区数据,无需操作。

Agent Git Oracle
Agent Git Oracle

高级仓库分析与重构指南。基于AI推理识别技术债务与架构反模式。

下载
  • 关键表包括:WRH$_ACTIVE_SESSION_HISTORYWRH$_EVENT_HISTOGRAMWRH$_SQLSTAT
  • 不要依赖 dba_hist_wr_control ——它只显示当前 DBID 的策略,不反映其他 DBID 的分区存在状态
  • 务必在 sys 用户下执行,普通用户查不到 WRH$ 分区元数据

安全删除指定 DBID 的 AWR 分区(推荐方式)

对每个匹配的分区执行 ALTER TABLE ... DROP PARTITION,这是唯一能立即释放空间、不产 redo、不锁全表的方法:

-- 示例:删除 WRH$_ACTIVE_SESSION_HISTORY 中属于 DBID 4059638244 的一个分区
ALTER TABLE sys.WRH$_ACTIVE_SESSION_HISTORY DROP PARTITION P_4059638244_6770;
  • 分区名格式通常是 P_<dbid>_<snap_id></snap_id></dbid>WRH$_<tablename>_DBID_SNAPID</tablename>,需从上一步查询结果中提取
  • 一次只删一个分区,避免误操作;可写 PL/SQL 循环批量处理,但必须加 DBMS_OUTPUT.PUT_LINE 日志确认
  • 执行前确保已备份:分区删除不可逆,且影响该 DBID 后续 AWR 报告生成(若该 DBID 未来还会导入数据)
  • 执行后运行 EXEC DBMS_STATS.GATHER_TABLE_STATS('SYS', 'WRH$_ACTIVE_SESSION_HISTORY') 更新统计信息

别碰的红线:WRH$ 表不能 TRUNCATE 或 DROP

TRUNCATE TABLE sys.WRH$_XXXDROP TABLE 会破坏 AWR 内部一致性,导致后续快照采集失败、awrrpt.sql 报错 ORA-00942: table or view does not exist,甚至使 DBA_HIST_* 视图失效。

  • WRH$ 表是 Oracle 内部管理对象,结构与约束受严格保护,手工删表等于挖掉 AWR 的地基
  • 哪怕看到 WRH$_ 表占了几十 GB,也绝不能 TRUNCATE ——只能删分区
  • 如果 SYSAUX 已满且分区删不动(比如分区被其他会话持有锁),优先检查是否有长事务或未提交的 AWR 导入任务

最易被忽略的一点:删除分区后,dba_hist_wr_control 里仍显示旧的 retentionsnap_interval,但这只是当前 DBID 的策略,不影响已删分区的数据。别试图用 MODIFY_SNAPSHOT_SETTINGS 去“修复”跨 DBID 的残留——它管不了别的 DBID。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
oracle清空表数据
oracle清空表数据

当表中的数据不需要时,则应该删除该数据并释放所占用的空间。本专题为大家提供oracle清空表数据的相关文章,帮助大家解决该问题。

2023.08.16

821

5

Oracle中declare的使用
Oracle中declare的使用

Oracle DECLARE语句是PL/SQL编程语言中用于声明变量、常量、游标或异常的关键字。它的主要作用是在程序中定义这些对象,以便在后续的代码中使用。DECLARE语句的语法简单明了,可以根据需要声明多个对象。通过使用这些声明的对象,可以进行各种操作,如计算、查询数据库、处理异常等 。

2023.09.15

2213

5

oracle怎么分页
oracle怎么分页

实现分页的步骤:1、使用ROWNUM进行分页查询;2、在执行查询之前进行设置分页参数;3、使用"COUNT(*)"函数来获取总行数,并使用"CEIL"函数来向上取整计算总页数;4、在外部查询中使用"WHERE"子句来筛选出特定的行号范围,以实现分页查询。想了解更多oracle怎么分页的文章,可以来阅读本专题先的文章。

2023.09.18

2230

5

Oracle查看表操作历史记录
Oracle查看表操作历史记录

查看操作历史记录的方法:1、使用Oracle内置的审计功能,可以记录数据库中发生的各种操作,包括登录、DDL语句、DML语句等;2、使用Oracle日志文件,其中包含了数据库中发生的各种操作,可以通过查看日志文件来获取操作历史记录;3、使用Oracle的Flashback功能,可以查看数据库在某个时间点的操作历史记录;4、使用第三方工具等。本专题还提供其他查看表操作的文章,大家可以免费阅读。

2023.09.19

1309

3

Oracle中RAC的用法
Oracle中RAC的用法

Oracle中RAC的用法:1、通过在多个服务器上运行数据库实例来提供高可用性;2、允许在需要时增加或减少节点数量;3、通过将工作负载分布到多个节点上来实现负载均衡;4、使用共享存储来实现多个节点之间的数据共享;5、允许多个节点同时处理数据库请求,从而实现并行处理;6、提供了透明故障切换功能;7、使用了一些技术来确保数据的一致性;8、提供了管理工具来简化RAC环境的管理和维护。本专题还提供RAC相关的其他文章,大家可以免费阅读。

2023.09.19

1873

7

oracle imp
oracle imp

imp是Oracle数据库中的一个命令行工具,用于将导出的数据和对象从一个数据库实例导入到另一个数据库实例。imp命令的一般语法为“imp username/password@connect_string file=file_name [options]”。

2023.09.19

2409

4

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4009

19

oracle通配符有哪些
oracle通配符有哪些

oracle通配符有“%”、“_”、“[]”和“[^]"。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.08

237

5

oracle四舍五入怎么操作
oracle四舍五入怎么操作

oracle四舍五入操作可以使用ROUND函数来实现,其语法为“ROUND(number, decimal_places)”,其中,number是要进行四舍五入的数值,decimal_places是指定的小数位数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.14

626

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程