关于Oracle SCN的最大阈值

SCN每秒增长的速度跟Oracle的版本有关,在Oracle 11.2.0.2之前是每秒允许最大增长16384,在Oracle 11.2.0.2之后是默认每秒允许增长32768,这个值跟新增的隐含参数_max_reasonable_scn_rate有关,如下所示:

NAME                           VALUE           PDESC

------------------------------ --------------- --------------------------------------------------

_max_reasonable_scn_rate       32768           Max reasonable SCN rate

Oracle的CURRENT SCN值会通过DBLINK进行传播。比如B库的CURRENT SCN值高于A库,当A库通过DBLINK查询B库的表时,A库就会递增本库的CURRENT SCN值,使其跟B库一样。也就是说,多个库之间使用DBLINK交互数据时,每个库各自的CURRENT SCN值会和这些库中最大的SCN值保持同步。如果存在Oracle Bug或者人为调整SCN值(比如有时需要手工递增SCN值才能强制打开数据库)可能导致某个库的CURRENT SCN值异常增长,而此时,要是再有其他数据库和这个库有DBLINK交互,那么就会非常危险。所幸的是Oracle对于最大的SCN有个阀值,不允许系统的CURRENT SCN超过这个阀值,这个阀值的算法如下所示(按照SCN每秒最多递增16384计算):

   select

   to_char(SYSDATE,'YYYY/MM/DD HH24:MI:SS') DATE_TIME,

   ((((

    ((to_number(to_char(sysdate,'YYYY'))-1988)*12*31*24*60*60) +

    ((to_number(to_char(sysdate,'MM'))-1)*31*24*60*60) +

    (((to_number(to_char(sysdate,'DD'))-1))*24*60*60) +

    (to_number(to_char(sysdate,'HH24'))*60*60) +

    (to_number(to_char(sysdate,'MI'))*60) +

    (to_number(to_char(sysdate,'SS')))

    ) * (16*1024)) - dbms_flashback.get_system_change_number)

   / (16*1024*60*60*24)

   ) indicator

   from dual;

其中,Headroom指的是数据库CURRENT SCN和最大SCN阀值之间的差值。2012年1月之后发布的CPU或PSU补丁增加了新的隐含参数_external_scn_rejection_threshold_hours,用于表示这个差值,以小时为单位。external_scn_rejection_threshold_hours为静态参数,根据这个参数的字面意思再结合它的作用来看,可以理解它就是“拒绝外部SCN”的阈值,其对于数据库自身产生的SCN递增是没有影响的。安装完补丁之后,在Oracle 11.2.0.2及以上版本中,该参数默认值是24小时,其他版本默认值是744小时。这也就意味着如果系统的CURRENT SCN和阀值SCN相差小于24小时,数据库的CURRENT SCN值递增的时候则会容易出现ORA-19706错误。如下所示:

SQL> select 1 from dual@dltest;

select 1 from dual@dltest

                   *

ERROR at line 1:

ORA-19706: invalid SCN

同时,警告日志中也会出现如下警告:

Fri Apr 27 11:50:41 2012

Rejected the attempt to advance SCN over limit by 21 hours worth to 0x0ba5.ee95b2e6, by distributed transaction remote end, remote DB: ORAQY10.

 Client info : DB logon user ZJUPAR1O, machine BSS_P560Q_5, program sqlplus@BSS_P560Q_5 (TNS V1-V3), and OS user oracle

Fri Apr 27 11:51:09 2012

Rejected the attempt to advance SCN over limit by 21 hours worth to 0x0ba5.ee95b63e, by distributed transaction remote logon, remote DB: ORAQY10.

 Client info : DB logon user ZJUPAR1O, machine BSS_P560Q_5, program sqlplus@BSS_P560Q_5 (TNS V1-V3), and OS user oracle

引入了_external_scn_rejection_threshold_hours参数之后,由于Headroom变大(如果不安装补丁,Headroom默认为1小时),在使用DBLINK的数据库环境中,反而更容易出现ORA-19706错误。所以安装完补丁之后建议将其设置为1,从而尽可能地避免出现ORA-19706错误(但会使得系统的CURRENT SCN值更加接近SCN阀值)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值