自2019年6月23日之后,Oracle启用了 SCN 自动 Auto-Rollover 的新特性,也就是自动调整了 SCN 的增长率算法(缺省32K 每秒,允许 SCN 最高以每秒 96K 计算)。注意,这里说的自动,是指不需要用户做任何主动的变化,数据库会自动调整。
在告警日志中,可以看到如下一行信息:
Database SCN compatibility auto-rollover - control file update
SCN compatibility changed from 1 to 3 (auto-rollover)
而这一调整生效之后,带来的一个可能的负面影响就是:当SCN增长率高的数据库连接增长率低的数据库,如果低版本的数据库无法同步拉高SCN,就会出现ORA-600 2552错误,事务或查询无法进行,影响业务运行。
这个问题直接引发的错误号:ORA-600 2252,在Google搜索上,我的2012年的历史文章排在第一位:《ORA-600 2252 错误与SCN的一致性》,这篇文章描述了时间相关的一种情况。
针对 SCN 兼容性问题,我们曾经发布过一个系列的文章去阐述,所以在此不再赘述,以下链接供参考:
在『DBASK』问答小程序中,用户在线提问,专家随时解答,每期会整理出一些重要的问题与回复。
现在,我们首先看看官方对 ORA-600 2552 错误的解释:
symptom: Query that uses a database link between two machines fails cause: Argument [2252] for the ORA-00600 indicates that the System Change Number (SCN) Oracle is calculating for a transaction is an unreasonable number.
The SCN is calculated based in part on the host system date. If the system date is a LONG way off, the maximum possible value calculated for the SCN may be impossibly large which would result in an ORA-600[2252].
翻译一下就是:
ORA-600 的 2552 号错误,表明 Oracle 为事务计算出来的 SCN 号是不合理的数值,其中的一个可能原因和系统时间相关,因为 SCN 的计算和时间有关,如果操作系统的时间错误,就可能导致这个问题。
当然,最近爆发的 2552 问题和时间无关,是和 SCN 的算法改变相关。对于高版本的数据库,SCN的合理值很高,而对于低版本的数据库,SCN的合理值较低,当通过 DB Link 连接这两个数据库时,因为分布式事务需要同步两个数据库之间的SCN,而低版本数据库不可抬升,就出现了 2552 错误。
当出现这个错误之后,意味着,高版本的数据库 SCN 已经跃升到高值,这个跃迁不可逆转,所以唯一的办法就是升级低版本的数据库;
如果在遇到这个错误之前,可以针对高版本的数据库禁用自动的SCN Roll-Over新特性,继续保持低增长率,则不会出现和低版本失联问题。
我们再来看一下出现这类问题的场景和症状:
例如,主生产数据库为 12.2/12.1.0.2/11.2.0.4等高版本(SCN 增长率高),但还有核心库为10.2.0.4.0,为低版本(SCN增长率低)。
主生产数据库和核心库通过 DB Link 进行核心业务数据交互,这其中的过程决定业务交易的成败。
关键点:客户未在6/23前升级低版本,也没有关闭高版本的SCN Auto RollOver。
案发场景:某12.1.0.2的数据库,由于相连某个数据库发生SCN异常增长,通过DB Link被推高到同样位置。
2019-08-12T16:17:13.142309+08:00
Session (10381,312): EXTERNAL SCN ALERT: Advanced SCN by 1244395 minutes worth to 0x000016cbca6399b7, by outbound distributed transaction begin with returned scn
Session (10381,312): EXTERNAL SCN SOURCE: Outbound connection to DBID: xxxx GLOBAL_DB_NAME: DXHX
Session (10381,312): EXTERNAL SCN SOURCE: DBlink Name: XXXX, Connect String: (DESCRIPTION = (ADDRESS_LIST = (LOAD_BALANCE = no) (FAILOVER=ON) (ADDRESS = (PROTOCOL = TCP)(HOST = XXXX)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = XXXX)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = XXXX) (failover_mode=(type=select)(method=basic)))), Remote Machine: XXX
这个高版本数据库SCN异常跳增涨到2.39E13,而当前的16k速率SCN上限仅为1.66E13。
以下查询诊断输出了SCN的跳变时间,正常情况下数据库的 SCN 位于低位,但是在某个时间受其他数据库影响发生跳变:
Time SCN Changed By Time
------------- --------------------
20190812-1600 16,625,261,888,353
20190812-1601 16,625,261,888,724
20190812-1644 16,625,269,791,170
20190812-1728 16,625,271,982,215 ==> 16k速率下SCN, 离headroom 约13天
20190812-1813 23,985,018,894,186 ==> 96k速率下SCN, 远高于 16k速率下headroom
20190812-1814 23,985,018,894,301
20190812-1900 23,985,020,302,986
20190812-1947 23,985,022,403,528
20190812-2028 23,985,024,519,726
20190812-2028 23,985,024,522,323
20190812-2119 23,985,027,176,419
该数据库需要通过DB Link访问低版本数据库,由于SCN超出低版本数据库SCN 的最大限制,导致ORA-00600 2252 错误。两者之间DB Link无法再工作,严重影响业务:
ORA-00600: 内部错误代码, 参数: [2252], [2834], [4076555716], [], [], [], [], []
由于 SCN 具有传播性,所有和高 SCN 数据库相连接的数据库,都抬升了 SCN,这些数据库连接低版本平台都会出现错误,所有相关业务都可能遭受影响,这时候就只能通过紧急升级低版本数据库来解决问题。
再次警示:请大家再次检查自己管理的数据库,是否还有高低版本混用的情况,如果有,重点关注是否有高版本数据库的SCN超越16k headroom的情况,最好做成监控脚本,万一有超过需要尽快升级旧版本。
整理了一个监控脚本供大家参考:https://www.modb.pro/download/3131(复制地址至浏览器或点击左下角的「阅读原文」)
以上问题对于有大量分支机构数据库的全国性企业,尤其需要重视。
此前我们低估了这一罕见异常可能出现的概率,根据墨菲定律,可能会发生的事情是一定会发生的。所以强烈建议大家要么及时升级低版本的数据库,要么禁用高版本数据库的 Auto-Rollover 特性(同时降低 SCN 兼容性级别至 1 ),避免问题出现时措手不及而影响业务,造成损失。
在处理此问题时有任何疑难,欢迎随时咨询云和恩墨技术支持:010-59007017 。
如有收获,请划至底部,点击“在看”,谢谢!
资源下载
关注公众号:数据和云(OraNews)回复关键字获取
help,30万+下载的完整菜单栏
2019DTCC,数据库大会PPT
2018DTCC , 数据库大会PPT
2018DTC,2018 DTC 大会 PPT
ENMOBK,《Oracle性能优化与诊断案例》
DBALIFE,“DBA 的一天”海报
DBA04,DBA 手记4 电子书
122ARCH,Oracle 12.2体系结构图
2018OOW,Oracle OpenWorld 资料
产品推荐云和恩墨Bethune Pro2 企业版,集监控、巡检、安全于一身,你的专属数据库实时监控和智能巡检平台,漂亮的不像实力派,你值得拥有!
云和恩墨zData一体机现已发布超融合版本和精简版,支持各种简化场景部署,零数据丢失备份一体机ZDBM也已发布,欢迎关注。
云和恩墨大讲堂 | 一个分享交流的地方
长按,识别二维码,加入万人交流社群
请备注:云和恩墨大讲堂