ORACLE中STATUS為INACTIVE但是SERVER為SHARED狀態的會話淺析

来源:http://www.cnblogs.com/kerrycode/archive/2016/12/15/6183861.html
-Advertisement-
Play Games

我們知道當ORACLE資料庫啟用共用伺服器模式時,通過共用伺服器模式連接到資料庫的會話是有一些特征的。在v$session裡面,其SERVER的狀態一般為SHARED和NONE, 為SHARED時,表示當前會話正在執行SQL語句,其占用共用伺服器進程,會話的STATUS狀態為ACTIVE;當會話狀態... ...


   我們知道當ORACLE資料庫啟用共用伺服器模式時,通過共用伺服器模式連接到資料庫的會話是有一些特征的。在v$session裡面,其SERVER的狀態一般為SHARED和NONE, 為SHARED時,表示當前會話正在執行SQL語句,其占用共用伺服器進程,會話的STATUS狀態為ACTIVE;當會話狀態STATUS處於INACITVE時,它的SERVER欄位值一般為NONE,意味著此時並沒有共用伺服器進程服務該會話,這個詳細請見v$session中server為none與shared值解析 這篇博客。但是最近在一資料庫中突然見到一些會話STATUS為INACTIVE,但是SERVER狀態為SHARED的會話,如下所示:

clip_image001

 

其實發現這個問題是因為在追查一個TNS-12535的問題時發現的。當時突然出現短暫的資料庫(Oracle 10g R2)連接不上的情況,nmon監控發現當時的整體資源開銷都非常小,也分析過AWR、ASH報告,並沒有發現很特殊的情況,但是在bdump下麵發現shared server進程生成的trc文件。例如下麵一個 epps_d004_24858.trc,截圖所示:

 

clip_image002

 

在這篇博客”TNS-12535: TNS:operation timed out案例解析”裡面我分析、構造過出現TNS-12535錯誤的場景。但是我們分析ASH報告和查詢dba_hist_active_sess_history時發現出現問題的時間段,active會話的數量不超過4個。所以可以排除是這種情形。後面檢查發現共用伺服器模式的會話居然有STATUS為INACTIVE但是SERVER為SHARED狀態的會話,而且數量較多,本身這台伺服器的max_shared_servers參數為32,所以當大量INACTIVE會話一直占用shared server進程時,當ACITVE會話需要shared server服務進程時就會由於shared server進程不夠而處於等待狀態,時間長了就會出現TNS-12535錯誤。那麼就有可能出現active session不多,但是連接不上資料庫的這種情況。分析至此,那麼就有兩個問題需要解決:1 為什麼INACTIVE的會話會占用shared server進程不釋放? 2 這個分析必須要經測試驗證確認. 3:如何解決這個問題?

 

SQL> show parameter max_shared_servers;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers                   integer     32
SQL> 

 

關於第一個問題,剛剛開始一直沒有找到答案,後面才在oracle metalink上面找到了答案,官方文檔High Number Of Shared Servers Usage In 10g When Compared To 9i (文檔 ID 444950.1)裡面有相關介紹,如下摘抄所示:

 

 

APPLIES TO:

Oracle Server - Enterprise Edition - Version: 9.2.0.1 to 10.2.0.3
This problem can occur on any platform.

SYMPTOMS

On 10g having a shared server configuration and seeing many sessions with "STATUS" "INACTIVE" but still these sessions are not releasing the shared server process.

When you query from V$SESSION

SQL>select sid,server,status FROM v$session WHERE SID='154';

SID SERVER STATUS
---------- --------- --------
154 SHARED INACTIVE

In 9i The shared server process is released.

SQL> select SID,Server,STATUS from V$Session where SID=10;

SID SERVER STATUS
---------- --------- --------
10 NONE INACTIVE

In 10g Since the sessions are not releasing the shared server processes, Number of shared server processes increases and will cause new connections to terminate with a message max limit(MAX_SHARED_SERVERS) for shared_servers exceeded.

If you trace the session then you will observe the following wait events.

WAIT #0: nam='virtual circuit status' ela= 30000256 circuit#=7 status=2 p3=0
obj#=-1 tim=745725456
*** 2006-11-28 14:46:43.906
WAIT #0: nam='virtual circuit status' ela= 30000250 circuit#=7 status=2 p3=0
obj#=-1 tim=775725785

CAUSE

When using WORKAREA_SIZE_POLICY=AUTO, In 10g for certain operations (Like SORT) SQL memory can intentionally spill into the PGA of the shared server rather than taking up space in shared memory. When data spills to the PGA the session has to stay tied to that specific shared server. And hence the Process in Inactive can still be holding a shared server until it is terminated.

SOLUTION

The behavior observed is expected in 10g when WORKAREA_SIZE_POLICY is set to automatic.

Use WORKAREA_SIZE_POLICY=MANUAL to prevent the SORT operation to spill over the PGA. This will make sure the session doesn't require any more shared server process and the SHARED_SERVER will be released by the process when it is in INACTIVE status.

BUG 5689608  can be referred for more information

REFERENCES

BUG:5689608 - INACTIVE SESSION IS NOT RELEASING SHARED SERVER PROCESS

 

當資料庫參數WORKAREA_SIZE_POLICY = AUTO時,在10g中對於某些SQL操作(如SORT)所用的SQL記憶體,可能有意地放入( spill over這裡沒有翻譯為溢出)共用伺服器的PGA當中,而不是占用共用記憶體(shared memroy)中的空間。 當數據放入到PGA時,會話必須保持綁定到該特定的共用伺服器(shared server)。 因此,處於非活動狀態的進程仍可以持有共用伺服器,直到會話終止。

