本篇文章中的内容来自ORACLE 11GR2版本的《Administrator's Guide》第16章,该章主要介绍了管理Undo表空间的相关知识。建议有英文基础的同学直接去看《Administrator's Guide》。
一、Undo记录的作用
1.事务未提交时的回滚;
2.恢复数据库
3.保证数据库的读一致性;
4.闪回查询、闪回事务、闪回表
二、自动回滚段管理(Automatic Undo Managent,简称为AUM)
1、在11g中,Oracle使用AUM作为管理Undo信息以及Undo表空间的默认管理方式。执行show parameter undo 可以看到有三个参数:
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
其中,undo_management的值是AUTO或null时,采用的模式是自动回滚段管理;如果值是MANUAL,就是手动回滚段管理。
注:自动回滚段管理使用undo表空间,而手动回滚段管理使用的是回滚段。使用AUM与回滚段表空间是否自动增长没有必然关系。
undo_retention是保证数据不被覆盖的最短时间;
undo_tablespace是指定使用的Undo表空间;
2、Oracle数据库会自动的根据undo表空间的大小以及数据库中的活动情况,对retention的值动态调整。所以通常V$UNDOSTAT中的TUNED_UNDORETENTION的值与TUNED_UNDORETENTION并不总是相等。
对于Oracle自动调整的Undo Retention需要理解以下两点:
1.当undo表空间设置成autoextend选项,并且未达到undo表空间设置的最大值,此时数据库会尽可能地保留undo信息,Undo Retention的值就会变得比较大。
2.对于固定大小的表空间[或者是表空间设置成autoextend,但是已经达到了最大值],Oracle会根据当前undo表空间的大小以及数据库的负载情况,调整Undo Retention的值。默认是基于undo表空间的85%大小或者告警的阈值(默认是85%,这个阈值可以修改)
注意:
1)在动态调整中,Undo Retention的值会比最长的查询时间还要长;如果没有指定retention guarantee,Undo Retention的值也有可能比指定的undo_retention的值要小,也就是回滚段中expired的部分会被提前覆盖。
2)自动调整不支持LOBS类型的数据。
3、查看Undo Retention的值
通过V$UNDOSTAT视图可以查看近4天中,每隔10分钟统计一次的Undo Retention的值(单位:s):
select to_char(begin_time, 'mm-dd hh24:mi') begin_time,to_char(end_time, 'mm-dd hh24:mi') end_time,tuned_undoretention
from v$undostat
order by end_time
三、设置最小的Undo Retention的值
在参数文件里面修改undo_retention的值或者使用alter system set undo_retention的值
四、计算合适的固定大小的Undo空间
OEM中的Undo Advisor和DBMS_ADVISOR包提供了计算合适的undo表空间大小的能力。当你决定使用这个工具时,要明确:
1.最长的查询时间是多少;2.需求的闪回操作的时间点[这点没用到]。
OEM中的使用方式:
DBMS_ADVISOR的使用方式:
DECLARE
tid NUMBER;
tname VARCHAR2(30);
oid NUMBER;
BEGIN
DBMS_ADVISOR.CREATE_TASK('Undo Advisor', tid, tname, 'Undo Advisor Task');
DBMS_ADVISOR.CREATE_OBJECT(tname, 'UNDO_TBS', null, null, null, 'null', oid);
DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'TARGET_OBJECTS', oid);
DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'START_SNAPSHOT', 1);
DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'END_SNAPSHOT', 2);
DBMS_ADVISOR.SET_TASK_PARAMETER(tname, 'INSTANCE', 1);
DBMS_ADVISOR.execute_task(tname);
END;
通过这些视图:DBA_ADVISOR_TASKS, DBA_ADVISOR_OBJECTS, DBA_ADVISOR_FINDINGS, DBA_ADVISOR_RECOMMENDATIONS可以看到执行的结果。
DBA_ADVISOR_FINDINGS告诉你运行的信息,但是没有显示合适的表空间大小是多少。
五、管理Undo表空间
5.1 创建undo表空间
1)dbca命令会自动创建undo表空间;
2)create database 时创建undo表空间
3)create undo tablespace 另外创建undo表空间,如:
CREATE UNDO TABLESPACE undotbs_02
DATAFILE '/u01/oracle/rbdb1/undo0201.dbf' SIZE 2M REUSE AUTOEXTEND ON;
5.2 变更undo表空间
5.2.1 增加数据文件
5.2.2 修改数据文件名称
5.2.3 修改数据文件为online或者offline
5.2.4 备份数据文件
以上4点跟普通数据文件的变更方式一样。
5.2.5 修改retention guanantee
alter tablespace UNDOTBS1 retention guarantee;--确保在undo_retention的时间内,数据不会被覆盖。
5.3 删除undo表空间
DROP TABLESPACE undotbs_01;
只有在实例未使用该undo表空间时才能删除;
5.4 切换undo表空间
alter system set undo_tablespace=undotbs_02;
1)undotbs_02必须要存在
2)原来的表空间会出现 PENDING OFFLINE的中间状态,在该状态,原有的事务会继续执行,当这些事务都执行完毕时,状态会切换成OFFLINE。
5.5 undo表空间限额
不能直接使用“alter user scott quota 10m on undotbs1”,而是要在Resource Manager中设置undo_pool,具体要在27章中“Managing Resources with Oracle Database Resource Manager”中的内容。
不过这个表空间限额很少用到。
5.6 undo表空间数据字典
V$UNDOSTAT:包含用于监视和调整undo空间的统计信息。使用此视图可以帮助估计当前工作负载所需的undo空间的数量。该数据库还使用此信息来帮助调整系统中的undo空间的使用。只在自动管理表空间模式下有用。
V$ROLLSTAT:自动撤销管理模式下,反映在undo表空间的撤销段的行为
V$TRANSACTION:回滚段的信息
DBA_UNDO_EXTENTS:显示undo表空间各个extent的大小及状态
DBA_HIST_UNDOSTAT:包含V$UNDOSTAT的快照信息