Oracle undo表空间爆满的解决
1. 启动SQLPLUS,并用sys登陆到
数据库。
#su - oracle
$>sqlplus / as sysdba
2. 查找数据库的UNDO表空间名,确定当前例程正在使用的UNDO表空间:
Show parameter undo_tablespace。
3. 确认UNDO表空间;
SQL> select name from v$tablespace;
NAME
------------------------------
UNDOTBS1
4. 检查数据库UNDO表空间占用空间情况以及数据文件存放位置;
select file_name, bytes / 1024 / 1024 / 1024
from dba_data_files
where tablespace_name like 'UNDOTBS%';
5. 查看回滚段的使用情况,哪个用户正在使用回滚段的资源,如果有用户最好更换时间(特别是生产环境)。
select s.username, u.name
from v$transaction t, v$rollstat r, v$rollname u, v$session s
where s.taddr = t.addr
and t.xidusn = r.usn
and r.usn = u.usn
order by s.username;
查询结果为空的话就能删除。
6. 检查UNDO Segment状态;
select usn,
xacts,
rssize / 1024 / 1024 / 1024,
hwmsize / 1024 / 1024 / 1024,
shrinks
from v$rollstat
order by rssize;
USN XACTS RSSIZE/1024/1024/1024 HWMSIZE/1024/1024/1024 SHRINKS
8
0
0.00017547607421875
3.11521148681641
700
3
0
0.00023651123046875
3.22954559326172
632
0
0
0.00035858154296875
0.00035858154296875
0
1
0
0.00206756591796875
3.04867553710938
920
10
0
0.00206756591796875
0.648170471191406
819
7
0
0.00231170654296875
3.94835662841797
730
4
0
0.00304412841796875
2.00011444091797
651
11
0
0.00695037841796875
2.26921844482422
740
9
0
0.00792694091796875
2.07530975341797
773
6
0
0.00792694091796875
1.31906890869141
775
2
0
0.00890350341796875
3.13677215576172
699
5
0
1.96833801269531
3.99906921386719
267
这还原表空间中还存在12个回滚的对象。
7. 创建新的UNDO表空间,并设置自动扩展参数;
create undo tablespace undotbs2 datafile '/u02/pnrdb/undotbs2_01.dbf' size 100m reuse autoextend on next 100m maxsize unlimited;
8. 切换UNDO表空间为新的UNDO表空间 , 动态更改spfile配置文件;
alter system set undo_tablespace=undotbs2 scope=both;
9.验证当前数据库的 UNDO表空间
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- --------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS2
9. 等待原UNDO表空间所有UNDO SEGMENT OFFLINE;
select usn,
xacts,
status,
rssize / 1024 / 1024,
hwmsize / 1024 / 1024,
shrinks
from v$rollstat
order by rssize;
select usn,
xacts,
status,
rssize / 1024 / 1024,
hwmsize / 1024 / 1024,
shrinks
from v$rollstat
order by rssize;
select t.segment_name, t.tablespace_name, t.segment_id, t.status
from dba_rollback_segs t;
SEGMENT_NAME TABLESPACE_NAME SEGMENT_ID STATUS
_SYSSMU1$
UNDOTBS1
1
OFFLINE
_SYSSMU2$
UNDOTBS1
2
OFFLINE
_SYSSMU3$
UNDOTBS1
3
OFFLINE
_SYSSMU4$
UNDOTBS1
4
OFFLINE
_SYSSMU5$
UNDOTBS1
5
OFFLINE
_SYSSMU6$
UNDOTBS1
6
OFFLINE
_SYSSMU7$
UNDOTBS1
7
OFFLINE
_SYSSMU8$
UNDOTBS1
8
OFFLINE
_SYSSMU9$
UNDOTBS1
9
OFFLINE
_SYSSMU10$
UNDOTBS1
10
OFFLINE
_SYSSMU11$
UNDOTBS1
11
OFFLINE
_SYSSMU12$
UNDOTBS1
12
OFFLINE
_SYSSMU13$
UNDOTBS1
13
OFFLINE
_SYSSMU14$
UNDOTBS1
14
OFFLINE
_SYSSMU15$
UNDOTBS1
15
OFFLINE
_SYSSMU16$
UNDOTBS1
16
OFFLINE
_SYSSMU17$
UNDOTBS1
17
OFF