注册
达梦与Oracle的DBLINK对lsn/scn同步的影响
专栏/培训园地/ 文章详情 /

达梦与Oracle的DBLINK对lsn/scn同步的影响

Baldwin 2024/10/30 384 0 0
摘要

1、环境概述

image.png

2、构建测试表和DBLINK

2.1 oracle19c建立测试表

create table system.otable1 (text varchar2(50));
insert into system.otable1 values ('链接到Oracle c19cpdb1');
commit;

2.2 oracle 11201建立dblink

create public database link o11201_to_19c connect to system identified by oracle using '192.168.166.30:1521/c19cpdb1';

image.png

2.3 oracle11201建立测试表

create table system.otable2 (text varchar2(50));
insert into system.otable2 values ('链接到Oracle 11201');
commit;

2.4 DM创建DBLINK到oracle11201(ORACLE OCI方式)

create link dm_to_o11201 connect 'oracle' with "SYSTEM" identified by "oracle"  using '192.168.166.120:1521/ORCL';

image.png

2.5 DM创建DBLINK到oracle 19c

create link dm_to_o19c connect 'oracle' with "SYSTEM" identified by "oracle"  using '192.168.166.30:1521/c19cpdb1';

image.png

3、获取当前scn

3.1 oracle11201

select current_scn,dbms_flashback.get_system_change_number scn from v$database;

image.png

3.2 oracle 19c

select current_scn,dbms_flashback.get_system_change_number scn from v$database;

image.png

3.3 DM查看LSN

select cur_lsn from sys.v$rlog;

image.png

4、查看scn健康状况

4.1 oracle11201

image.png

4.2 oracle 19c

image.png

5、SCN扩展

5.1 最大SCN

Oracle使用6 Bytes记录SCN,也就是48位,其最大值是(2开头的15位数):

col scn for 999,999,999,999,999,999
select power(2,48) scn from dual;

image.png

5.2 SCN至少使用时间

Oracle在内部控制每秒增减的SCN不超过 16K,按照这样计算,这个数值可以使用大约544年:
image.png

5.3 最大增长速率变化

在11.2.0.2之前是16384,在11.2.0.2及之后版本是32768

col DESCRIPTION for a30
select x.ksppinm name, y.ksppstvl value, x.ksppdesc description
  from sys.x$ksppi x, sys.x$ksppcv y
 where x.inst_id = userenv('Instance')
   and y.inst_id = userenv('Instance')
   and x.indx = y.indx
   and x.ksppinm = '_max_reasonable_scn_rate';

image.png

5.4 SCN扩充

在 Oracle 12.2将原来 SCN 的存储位数从 6 字节扩展为 8 字节在 Oracle 12.2 的执行文件中,可以看到其中的一点提示:

cd $ORACLE_HOME/bin
strings oracle | grep big_scn

image.png
通过隐含参数列表,可以获得 big scn 的一个隐含参数,从这个注释中可以看出新特性被命名为 BigSCN, 缺省值是 2 ,在产品环境中这个参数不可以修改,当 _big_scn_test_mode 被设置为 4 的时候,SCN 会增进为 0x0002000000000000 ,由这些我们可以看出 SCN 终于突破了 6 Bytes 的设置,进入到了 8 Bytes 时代。

SELECT x.ksppinm name,
    y.ksppstvl value,
    y.ksppstdf isdefault,
    decode(bitand(y.ksppstvf, 7), 1, 'MODIFIED', 4, 'SYSTEM_MOD', 'FALSE') ismod,
    decode(bitand(y.ksppstvf, 2), 2, 'TRUE', 'FALSE') isadj
FROM 
    sys.x$ksppi x, sys.x$ksppcv y
WHERE 
    x.inst_id = userenv('Instance')
AND y.inst_id = userenv('Instance')
AND x.indx = y.indx
AND x.ksppinm ='_big_scn_test_mode'
order by translate(x.ksppinm, ' _', ' ');

image.png
image.png

6、推进SCN号

