select segment_name, tablespace_name, r.status,
(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
max_extents, v.curext CurExtent
From dba_rollback_segs r, v$rollstat v
Where r.segment_id = v.usn(+)
order by segment_name
查看表空间的使用情况
select sum(bytes)/(1024*1024) as free_space,tablespace_name
from dba_free_space
group by tablespace_name
首先,undo表空间满是正常的,oracle自然会重用或者扩展它,一般不用管它。然后,现在要解决的话,需要先把undo
tablespace设置成手动,启动数据库,创建新的undo
tablespace。把新的设置成默认的。
假设你的库现在是mounted状态
1
创建PFILE(如果已有就是更新)
SQL>create
pfile
from
spfile
2
关闭数据库
SQL>shutdown
immediate
3
在你的$ORACLE_HOME/dbs目录下面找个叫做
init<数据库>.ora的文件,把其中有undo_management=AUTO的一行改成
undo_management=MANUAL
如果没有就在文件末尾填一行
4
以sysdba身份连接数据库
SQL>connect
"/
as
sysdba"
用刚才改过的文件启动数据库
SQL>
startup
pfile=<刚才的文件全路径和名字>
这步是最关键的,如果成功,后面就没问题了
5
drop掉原来的表空间
SQL>
drop
tablespace
<原来的undo表空间名字>
including
contents
6
创建新的undo表空间
SQL>
create
UNDO
tablespace
undotbs2
datafile
'/u01/app/oracle/oradata/orcl/undotbs02.dbf'
size
100M
autoextend
on
7
关闭数据库,
SQL>shutdown
immediate
在开始那个init文件里设置UNDO_MANAGEMENT=AUTO
和
UNDO_TABLESPACE=UNDOTBS2
8
再做一次第四步
9
更新spfile
SQL>create
spfile
from
pfile
10
关闭数据库,正常重新启动
SQL>shutdown
immediate
SQL>startup
11
去网上教你删undo那个地方骂它。非常想当然的做法。没有任何理由这么做
12
让你的工程师去学oracle
培训
以上步骤的中的第5步可能会出问题。我不确认。。。
但是即使第5步不成功,问题应该也不大
oracle中undo是用来存放回滚数据的。撤销(Undo)数据是反转DML语句结果所需的信息。撤销数据通常被称为“回滚数据”,在过去的Oracle版本中,“回滚数据”和“撤销数据”可以交替使用,但从 9i版本开始,这两个术语有所不同:功能相同,但管理方式不同。只要某个事务修改了数据,那么更新前的原有数据就会被写入一个回滚段或撤销段。回滚段在 11g版本中依然存在,但从9i版本开始,Oracle数据库引入了可供选择的撤销段。Oracle强烈建议所有数据库都应当使用撤销段,回滚段只被保留用于向后兼容 。
undo表空间:
一个数据库可以存在多个撤销表空间,但是在任意给定时刻都只能使用一个撤销表空间。撤销表空间必须被创建为持久的、本地管理的并且能够自动扩展分配空间的表空间。
事务与undo段:
在某个事务启动时,Oracle会为其指派一个撤销段。任何一个事务都只能受一个撤销段保护,一个事务生成的撤销数据无法被分配到多个撤销段中。
在某个事务更新表和索引数据块时,回滚该变化所需的信息会被写入指定撤销表空间的数据块。撤销数据在提交后过期的事实意味着可以采用循环方式使用撤销段。如果使用原有的、人工管理的回滚段,那么调整的重要环节是控制具体事务分别受哪些回滚段保护。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)