承上 DBlink 与 SCN | 新增视图找出外部 SCN 跳变

简介:

众所周知,当在两个数据库之间建立 dblink连 接时,SCN 将被同步,以维持分布式事务读取一致性。 这将导致在较低 SCN 的数据库的 SCN 跳变。

在分布式事务中很难找到 SCN 跳变的来源。从 12.2 开始,视图DBA_EXTERNAL_SCN_ACTIVITY 以及 DBA_DB_LINK_SOURCES 和 DBA_DB_LINKS 使我们能够跟踪这些跳转。视图DBA_DB_LINK_SOURCES 也为 12.2 版本的新增视图。

Oracle 官网文档原文:

Finding out External SCN jump using DBA_EXTERNAL_SCN_ACTIVITY in 12.2 (Doc ID 2171090.1)

让我们看看下面的例子,如何在 dblink 连接中涉及的两个数据库中捕获这些跳转。

我们将使用以下示例视图,基于 DBA_EXTERNAL_SCN_ACTIVITY,DBA_DB_LINK_SOURCES,DBA_DB_LINKS 三个视图收集信息。

bd23e40803e4ae7cae8b72aa701e37864660ae42

创建示例视图 SQL 文本:

create or replace view check_ext_scn as

(SELECT RESULT, OPERATION_TIMESTAMP, EXTERNAL_SCN, SCN_ADJUSTMENT,

HOST_NAME, DB_NAME, SESSION_ID, SESSION_SERIAL#

FROM DBA_EXTERNAL_SCN_ACTIVITY a, DBA_DB_LINK_SOURCES s

WHERE a.INBOUND_DB_LINK_SOURCE_ID = s.SOURCE_ID)

UNION

(SELECT RESULT, OPERATION_TIMESTAMP, EXTERNAL_SCN, SCN_ADJUSTMENT,

dbms_tns.resolve_tnsname(HOST) HOST_NAME, NULL DB_NAME, SESSION_ID, SESSION_SERIAL#

FROM DBA_EXTERNAL_SCN_ACTIVITY a, DBA_DB_LINKS o, DBA_DB_LINK_SOURCES s

WHERE a.OUTBOUND_DB_LINK_NAME = s.SOURCE_ID

AND OUTBOUND_DB_LINK_OWNER = o.OWNER)

UNION

(SELECT RESULT, OPERATION_TIMESTAMP, EXTERNAL_SCN, SCN_ADJUSTMENT,

s.MACHINE HOST_NAME, NULL DB_NAME, SESSION_ID, SESSION_SERIAL#

FROM DBA_EXTERNAL_SCN_ACTIVITY a, V$SESSION s

WHERE a.SESSION_ID = s.SID AND a.SESSION_SERIAL#=s.SERIAL#

AND INBOUND_DB_LINK_SOURCE_ID IS NULL

AND OUTBOUND_DB_LINK_NAME IS NULL

AND OUTBOUND_DB_LINK_OWNER IS NULL);

上面输出中每列的描述如下:

  • RESULT:SCN 推进是否接受或拒绝

  • OPERATION_TIMESTAMP:推进发生的时间

  • EXTERNAL_SCN:当前 SCN 跳变到的新 SCN 值

  • SCN_ADJUSTMENT:SCN 的增量有多大

  • HOST_NAME:dblink 源于哪个主机

  • DB_NAME:dblink 源自哪个数据库

  • SESSION_ID:此条目的本地实例的会话 ID

  • SESSION_SERIAL#:此条目的本地实例的序列号

创建监测SQL脚本

创建一个脚本名为 check_ext_scn.sql 内容如下:

select * from check_ext_scn;

使用Dblink前查看SCN 号与推进

检查两个数据库中的 SCN:

Database 1:

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

12693736

SQL> set pages 100 lines 200

col result for a15

col OPERATION_TIMESTAMP for a35

col HOST_NAME for a15

col DB_NAME for a15

SQL> @check_ext_scn

no rows selected

Database 2:

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

1574865

##数据库2的 SCN 是否远远小于数据库1。

SQL>@check_ext_scn

no rows selected
使用Dblink后查看SCN号与推进记录 

尝试两个数据库之间的 Dblink 连接以同步 SCN

Database 1:

从数据库1到2启动 Dblink 连接DUAL:

SQL> select * from dual@testlnk;

D

-

X

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

12693943

SQL>@check_ext_scn

no rows selected

## 注意数据库1中没有发现记录。


Database 2:

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

12693956

##注意数据库2中的 SCN 现在与数据库1同步。

SQL>@check_ext_scn

7e5f38da5293c5e99154f8a00c02816582e15c30

## 从上面的输出,我们可以看到数据库1已导致数据库2中的 SCN 推进,推进量为11118928 个SCN。当前隐含参数_EXTERNAL_SCN_LOGGING_THRESHOLD_SECONDS 的值设置为600,因此只会记录大于9830400(600 * 16k)的跳变。

现在,由于两个数据库的 SCN 几乎接近,让我们尝试一个 Dblink 连接,看看如果跳变小于9830400个SCN,是否记录 SCN 跳变。

