未完待续:关于DB Link和SCN,你还需要知道的是...

前情回顾:

更新通报:Oracle修正了关于DB Link补丁的公告

解决方案:Oracle的DB Link问题及升级路线详述

预警揭秘:11.2.0.4前版必须在2019年4月升级

Oracle Database 12.2 中,为了更彻底的解决SCN问题,Oracle 通过引入 BigSCN 的新特性,最终改变了 SCN 的算法。

BigSCN 新特性最根本的改变是:将原来 SCN 的存储位数从 6 字节扩展为 8 字节。对比起来,我们将原来的SCN算法称为 SmallSCN,现在的就是 BigSCN。

在 Oracle 12.2 的执行文件中,可以看到其中的一点提示:

[oracle12c@enmotech bin]$ strings oracle | grep big_scn _big_scn_test_mode Raising initial SCN from 0x%016llx to 0x0002000000000000 due to _big_scn_test_mode = 4 Raising initial SCN from 0x%016llx to 0x0000ffffffff1fff due to _big_scn_test_mode = %d

通过隐含参数列表,可以获得 big scn 的一个隐含参数,从这个注释中可以看出新特性被命名为 BigSCN, 缺省值是 2 ,在产品环境中这个参数不可以修改,是以测试目的设置的 :

NAME: _big_scn_test_mode VALUE: 2 DESCRIB: testing mode for BigSCN

通过以上两类输出,可以看到,当 _big_scn_test_mode 被设置为 4 的时候,SCN 会增进为 0x0002000000000000 ,由这些我们可以看出 SCN 终于突破了 6 Bytes 的设置,进入到了 8 Bytes 时代。


插播活动信息

2018 ACOUG中国行之·上海站 4月13日上海相见,从Oracle 18c到MySQL 8.0 ,5 大技术主题,欢迎来约,报名详情参考:

ACOUG China Tour 2018 - 4月13日启航上海站

当SCN mode 设置为 4 的时候,SCN 会直接跃迁到 7 Bytes,超越了 6 Bytes 的界限。

那么这个SCN 是多少?

SQL> select to_number('2000000000000','xxxxxxxxxxxxx') scn from dual; SCN ------------------------ 562,949,953,421,312

而 6 Bytes 的 SCN极限值是281 trillion :

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

将这两组数据放到一个表格会显得一目了然:

SCN 位数和设置

SCN值

6 Bytes最大可用

281,474,976,710,656

_big_scn_test_mode=4

562,949,953,421,312

BigSCN 最大可用

9,223,372,036,854,775,808

_big_scn_test_mode=4 的起点是 49 位,比较 原来的 48 位增进一位,这个起点就直接超越了过去的最大限制:

SQL> select power(2,49) scn from dual; SCN ------------------------ 562,949,953,421,312

BigSCN 最大可用值上升到一个天量数字,可以看到关于SCN问题,我们越来越不需要去担心了:

SQL> select power(2,63) scn from dual; SCN -------------------------------- 9,223,372,036,854,775,808

虽然理论值做出了改变,SCN的地址空间也获得了增加,但是在实践中,这些新特性的获得是渐进式,在 12.2 之后,这些特性才会逐渐的释放出来。

在以下我的测试环境中,尝试将SCN推进到了极高的位置:

SQL> select current_scn scn from v$database; SCN -------------------------------- 4,519,057,215,000,399 SQL> oradebug setmypid Statement processed. SQL> oradebug dumpvar sga kcsgscn_ kcslf kcsgscn_ [0600113B8, 0600113E8) = 00050F5D 00100E0F

将这个数字放到前面的表格中,大家可以看到SCN在实践中可以获得的海量值空间:

SCN 位数和设置

SCN值

6 位SmallSCN 最大

281,474,976,710,656

_big_scn_test_mode=4

562,949,953,421,312

测试环境 SCN 推进量

4,519,057,215,000,399

8 位BigSCN 最大

9,223,372,036,854,775,808

为了防止SCN的过度增加,Oracle 增加了内部函数去分析headroom,并通过 600 号错误的 kcm_low_scn_headroom_alert_1 抛出异常:

