关于undo真实使用情况的笔记

因为工作需要,不时需要删除大量数据
又因能力问题,暂时不敢排程删除
又因性能问题,rac每个节点上只有4G undo tablespace

一边删除数据自然一边留意着undo tablespace的使用情况,以免导致undo不足

首先发现的情况是,公司一般使用toad作为第三方的管理工具
而发现EM的使用情况往往要比toad的使用得少

今天又做删除动作,面对着toad里面使用的情况不断上涨
而看到EM里面还在控制范围内(剩余的undo tablespace容量是业务高峰期2-3倍)

但是通过以下语句(一般查看tablespace使用情况的语句)
SELECT B.TABLESPACE_NAME,
       B.TOTAL_MB-NVL(A.FREE_MB,0) USED_MB,   B.TOTAL_MB TOTAL_MB,
       ROUND((B.TOTAL_MB-NVL(A.FREE_MB,0))/B.TOTAL_MB*100,2) USED_PERCENT,
       B.TOTAL_ALLOCATE_MB+NVL(C.NONAUTO,0) MAX_ALLOCATE_MB,
       NVL(B.TOTAL_ALLOCATE_MB,0) AUTO_MB,NVL(C.NONAUTO,0) NONAUTO_MB
  FROM
       (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/1048576) FREE_MB
          FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) A,
       (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES)/1048576) TOTAL_MB, ROUND(SUM(MAXBYTES)/1048576) TOTAL_ALLOCATE_MB
          FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) B,
       (SELECT SUM(BYTES)/1048576 NONAUTO, TABLESPACE_NAME
          FROM DBA_DATA_FILES
         WHERE MAXBYTES ='0' GROUP BY TABLESPACE_NAME) C
 WHERE A.TABLESPACE_NAME(+)=B.TABLESPACE_NAME
   AND C.TABLESPACE_NAME(+)=B.TABLESPACE_NAME
   AND B.TABLESPACE_NAME LIKE 'UNDO%'
 ORDER BY USED_PERCENT DESC ;

看到使用量真的的不少
TABLESPACE_NAME                   USED_MB   TOTAL_MB USED_PERCENT MAX_ALLOCATE_MB    AUTO_MB NONAUTO_MB
------------------------------ ---------- ---------- ------------ --------------- ---------- ----------
UNDOTBS1                             3885       4100        94.76            4100       4100          0
UNDOTBS2                             3138       4000        78.45            4000       4000          0


再查看是否过期的部分
SELECT DISTINCT STATUS, SUM(BYTES)/1024/1024, COUNT(*)   
FROM DBA_UNDO_EXTENTS GROUP BY STATUS; 

STATUS    SUM(MB)/1024/1024   COUNT(*)
--------- -------------------- ----------
UNEXPIRED            6654.5625       1531
EXPIRED                 347.75        291

其中unexpired部分刚好就等于EM现实的undo使用情况

这下子好了,众所周知,expired部分可以被overwrite(无论是否设置了GUARANTEE)
那以后就可以安心看EM做事。

其实大家可以用这句话来看undo真实使用情况,我猜EM也是用这句
select 
((select (nvl(sum(bytes),0)) 
from dba_undo_extents 
where tablespace_name='UNDOTBS1' 
and status in ('ACTIVE','UNEXPIRED')) *100) / 
(select sum(bytes) 
from dba_data_files 
where tablespace_name='UNDOTBS1') 
"PCT_INUSE" 
from dual; 

 PCT_INUSE
----------
88.1295732


再说几句
大家都知道有个参数UNDO_RETENTION指示系统最少保留的undo秒数
SQL> show parameter UNDO_RETENTION

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     900

然而,在10g新功能中有个叫(AUR)的东东,这东西就是根据系统现在使用的undo情况去自动调整RETENTION的大小。
当然,这个自动调整的数值不少于UNDO_RETENTION的值
想看看调整成多少?
SELECT TO_CHAR(BEGIN_TIME, 'MM/DD/YYYY HH24:MI:SS') BEGIN_TIME,
    TUNED_UNDORETENTION FROM V$UNDOSTAT;

而在10g当中可以决定是否启用undo retention guarantee
如果是NOGUARANTEE,那么oracle将自动覆盖没有过期的Undo以确保DML的顺利执行
alter tablespace undotbs1 retention guarantee;
alter tablespace undotbs1 retention noguarantee;


另一个有趣的现象,整个晚上的undo使用率都很高
因为是RAC,所以我在两个节点上做不同的操作,就是删不同的表
后来发现一个很高——接近90%,所以把上面的操作停了下来
但是undo没有释放,直到把第二个节点上的操作也停下来后,undo突然全部释放了——变为过期
SQL> SELECT DISTINCT STATUS, SUM(BYTES)/1024/1024, COUNT(*)     
  2  FROM DBA_UNDO_EXTENTS GROUP BY STATUS;  

STATUS    SUM(BYTES)/1024/1024   COUNT(*)
--------- -------------------- ----------
UNEXPIRED              119.125         16
EXPIRED              6715.1875       1694


参考文献,metalink
FAQ – Automatic Undo Management (AUM) / System Managed Undo (SMU) [ID 461480.1]

你可能感兴趣的:(oracle,sql,C++,c,C#)