create table system.otable1 (text varchar2(50));
insert into system.otable1 values ('链接到Oracle c19cpdb1');
commit;
create public database link o11201_to_19c connect to system identified by oracle using '192.168.166.30:1521/c19cpdb1';
create table system.otable2 (text varchar2(50));
insert into system.otable2 values ('链接到Oracle 11201');
commit;
create link dm_to_o11201 connect 'oracle' with "SYSTEM" identified by "oracle" using '192.168.166.120:1521/ORCL';
create link dm_to_o19c connect 'oracle' with "SYSTEM" identified by "oracle" using '192.168.166.30:1521/c19cpdb1';
select current_scn,dbms_flashback.get_system_change_number scn from v$database;
select current_scn,dbms_flashback.get_system_change_number scn from v$database;
select cur_lsn from sys.v$rlog;
Oracle使用6 Bytes记录SCN,也就是48位,其最大值是(2开头的15位数):
col scn for 999,999,999,999,999,999
select power(2,48) scn from dual;
Oracle在内部控制每秒增减的SCN不超过 16K,按照这样计算,这个数值可以使用大约544年:
在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';
在 Oracle 12.2将原来 SCN 的存储位数从 6 字节扩展为 8 字节在 Oracle 12.2 的执行文件中,可以看到其中的一点提示:
cd $ORACLE_HOME/bin
strings oracle | grep big_scn
通过隐含参数列表,可以获得 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, ' _', ' ');
_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;
当使用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;
注:脚本来自官方的scnhealthcheck.sql, INDICATOR是距离SCN Headroom(天花板)的天数
数据库当前的请求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
当前19c是18开头的14数字
alert日志
DM到oracle的dblink还能使用,通过查询DM的LSN发现Oracle SCN大跨度的变化并不会同步到DM。
调整时间,推进11201scn,调整时间,启动数据库模拟scn耗尽
ntpdate ntp1.aliyun.com
date -s "2010-01-01 00:00:00"
hwclock -w
启动数据库
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
记录下当前DM的LSN和Oracle的SCN
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;
查询Oracle端的SCN并无变化
SQL> select current_scn,dbms_flashback.get_system_change_number scn from v$database;
CURRENT_SCN SCN
----------- ----------
18253611466 1825361146
通过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.
Doc ID 2687773.1
总结:
文章
阅读量
获赞