當前位置:
首頁 > 最新 > 新增視圖找出外部 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 三個視圖收集信息。

創建示例視圖 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

-----------

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

-----------

SQL>@check_ext_scn

no rows selected

## 注意資料庫1中沒有發現記錄。

Database 2:

SQL> select current_scn from v$database;

CURRENT_SCN

-----------

##注意資料庫2中的 SCN 現在與資料庫1同步。

SQL>@check_ext_scn

## 從上面的輸出,我們可以看到資料庫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

-----------

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

-----------

##Dblink連接後SCN號發生推進。

SQL>@check_ext_scn

##注意,即使在 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 跳變的資料庫上使用此視圖。

近期活動


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雲和恩墨 的精彩文章:

TAG:雲和恩墨 |