Posted on 2008-06-03 11:56
sdl 阅读(2068)
评论(2) 编辑 收藏 所属分类:
Oracle
在开发过程中遇到这样一个问题:
2008-06-02 16:29:23,262 WARN [org.hibernate.util.JDBCExceptionReporter] SQL Error: 30036, SQLState: 99999
2008-06-02 16:29:23,263 ERROR [org.hibernate.util.JDBCExceptionReporter] ORA-30036: unable to extend segment by 1024 in undo tablespace 'UNDOTBS2'
后来查资料才发现是Undo表空间的问题。查看了一下Undo表空间剩的空间已经很少了。这种问题解决方法如下:
UNDO表空间用于存放UNDO数据,当执行DML操作(INSERT,UPDATE和DELETE)时,oracle会将这些操作执行前的旧数据写入到UNDO段,在oracle9i之前,管理UNDO数据时使用(Rollback Segment)完成的.从oracle9i开始,管理UNDO数据不仅可以使用回滚段,还可以使用UNDO表空间.因为规划和管理回滚段比较复杂,所有oracle database 10g已经完全丢弃用回滚段.并且使用UNDO表空间来管理UNDO数据.
1:查看所有的Undo表空间
SELECT * FROM dba_tablespaces where contents='UNDO'
2:Undo大小计算公式:
SELECT ((UR * (UPS * DBS)) + (DBS * 24))/1048576 AS "MB"
FROM (SELECT value AS UR
FROM v$parameter
WHERE name = 'undo_retention'),
(SELECT (SUM(undoblks)/SUM
(((end_time-begin_time)*86400))) AS UPS
FROM v$undostat),
(SELECT value AS DBS
FROM v$parameter
WHERE name = 'db_block_size');
3:修改Undo表空间大小
先删除原来的表空间:
drop tablespace UNDOTBS2 including contents and datafiles
再建立一个和原来名称一样的表空间
create undo tablespace UNDOTBS2 datafile '/home/oracle/oradata/depsight/undotbs2.dbf' size 50m