表现是undo 100%占用不释放,其实原因是因为本地磁盘没有空间了,没办法让undo继续自动扩展了,同时现有的undo也有点大了,想要清理一下。
起因是客户存储没空间了,目前rac1节点undotbs1占用200多g,想要把undo释放一下。
我这边undo_retention设置的是900,按说不应该增长到很大才对,以前确实没有注意,只是加 过几次undo数据文件。
数据库的版本为12cr2,操作系统为solaris 11。
查看发现有大量unexpired
oracle undo段中区3种状态(dba_undo_extents的status列):active、expired和unexpired:
- active即未提交的undo信息(活动):表示事物还在活动,该值对应的undo段的dba_rollback_segs.status一定是online状态,一旦没有活动的事务在使用undo段,那么对应的undo段就变成offline状态。active状态的undo区不会被覆盖。
- expired即过期的undo信息(过期):表示事务已经提交且超过了undo_retention指定时间,该状态可以被覆盖使用。
- unexpired即提交的undo信息(未过期):表示事务已经提交但是还没有超过undo_retention指定时间,该状态可以被覆盖使用。
2.1、修改隐藏参数关闭autotune
查看隐藏参数_undo_autotune默认状态为true:
select ksppinm, ksppstvl, ksppdesc from x$ksppi x, x$ksppcv y where x.indx = y.indx and ksppinm = '_undo_autotune';
修改隐藏参数来限制undo这里有2个方法
方法1:限制undoretention最大时间,就是在自动调整的结果上强制限制最大时间(试了效果不大)。
alter system set "_highthreshold_undoretention"=50000 scope=spfile;
方法2:直接关闭autotune(这个更干脆)
关于autotune可以查看官方文档automatic tuning of undo retention common issues (doc id 1579779.1)
alter system set "_undo_autotune"=false;
创建pdb参数文件
改完效果
再检查undo情况
隔了一天再检查
再检查状态基本都为expired状态
select status, count(*) num_extents, sum(blocks) num_blocks, round((sum(bytes)/1024/1024),2) mb from dba_undo_extents group by status order by status;
2.2、切换undo方法
我这边的数据库版本是12.2版本。默认使用local undo
先切换到pdb
sql> alter session set container=pdb;
session altered.
动之前再确认是否开启本地undo
sql> select property_name, property_value from database_properties where property_name='local_undo_enabled';
property_name property_value
----------------------- ---------------
local_undo_enabled true
创建undo_01表空间
create undo tablespace undo_1 datafile ' data' size 10g autoextend on;
pdb修改下原来11g基本一样,也要指定下sid(这里不是写数据库的实例名)
alter system set undo_tablespace=undo_01 sid='orcl1' scope=both;
然后使用如下sql查看,回滚段是否己经切换到undo_01里。
select dr.tablespace_name, dr.segment_name, vr.status from dba_rollback_segs dr, v$rollstat vr where dr.segment_id=vr.usn;
确实无误后执行删除原有undotbs1。
drop tablespace undotbs1 including contents and datafiles;
再次查看。
select * from dba_data_files;
第2个节点的名称挺奇怪,原来11g的时候都是undotbs1和undotbs2
在pdb里显示为1节点是undotbs1,2节点是undo_2。这个在12cr2的版本里是正常现像,rac环境创建pdb的第2个节点就是默认叫这个名,可以参照官方文档说明。
with local undo enabled and rac environment,the undo tablespace of a pdb is undo_2 (doc id 2971554.1)
如果你觉得别扭,可以手动创建个undotbs2进行切换,具体方法参照官方文档,这里我贴出来
if you need to change the undo tablespace of the pdb on node 2 from undo_2, do the following in the target pdb on node2:
check the current undo tablespace. -- connect to and execute the pdb on the target node.
alter session set container=;
show con_name
-- check the current undo tablespace.
show parameter undo_tablespace
if there is no undo tablespace to change to, create a new undo tablespace.
create undo tablespace size autoextend on ;
example:
create undo tablespace undotbs2 datafile size 10m autoextend on ;
verify that the undo tablespace that you want to change has been created.
select * from dba_data_files;
change the undo tablespace.
alter system set undo_tablespace= container=current sid='' scope=spfile ;example:
alter system set undo_tablespace=undotbs2 container=current sid='orcl2' scope=spfile ;
restart the pdb and confirm that you have switched to the new tablespace.
restart the pdb:shutdown
startupplease confirm that you have switched to the new tablespace.
see if the segment for the old undo tablespace (undo_2) disappears.
select dr.tablespace_name, dr.segment_name, vr.status from dba_rollback_segs dr, v$rollstat vr where dr.segment_id=vr.usn;
drop the old undo tablespace.
drop tablespace undo_2 including contents and datafiles;
verify that the original undo tablespace has been dropped.
select * from dba_data_files;
也欢迎关注我的公众号【徐sir的it之路】,一起学习!
————————————————————————————
公众号:徐sir的it之路
csdn :
墨天轮:https://www.modb.pro/u/3605
pgfans:
————————————————————————————