文章編號: 137983 - 上次校閱: 2004年1月19日 - 版次: 1.0

INF:如何解決 SQL Server 裡的孤兒連線

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。
本文曾發行於 CHT137983
全部展開 | 全部摺疊

結論

當 SQL Server 用戶端從 SQL Server 中斷連線時,在伺服器端的連線程序便會被清出。 如果連線程序因為任何原因而未清出的話,那他們便會變成「孤兒」或「幽靈」程序, 並可能會用掉像是鎖定及使用者連線等寶貴的資源。一般而言,孤兒程序是因為用戶端 應用程式不適當關閉及網路相關問題所造成,而且經常需要透過解決用戶端應用程式問題 及微調網路設定,來糾正這些問題。

其他相關資訊

當您要解決這些問題的時候,就要注意下列幾點:
  • SQL Server 應用程式不會也不應該主動地探查用戶端連線來判斷其現有狀態。「內部處理通訊」(IPCs) 的較低層級,例如具名管道、IPX/SPX 或 TCP/IP 通訊端的職責才是管理用戶端連線。
  • 一般而言,IPC 擁有管理用戶端連線的特有機制。當用戶端連線沒有反應的狀況維持一段時間後,Windows NT Server 電腦一般 可透過傳送「是否還活著」探查,或在連線閒置了設定的時間量後,將連線清出。
  • 在某些情況之下 (例如用戶端一般性保護錯誤),即使應用程式已經死掉,用戶端仍可能回應伺服器的探查。 在這種情況下,只要用戶端電腦不關閉,Windows NT Server 電腦便可能會永遠保持此用戶端連線。
  • 如果 Windows NT Server 的電腦因為某種因素(如上述)而沒有關閉終止的連線,SQL Server 便可正當地假設此連線仍在使用中, 所以不會將它清出。
  • 如果 Windows NT Server 電腦已經成功關閉連線,但是用戶端程序仍存在於 SQL Server 上 (由 sp_who 指出), 則這可能就代表 SQL Server 的連線管理有問題。在這種情況下,您應該與您主要支援提供者共同解決此問題。
