承上 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 三個檢視收集資訊。
建立演示樣例檢視 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 [email protected];
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
## 從上面的輸出,我們可以看到資料庫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 [email protected];
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
##注意,即使在 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 跳變的資料庫上使用此檢視。
最近活動
掃描二維碼
馬上報名參加
資源下載
關注公眾號:資料和雲(OraNews)回覆keyword獲取
‘2017DTC’,2017 DTC 大會 PPT
‘DBALIFE’。“DBA 的一天”海報
‘DBA04’。DBA 手記4 經典篇章電子書
‘RACV1’, RAC 系列課程視訊及 PPT
‘122ARCH’,Oracle 12.2 體系結構圖
‘2017OOW’,Oracle OpenWorld 資料
‘PRELECTION’,大講堂講師課程資料