_minimum_giga_scn(Minimum SCN to start with in 2^30 units),意思是把SCN往前推进到n*1024*1024*1024,在10g可用,11g大部分版本可用

create pfile='/tmp/pfile_tmp.ora' from spfile;

添加_minimum_giga_scn=17000

shutdown immediate;
startup mount pfile='/tmp/pfile_tmp.ora';
show parameter scn
alter database open;
col checkpoint_change# for 999,999,999,999,999
select checkpoint_change# from v$database;
alter system checkpoint;
col current_scn for 999,999,999,999,999
col scn for 999,999,999,999,999
select current_scn,dbms_flashback.get_system_change_number scn from v$database;

6.1 DBLINK同步SCN号

当使用DB Link跨数据库查询时,SCN会被同步,基于分布式一致性原理,Oracle会将两个数据库的SCN时钟同步,SCN低的被拉高,一旦超过数据库的允许限制,就会出错。如果数据库的 SCN 接近极限,则数据库就可能频繁出错,最坏的情况是事务都执行不了,数据库停顿。由于SCN不可以重置,严重情况甚至要重建数据库。查询两个库的SCN Headroom

select version,
       to_char(SYSDATE, 'YYYY/MM/DD HH24:MI:SS') DATE_TIME,
       ((((((to_number(to_char(sysdate, 'YYYY')) - 1988) * 12 * 31 * 24 * 60 * 60) +
       ((to_number(to_char(sysdate, 'MM')) - 1) * 31 * 24 * 60 * 60) +
       (((to_number(to_char(sysdate, 'DD')) - 1)) * 24 * 60 * 60) +
       (to_number(to_char(sysdate, 'HH24')) * 60 * 60) +
       (to_number(to_char(sysdate, 'MI')) * 60) +
       (to_number(to_char(sysdate, 'SS')))) * (16 * 1024)) -
       dbms_flashback.get_system_change_number) /
       (16 * 1024 * 60 * 60 * 24)) indicator
  from v$instance;

image.png
image.png
image.png
image.png
注:脚本来自官方的scnhealthcheck.sql, INDICATOR是距离SCN Headroom(天花板)的天数

6.2 模拟SCN耗尽

数据库当前的请求SCN大于当前最大允许SCN时会提示ORA-600[2252],最大允许SCN是有本地系统时间决定。一个可能性是本地库主机时间向前调了,还有个可能性是通过DBLINK分布式事务同步SCN时,远程库SCN大于本地允许的最大SCN。
一个数据库当前最大的可能SCN被称为"最大合理SCN",这个算法即SCN算法,以1988年1月1日 00点00时00分开始,每秒计算1个点数,最大SCN为16K。
该值可以通过如下方式计算:

col scn for 999,999,999,999,999,999
select
(
    (
        (
            (
                (  
                    (
                        to_char(sysdate,'YYYY')-1988
                    )*12+
                to_char(sysdate,'mm')-1
                )*31+to_char(sysdate,'dd')-1
            )*24+to_char(sysdate,'hh24')
        )*60+to_char(sysdate,'mi')
    )*60+to_char(sysdate,'ss')
) * to_number('ffff','XXXXXXXX')/4 scn
from dual
/

恢复Oracle 11201快照,调整11201服务器时间,使19c scn超过11201的最大合理scn,使用dblink链接

date -s "2010-01-01 00:00:00"
hwclock -w

当前11201最大合理scn
image.png
当前19c是18开头的14数字
image.png

6.3 错误码 600 2252

image.png
alert日志
image.png
DM到oracle的dblink还能使用,通过查询DM的LSN发现Oracle SCN大跨度的变化并不会同步到DM。
image.png
image.png
调整时间,推进11201scn,调整时间,启动数据库模拟scn耗尽

ntpdate ntp1.aliyun.com
date -s "2010-01-01 00:00:00"
hwclock -w

启动数据库
image.png
image.png

7、DM到ORACLE的DBLINK无法使用

image.png

8、DM LSN的增长对ORACLE SCN的影响