如果您懷疑您的 SQL Server 上有孤兒程序的存在,可以使用下列步驟來解決問題:
  1. 使用 sp_who 來識別出孤兒程序,還可透過主機名稱(Host name),告訴您那些應用程式是與這些程序有關連的。
  2. 在您識別出這些孤兒程序之後,如果它們沒有造成任何鎖定(lock)或使用很多連線,您就可以選擇忽略它們或使用 SQL Server KILL 命令來加以清除。
  3. 向應用程式的使用者查詢是否在關閉應用程式時,有不當的程序發生,例如:未先結束應用程式,就用暖開機或冷開機重新啟動工作站。 請檢查是否有工作站變得不穩定的記錄,例如:一般性保護錯誤等等。如果這些問題存在的話,請修正這些不適當的程序或穩定問題。
  4. 請檢查執行 SQL Server 的 Windows NT Server 電腦上的 IPC 工作階段是否仍在使用中。依照您目前正在使用的 IPC,其命令是有所不同的。 例如:如果使用的是具名管道,其命令為 NET SESSION 或 NET FILES;而如果是 TCP/IP 通訊端連線,就可以使用 NETSTAT 來顯示使用中的 TCP 工作階段; 如果使用的是 IPX/SPX,那您可能要使用「效能監視器」來監視 NWLink SPX 的 Connections Open 狀態。
  5. 如果 Windows NT Server 電腦的 IPC 工作階段仍在使用中,那麼 SQL Server 保留那些連線程序便絕對正常。 當 Windows NT 清出 IPC 工作階段時,SQL Server 會接到通知,並按照通知清出相對應的連線程序。 您可以調整某些 Windows NT 網路參數,以縮短在終止的工作階段清出前 Windows NT 所需等候的時間週期。

    同樣的,依照您所使用的 IPC,所包含的參數是很不同的。如需有關如何修改這些登錄設定以符合以下所述的詳細資訊,請參閱 Microsoft Knowledge Base 中的下列文件: :
    120642? (http://support.microsoft.com/kb/120642/EN-US/ ) : TCP/IP & NBT Configuration Parameters for Windows NT

    99745? (http://support.microsoft.com/kb/99745/EN-US/ ) : Tuning NWLINK Registry Parameters

    1. 具名管道:具名管道實作於「伺服器訊息區」(SMB) 階層,位於其他傳輸通訊協定如 TCP/IP、NetBEUI 或 NWLink IPX/SPX 之上。 一個稱為 NetBIOS 的薄層通常會實作於 SMB 及傳輸層之間。因此,如果要調整在關閉沒有回應的「具名管道」工作階段前等待 的時間長度,最方便的方法,就是調整相關 NetBIOS 層的 KeepAlive 參數。至於 TCP/IP,則所含的 NetBIOS 層為 NBT (NetBIOS over TCP),而下列登錄機碼中相關的參數為 SessionKeepAlive:
               KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netbt\Parameters
           
      如果使用的通訊協定為 NWlink IPX/SPX,那下列登錄機碼中相關的參數為 KeepAliveCount 及 KeepAliveTimeout:
               HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NWNBLink\Parameters
           
      請注意某些在 NWLink 之上所實施的「具名管道」,可能會繞過 NetBIOS 網路層 (DirectHosting),這表示以上的 NWNBlink NetBIOS 參數無法應用。
    2. TCP/IP 通訊端:Windows NT Server 會定期傳送 keep alive 封包到用戶端,而用戶端也要回應。 如果用戶端因任何的因素而無法回應那些封包,那麼在嘗試過設定的時間後,Windows NT 便會清出該 TCP 工作階段。 下列登錄機碼中相關的參數為 KeepAliveInterval、KeepAliveTime 及 TcpMaxDataRetransmissions:
               HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
           
    3. IPX/SPX:與 TCP/IP 類似,Windows NT Server 會定期傳送 keep alive 封包到用戶端,而用戶端則回應。 如果 Windows NT 在傳送過設定次數的 keep alive 封包後,還無法收到任何回應,便會清出該 SPX 連線。 下列登錄機碼中相關的參數為 KeepAliveCount 及 KeepAliveTimeout:
               HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NWLnkSPX\Parametes
           
    請注意,如果您將 IPC 的 keep alive 參數設定為永不逾時的話,即使用戶端完全關閉,Windows NT 仍將永遠保持 IPC 的工作階段。 在這種情況下,SQL Server 將如預期地永遠保持這些用戶端程序。

    如需有關參數的進一步資訊,請查閱 Windows NT 文件或 Windows NT Resource Kit。如果根據所設定的參數,您懷疑 Windows NT Server 電腦 無法清出那些工作階段的話,那請向您主要的 Windows NT 支援提供者尋求協助。
  6. 如果 Windows NT Server 電腦不再有該 IPC 工作階段,但是 SQL Server 仍保持用戶端連線 (如 sp_who 所示), 則可以使用 KILL 命令作為清出程序的暫時解決方法,並請與您主要的 SQL Server 支援提供者連絡以尋求進一步協助。

?考

本文件是根據 Microsoft Knowledgebase 文件編號 Q137983 翻譯的. 若要參考原始英文文件內容, 請至以下網址:

http://support.microsoft.com/support/kb/articles/Q137/9/83.asp (http://support.microsoft.com/kb/137983/en-us?ln=en-us&sd=gn&fr=0)

這篇文章中的資訊適用於:
  • Microsoft SQL Server 4.21a Standard Edition
  • Microsoft SQL Server 6.0 Standard Edition
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
關鍵字:?
kbhowto kbinfo ssrvlan kbusage ssrvgpf ssrvlock KB137983
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。