Oracle 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的新机制(auto rollover),即SCN rate 最大增长可达96K(每秒增加的SCN不超过 96K),远超之前的32kb(在 Oracle 11.2.0.2 之前这个限制是 16K)。

那么哪些版本的数据库会自动启用这个机制,查看如下:
Oracle SCN新进制以及推荐升级的版本_第1张图片

也就是说11.2.0.4和12.1.0.2以及12.2.0.1以上已经包含了必要的修复,已天然豁免。11.1.0.7和11.2.0.3版本需要打相对应补丁。 其他版本无补丁,需要升级,否则低版本和新版本的其他库通过 DB Link 连接时可能遇到问题。

哪些版本的数据库需要处理

如果你的所有Oracle数据库都是11.2.0.412.2等新版本,那么无需做任何处理;
如果你的所有数据库中,有部分低版本(如10205、11.1)需要通过dblink访问高版本的库(如11.2.0.4,12.2),那么可能有风险,建议将低版本的库进行升级或者安装上面推荐的Patch;
如果你的数据库都是低版本的库,那么不受任何影响;
如果你的数据库之间,没有dblink相互访问,你也可以高枕无忧!

科普一下SCN机制
1、SCN(System Change Number) ,也就是通常我们所说的系统改变号,是数据库中非常重要的一个数据结构。它定义数据库在某个确切时刻提交的版本。在事物提交时,它被赋予一个唯一的标示事物的 SCN 。 SCN 提供 Oracle 的内部时钟机制,可被看作逻辑时钟,这对于恢复操作是至关重要的 ( Oracle 仅根据 SCN 执行恢复)。

2、Oracle 通过 SCN 来维护数据库的一致性,并通过SCN 实施 Oracle 至关重要的恢复机制。

3、SCN 是Oracle数据库的内部时钟,单调递增,不可逆转。

SCN接近极限值的风险
SCN 在很多情况下会增长,比如Commit,Oracle对这个增长进行控制。如果通过 DB Link 进行跨数据库访问,基于分布式一致性原理,Oracle会将两个数据库的SCN时钟同步;通过DB Link,SCN低的被拉高,一旦超过数据库的允许限制,就会出错。如果数据库的 SCN 接近极限,则数据库就可能频繁出错,最坏的情况是事务都执行不了,数据库停顿。由于SCN不可以重置,严重情况甚至要重建数据库。

查看下scn使用的最大位数
Oracle 使用了 6 Bytes 记录SCN,也就是48位,不能无限增长。6 Bytes 的最大值是:

SQL> select power(2,48) scn from dual;
           SCN
----------------------------
    281,474,976,710,656

如果在6月份使用最新的scn机制schema 3,也就是Oracle在内部控制每秒增加的SCN不超过 96K,按照这样计算,那么在 96K 的约束之下,SCN 的存储空间,可以使用 90 年。

SQL> select power(2,48) / 96 / 1024 / 3600 / 24 / 365
 from dual;
POWER(2,48)/96/1024/3600/24/365
-------------------------------
      90.795013

当然,在新的算法中,Oracle改变了 SCN 算法的起点值,在最新96K的增长率下,起点分别近似调整为:
3: ~ 2008/03/30
所以经过调整最大支持到大约 2097年。

我们需要做哪些
梳理所有Oracle数据库,确认版本信息,将数据库升级到11.2.0.4、12.1.0.2以上版本或者包含补丁程序的低版本打补丁。

以下是11.2.0.4的数据库,检查是否启用SCN的新机制(auto rollover)

set serveroutput on
declare
v_autorollover_date date;
v_target_compat number;
v_is_enabled boolean;
begin
dbms_scn.getscnautorolloverparams(v_autorollover_date, v_target_compat, v_is_enabled);
dbms_output.put_line('auto rollover date : '||to_char(v_autorollover_date,‘YYYY-MM-DD’));
dbms_output.put_line('target scheme : '||v_target_compat);
dbms_output.put_line('rollover enabled (1=yes): '||sys.diutil.bool_to_int(v_is_enabled));
end;
/

auto rollover date      : 2019-06-23
target scheme           : 3
rollover enabled (1=yes): 1

PL/SQL procedure successfully completed.

大家可以在sqlplus中执行如上脚本,如有上述结果输出,证明这个数据库会自动启用新的SCN机制。

你可能感兴趣的:(补丁)