undo系列学习之如何计算undo表空间的大小

undo空间的大小不足会引起ORA-30036或者ORA-01555。

我们创建一个小的undo表空间,然后执行一个比较大的事务,这时就可以模拟出ORA-30036.

sys@ORCL> create undo tablespace thinktbs datafile '/u01/app/oracle/oradata/ORCL/datafile/think_undo.dbf'
  2  size 2m autoextend off;

Tablespace created.

sys@ORCL> alter system set undo_tablespace=thinktbs;

System altered.

sys@ORCL> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     800
undo_tablespace                      string      THINKTBS
另开一个会话:
hr@ORCL> select count(*) from t;

  COUNT(*)
----------
    462140

hr@ORCL> begin
  2        for i in 1..1000
  3       loop
  4         delete from t where rownum<1001;
  5         commit;
  6       end loop;
  7      end;
  8  /
begin
*
ERROR at line 1:
ORA-30036: unable to extend segment by 8 in undo tablespace 'THINKTBS'
ORA-06512: at line 4
在执行这个事务的过程中,我们可以查询它一共使用了多少个undo数据块:
sys@ORCL> select addr,used_ublk from v$transaction;

ADDR      USED_UBLK
-------- ----------
37A19440         19
37A19E88          1


那么我们该如何确定undo表空间的大小呢?
undo表空间的大小有三个影响因素:
1)undo_retention:这个值的确定,请参见我的blog:http://blog.csdn.net/linwaterbin/article/details/7800190
2)每秒需要的undo数据块:这个值我们可以从v$undostat里面查询,计算其最大值或者平均值都可以,但建议取其最大
3)缺省块大小
公式
undo size=db_block_size*undo_retention*max(undoblks/((end_time-begin_time)*24*3600))

sys@ORCL> select max(undoblks/((end_time-begin_time)*24*3600)) from v$undostat;

MAX(UNDOBLKS/((END_TIME-BEGIN_TIME)*24*3600))
---------------------------------------------
                                   5.77333333
sys@ORCL> show parameter db_block_size

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        integer     8192
sys@ORCL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     800


通过上面的查询我们就可以计算出undo表空间的大小的具体值。我们便可以相应的增加undo表空间的大小。

sys@ORCL> alter tablespace undotbs1 add datafile '/u01/app/oracle/oradata/ORCL/datafile/thinkundo.dbf' size 30m autoextend on;

Tablespace altered.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值