2018-03-23T18:12:01.849206+08:00 Errors in file /enmo12c/enmo12c/trace/enmo12c_ora_5259.trc (incident=174424) (PDBNAME=CDB$ROOT): ORA-00600: internal error code, arguments: [2252], [4520092301887888], [4519517455400960], [], [], [], [], [], [], [], [], [] Incident details in: /enmo12c/enmo12c/incident/incdir_174424/enmo12c_ora_5259_i174424.trc 2018-03-23T18:12:01.858629+08:00 Errors in file /enmo12c/enmo12c/trace/enmo12c_ckpt_5220.trc (incident=174304) (PDBNAME=CDB$ROOT): ORA-00600: internal error code, arguments: [kcm_low_scn_headroom_alert_1], [], [], [], [], [], [], [], [], [], [], [] Incident details in: /enmo12c/enmo12c/incident/incdir_174304/enmo12c_ckpt_5220_i174304.trc

这个启用了 BigSCN 的 12.2 数据库,当通过DB Link连接 11.2.0.4 的数据库时:

SQL> create database link enmo connect to eygle identified by eygle using 'enmo'; Database link created. SQL> select * from dual@enmo; select * from dual@enmo * ERROR at line 1: ORA-24442: SCN exceeds the capability of the target OCI database or client

这是一个新的错误号:

ORA-24442: SCN exceeds the capability of the target OCI database or client Cause: An attempt was made to transfer a system change number (SCN) to an Oracle database or client that is older than Release 12.2 and the SCN exceeds the maximum value that such a system can handle. Action: If needed, update the target database or client to Release 12.2 or higher.

有了BigSCN的新特性,在12.2版本之后,Oracle 关于SCN的种种问题,可能再也不容易被遇到了。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2018-03-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java呓语

适配器模式(转化匹配,复用功能)

如果您是第一次阅读我的设计模式系列文章,建议先阅读设计模式开篇,希望能得到您宝贵的建议。

884
来自专栏菩提树下的杨过

将淘宝数据包导入自己的商城系统

淘宝网有一个淘宝助理,可以方便的将淘宝店的商品资源导出成csv格式的数据包。很多商城系统为了能快速输入商品,都会要求开发者能最大限度的利用淘宝数据包直接导入产品...

2449
来自专栏Java帮帮-微信公众号-技术文章全总结

Java设计模式-策略模式

策略模式: 定义一系列的算法, 将其一个个封装起来, 并使它们可相互替换, 使得算法可独立于使用它的客户而变化. ? (图片来源: 设计模式: 可复用面向对象...

4376
来自专栏desperate633

设计模式之状态模式(state模式)状态模式的具体实例状态模式的分析

面向对象编程中,类用来表示对象,一般情况下,我们需要考虑用类来表示什么具体的东西。类对应的东西可能存在于真实世界中,也可能不存在于真实世界中。 状态模式所表示...

1002
来自专栏向治洪

百度地图之标注聚会

俗话说站在巨人的肩膀上将事半功倍,在写android的百度地图标注物聚合时,我在网上也进行了大量的查询,发现标注物聚合的算法很早就有人写了,不过他们是js或者是...

2206
来自专栏个人随笔

C# 操作 access 数据库

private staticstring connStr = @"Provider= Microsoft.Ace.OLEDB.12.0;...

44913
来自专栏用户画像

实验5.1 存储过程的建立与使用

使用CREATE  PROCEDURE语句创建存储过程,ALTER  PROCEDURE语句修改存储过程,DROP  PROCEDURE语句删除存储过程,存储过...

673
来自专栏小古哥的博客园

数据库设计入门

数据库是网络应用的基础,良好的表结构设计,对整个应用起着至关重要的作用。 数据库设计的步骤: 1.需求分析:数据是什么,有哪些属性,数据和属性的特点 2.逻...

4215
来自专栏JarvanMo的IT专栏

Java中避免if-else-if:策略模式策略模式(Policy)总结

实际工作中,我们总会遇到类似如下的需求: 某支付系统接入以下几种商户进行充值:易宝网易,快线网银,19pay手机支付,支付宝支付,骏网一卡通,由于每家充值系统...

2373
来自专栏web前端教室

web前面装逼指南

开篇语: 生有涯而装逼无涯 ---我曰(yue)的 web前端现在也是百花齐放了, 野路子出来的, 科班出来的, 搬砖转过来的, 失足掉进来的...

1856

扫码关注云+社区

领取腾讯云代金券