DROP_SNAPSHOT_RANGE过程不能清理表RM$_SNAPSHOT_DETAILS

    今天在测试、验证DROP_SNAPSHOT_RANGE不能彻底快照的过程中遇到了DROP_SNAPSHOT_RANGE无法清理WRM$_SNAPSHOT_DETAILS表中数据的情况,测试服务器版本为10.2.0.4.0,AWR的快照是1小时采集一次数据,快照保留14天,也就是二周。具体情况如下所示:

SQL> select * from v$version;       
 
BANNER
----------------------------------------------------------------
Oracle Database 10g Release 10.2.0.4.0 - 64bit Production
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
 
 
SQL> COL SNAP_INTERVAL FOR A20;
SQL> COL TETENTION FOR A26;
SQL> SELECT * FROM dba_hist_wr_control;
 
      DBID SNAP_INTERVAL        RETENTION             TOPNSQL
---------- -------------------- -------------------- ----------
3990839260 +00000 01:00:00.0    +00014 00:00:00.0     DEFAULT
 
SQL> SELECT MIN(SNAP_ID), MAX(SNAP_ID) FROM dba_hist_snapshot;
 
MIN(SNAP_ID) MAX(SNAP_ID)
------------ ------------
        7417        59195
 
SQL> 

SQL>  SELECT MIN(SNAP_ID), MAX(SNAP_ID) FROM dba_hist_snapshot;
 
MIN(SNAP_ID) MAX(SNAP_ID)
------------ ------------
        7417        59196
 
SQL> select dbid, status, count(*)
  2  from wrm$_snapshot
  3  group by dbid, status;
 
      DBID     STATUS   COUNT(*)
---------- ---------- ----------
3990839260          0       1250
 
SQL> select min(snap_id), max(snap_id), dbid from wrm$_snapshot
  2  group by dbid; 
 
MIN(SNAP_ID) MAX(SNAP_ID)       DBID
------------ ------------ ----------
        7417        59196 3990839260
 
SQL> exec dbms_workload_repository.drop_snapshot_range(7417,59196,3990839260);
 

PL/SQL procedure successfully completed.

 
SQL>  select min(snap_id), max(snap_id), dbid from wrm$_snapshot
  2  group by dbid;
 
MIN(SNAP_ID) MAX(SNAP_ID)       DBID
------------ ------------ ----------
        7417        59197 3990839260
 
SQL> select min(snap_id), max(snap_id), dbid from wrm$_snapshot
  2  group by dbid;
 
MIN(SNAP_ID) MAX(SNAP_ID)       DBID
------------ ------------ ----------
        7417        59197 3990839260
 
SQL> SELECT MIN(SNAP_ID), MAX(SNAP_ID) FROM dba_hist_snapshot;
 
MIN(SNAP_ID) MAX(SNAP_ID)
------------ ------------
        7417        59197

 

    如上实验所示,DROP_SNAPSHOT_RANGE不能清理WRM$_SNAPSHOT_DETAILS中的数据,当然对于的空间就不会释放,另外,有些版本中Oracle仅仅修改了对应SNAPSHOT的状态,而并没有删除快照。PS:有些人可能被上面又是DBA_HIST_SNAPSHOT,又是WRM$_SNAPSHOT_DETAILS弄得有点晕,其实DBA_HIST_SNAPSHOT是视图,它的数据来源于表WRM$_SNAPSHOT_DETAILS,使用下面SQL就能查看具体定义

SELECT OWNER, VIEW_NAME, TEXT FROM DBA_VIEWS WHERE VIEW_NAME='DBA_HIST_SNAPSHOT';

"select snap_id, dbid, instance_number, startup_time,
       begin_interval_time, end_interval_time,
       flush_elapsed, snap_level, error_count
from WRM$_SNAPSHOT
where status = 0"

 

-------------------------------------------------------------分割线------------------------------------------------------

本来这篇文章写了好几天了,后面讨论发现其实有时候AWR快照不能删除,并不一定就是bug,也有可能是设置了AWR的基线,下面我来演示一下

SQL> select baseline_name, start_snap_id, end_snap_id
  2  from  dba_hist_baseline
  3  order by 1;
 
BASELINE_NAME            START_SNAP_ID END_SNAP_ID
------------------------ ------------- -----------
20100526                          7455        7464
20100602                          7624        7632
20100609                          7791        7800
20100616                          7959        7968
20100623                          8126        8135
20100630                          8294        8303
20100707                          8453        8477
20100714                          8621        8645
20100721                          8789        8813
20100728                          8957        8981
20100804                          9125        9149
 
BASELINE_NAME            START_SNAP_ID END_SNAP_ID
------------------------ ------------- -----------
20100811                          9293        9317
20100818                          9461        9485
20100825                          9620        9644
20100901                          9788        9812
20100908                          9957        9980
20100915                         10124       10148
20100922                         10292       10316
20100929                         10460       10484
20101006                         10628       10652
20101013                         10796       10820
20101020                         10964       10988
 