另外,解決方案裡面也介紹,可以將參數WORKAREA_SIZE_POLICY設置為MANUAL,這樣可以阻止排序操作將數據放入PGA當中。這個設定可以確保會話不會要求更多的共用伺服器進程,並且當會話變成INACTIVE狀態時,共用伺服器很快就能釋放。

那麼第一個問題解決了,接下來我們來看第二個問題,後面我觀察時,發現出現問題的時候,ACTIVE和INACTVIE的shared server數量等於32了. 那麼我們接下來看看,如何構造這種狀態的會話

 

在共用連接方式的會話1中執行下麵SQL

SQL> show user;
USER is "TEST"
SQL> create table test as select * from dba_objects;
 
Table created.
 
SQL> create or replace package cursor_package as
  2  cursor mycursor is select * from test order by object_name;
  3  end;
  4  /
 
Package created.
 
SQL> begin
  2   open cursor_package.mycursor;
  3   end;
  4   /
 
PL/SQL procedure successfully completed.
 
SQL> create or replace procedure test_case is
  2  l_row TEST%rowtype;
  3  begin
  4  if cursor_package.mycursor%isopen then
  5  fetch cursor_package.mycursor into l_row;
  6  end if;
  7  end;
  8  /
 
Procedure created.
 
SQL> select sys_context('userenv', 'sid') from dual;
 
SYS_CONTEXT('USERENV','SID')
--------------------------------------------------------------------------------
932

 

如上所示,我們知道這個會話ID為932,此時開啟另外一個會話2,查看會話ID為932的狀態。如下所示

SQL> select sid, serial#, status ,server from v$session where sid=932;
 
       SID    SERIAL# STATUS   SERVER
---------- ---------- -------- ---------
       932         23 INACTIVE NONE

 

在會話1中執行下麵SQL語句,如下截圖所示:

SQL> exec test_case;
 
PL/SQL procedure successfully completed.
 
SQL> 

clip_image003

 

然後去會話2中檢查會話ID為932的狀態,此時就會出現STATUS為INACTIVE,SERVER狀態為SHARED的會話狀態了。

 

image

 

關於如何解決這個問題,我們並沒有將將參數WORKAREA_SIZE_POLICY設置為MANUAL,因為修改這個參數過後,需要調整sort_area_size,hash_area_size等參數. 在複雜環境下,一個固定值比較難滿足各個時段的需求。這個資料庫實例本身max_shared_server的值(32)比較小,我們將其調整為48, 另外本身設置了一個crontab作業, 定期清理那些空閑超過一段時間的INACTIVE會話。

 

參考資料:

High Number Of Shared Servers Usage In 10g When Compared To 9i (文檔 ID 444950.1)


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

-Advertisement-
Play Games
更多相關文章
  • 這次搭建iOS的ProtocolBuffer編譯器和把*.proto源文件編譯成*.pbobjc.h 和 *.pbobjc.m文件時,碰到不少問題! 搭建pb編譯器到時沒有什麼問題,只是在把*.proto文件編譯出來後,我用cocoaPods集成ProtocolBuffers到自己項目, cocoa ...
  • 從iOS8系統開始,用戶可以在設置裡面設置在WiFi環境下,自動更新安裝的App。此功能大大方便了用戶,但是一些用戶沒有開啟此項功能,因此還是需要在程式裡面提示用戶的 方法一:在伺服器介面約定對應的數據,這樣,伺服器直接傳遞信息,提示用戶有新版本,可以去商店升級 註意:這個方法是有毛病的,若您的Ap ...
  • 這是一篇我曾經拜讀過的資料庫基礎總結性的文章,原文出自園友 "游戲世界" 。最近想重新鞏固一遍,不過原文訪問受限,我在某網站找到爬蟲版,重新排版後轉載至此處。 1.什麼是SQL語句 SQL語言,結構化的查詢語言(Structured Query Language),是關係資料庫管理系統的標準語言。它 ...
  • 初識spark,需要對其API有熟悉的瞭解才能方便開發上層應用。本文用圖形的方式直觀表達相關API的工作特點,並提供瞭解新的API介面使用的方法。例子代碼全部使用python實現。 1. 數據源準備 準備輸入文件: 啟動pyspark: 使用textFile創建RDD: 查看RDD分區與數據: 2. ...
  • 你正在使用 SQL Server 的哪個版本? "我是誰" SQL Server 及其組件的版本、版本類別和更新級別? 作為一個SQL Server資料庫管理者或維護、支持人員,應該會經常問自己這樣一個問題:我當前SQL Server版本號是?當前版本已經有的累計更新、安全更新包有哪些?這麼多包要選 ...
  • 1、環境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 master作為active主機,data1作為standby備用機,三台機器均作為數據節點,yarn資源管理器在master上開啟,在data1上備用,data1上開啟歷史伺服器 主要參考見下表 Data ...
  • 在Disk-Base資料庫中,如果系統頻繁地創建和更新臨時表,大量的IO操作集中在tempdb中,tempdb很可能成為系統性能的瓶頸。在SQL Server 2016的記憶體(Memory-Optimized)資料庫中,如果考慮使用記憶體優化結構來存儲臨時表,表變數,表值參數的數據,那麼將完全消除IO ...
  • Microsoft SQL Server 2005 提供了一些工具來監控資料庫。方法之一是動態管理視圖。動態管理視圖 (DMV) 和動態管理函數 (DMF) 返回的伺服器狀態信息可用於監控伺服器實例的運行狀況、診斷問題和優化性能。常規伺服器動態管理對象包括:– dm_db_*:資料庫和資料庫對象– ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...