DM创建测试表

create table otable3 (text varchar2(30))
insert into otable3 values('链接到DM101')
commit

配置透明网关+ODBC(略)可参考
https://blog.itpub.net/10201716/viewspace-3012980/
Oracle创建到DM的DBLINK

create  public  database link link_11201_to_dm8 connect to "SYSDBA" identified by SYSDBA using 'dm8';

测试dblink
image.png
记录下当前DM的LSN和Oracle的SCN
image.png

SQL> select current_scn,dbms_flashback.get_system_change_number scn from v$database;

CURRENT_SCN        SCN
----------- ----------
18253611466 1825361146

通过建表插入数据推进LSN

CREATE TABLE "SYSDBA"."test222"
(
"COLUMN_1" VARCHAR2(50),
"COLUMN_2" VARCHAR2(50),
"COLUMN_3" VARCHAR2(50),
"COLUMN_4" VARCHAR2(50)) STORAGE(ON "MAIN", CLUSTERBTR) ;
begin
for i in 1..2000 loop
insert into "test222" vaLUeS(ABS(MOD(DBMS_RANDOM.RANDOM,100888)),dbms_random.string('A',12),dbms_random.string('A',12),
dbms_random.string('A',12));
commit;
end loop;
end;

image.png
查询Oracle端的SCN并无变化

SQL> select current_scn,dbms_flashback.get_system_change_number scn from v$database;

CURRENT_SCN        SCN
----------- ----------
18253611466 1825361146

9、DM到DM

通过DPI方式创建DM到DM的DBLINK

create link "dm_to_dm" connect 'DPI' with "SYSDBA" identified by "SYSDBA" using '192.168.166.101:5236'; 
SQL> select * from otable3@"dm_to_dm" ;

行号     TEXT          
---------- --------------
1          链接到DM101

已用时间: 30.924(毫秒). 执行号:1401.

查询创建dblink端的LSN号
SQL> select ckpt_lsn,file_lsn,flush_lsn,cur_lsn,next_seq from sys.v$rlog;

行号 CKPT_LSN FILE_LSN FLUSH_LSN CUR_LSN NEXT_SEQ


1 44053 44146 44146 44146 3352

用时间: 0.499(毫秒). 执行号:1403.
推进源端LSN号

CREATE TABLE "SYSDBA"."test222"
(
"COLUMN_1" VARCHAR2(50),
"COLUMN_2" VARCHAR2(50),
"COLUMN_3" VARCHAR2(50),
"COLUMN_4" VARCHAR2(50)) STORAGE(ON "MAIN", CLUSTERBTR) ;
begin
for i in 1..2000 loop
insert into "test222" vaLUeS(ABS(MOD(DBMS_RANDOM.RANDOM,100888)),dbms_random.string('A',12),dbms_random.string('A',12),
dbms_random.string('A',12));
commit;
end loop;
end;

查询dblink端DM的LSN并无变化

SQL> select ckpt_lsn,file_lsn,flush_lsn,cur_lsn,next_seq from sys.v$rlog;

行号     CKPT_LSN             FILE_LSN             FLUSH_LSN            CUR_LSN              NEXT_SEQ            
---------- -------------------- -------------------- -------------------- -------------------- --------------------
1          44053                44146                44146                44146                3352

已用时间: 0.181(毫秒). 执行号:1405.

10、关于600 2252

Doc ID 2687773.1
image.png
image.png
总结:

  • Oracle与Oracle之间的dblink基于分布式一致性原理,SCN会被同步,而DM到Oracle、Oracle到DM、DM到DM之间的DBLINK均是通过接口实现的,并不会同步SCN和LSN。
  • Oracle高版本使用更大的空间存储scn,并且scn的增长率增大了,这就导致了版本跨度过大的数据库使用dblink的时候有scn耗尽的风险,当scn耗尽时DM到Oracle的dblink也将无法使用,dblink对达梦的lsn没有影响。如果在客户环境中遇到类似情况可以建议客户打上上面列表的补丁。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服