维护的一个库,最近发现undo表空间的使用率已经到了95%。
让undo表空间的自动扩展,或新建undo表空间进行切换都可以解决这个问题。
undo表空间自动扩展,可能会导致undo不释放,undo表空间的增大,浪费存储空间。
新建undo表空间进行切换,也需要人工干预。
能不能让Oracle自动进行undo表空间的收缩呢?查了MOS,找到一种方法。
设置undo表空间为自动扩展,并设置数据文件自动扩展的最大值MAXSIZE。
这样可以不用调整undo_retention,在最大限度满足闪回的同时,
也可以避免undo表空间使用率过高,不释放的问题。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
SQL>
show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 1800
undo_tablespace string UNDOTBS1
SQL> SELECT autoextensible FROM dba_data_files WHERE tablespace_name = 'UNDOTBS1';AUTOEXTENSIBLE--------------YES
SQL> SELECT (sum(blocks) * 8) / 1024, status2 FROM dba_undo_extents group by status;(SUM(BLOCKS)*8)/1024 STATUS-------------------- ---------------------6648.375 UNEXPIRED504.625 EXPIRED
设置undo表空间为自动扩展,并设置数据文件自动扩展的最大值MAXSIZE
SQL>ALTER DATABASE DATAFILE '/opt/ora11g/datafile/LiangWei/undotbs01.dbf' AUTOEXTEND ON NEXT 1M MAXSIZE 8192M
经过大约5到10分钟后,查看undo表空间使用率
SQL>SELECT ((SELECT (NVL(SUM(bytes), 0))FROM dba_undo_extentsWHERE tablespace_name = 'UNDOTBS1'AND status IN ('ACTIVE', 'UNEXPIRED')) * 100) /(SELECT SUM(bytes)FROM dba_data_filesWHERE tablespace_name = 'UNDOTBS1') PCT_INUSEFROM dual;
PCT_INUSE----------5.50333658