BASELINE_NAME            START_SNAP_ID END_SNAP_ID
------------------------ ------------- -----------
20101027                         11132       11156
20101103                         11300       11324
20101110                         11468       11492
20101117                         11636       11660
20101124                         11804       11828
20101201                         11972       11996
20101208                         12140       12164
20101215                         12308       12332
20101222                         12476       12500
20101229                         12644       12668
20110105                         12812       12836
 
BASELINE_NAME            START_SNAP_ID END_SNAP_ID
------------------------ ------------- -----------
20110112                         12980       13004
20110119                         13148       13172
20110126                         13316       13340
20110202                         13484       13508

 

SQL> SELECT MIN(SNAP_ID), MAX(SNAP_ID) FROM dba_hist_snapshot;
 
MIN(SNAP_ID) MAX(SNAP_ID)
------------ ------------
        7100        61252
 
SQL>  exec dbms_workload_repository.drop_snapshot_range(7100,7108,2179993557);
 
PL/SQL procedure successfully completed.
 
SQL> SELECT MIN(SNAP_ID), MAX(SNAP_ID) FROM dba_hist_snapshot;
 
MIN(SNAP_ID) MAX(SNAP_ID)
------------ ------------
        7287        61252
 
SQL> exec dbms_workload_repository.drop_snapshot_range(7455,7458,2179993557);
 
PL/SQL procedure successfully completed.
 
SQL>  SELECT SNAP_ID,STARTUP_TIME FROM dba_hist_snapshot
  2   WHERE SNAP_ID BETWEEN 7455 AND 7458;
 
   SNAP_ID STARTUP_TIME
---------- ---------------------------------------------------------------------------
      7455 16-JAN-10 12.18.46.000 PM
      7456 16-JAN-10 12.18.46.000 PM
      7457 16-JAN-10 12.18.46.000 PM
      7458 16-JAN-10 12.18.46.000 PM
 
SQL> 

AWR快照SNAP_ID从7455 到7458 删除不掉,其实是因为这个段的快照设置成了基线,如下截图所示,所以,如果你发现快照删除不了的话,最好先检查这个SNAP_ID段是否设置成了基线。

 

另外还有就是有可能一个Bug引起的,这个只出现在特定版本中,官方文档WRM$_SNAPSHOT_DETAILS Table is Not Purged (文档 ID 1489801.1) 和文档 Document 9797851.8 Bug 9797851 - WRM$_SNAPHOST_DETAILS is never purged 都有描述这个Bug

APPLIES TO:

Oracle Database - Enterprise Edition - Version 11.2.0.3 to 12.1.0.1 [Release 11.2 to 12.1]
Information in this document applies to any platform.

SYMPTOMS

The following symptoms are observed:

  • AWR purge code is not automatically purging WRM$_SNAPSHOT_DETAILS, as expected
  • Even after dropping a range of snap id's using dbms_workload_repository.drop_snapshot_range(), the table is not purged.
  • Table WRM$_SNAPSHOT_DETAILS grows indefinitely.
  • There are many orphaned entries in the table WRM$_SNAPSHOT_DETAILS.

The number of orphaned rows for the table WRM$_SNAPSHOT_DETAILS can be found by running the following sql:


 

CAUSE

This issue is caused by an unpublished bug:

Document 9797851.8 Bug 9797851 - WRM$_SNAPHOST_DETAILS is never purged

The verification criteria for the bug are:

  1. Drop a range of snap id's using dbms_workload_repository.drop_snapshot_range()
  2. Check the corresponding snap id's in WRM$_SNAPSHOT_DETAILS.
  3. If snap id's from the range that you chose to drop are still present, then you are hitting this bug.

SOLUTION

The following solutions are available:

  • The Patch 9797851 for unpublished Bug 9797851 is available for some platforms and can be downloaded from My Oracle Support
  • If the patch is not available on your platform on a supported version, please contact Oracle Support.
  • This issue will be fixed from release Oracle 12.1

As a workaround, it is possible to manually purge the range of snap id's from the table WRM$_SNAPSHOT_DETAILS using appropriate delete statments under the guidance of Oracle Support.

Note:

 

在下面版本中,这些bug才fix掉了,请留意自己的版本信息。

 

时间: 2024-09-20 09:46:18

DROP_SNAPSHOT_RANGE过程不能清理表RM$_SNAPSHOT_DETAILS的相关文章

oracle清理日常备份数据及恢复误删除表

  一.清理日常备份的数据表 1.背景:系统表空间占用率已经超过90%.于是做了一个相关的垃圾数据进行清理的工作. 2.查询需清理表清单:因为日常在数据库操作的时候,经常会进行一些表的备份.咨询前任系统管理员,他们在备份表的时候一般是在原表上加日期或者使用bak进行标识.于是使用 SELECT owner, num_rows * avg_row_len,table_name FROM DBA_TABLES WHERE TABLE_NAME LIKE '%BAK%' AND REGEXP_LIKE

MSSQL · 应用案例 · 日志表设计优化与实现

