因为工作需要,不时需要删除大量数据
又因能力问题,暂时不敢排程删除
又因性能问题,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]