一设置AUM
设置自动撤销管理,涉及三个参数:undo_management、undo_tablespace、undo_retention
1、undo_management
设置自动撤销管理,必须设置初始化参数undo_management=auto
alter system set undo_management=auto scope=spfile;
该参数也是必须要设定的
2、undo_tablespace
指定数据库使用的撤销表空间
(1)如果没有指定该参数且没有可用的撤销表空间,oracle将使用system表空间。
如果没有指定该参数,但有撤销表空间,oracle将使用该撤销表空间;若有多个撤销表空间,oracle将使用第一个可用的作为数据库撤销表空间。
如果该参数指定的撤销表空间不存在,将报错。
(2)即便数据库中有多个撤销表空间,oracle在同一时间也将只是用一个;可以使用该参数切换oracle使用的撤销表空间
alter system set undo_tablespace=undo_tablespace_name;
oracle使用的撤销表空间不能被删除,需要删除的话,必须先切换撤销表空间。
(3)创建撤销表空间:
create undo tablespace undo_tablespace_name
datafile 'data_path_name'
size nm
[autoextend on next mm maxsize pm]
[extent management local ]
[segment space management manual] --撤销表空间的段空间管理必须为manual
[{uniform [ size am] } | autoallocate]
(4)如果不能确定撤销表空间的大小,可以先使用自动扩展的数据文件,在创建撤销表空间时指定,也可以通过下面方式:
alter database datafile 'datafile_path_name' autoextend on next mm maxszie pm;
在确定撤销表空间的大小后再使用固定的表空间:
alter database datafile 'datafile_path_name' autoextnd off;
3、undo_retention
指定已提交事务的撤销数据保留的时间长短
alter system set undo_retention=n --n为保留的时间大小,默认为900,单位秒
oracle绝对保证活动的撤销数据,即事务尚未提交的撤销数据。如果空间不足,将先删除事务已经提交且保留时间超过undo_retention设定值的撤销数据,如果空间仍然不足,将删除事务已经提交但保留时间未超过undo_retention设定值的撤销数据。
(1)使用AUM且数据文件自动扩展,oracle将以undo_retention设定的值为最小值,自动调整撤销保留时间,照顾到数据库中最长查询的撤销要求。
(2)使用AUM但固定数据文件,oracle将忽略用户设定的undo_retention的值,自动调整撤销保留时间,尽最大努力保留撤销数据。
(3)前两种情况相比,如果空间允许,一般使用固定数据文件时撤销数据保留的时间要长。
二、如何设置undo_retention?
建议参考数据库中最长事务的时间大小,设置的undo_retention应该比最长事务的时间稍大一点。
select max(maxquerylen) from v$undostat;
如果使用闪回,应该保证undo_retention的设置能够满足的闪回要求。
三、如何确定撤销表空间的大小
建议首先创建自动扩展的撤销表空间,之后使用undo advisor确定撤销表空间的大小,然后更改撤销表空间为固定大小。
四、有保证的撤销保留
使用undo_retention设定保留时间,oracle并不一定能满足你的要求,当空间不足时,oracle依然会删除没有达到保留时间的撤销数据。如果需要强制oracle按照你设定值保留撤销数据,可以使用有保证的撤销保留。
1、create undo tablespace
.....
retention guarantee;
2、alter tablespace undo_tablespace_name retention guarantee;
取消有保证的撤销保留:alter tablespace undo_tablespace_name retention noguarantee;
使用有保证的撤销保留,如果空间不足以满足活动事务,那么所有的DML操作都不允许,会收到空间出超的错误;二DDL语句可以继续进行。