暂无图片
UNDO表空间清理
我来答
分享
哆啦A梦
2021-03-17
UNDO表空间清理

Oracle数据库想清理undo表空间
1.新建UNDO表空间UNDOTBS2
2.设置为默认UNDO表空间
3.查看undotbs1是否有使用的段,发现有很多段都是online状态
4.等待一周,发现还是有很多的段是online状态
问题:如和不重启,可以不影响生产的情况下删掉undotbs1表空间?
已经尝试过drop 表空间和offline表空间,均失败报错。

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
文成
--查看active状态的segment 
SELECT b.usn,
       tablespace_name,
       segment_name,
       bytes "Extent_Size",
       count(extent_id) "Extent_Count",
       bytes * count(extent_id) "Extent_Bytes"
  FROM dba_undo_extents a, v$rollname b
 WHERE status = 'ACTIVE'
   and a.SEGMENT_NAME = b.name
 group by b.usn, tablespace_name, segment_name, bytes
 order by count(extent_id) desc;

--查看具体 undo segment 的情况
SELECT b.usn,    --undo segment NO.
       tablespace_name,
       segment_name,
       bytes "Extent_Size",
       status,
       count(extent_id) "Extent_Count",
       bytes * count(extent_id) "Extent_Bytes"
  FROM dba_undo_extents a, v$rollname b
 WHERE /*status = 'ACTIVE'
   and*/ a.SEGMENT_NAME = b.name
   and a.SEGMENT_NAME ='_SYSSMU479_2990344083$'
 group by b.usn, tablespace_name, segment_name, bytes,status
 order by count(extent_id) desc;

-- 通过usn查看会话中的事务状态,正在运行什么sql
select start_time, --事务起始时间  
       s.SID,      -- session id
       s.username, --用户名  
       s.MACHINE, --机器名称  
       s.OSUSER, --登录名  
       pr.SPID, 
       r.name, --回滚段名称  
       ubafil, --Undo block address (UBA) filenum  
       ubablk, --UBA block number  
       t.ses_addr,
       t.status, --会话状态  
       (used_ublk * p.value) / 1024 blk, --使用的回滚段空间  
       used_urec, --使用的undo 记录 ,  
       s1.SQL_ID, --sql_id  
       s1.SQL_TEXT --sql文本  
  from v$transaction t, v$rollname r, v$session s, v$parameter p, v$sql s1 ,v$process pr
 where xidusn = usn
   and s.saddr = t.ses_addr
   and p.name = 'db_block_size'
   and s.SADDR = s1.ADDRESS(+)
   and s.paddr = pr.addr(+)
   and xidusn = 1505
 order by 1;

复制

可能部分会话虽然事务结束了,但是undo块头还持有着,根据上面的sql定位是否异常会话,杀掉这些会话释放undo占用

暂无图片 评论
暂无图片 有用 1
打赏 0
暂无图片
回答交流
Markdown


请输入正文
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