UNDO如何设置大小

最近在处理的一些UNDO的故障,发现UNDO在OLTP/OLAP上多多少少存在些问题,比如经典的ORA-1555错误,以及最近我接手的ORA-3001错误。

 UNDO的大小是由下面决定的

UR      以秒为单位的UNDO_RETENTION  对于UNDO表空间的数据文件属性为autoextensible,则undo_retenion参数必须设置,UNDO信息将至少保留至undo_retention 参数设定的值内,但UNDO表空间将会自动扩展。对于固定UNDO表空间,将会通过表空间的剩余空间来最大限度保留UNDO信息。
UPS    每秒生成的还原数据块的数量
DBS     db_block_size

UndoSpace = [UR * (UPS * DBS)] + (DBS * 24)

 

UNDO_RETENTION是一个参数,此参数控制为提供读一致性而保留的还原数据量,以秒为单位定义,可以在初始化文件中设置,或使用 ALTER SYSTEM 命令来动态修改。

 

SQL>ALTER SYSTEM SET UNDO_RETENTION=600;

SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     600

如果值为900,则可以使还原数据保留 15 分钟,当然需要足够的存储空间才行。

那么如何计算每秒生成的还原数据块的数量呢,可以通过v$undostat视图的begin_time、end_time和undoblks三个字段的值查询出来,计算的SQL语句如下:

--------------------------------------- 第一种是按照平均UNDO计算--------------------------------------------------------

SELECT (UR * (UPS * DBS)) + (DBS * 24) AS "Bytes"
FROM       (SELECT value AS UR
           FROM v$parameter
           WHERE name = 'undo_retention'),
   (SELECT (SUM(undoblks)/SUM(((end_time -begin_time)*86400))) AS UPS
   FROM v$undostat),
   (SELECT value AS DBS
   FROM v$parameter
   WHERE name = 'db_block_size');
--------------------------------------以下方法是按照最大峰值计算,比较符合业务逻辑 ---------------------------------------
   SELECT (UR * (UPS * DBS)) + (DBS * 24) AS "Bytes"
FROM       (SELECT value AS UR
           FROM v$parameter
           WHERE name = 'undo_retention'),
   (SELECT  max(undoblks /((end_time -begin_time)*86400))   AS UPS
   FROM v$undostat),
   (SELECT value AS DBS
   FROM v$parameter
   WHERE name = 'db_block_size');
 

第二种计算最大值的虽然算出来的UNDO大小比较大,但是这样设置UNDO 不会带来 系统由于各种DML操作照成的UNDO不足引起的ORA-1555等错误, 最近我处理的ORA-3001错误 定位在批量的DELETE操作致使UNDO一下不够了;

 

当然 在你使用批量的删除的时候就必须考虑在代码上减少UNDO的使用了;

 

如何切换UNDO表空间。

       数据库任何时刻只有一个UNDO表空间在使用。

              ALTER SYSTEM SETUNDO_TABLESPACE=UNDOTBS2

              切换这个最好在没有用户使用的时候,或者没有TRANSACION时候。

 

 

Oracle 10g 有自动Automatic Undo Retention Tuning 这个特性。设置的 undo_retention 参数只是一个指导值,,Oracle 会自动调整 Undo (会跨过 undo_retention 设定的时间) 来保证不会出现 Ora-1555 错误.。通过查询V$UNDOSTAT(该视图记录4天以内的UNDO表空间使用情况,超过4天可以查询DBA_HIST_UNDOSTAT视图) 的 tuned_undoretention (该字段在10G版本才有,9I是没有的)字段可以得到Oracle 根据事务量(如果是文件不可扩展,则会考虑剩余空间)采样后的自动计算出最佳的 retenton 时间.。这样对于一个事务量分布不均匀的数据库来说,,就会引发潜在的问题--在批处理的时候可能 Undo 会用光, 而且这个状态将一直持续, 不会释放。

你可能感兴趣的:(UNDO如何设置大小)