`
yangzhiyong77
  • 浏览: 959522 次
文章分类
社区版块
存档分类
最新评论

oracle的还原表空间UNDO写满磁盘空间,解决该问题的具体步骤

 
阅读更多

产生问题的原因主要以下两点:
1. 有较大的事务量让Oracle Undo自动扩展,产生过度占用磁盘空间的情况;
2. 有较大事务没有收缩或者没有提交所导制;
说明:本问题在ORACLE系统管理中属于比较正常的一现象,日常维护多注意对磁盘空间的监控。

UNDO表空间介绍
UNDO表空间用于存放UNDO数据,当执行DML操作(INSERT,UPDATE和DELETE)时,oracle会将这些操作的旧数据写入到UNDO段,在oracle9i之前,管理UNDO数据时使用(Rollback Segment)完成的.从oracle9i开始,管理UNDO数据不仅可以使用回滚段,还可以使用UNDO表空间.因为规划和管理回滚段比较复杂,所有oracle database 10g已经完全丢弃用回滚段.并且使用UNDO表空间来管理UNDO数据。

1、查看系统磁盘状态
AIX系统:/> df -g (Linux系统: df -h)
Filesystem GB blocks Free %Used Iused %Iused Mounted on
/dev/undolv 30.00 0.00 100% 9 1% /u01/app/u01/app/oracle/undo

2、查看Oracle数据库表空间的占有率
select a.tablespace_name,
round((a.maxbytes / 1024 / 1024), 2) "sum MB",
round((a.bytes / 1024 / 1024), 2) "datafile MB",
round(((a.bytes - b.bytes) / 1024 / 1024), 2) "used MB",
round(( (a.maxbytes-a.bytes+b.bytes) / 1024 / 1024), 2) "free MB",
round(((a.bytes - b.bytes) / a.maxbytes) * 100, 2) "percent_used"
from (select tablespace_name, sum(bytes) bytes,sum(maxbytes) maxbytes
from dba_data_files where maxbytes!=0
group by tablespace_name) a,
(select tablespace_name, sum(bytes) bytes, max(bytes) largest
from dba_free_space
group by tablespace_name) b
where a.tablespace_name = b.tablespace_name
order by ((a.bytes - b.bytes) / a.maxbytes) desc

Tablespace_name SumDatafile(MB)Datafile Used Free Precent_used
1UNDOTBS132767.9830000299682799.9891.46


或者通过如下脚本检查数据库表空间占用空间情况:
select tablespace_name,sum(bytes)/1024/1024/1024 GB
from dba_data_files group by tablespace_name
union all
select tablespace_name,sum(bytes)/1024/1024/1024 GB
from dba_temp_files group by tablespace_name order by GB;


3、找出UNDO表空间的路径及大小
SQL> select file_name,bytes/1024/1024 from dba_data_files
where tablespace_name like 'UNDOTBS1'

/u01/app/oracle/undo/undotbs01.dbf 30000


4、检查UNDO Segment状态
SQL> select usn,xacts,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks
from v$rollstat order by rssize;

USNXACTSRSSIZE/1024/1024/1024HWMSIZE/1024/1024/1024SHRINKS
1000.0003585820.0003585820
21400.7967910770.796791077735
31300.8004531860.800453186894
41200.8052139280.805213928728
51501.1861267091.186126709922
6101.7233657841.963180542946
7301.7327041631.9774627691051
8501.9783706672.228370667654
9202.0325012212.034454346707
10402.0652160642.318145752875
111102.1000061042.1000061041269
12802.6303405762.700653076897
13602.7408142092.7408142091030
14902.7456970212.7720642091037
15702.8335266112.8335266111033
161003.0883636473.310592651989

这还原表空间中还存在16个回滚的对象。

5、创建新的临时UNDO表空间
可以在其它的磁盘空间临时创建还原表空间
SQL>
create undo tablespace undotbs2
datafile '/u01/app/oracle/pub/undotbs02.dbf'
size 10M autoextend on;

Tablespace created.


6、切换UNDO表空间为新的UNDO表空间

SQL> alter system set undo_tablespace=undotbs2 scope=both;
System altered.

7、验证当前数据库的还原表空间
SQL> show parameter undo

NAME TYPE VALUE
------------------------------------ ----------- --------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS2

8、等待原UNDO表空间所有UNDO SEGMENT OFFLINE

select t.segment_name,t.tablespace_name,t.segment_id,t.status from dba_rollback_segs t;
SEGMENT_NAMETABLESPACE_NAMESEGMENT_IDSTATUS
1SYSTEMSYSTEM0ONLINE
2_SYSSMU1$UNDOTBS11OFFLINE
3_SYSSMU2$UNDOTBS12OFFLINE
48_SYSSMU47$UNDOTBS147OFFLINE
49_SYSSMU48$UNDOTBS148OFFLINE
50_SYSSMU49$UNDOTBS149OFFLINE
51_SYSSMU50$UNDOTBS150OFFLINE
52_SYSSMU51$UNDOTBS151OFFLINE
53_SYSSMU52$UNDOTBS152OFFLINE
54_SYSSMU53$UNDOTBS153OFFLINE
55_SYSSMU54$UNDOTBS154OFFLINE
56_SYSSMU55$UNDOTBS155OFFLINE
57_SYSSMU56$UNDOTBS156OFFLINE
58_SYSSMU57$UNDOTBS157OFFLINE
59_SYSSMU58$UNDOTBS158OFFLINE
60_SYSSMU59$UNDOTBS159OFFLINE
61_SYSSMU60$UNDOTBS160OFFLINE
62_SYSSMU61$UNDOTBS161OFFLINE
63_SYSSMU62$UNDOTBS262ONLINE
64_SYSSMU63$UNDOTBS263ONLINE
65_SYSSMU64$UNDOTBS264ONLINE
66_SYSSMU65$UNDOTBS265ONLINE
67_SYSSMU66$UNDOTBS266ONLINE
68_SYSSMU67$UNDOTBS267ONLINE
69_SYSSMU68$UNDOTBS268ONLINE

上面对应的UNDOTBS1还原表空间所对应的回滚段均为OFFLINE

9、删除原UNDO表空间

SQL> drop tablespace undotbs1 including contents and datafiles;

Tablespace dropped.


10、可以再次查看系统磁盘空间:
AIX系统:/> df -g (Linux系统: df -h)


如果需要规范数据库的表空间和路径,还原表空间名称undotbs1和路径不能改变,
可以安装刚才的步骤进行切换回来。
1、创建新的原来的UNDO表空间
可以在其它的磁盘空间临时创建还原表空间
SQL>
create undo tablespace undotbs1
datafile '/u01/app/oracle/undo/undotbs01.dbf'
size 10M autoextend on maxsize 15G;

刚开始为10M,设置自动扩展,最大为15GB

Tablespace created.


2、切换UNDO表空间为新的UNDO表空间

SQL> alter system set undo_tablespace=undotbs1 scope=both;
System altered.

3、验证当前数据库的还原表空间
SQL> show parameter undo

NAME TYPE VALUE
------------------------------------ ----------- --------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1

4、等待原UNDO表空间所有UNDO SEGMENT OFFLINE

select t.segment_name,t.tablespace_name,t.segment_id,t.status from dba_rollback_segs t;
SEGMENT_NAMETABLESPACE_NAMESEGMENT_IDSTATUS

上面对应的UNDOTBS2还原表空间所对应的回滚段均为OFFLINE

5、删除UNDO2表空间

SQL> drop tablespace undotbs2 including contents and datafiles;

Tablespace dropped.


6、可以再次查看系统磁盘空间:
AIX系统:/> df -g (Linux系统: df -h)


undo_retention:指定事物commit后undo 将要保存的时间(秒),在ORACLE10g中默认的是900秒。

GUARANTEE : 保证undo_retention参数所设定的时间有效,这个是10g的新功能。

SQL> ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;

SQL> ALTER TABLESPACE undotbs1 RETENTION NOGUARANTEE;

在没有guarantee的保证下,ORACLE并不能保证能够将undo信息存储900秒,如果undo表空间不足,那么ORACLE将忽略undo_retention的设置,直接覆盖掉以前的undo,这个时候有可能会产生ORA-01555错误。如果undo表空间空间足够,那么undo将会保存很长一段时间,直到undo表空间达到maxsize,这个时候才会覆盖undo信息,而且ORACLE会从最古老的undo信息开始覆盖。

ORACLE推荐我们将undo 表空间中的datafile 设定MAXSIZE ,不要让它一直自动扩展,如果ORACLE获得了自动扩展的能力,那么旧的undo不会被覆盖,到后来undo表空间会越来越大,越来越大,直到将磁盘空间耗尽。

在有guarantee的保证下,ORACLE将会保证undo信息能够保存到undo_retention设定的值之后才被覆盖,如果这个时候同时执行了很多事物,将undo表空间耗完了,那么那个事物会失败,会报ORA-30036 错误,所以使用guarantee一定要慎用,如果非要使用guarantee,那么尽量将undo 表空间设大 一点。

Oracle10g开始,如果你设置UNDO_RETENTION为0,那么Oracle启用自动调整以满足最长运行查询的需要。当然如果空间不足,那么Oracle满足最大允许的长时间查询,而不再需要用户手工调整。

FROM:http://space.itpub.net/12778571/viewspace-689354

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics