暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

SCN风波又起,2019年6月之前Oracle必须升级吗?

原创 李真旭 2019-04-16
3582

问题描述

最近关于SCN的问题又被炒的沸沸扬扬;因为Oracle之前更新了一篇文章(ANNOUNCEMENT: Recommended patches and actions for Oracle databases versions 12.1.0.1, 11.2.0.3 and earlier – before June 2019 (Doc ID 2361478.1))


简单的说,Oracle将在2019年6月份自动启动SCN的新机制,即SCN rate 最大增长可达96kb,远超之前的32kb。当然,并不是说所有版本的Oracle数据库,都将自动启用这一特性(感觉Oracle埋了一个坑)。准确一点的说,时间点是2019年6月23号;如下:

SYS@ora122>set serveroutput on
SYS@ora122>declare
  2    v_autorollover_date date;
  3    v_target_compat number;
  4    v_is_enabled boolean;
  5  begin
  6    dbms_scn.getscnautorolloverparams(v_autorollover_date, v_target_compat, v_is_enabled);
  7    dbms_output.put_line('auto rollover date      : '||to_char(v_autorollover_date,'YYYY-MM-DD'));
  8    dbms_output.put_line('target scheme           : '||v_target_compat);
  9    dbms_output.put_line('rollover enabled (1=yes): '||sys.diutil.bool_to_int(v_is_enabled));
 10  end;
 11  /
auto rollover date      : 2019-06-23
target scheme           : 3
rollover enabled (1=yes): 1

PL/SQL procedure successfully completed.


针对上述版本的数据库将会在6月23号自动自动新机制。这么这个新机制是什么呢?

专家解答

简单的讲就是以前老版本的scn机制我们可以理解为是scheme 1、新版本将自动改成scheme 3,每秒允许增长的阈值更大。

SYS@ora122> declare
  2    v_rsl number;
  3    v_headroom_in_scn number;
  4    v_headroom_in_sec number;
  5    v_cur_scn_compat number;
  6    v_max_scn_compat number;
  7  begin
  8    dbms_scn.getcurrentscnparams(v_rsl, v_headroom_in_scn, v_headroom_in_sec, v_cur_scn_compat, v_max_scn_compat);
  9    dbms_output.put_line('reasonable scn limit (soft limit): '||to_char(v_rsl,'999,999,999,999,999,999'));
 10    dbms_output.put_line('headroom in scn                  : '||to_char(v_headroom_in_scn,'999,999,999,999,999,999'));
 11    dbms_output.put_line('headroom in sec                  : '||v_headroom_in_sec);
 12    dbms_output.put_line('current scn compatibility scheme : '||v_cur_scn_compat);
 13    dbms_output.put_line('max scn compatibility scheme     : '||v_max_scn_compat);
 14  end;
 15  /
reasonable scn limit (soft limit):       16,439,976,001,536
headroom in scn                  :       16,439,897,793,807
headroom in sec                  : 1003411730
current scn compatibility scheme : 1
max scn compatibility scheme     : 3

PL/SQL procedure successfully completed.

当然,Oracle在这些版本中引入了一个dbms_scn包来控制这个机制。

比如我们这里就可以直接用dbms_scn来disable这个机制。

SYS@ora122>exec dbms_Scn.DISABLEAUTOROLLOVER;

PL/SQL procedure successfully completed.
SYS@ora122>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@ora122>startup mount
ORACLE instance started.

Total System Global Area 4999610368 bytes
Fixed Size                  8803024 bytes
Variable Size             956304688 bytes
Database Buffers         3489660928 bytes
Redo Buffers                7970816 bytes
In-Memory Area            536870912 bytes
Database mounted.

SYS@ora122>alter database set scn compatibility 1;

Database altered.

Elapsed: 00:00:00.00
SYS@ora122>alter database open;

Database altered.
SYS@ora122>declare
  2    v_autorollover_date date;
  3    v_target_compat number;
  4    v_is_enabled boolean;
  5  begin
  6    dbms_scn.getscnautorolloverparams(v_autorollover_date, v_target_compat, v_is_enabled);
  7    dbms_output.put_line('auto rollover date      : '||to_char(v_autorollover_date,'YYYY-MM-DD'));
  8    dbms_output.put_line('target scheme           : '||v_target_compat);
  9    dbms_output.put_line('rollover enabled (1=yes): '||sys.diutil.bool_to_int(v_is_enabled));
 10  end;
 11  /
auto rollover date      : 2019-06-23
target scheme           : 3
rollover enabled (1=yes): 0

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.01


说明了这么多,最重要的问题来了。


1. 如何判断我的数据库是否受这个scn机制变化的影响?

如果你的所有Oracle数据库都是11.2.0.4或12.2等新版本,那么无需做任何处理;

如果你的所有数据库中,有部分低版本(如10205、11.1)需要通过dblink访问高版本的库(如11.2.0.4,12.2),那么可能有风险,建议将低版本的库进行升级或者安装上面推荐的Patch;

如果你的数据库都是低版本的库,那么不受任何影响;

如果你的数据库之间,没有dblink相互访问,你也可以高枕无忧!


2. 如果判断一个数据库的scn是否异常,是否达到scheme 极限

SYS@ora122>select dbms_flashback.get_system_change_number "current value",
  2         ((((to_number(to_char(sysdate,'YYYY'))-1988)*12*31*24*60*60) +
  3         ((to_number(to_char(sysdate,'MM'))-1)*31*24*60*60) +
  4         (((to_number(to_char(sysdate,'DD'))-1))*24*60*60) +
  5         (to_number(to_char(sysdate,'HH24'))*60*60) +
  6         (to_number(to_char(sysdate,'MI'))*60) +
  7         (to_number(to_char(sysdate,'SS')))) * (16*1024)) "RSL scheme 1",
  8         round(dbms_flashback.get_system_change_number/((((to_number(to_char(sysdate,'YYYY'))-1988)*12*31*24*60*60) +
  9         ((to_number(to_char(sysdate,'MM'))-1)*31*24*60*60) +
 10         (((to_number(to_char(sysdate,'DD'))-1))*24*60*60) +
 11         (to_number(to_char(sysdate,'HH24'))*60*60) +
 12         (to_number(to_char(sysdate,'MI'))*60) +
 13         (to_number(to_char(sysdate,'SS')))) * (16*1024))*100,5) "% to RSL scheme 1"
 14  from dual;

         current value           RSL scheme 1 % to RSL scheme 1
---------------------- ---------------------- -----------------
            78,207,891     16,439,977,345,024            .00048

通过上述脚本即可判断,如果to RSL scheme 1 百分比高达90%,那么说明你的数据库scn增长异常,建议进行处理。


3. 新版本的scn机制后,scn最大可到多少?

我们知道老版本中scn最大值为power(2,48);新机制后被成为Big Scn,可达power(2,64),相差了数万倍。

最后接下来大家需要做什么? 梳理所有Oracle数据库,确认版本信息,采取行动吧!

最后修改时间:2019-04-16 14:52:02
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论