2018年2月15日Oracle官方在MOS上新发布预警文档《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)》中强烈建议所有DBA在2019年6月之前将Oracle数据库版本11.1.0.7、11.2.0.3和12.1.0.1打补丁到下面提到的patchset/PSU级别,以解决未来dblinks互操作性方面的潜在问题。
Oracle只是定义为潜在问题,实际关键是oracle的高版本(11.2.4/12.1.0.2/12.2及以上)数据库在2019年06月23日,默认的SCN兼容性会进行自动变化。
2.1 SCN基础概念
系统更改号(SCN)是Oracle数据库使用的一个逻辑的内部时间戳。SCN对数据库中发生的事件进行排序,这是满足事务的ACID属性所必需的。
数据库使用SCN来查询和跟踪更改。例如,如果事务更新了一行,那么数据库将记录更新发生时的SCN。此事务中的其他修改通常具有相同的SCN。当事务提交时,数据库将为此提交记录SCN。每个事务在提交后增加SCN。
2.2 SCN limit
SCN以单调递增的顺序出现,Oracle数据库可以使用的SCN数量上限非常大。也称为Reasonable SCN Limit,简称RSL。这个值是一个限制,避免数据库的SCN无限制地增大,甚至达到了SCN的最大值。这个值大约是这样一个公式计算出来的:(当前时间-1988年1月1日)*24*3600*16,384 (16K/sec)。兼容性版本1
由于存在上限,任何给定的Oracle数据库都不能耗尽可用的SCN,这一点很重要。Oracle数据库使用基于时间的配给系统来确保不会发生这种情况。
这样做可以确保Oracle数据库随着时间的推移对SCN进行定量配给,从而允许任何使用版本12.2.0.1或更低版本的Oracle数据库进行超过500年的数据处理。从12.2.0.1开始,数据库的兼容性设置为12.2,即使SCN以96K/sec(兼容性版本3)的速度消耗,Oracle数据库也将允许近300万年的数据处理。
2.3 SCN headroom
数据库使用的当前SCN与“不超过”上限之间的差异称为SCN headroom 。
然而,Oracle已经确定,一些软件错误可能会导致数据库试图超过当前最大SCN值(或者超出所保证的范围)。
通常,如果数据库确实试图超过当前的最大SCN值,那么引起此事件的事务将被数据库取消,应用程序将看到一个错误。下一秒,这个限制就会增加,所以通常应用程序在处理过程中会继续出现轻微的打嗝。然而,在一些非常罕见的情况下,数据库确实需要关闭以保持其完整性。在任何情况下,数据都不会丢失或损坏。
2.4 SCN兼容性
SCN 兼容级别是限制SCN增速和SCN RSL。
2.5 Auto-rollover
AUTO-ROLLVOER是一种类例JOB的定时任务,定时修改SCN 兼容性级别。
禁用了AUTO-ROLLOVER 到2019-06-23后SCN兼容级别就不会自动调整,还保持原来的限制。 禁用了Auto-RollOver,可以手动调整scn兼容性(前提是应用了补丁)。
三 关于这次SCN兼容性自动触发的原理
在高版本的数据库中引入了SCN 兼容性参数( Compatibility),而且在这个特性中设置了时间限制。
在Oracle数据库软件内核中, 引入了一个: Auto-RollOver 的机制 。
也就是说Oracle 为不同 SCN 兼容性设定了触发时间,随着时间推移自动迭代,用户会在不知情的情况下自动应用了新的SCN 兼容性。
当在2019年6月23日后,整体数据库环境中,有高版本(定义参看上)创建后, 由于SCN允许最高SCN新增速率会有可能有较高的SCN,而未打补丁的数据库处于较低的SCN级别(可能会出现通过dblink连接这两个数据库,由于DBLINK的特性(两端数据库必须同步SCN),如果SCN增加修改数据库的同步超出它的允许SCN率或当前最大的SCN限制,无法建立连接,那么dblink被拒绝,导致业务中断。
四 查看SCN兼容性级别和调整时间
数据库版本在11.2.0.3.9之前没有打dblink的补丁则没有DBMS_SCN包。
在11g版本可以通过sqlplus连接至数据库执行以下语句
set serveroutput on
declare rsl number; headroom_in_scn number; headroom_in_sec number; cur_scn_compat number; next_compat number; max_scn_compat number; auto_rollover_ts date; is_enabled boolean; begin dbms_scn.getcurrentscnparams(rsl,headroom_in_scn,headroom_in_sec,cur_scn_compat,max_scn_compat); dbms_scn.getscnautorolloverparams(auto_rollover_ts,next_compat,is_enabled); dbms_output.put_line(‘RSL=’||rsl); dbms_output.put_line(‘headroom_in_scn=’||headroom_in_scn); dbms_output.put_line(‘headroom_in_sec=’||headroom_in_sec); dbms_output.put_line(‘CUR_SCN_COMPAT=’||cur_scn_compat); dbms_output.put_line(‘NEXT_COMPAT=’||next_compat); dbms_output.put_line(‘MAX_SCN_COMPAT=’||max_scn_compat); dbms_output.put_line(‘auto_rollover_ts=’||to_char(auto_rollover_ts,’YYYY-MM-DD’)); if(is_enabled) then dbms_output.put_line(‘Auto_rollover is enabled!’); else dbms_output.put_line(‘Auto_rollover is disabled!’); end if; end; / |
样例输出
当前auto rollover是启用且在2019年6月23日自动调整SCN兼容级别为3
五 如何判断是否需要应用补丁调整策略
5.1符合以下条件则无需关注SCN兼容性自动变化及相关补丁信息
所有有DBLINK传输数据数据库的集合版本均为低版本(11.1.0.7/11.2.0.3/12.1.0.1之前版本)或均为高版本(11.2.4/12.1.0.2/12.2及以上),且未来不会有版本和dblink交叉传输数据需求的变化
5.2对于11.1.0.7、11.2.0.3和12.1.0.1版本的数据库
这些补丁增加了数据库当前最大SCN限制,从16k/s到96k/s,且默认为2019年6月24日启动生效,允许更高的SCN速率,使数据库能够支持比早期版本高许多倍的事务速率。
在2019年6月23日之前安装补丁后,可以通关闭autorollover的特性,来规避scn兼容性自动变更到3。命令如下:
sqlplus连接至数据库
Exec dbms_scn. DisableAutoRollover ; |
在2019年6月23日之后安装的高版本(定义参看上)数据库环境设置scn 兼容性至1.命令如下:
sqlplus连接至数据库
ALTER DATABASE SET SCN COMPATIBILITY 1; |
5.3对于上表中Oracle官方没有提及的数据库版本如10.2或更老的数据库
充分评估业务将来可能出现的dblink传输数据的场景,考虑升级数据库或不使用dblink通过JDBC等其他方式进行数据传输。
对于10g数据库在安装完10.2.0.5.171017的PSU以及补丁14121009。
5.4安装相应补丁后将SCN的异常情况记录到alert日志中
我们建议通过控制SCN Headroom的告警阀值使得数据库可以尽可能的将DBLINK传播SCN的行为在alert日志中提现出来,目前我们建议将_external_scn_logging_threshold_seconds设置为600秒左右,使得通过DBLINK传递导致SCN Headroom过低产生alert告警。
alter system set “_external_scn_logging_threshold_seconds”=600 scope=spfile;
参考《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)》