SQL*Net message from client 事件產生的原因分析

路途中的人2012發表於2017-04-24
<div> </div> <div> 今天同事在做資料庫巡檢時,發現巡檢報告中有大量的SQL*Net message from client等待事件。同事問什麼情況下回產生SQL*Net message from client,為什麼回產生SQL*Net message from client。<br /> <div> 1.對於資料庫的一個session來說,每時每刻都在wait 的狀態。<br /> WAIT FOR IO / WAIT FOR CPU / WAIT FOR LATCH /WAIT FOR ...<br /> 這一點你可以查詢 v$session_wait,總有資料.<br /> SQL&gt;select sid,event,p1,p1raw from v$session_wait;<br /> <br /> 2.對於Server process來說,如果客戶端發來一個請求,它處理完所有需要處理的請求之後,它就進入另一個WAIT,<strong>SQL</strong>*<strong>Net</strong> <strong>message</strong> <strong>from</strong> <strong>client</strong> ,等待著Cilent發來請求讓它處理,而我們把這種wait叫做空閒事件(<span>ildel event)</span>,並不代表真正的loading。<br /> 舉一日常生活中的例子,你去銀行辦理業務,辦理業務的視窗的業務員。如果有很多客戶在等待辦理業務,那麼業務員會非常忙碌,但是,當他辦理所有排隊的業務後,沒有人辦理業務了,這時,業務員就處於了SQL*Net message from client狀態,一直等待有人走進大廳來辦理業務的客戶。<span>就相當於業務員wait for "業務</span><span style="font-size:x-small;"><strong>from客戶</strong>“,事實上是在休息,也就是沒有loading.<br /> </span><br /> 4.當然也有其他情況,比如,業務員辦理完業務後,一直沒有按叫號器,大廳裡有很多人都在等待辦理業務 ,這種情況下的 (SQL*Net message from client<span style="display:none;" id="__kindeditor_bookmark_start_123__"></span>) 就不正常了。相<span style="color:#000000;">對應的Oracle裡的就是網路不暢,<strong>Client</strong>想發資訊給Server process,結果不成功,而Server process一直是wait for <strong>SQL</strong>*<strong>Net</strong> <strong>message</strong> <strong>from</strong> <strong>client</strong> .</span><br /> 5.結論,<span>只要網路沒問題。<strong>SQL</strong>*<strong>Net</strong> <strong>message</strong> <strong>from</strong> <strong>client</strong> 這個wait不用管。</span><br /> <br /> <p> <span style="font-size:18px;"><strong>SQL*Net message to client</strong></span> </p> <pre style="display:none;" class="sql" name="code">SQL&gt; select event#,name,parameter1,parameter2,parameter3 from v$event_name where name = 'SQL*Net message to client'; EVENT# NAME PARAMETER1 PARAMETER2 PARAMETER3 ---------- -------------------------------------------------- --------------- --------------- -------------------- 255 SQL*Net message to client driver id #bytes</pre> 這個等待事件發生在伺服器端向客戶端傳送訊息的時候。當伺服器端向客戶端傳送訊息產生等待時,可能的原因是使用者端太繁忙,無法及時接收伺服器端送來的訊息,也可能是網路問題導致訊息無法從伺服器端傳送到客戶端。<br /> <p> 這個等待事件包含兩個引數。 </p> <p> driver id:伺服器端和客戶端連線是用的協議資訊。 </p> #bytes:伺服器端向客戶端傳送訊息的位元組數。<br /> <p> <br /> </p> <p> <span style="font-size:18px;"><strong>SQL*Net message to dblink</strong></span> </p> <pre style="display:none;" class="sql" name="code">SQL&gt; select event#,name,parameter1,parameter2,parameter3 from v$event_name where name = 'SQL*Net message to dblink'; EVENT# NAME PARAMETER1 PARAMETER2 PARAMETER3 ---------- -------------------------------------------------- --------------- --------------- -------------------- 256 SQL*Net message to dblink driver id #bytes </pre> 這個等待事件和SQL*Net message to client相同,不過是發生在資料庫伺服器端和伺服器端之間的等待事件,產生這個等待的原因可能是遠端伺服器繁忙,而無法即時接收傳送過來的訊息,也可能是伺服器之間網路問題導致訊息無法傳送過來。 <p> <br /> </p> <p> 這個等待事件包含兩個引數。 </p> <p> driver id:伺服器端和另一個伺服器端連線是用的協議資訊。 </p> <p> #bytes:伺服器端透過dblink從另一個伺服器端收到的訊息的位元組數。 </p> </div> <br /> 我們可以透過下面語句查詢資料庫看有什麼在等待, </div> <div> 查詢v$session_wait </div> <div> </div> <div> SELECT S.SID,<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S.SERIAL#, <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S.USERNAME,<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S.STATUS,<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S.MACHINE,<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S.PROGRAM,<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S.MODULE,<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A.SQL_TEXT<br /> &nbsp; FROM V$SESSION S,<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; V$SQLAREA A<br /> WHERE S.USERNAME IS NOT NULL<br /> &nbsp;&nbsp; AND S.SQL_ADDRESS = A.ADDRESS<br /> </div> <div> </div> <div> 看見<strong>SQL</strong>*<strong>Net</strong> <strong>message</strong> <strong>from</strong> <strong>client</strong> 等待時間最長,其實這個是oracle空閒等待時間,只要網路沒有問題,可以不用考略這個wait。 <div> </div> <div> </div> </div> <div> </div>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29067253/viewspace-2137878/,如需轉載,請註明出處,否則將追究法律責任。

相關文章