[20180124]奇怪的SQL*Net message from dblink.txt

来源:https://www.cnblogs.com/lfree/archive/2018/01/25/8351481.html
-Advertisement-
Play Games

[20180124]奇怪的SQL*Net message from dblink.txt--//生產系統出現大量的SQL*Net message from dblink事件,自己分析看看.1.環境:--//這個環境是伺服器在分院,有時候要通過dblink訪問總院的資料庫.xxxx> @ ver1PO ...


[20180124]奇怪的SQL*Net message from dblink.txt

--//生產系統出現大量的SQL*Net message from dblink事件,自己分析看看.

1.環境:
--//這個環境是伺服器在分院,有時候要通過dblink訪問總院的資料庫.

xxxx> @ ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

xxxx> @ ev_name.sql "SQL*Net message from dblink"
EVENT#   EVENT_ID NAME                        PARAMETER1 PARAMETER2 PARAMETER3 WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS
------ ---------- --------------------------- ---------- ---------- ---------- ------------- ----------- ----------
   356 4093028837 SQL*Net message from dblink driver id  #bytes                   2000153315           7 Network

--//P2參數表示傳輸的位元組數量.我發現一個奇特現象:

xxxx> SELECT *  FROM V$ACTIVE_SESSION_HISTORY WHERE event = 'SQL*Net message from dblink' AND p2 > 1;
no rows selected

xxxx> SELECT count(*)  FROM V$ACTIVE_SESSION_HISTORY WHERE event = 'SQL*Net message from dblink' AND p2 = 1;
  COUNT(*)
----------
    181068

--//出現問題的都是1個位元組的情況,按照道理這樣的傳輸不會出現的SQL*Net message from dblink事件,雖然分院與總院租用的電信的線路,
--//至少10M的帶寬,本想找網路管理員要網路出口的流量圖,估計沒做監控,失望.不過傳輸量這麼小,網路應該問題不大.

--//我從總院內網的一臺機器ping分院伺服器.使用
# ping -s 9000 分院伺服器
...
9 packets transmitted, 9 received, 0% packet loss, time 8007ms
rtt min/avg/max/mdev = 1.034/1.255/2.776/0.539 ms

# ping -s 9000 總院伺服器
10 packets transmitted, 10 received, 0% packet loss, time 9000ms
rtt min/avg/max/mdev = 0.303/0.342/0.402/0.039 ms

--//大約1ms往返內網網之間,應該問題不大.而我執行如下:

/* Formatted on 2018/1/24 9:24:37 (QP5 v5.269.14213.34769) */
  SELECT machine
        ,port
        ,session_id
        ,session_serial#
        ,MIN (sample_time) MIN
        ,MAX (sample_time) MAX
        ,MAX (sample_time) - MIN (sample_time) delta
    FROM V$ACTIVE_SESSION_HISTORY
   WHERE event = 'SQL*Net message from dblink'
GROUP BY machine
        ,port
        ,session_id
        ,session_serial#
ORDER BY 5 DESC;

--//我發現一個獨特的規律,delta的間隔大多數都是+00 00:15:24.369000上下相差1秒.15*60+25 = 925.另外我使用如下查詢:

SELECT sql_id,count(*)  FROM V$ACTIVE_SESSION_HISTORY WHERE event = 'SQL*Net message from dblink' group by sql_id order by 2 desc;

--//反查sql語句,居然發現靠前的幾個存在dblink訪問外.其中一些執行如下:
select sysdate from dual;

--//很明顯dblink鏈路出了問題,才會出現這樣的情況.

2.分析:
--//分析我已經在鏈接:
http://blog.itpub.net/267265/viewspace-2150434/
http://blog.itpub.net/267265/viewspace-2150431/

--//問題在於使用總院伺服器設置了SQLNET.EXPIRE_TIME參數,,定時監測服務端與客戶端連接情況.對於這裡監測dblink的連接情況.
--//但是在總院與分院之間配置的是狀態防火牆,不允許這樣的包通過,這樣總院伺服器發起的測試連接都被阻塞.而且根據前面的測試
--//一旦發出測試包發現不通,dblink的連接就出現問題.這樣用戶的應用程式如果僅僅訪問分院的伺服器資料庫不會存在問題.因為這條
--//鏈接是通的,但是一旦執行事務提交就會掛起(註使用dblink是會產生小量的redo的).這就是我們現在生產系統遇到的問題.

--//補充說明,使用dblink會產生事務的.許多開發並不知道,關於如何關閉資料庫會話的dblink,參考鏈接
--//http://blog.itpub.net/267265/viewspace-2123710/
SCOTT@book> @ &r/ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> @ &r/xid
XIDUSN_XIDSLOT_XIDSQN
------------------------------