Database 1:

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

12694325

SQL> select * from dual@testlnk;

D

-

X

SQL>@check_ext_scn

no rows selected

Database 2:

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

12694325

##Dblink连接后SCN号发生推进。
SQL>@check_ext_scn
7d08f9a0e14a90c2ac20f48f5a879bd0100b3313

##注意,即使在 SCN 跳变之后,也没有额外的记录,因为它的跳变量小于9830400。

※§6 小结

A. 本质上,DBA_EXTERNAL_SCN_ACTIVITY 捕获 SCN 跳变将非常有用,有助于我们查找有问题的数据库时缩小范围。视图 DBA_EXTERNAL_SCN_ACTIVITY 不会捕获所有 SCN 跳变。 它只在下面的情况下捕获 SCN 跳变。

1) SCN 跳变请求使得本地 headroom 小于 threshold 而被拒绝(由 _external_scn_rejection_threshold_hours 控制)

2) SCN 跳变请求因为 SCN 的 DELTA 增量过高而被拒绝(由 _external_scn_rejection_delta_threshold_minutes 控制)

3) SCN 跳变被接受但带有警告(由 _external_scn_logging_threshold_seconds 控制)

B. 如果 SCN 推进是由此数据库发起的,则此视图不会提供信息。 我们需要在遇到 SCN 跳变的数据库上使用此视图。


原文发布时间为:2018-04-11

本文作者:云和恩墨

本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”。

相关文章
|
7月前
|
存储 数据库
ALTER MATERIALIZED VIEW LOG :语句来更改现有物化视图日志的存储特征或类型。
`ALTER MATERIALIZED VIEW LOG` 语句用于修改已有的物化视图日志的存储属性或类型。配合示例中的动画图像(由于格式限制无法显示),该语句帮助优化数据库的性能和管理。
85 0
|
SQL Oracle 关系型数据库
"ORA-00942: 表或视图不存在 "的原因和解决方法
采用Oracle数据库,使用Powerdesigner设计,生成Sql文件导入后查询出现“ORA-00942: 表或视图不存在 ”,很是郁闷,这个问题以前出现过,当初解决了,但因好久没有使用,这次竟然忘了,害得我浪费了好些时间,为了避免再次忘记,将它记下来,同时和大家一起分享。
2648 0
|
SQL 存储 Oracle
Oracle总结【视图、索引、事务、用户权限、批量操作】 一
在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了…那么本篇主要总结关于Oralce视图、序列、事务的一些内容… 在数据库中,我们可以把各种的SQL语句分为四大类… (1)DML(数据操纵语言):select,insert,update,delete (2)DDL(数据定义语言):create table,alter table,drop table,truncate table (3)DCL(数据控制语言):grant select any table to scott/revoke select any table from scott (4)TCL(事务
177 0
Oracle总结【视图、索引、事务、用户权限、批量操作】 一
|
SQL Oracle 关系型数据库
Oracle总结【视图、索引、事务、用户权限、批量操作】二
在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了…那么本篇主要总结关于Oralce视图、序列、事务的一些内容… 在数据库中,我们可以把各种的SQL语句分为四大类… (1)DML(数据操纵语言):select,insert,update,delete (2)DDL(数据定义语言):create table,alter table,drop table,truncate table (3)DCL(数据控制语言):grant select any table to scott/revoke select any table from scott (4)TCL(事务
189 0
Oracle总结【视图、索引、事务、用户权限、批量操作】二
|
SQL 存储 Oracle
Oracle总结【视图、索引、事务、用户权限、批量操作】三
在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了…那么本篇主要总结关于Oralce视图、序列、事务的一些内容… 在数据库中,我们可以把各种的SQL语句分为四大类… (1)DML(数据操纵语言):select,insert,update,delete (2)DDL(数据定义语言):create table,alter table,drop table,truncate table (3)DCL(数据控制语言):grant select any table to scott/revoke select any table from scott (4)TCL(事务
162 0
Oracle总结【视图、索引、事务、用户权限、批量操作】三
|
Oracle 关系型数据库
【Flashback】使用视图快速获得Flashback Query闪回查询数据
本文给出使用视图协助我们快速构造闪回查询内容,通过视图可以方便的检索“历史上的数据”。 1.构造闪回查询视图需求描述 1)准备员工表和工资表 2)删除工资表中雇佣年限在1994年之前的记录 3)创建视图可以查询工资表删除之前的记录 2.准备环境 1)准备员工表和工资表 sec@ora10g> create table emp (id number,name varchar2(20), e_date date); Table created. sec@ora10g> create table salary (id number, salary number); Table create
136 0
|
SQL Oracle 关系型数据库
Oracle总结【视图、索引、事务、用户权限、批量操作】
前言 在Oracle总结的第一篇中,我们已经总结了一些常用的SQL相关的知识点了...那么本篇主要总结关于Oralce视图、序列、事务的一些内容... 在数据库中,我们可以把各种的SQL语句分为四大类.
1317 0