暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

SCN Compatibility与DB Link互联问题分析及建议

原创 罗海雄 2019-05-31
1761

1. 问题背景

根据Oracle的设计,目前所有Oracle数据库对SCN都有个上限的限制,其上限为当前时间与1988/01/01的秒数差*16k。对于指定的高版本数据库(10.2.0.5.12+patch 14121009 、11.1.0.7.20、11.2.0.3.9、11.2.0.4.*、12.1.0.2及以上),这个上限计算方式由SCN COMPATIBILITY控制,当前值为1。通过这种方式,Oracle控制所有的数据库的SCN都不超过这个上限,从而保证数据库DB Link正常的相互访问。

但是,对于高版本数据库,Oracle将会在2019年6月23日后自动调整SCN COMPATIBILITY为3,调整之后,这些数据库内部的SCN上限增速会变成96k, 从而可能出现超出低版本的SCN的情况,如果发生这种情况,将会导致低版本数据库无法与高版本通过DB Link进行连接。

对此,我公司组织技术专家进行了详细的研究。

2. 高低版本的区分

如果已经有各个数据库的准确版本及PSU信息,可以通过以下的信息判断。高版本数据库包括以下:

Ø  所有12.1.0.2 及以上的数据库,含Oracle 18c

Ø  11.2.0.4 的数据库,包含所有PSU

Ø  11.2.0.3 的数据库,PSU至少到11.2.0.3.9

Ø  11.1.0.7 的数据库,PSU至少到 11.1.0.7.20

Ø  10.2.0.5 的数据库,PSU为10.2.0.5.12,且打上 14121009补丁(注意,10.2.0.5.13+的PSU在Oracle官网上并没有14121009可供下载,所以10.2.0.5.13+应当视为低版本

其他的版本,都是属于低版本。 也就是说:

Ø  Oracle 11.1.0.6及以前版本,含绝大多数Oracle 10g(除了10.2.0.5.12+14121009).

Ø  Oracle 11.1.0.7, PSU小于11.1.0.7.20

Ø  Oracle 11.2.0.1/11.2.0.2

Ø  Oracle 11.2.0.3, PSU小于11.2.0.3.9

      

       如果没有准确的PSU, 由于高版本引入了SCN Compatibility新特性, 同时引入DBMS_SCN包用来管理SCN Compatibility,因此,我们可以通过直接检查数据库是否存在DBMS_SCN包来判断数据库是高版本还是低版本。

       如果返回值是1,就说明是高版本。反之,如果返回值是0,则说明是低版本。

       对于高版本的数据库,通过以下代码调用DBMS_SCN,可以获取当前的SCN Compatibility信息。

       如果没有做过改动,那么,Current SCN compatibility为1,AUTO rollover 启用,时间为2019、06/23, 目标为3.

       对于旧版本的数据库,我们可以认为SCN compatibility为1。

3. 潜在风险分析

       根据Oracle的SCN上限算法,16k的速度和96k的速度的上限显然是不一样。

image.png

 

如果部分数据库在2019/06/23自动把SCN Compatibility改到3,那么这些数据库的SCN上限马上就会变成3.5E13 以上,而那些没有发生变化的,SCN上限10年内只能保持在1.8E13到2E13以内。设想一下,如果那些SCN Compatibility=3的数据库,因为一些特殊的原因(bug,手动设置等),SCN异常增加,并超过了同样时间内的rate=16k算法下的SCN上限。两个数据之间需要进行DB Link通讯时,需要把SCN统一到高的那个,而由于超出了旧版本的上限,就会报错,并导致 DB Link通讯失败。

根据以上描述,发生问题需满足以下条件:

A.   两个数据库之间的SCN Compatibility不一致。

B.   SCN Compatibility高的那个数据库,SCN发生异常增长,超出了SCN Compatibility低的数据库的SCN当前时间的上限

C.   两者需要通过DB Link相互连接。

4. 应对策略

根据上面的描述,为了避免高低版本之间DB Link互联出现问题,最彻底的方法是统一SCN Compatibility。因此,可以分为4种情况来考虑:

ü  如果数据库都是高版本数据库,不用处理。

ü  如果数据库是高版本为主,有部分低版本数据库,那么,强烈建议把低版本数据库升级到高版本(其中10.2.0.5应该是调整到10.2.0.5.12 + patch 14121009)

ü  如果数据库都是低版本数据库,不用处理。但要考虑未来新版本数据库加入的问题(参考下面的内容)。

ü  如果数据库是低版本为主,且不方便升级;或者高版本为主,但低版本数据库无法升级,那么,建议统一到SCN Compatibility=1,并且关闭高版本的Auto Rollover功能,避免自动改变SCN Compatibility。

5. 调整Auto Rollover及SCN Compatibility的方法

如果决定把整体环境在2019/06/23后依然保留在SCN Compatibility=1的状态,需要在2019/06/23之前关闭新版本的数据库的SCN Compatibility Auto Rollover功能。

请注意,以下操作存在一定风险,不建议自行操作。需要的话,请联系云和恩墨技术支持操作如下:

Begin
       DBMS_SCN.DISABLEAUTOROLLOVER;
end;
/

Alert log 中会出现以下信息:

Fri Mar 16 17:15:15 2018
Database SCN compatibility auto-rollover disabled

你也可以通过运行第二章节的脚本来确认,脚本应该会输出:

AUTO SCN compatibility rollover is DISABLED!!!

如果决定把整个环境保持在SCN compatibility=1的状态,那么,还需要注意2019/06/23之后加入的数据库。由于在Auto Rollover时间点之后安装,数据库安装完毕后默认SCN compatibility=3,因此,需要手动将改为SCN compatibility=1。此操作需要在Mount状态下进行,操作如下:

Begin
       DBMS_SCN.DISABLEAUTOROLLOVER;
end;
/
shutdown immediate
startup mount
alter database set SCN COMPATIBILITY 1;

Alert日志中会出现以下信息:

Completed: alter database set scn compatibility 1

可以通过第二章提供的脚本进行确认。

6. 参考资料

Oracle Support 文档:

Oracle Databases Need to be Patched to a Minimum Patchset/PSU/RU level before April 2019 (Doc ID 2361478.1)

Mandatory Patching Requirement for Database Versions 11.2.0.3 or Earlier, Using DB Links (Doc ID 2335265.1)

数据和云公众号文章:

https://mp.weixin.qq.com/s/ZPdLb3gDdz54GyfXtuSWpA

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

评论