no rows selected

SCOTT@book> select sysdate from dual@loopback ;
SYSDATE
-------------------
2018-01-24 09:43:27

SCOTT@book> @ &r/xid
XIDUSN_XIDSLOT_XIDSQN
------------------------------
10.21.21378

--//註xid.sql腳本:
select dbms_transaction.local_transaction_id()  XIDUSN_XIDSLOT_XIDSQN from dual ;

--//一種情況很特殊,如果在dg上以只讀打開資料庫,使用dblink是沒有問題在11g下(10g會存在問題),但是如果sql語句涉及2個dblink鏈
--//接,這個問題可以參考我以前的鏈接:http://blog.itpub.net/267265/viewspace-2138879/

--//這個時間大約就是925秒,與我前面鏈接http://blog.itpub.net/267265/viewspace-2150434/,http://blog.itpub.net/267265/viewspace-2150431/
--//是一致的,補充1點,我前面的測試少算了最後1次測試時間120.補上基本一致了.

3.解決訪問:
--//最佳方法就是取消狀態防火牆設置.這是最佳方案.
--//或者增加SQLNET.EXPIRE_TIME參數設置,規避伺服器發起的監測,不過這樣就失去這個參數的意義.
--//在訪問dblink後,即使select最好加一個提交.這樣雖然dblink連接不會斷開,至少一些應用不會出錯.因為一些應用的提交順帶提交訪問dblink產生的事務.
--//如果這時dblink出問題,用戶的操作也會掛起,rollback掉.

--//最後再次佩服我們的使用者,居然這樣的問題也能忍耐,要是不是一次下班路上別人給我提起,我才關註這個問題.
--//更加佩服我們的團隊,這個問題存在這麼長時間,開發反應,我們資料庫團隊把問題歸到網路,就沒有任何人靜下來思考解決問題.失望....

4.我自己也重覆測試:
xxxx> select sysdate from dual@xhlis;
SYSDATE
-------------------
2018-01-24 10:05:52

xxxx> host sleep 900

xxxx>
xxxx> select sysdate from dual ;
SYSDATE
-------------------
2018-01-24 10:23:39

--//本地可以訪問,如果你執行dml的提交問題再現

xxxx> commit;
--//掛起...


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 普通模式下 u 撤銷 ctrl + r 反撤銷 ...
  • 三台hadoop集群,分別是master、slave1和slave2。下麵是這三台機器的軟體分佈: master:NameNode、ZK、HiveMetaSotre、HiveServer2、SentryServer slave1:DataNode、ZK slave2:DataNode、ZK 2 軟體 ...
  • UDF函數中定義的集合對象何時初始化 udf函數放在sql中對某個欄位進行處理,那麼在底層會創建一個該類的對象,這個對象不斷的去調用這個evaluate(...)方法,截圖如下: 1.1 如果說對於每一條傳入UDF中需要處理的數據都需要全新的集合對象,那麼這個時候集合對象就需要在類中聲明,在eval ...
  • 聯合索引概念:當系統中某幾個欄位經常要做查詢,並且數據量較大,達到百萬級別,可多個欄位建成索引 使用規則: 1.最 左 原則,根據索引欄位,由左往右依次and(where欄位很重要,從左往右) 2.Or 不會使用聯合索引 3.where語句中查詢欄位包含全部索引欄位,欄位順序無關,可隨意先後... ...
  • 以下為二維表信息 //統計嚴重等級Bug SELECT severity,count(severity) FROM `bf_bugview` where product_id=476 GROUP BY severity //統計創建者Bug SELECT created_by_name,count( ...
  • 近日在研究v$latch視圖時,發現一個從未見過的數據類型。v$latch 中ADDR屬性的數據類型為RAW(4|8) 同時也發現v$process中的ADDR屬性的數據類型也為RAW(4|8)。於是查了一下oracle 的SQL Language Reference文檔,文檔如下描述: The R ...
  • 接觸變成時間不久,之前對於MySQL的瞭解局限於簡單的CURD,沒有系統和深入的學習過,最近想要更深入的學習和瞭解一下MySQL,打算先從官方文檔入手。 最新官方文檔:https://dev.mysql.com/doc/refman/8.0/en 1. MySQL對標準SQL的擴展 (1) MySQ ...
  • 前段時間因工作需求,特地學習了下sp_send_dbmail的使用,發現網上的示例對我這樣的菜鳥太不友好/(ㄒoㄒ)/~~,好不容易完工來和大家分享一下,不談理論,只管實踐! 如下是實際需求: -- Title: 集團資質一覽表-- Description1:<1、距離到期日期1年內和已過期的發到期 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...