綜述 眾所周知,當(dāng)在兩個(gè)數(shù)據(jù)庫之間建立 dblink連 接時(shí),SCN 將被同步,以維持分布式事務(wù)讀取一致性。 這將導(dǎo)致在較低 SCN 的數(shù)據(jù)庫的 SCN 跳變。 在分布式事務(wù)中很難找到 SCN 跳變的來源。從 12.2 開始,視圖DBA_EXTERNAL_SCN_ACTIVITY 以及 DBA_DB_LINK_SOURCES 和 DBA_DB_LINKS 使我們能夠跟蹤這些跳轉(zhuǎn)。視圖DBA_DB_LINK_SOURCES 也為 12.2 版本的新增視圖。 Oracle 官網(wǎng)文檔原文:
讓我們看看下面的例子,如何在 dblink 連接中涉及的兩個(gè)數(shù)據(jù)庫中捕獲這些跳轉(zhuǎn)。 我們將使用以下示例視圖,基于 DBA_EXTERNAL_SCN_ACTIVITY,DBA_DB_LINK_SOURCES,DBA_DB_LINKS 三個(gè)視圖收集信息。 創(chuàng)建示例視圖 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); 上面輸出中每列的描述如下:
創(chuàng)建監(jiān)測SQL腳本 創(chuàng)建一個(gè)腳本名為 check_ext_scn.sql 內(nèi)容如下: select * from check_ext_scn; 使用Dblink前查看SCN 號與推進(jìn) 檢查兩個(gè)數(shù)據(jù)庫中的 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 ##數(shù)據(jù)庫2的 SCN 是否遠(yuǎn)遠(yuǎn)小于數(shù)據(jù)庫1。 SQL>@check_ext_scn no rows selected 使用Dblink后查看SCN號與推進(jìn)記錄 嘗試兩個(gè)數(shù)據(jù)庫之間的 Dblink 連接以同步 SCN Database 1: 從數(shù)據(jù)庫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 ## 注意數(shù)據(jù)庫1中沒有發(fā)現(xiàn)記錄。 Database 2: SQL> select current_scn from v$database; CURRENT_SCN ----------- 12693956 ##注意數(shù)據(jù)庫2中的 SCN 現(xiàn)在與數(shù)據(jù)庫1同步。 SQL>@check_ext_scn ## 從上面的輸出,我們可以看到數(shù)據(jù)庫1已導(dǎo)致數(shù)據(jù)庫2中的 SCN 推進(jìn),推進(jìn)量為11118928 個(gè)SCN。當(dāng)前隱含參數(shù)_EXTERNAL_SCN_LOGGING_THRESHOLD_SECONDS 的值設(shè)置為600,因此只會記錄大于9830400(600 * 16k)的跳變。 現(xiàn)在,由于兩個(gè)數(shù)據(jù)庫的 SCN 幾乎接近,讓我們嘗試一個(gè) Dblink 連接,看看如果跳變小于9830400個(gè)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號發(fā)生推進(jìn)。 SQL>@check_ext_scn ##注意,即使在 SCN 跳變之后,也沒有額外的記錄,因?yàn)樗奶兞啃∮?830400。 ※§6 小結(jié) A. 本質(zhì)上,DBA_EXTERNAL_SCN_ACTIVITY 捕獲 SCN 跳變將非常有用,有助于我們查找有問題的數(shù)據(jù)庫時(shí)縮小范圍。視圖 DBA_EXTERNAL_SCN_ACTIVITY 不會捕獲所有 SCN 跳變。 它只在下面的情況下捕獲 SCN 跳變。 1) SCN 跳變請求使得本地 headroom 小于 threshold 而被拒絕(由 _external_scn_rejection_threshold_hours 控制) 2) SCN 跳變請求因?yàn)?SCN 的 DELTA 增量過高而被拒絕(由 _external_scn_rejection_delta_threshold_minutes 控制) 3) SCN 跳變被接受但帶有警告(由 _external_scn_logging_threshold_seconds 控制) B. 如果 SCN 推進(jìn)是由此數(shù)據(jù)庫發(fā)起的,則此視圖不會提供信息。 我們需要在遇到 SCN 跳變的數(shù)據(jù)庫上使用此視圖。 近期活動 掃描二維碼 立即報(bào)名參加 |
|