摘要 这篇文章从日志表问题引入.日志表的共有特性.日志表的设计需求.设计思路以及设计详细实现的角度,阐述了在SQL Server数据库中如何最优化设计日志表来降低系统资源的占用和提高系统吞吐量. 问题引入 在平时与客户服务与交流过程中,我们不止一次的被客人问及这样的场景:我们现在面临如何设计SQL Server日志表方案,如何最优化设计数据库日志记录表.因为,日志表设计会面对如下问题: 表记录数大:日志表由于记录了应用程序的很多操作日志,有的业务有很多步骤,甚至每个步骤操作都会被记录到日志表中

MSSQL-应用案例-日志表设计优化与实现

title: MSSQL-应用案例-日志表设计优化与实现 author: 风移 摘要 这篇文章从日志表问题引入.日志表的共有特性.日志表的设计需求.设计思路以及设计详细实现的角度,阐述了在SQL Server数据库中如何最优化设计日志表来降低系统资源的占用和提高系统吞吐量. 问题引入 在平时与客户服务与交流过程中,我们不止一次的被客人问及这样的场景:我们现在面临如何设计SQL Server日志表方案,如何最优化设计数据库日志记录表.因为,日志表设计会面对如下问题: 表记录数大:日志表由于记录了

保护Windows注册表

保护注册表是很重要的,有很多不同的工具可以实现这一目的.当没有安全设置时,用户可能的错误会更多.幸运的是,他们可以有几中方法来保护Windows注册表,在注册表失败时他们可以用额外的拷贝来恢复注册表.下面就是其中的一些方法:   1.使用windows备份软件   注:Win95和Win98备份程序有部分区别,在这里只讲Win98的备份程序.   Win98中包括一个备份程序.当安装Win98时如果你选择"自定义安装",或者你可以在控制面板中的添加/删除程序里安装它.当你安装了这个备份

Win 2000系统引导过程详解(2)

过程|详解 表一则列出了在系统引导的不同阶段所引用的文件. 表一 在这里,我们暂不讨论Windows 2000操作系统的内部工作机制,以下通过图文结合的方式,简要给大家说明在这五个阶段,操作系统都在干些什么,那些程序发挥了作用. 第一步,预引导阶段,过程如图二所示,首先包括了系统加电自检,这个过程完成硬件设备的枚举和配置.其次计算机BIOS确定引导设备的位置,加载并运行Master Boot Record(MBR)主引导区内容(如lilo等).然后扫描分区表,定位活动分区,并将活动分区上的引导扇

InnoDB 中文参考手册 --- 4 建立 InnoDB 表

参考|参考手册|中文 4 建立 InnoDB 表假设你已以 mysql test 命令方式运行了 MySQL 客户端程序.为了建立一个 InnoDB 格式的表你必须在 SQL 命令中指定 TYPE = InnoDB : CREATE TABLE CUSTOMER (A INT, B CHAR (20), INDEX (A)) TYPE = InnoDB; 这个 SQL 命令将在 my.cnf 中设定的 InnoDB 数据文件中创建一个表和一个列 A 的索引,同时将在 MySQL 数据目录下的 t

数据结构教程 第二十九课 静态查找表(一)顺序表的查找

教学目的: 掌握查找的基本概念,顺序表查找的性能分析 教学重点: 查找的基本概念 教学难点: 顺序表查找的性能分析 授课内容: 一.查找的基本概念 查找表: 是由同一类型的数据元素(或记录)构成的集合. 查找表的操作: 1.查询某个"特定的"数据元素是否在查找表中.2.检索某个"特定的"数据元素的各种属性.3.在查找表中插入一个数据元素:4.从查找表中刪去某个数据元素. 静态查找表 对查找表只作前两种操作 动态查找表 在查找过程中查找表元素集合动态改变 关键字 是数

数据结构教程 第三十课 静态查找表(二)有序表的查找

教学目的: 掌握有序表的折半查找法 教学重点: 折半查找 教学难点: 折半查找 授课内容: 一.折半查找的查找过程 以有序表表示静态查找表时,Search函数可用折半查找来实现. 先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止. 二.折半查找的查找实现 int Search_Bin(SSTable ST,KeyType key){ low=1;high=ST.length; while(low<=high){ mid=(low+high)/2; if EQ(key,

Ajax改造,第4部分:用jQuery和Ajax表单改造现有站点

Ajax 技术改变了大型商业 Web 应用程序的外观,但是许多较小的 Web 站点都不具备重新构建整个用户界面(UI)的资源.Ajax 的一些新特性能够解决实际中的界面问题并改善用户体验.通过本系列文章,您可以了解如何使用开源的客户端库让您的用户界面变得更为时尚.本文将展示如何使用 Ajax 技术将一个多步结帐过程从一系列表单转变成一个单一屏幕的界面.我们将采用渐进增强方法,从而确保所有用户代理仍然能够访问您的站点. 关于本文 本文将逐步引导您使用 Ajax 技术改进一个 Web 1.0 购物站