1. 程式人生 > >[轉自Oracle官方技術部落格]為什麼資料庫中大量的server process沒有對應的session?

[轉自Oracle官方技術部落格]為什麼資料庫中大量的server process沒有對應的session?

在什麼情況下oracle server process沒有對應的session?除了px程序以外,還有沒有其他情況?
下面的一個真實的案例中,有600個個server process沒有session對應,並且這樣的process越來越多,
似乎永遠也不自己釋放,原因是什麼呢?

首先查詢一下v$process和v$session,觀察差異,可見差異有600多個。

select * from v$process;

1674 rows selected.

select * from v$session;

1051 rows selected.

比對了一下,v$process中除了32個px程序以外,還有大量的普通server process,並且它們已經存在了很多天了。

select * from v$process p where p.addr not in (select addr from v$process p,v$session s where s.creator_addr=p.addr) order by pid;

SPID    PROGRAM
29674    [email protected] (P000)
29820    [email protected] (P001)
29822    [email protected] (P002)
......
31415    [email protected] (P031)
31417    

[email protected] (P032)
31419    [email protected] (P033)
7523    [email protected]
27740    [email protected]
3283    [email protected]
29116    [email protected]
20006    [email protected]
12831    [email protected]
15681    [email protected]
2139    [email protected]

8606    [email protected]
3963    [email protected]
31811    [email protected]
1613    [email protected]
......

先確認一下當前時間是2017年10月12日:

# date
Thu Oct 12 11:03:54 CST 2017

然後選取一個v$process中沒有session的程序,比如以上輸出中的最後一行的pid為1613的程序,通過ps來觀察其狀態:

# ps -aeo user,pid,ppid,pri,pcpu,pmem,vsize,rssize,wchan:25,s,start,cputime,command

USER       PID  PPID PRI %CPU %MEM    VSZ   RSS WCHAN                     S  STARTED     TIME COMMAND
oracle 1613 1 19 0.0 0.0 365768 27636 sk_wait_data S Oct 04 00:00:00 oraclemydb01 (LOCAL=NO)

發現以上程序在10月4日就存在了,也就是已經過了8天了。

同時做一次system state dump,找到這個程序1613

PROCESS 1560:
----------------------------------------
SO: 0x73a3d79790, type: 2, owner: (nil), flag: INIT/-/-/0x00 if: 0x3 c: 0x3
proc=0x73a3d79790, name=process, file=ksu.h LINE:13949, pg=0 conuid=0
(process) Oracle pid:1560, ser:174, calls cur/top: (nil)/0x71232cdd70
......
Process Group: DEFAULT, pseudo proc: 0x7323de7370
O/S info: user: grid, term: UNKNOWN, ospid: 1613 <<<<<< 這裡可見程序 1613
OSD pid info:
Short stack dump:

ksedsts <- ksdxfstk <- ksdxcb <- sspuser <- __sighandler
<- read <- nttfprd <- nsbasic_brc <- nsbrecv <- nioqrc
<- opikndf2 <- opitsk <- opiino <- opiodr <- opidrv
<- sou2o <- opimai_real <- ssthrdmain <- main

可以看到以上程序的call stack都是一些網路相關的function call,既然與網路有關係,不妨取一下其開啟的tcp連線:

# lsof -p 1613 -Pnai TCP

COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
oracle_16 1613 oracle 20u IPv4 1303337121 0t0 TCP 10.5.20.110:1521->10.5.70.234:23966 (ESTABLISHED)

可見server端(10.5.20.110)的確和一個client端(10.5.70.234)建立了連線,找到client端(10.5.70.234),在client上
用如下命令觀察是什麼程序建立了連線:

# lsof -Pni :5926
COMMAND   PID   USER   FD   TYPE DEVICE SIZE NODE NAME
sqlplus 29544 oracle    9u  IPv4 739424       TCP 10.5.70.234:23966->10.5.20.110:1521 (ESTABLISHED)

原來客戶端是一個sqlplus程序,程序號為29544,但是什麼情況下sqlplus連線資料庫後只有server process而沒有session?
最大的可能性是這個程序正處於密碼驗證階段。

檢查一下呼叫這個sqlplus的指令碼,果然發現指令碼中指定的登入資料庫的密碼是錯誤的!

接下來在12.2.0.1的測試機上模擬一下,sqlplus故意以錯誤密碼登入,然後停住不動等1分鐘,看能否重現這個現象。

sqlplus tony/[email protected]_r12201

SQL*Plus: Release 12.2.0.1.0 Production on Thu Nov 2 11:50:46 2017
Copyright (c) 1982, 2016, Oracle.  All rights reserved.

ERROR:
ORA-01017: invalid username/password; logon denied

Enter user-name:   <<<<停在這裡不要動

在server上通過兩次ps定位是哪個程序被最新建立:

# ps -ef | egrep "oracleR12201 \(LOCAL=NO\)|PID" | grep -v grep
UID        PID  PPID  C STIME TTY          TIME CMD
oracle     962     1  0 Oct31 ?        00:00:04 oracleR12201 (LOCAL=NO)

# ps -ef | egrep "oracleR12201 \(LOCAL=NO\)|PID" | grep -v grep
UID        PID  PPID  C STIME TTY          TIME CMD
oracle     962     1  0 Oct31 ?        00:00:04 oracleR12201 (LOCAL=NO)
oracle   28540     1  0 11:50 ?        00:00:00 oracleR12201 (LOCAL=NO)

兩次ps對比可見新產生了程序28540,查詢v$process v$session

select * from v$process where spid=28540;

ADDR    SPID    PROGRAM
000000006A576D48    28540    [email protected]

select * from v$session where creator_addr='000000006A576D48';

no rows selected.

看來問題重現了,以上的程序28540在v$process中存在但是在v$session中不存在。

但是,在我們的測試中,程序28540會在大約1分鐘後自行從server端退出,並且在alert log中列印如下資訊

2017-11-02T11:51:02.509020+08:00
***********************************************************************
Fatal NI connect error 12170.

  VERSION INFORMATION:
    TNS for Linux: Version 12.2.0.1.0 - Production
    Oracle Bequeath NT Protocol Adapter for Linux: Version 12.2.0.1.0 - Production
    TCP/IP NT Protocol Adapter for Linux: Version 12.2.0.1.0 - Production
  Time: 02-NOV-2017 11:51:02
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12535
    
TNS-12535: TNS:operation timed out
    ns secondary err code: 12606
    nt main err code: 0
    nt secondary err code: 0
    nt OS err code: 0
  Client address: (ADDRESS=(PROTOCOL=tcp)(HOST=10.182.211.94)(PORT=51681))
2017-11-02T11:51:02.510302+08:00
WARNING: inbound connection timed out (ORA-3136)

看到這個錯誤可能大家馬上想到了SQLNET.INBOUND_CONNECT_TIMEOUT這個Oracle*Net引數,的確,問題是這個引數引發的。
在server端開啟$ORACLE_HOME/network/admin/sqlnet.ora,發現如下設定:

SQLNET.INBOUND_CONNECT_TIMEOUT=0

以上引數的含義是完成使用者驗證的最大時間,設定成0代表無限。也就是說,如果客戶端輸錯了密碼,只要客戶端不關閉,
那麼對應的server process會永遠等待client。

這個時候我們終於知道這個問題的原因了: 客戶端輸錯了密碼,停留在提示輸入再次密碼的介面上,
並且資料庫的server端的sqlnet.ora設定了SQLNET.INBOUND_CONNECT_TIMEOUT=0(無限時間),
導致server process一直等待客戶端輸入密碼驗證,因此永遠也不自動退出。

這個問題實際上還是比較嚴重的,它可能會導致ORA-00020錯誤發生,並且導致新的session無法連線。


相關推薦

[Oracle官方技術部落]為什麼資料庫大量server process沒有對應session?

在什麼情況下oracle server process沒有對應的session?除了px程序以外,還有沒有其他情況? 下面的一個真實的案例中,有600個個server process沒有session對應,並且這樣的process越來越多, 似乎永遠也不自己釋放,原因是

使用CocoaPods做依賴管理(淘寶源更換為HTTPS)-- 唐巧技術部落

CocoaPods 簡介 每種語言發展到一個階段,就會出現相應的依賴管理工具,例如 Java 語言的 Maven,nodejs 的 npm。隨著 iOS 開發者的增多,業界也出現了為 iOS 程式提供依賴管理的工具,它的名字叫做:CocoaPods。 CocoaPod

美團技術部落的jvm記憶體洩露分析

Linux與JVM的記憶體關係分析 引言 在一些實體記憶體為8g的伺服器上,主要執行一個Java服務,系統記憶體分配如下:Java服務的JVM堆大小設定為6g,一個監控程序佔用大約600m,Linux自身使用大約800m。從表面上,實體記憶體應該是足夠使用的;但實

css字型圖示的製作和使用。 ---_林沖部落

原文來自_林沖 https://www.cnblogs.com/momozjm/p/6383058.html的部落格,僅學習用。 css字型圖示的製作和使用。 在專案開發的過程中,我們會經常用到一些圖示。但是我們在使用這些圖示時,往往會遇到失真的情況,而且圖片數量很多的話,頁面載入就越慢。所

【JIRA、Confluence中文官方技術部落】分享JIRA、Confluence、Bamboo等Atlassian產品的安裝部署及使用技巧,營造全面高效的學習交流空間。上atlassian.csdn.net下載享用,諮詢QQ:2714137330

分享JIRA、Confluence、Bamboo等Atlassian產品的安裝部署及使用技巧,營造全面高效的學習交流空間。上atlassian.csdn.net下載享用,諮詢QQ:2714137330...

【Lua學習筆記】 Lua實現面向物件,雲風的部落

local _class={} function class(super) local class_type={} class_type.ctor=false class_type.super=super class_type.new=function(...) local obj={}

清華大學MOOC《作業系統》第4講:“實驗1-系統軟體啟動過程”總結(張慕暉部落

課程內容概述 這節課主要介紹了一些和Lab1相關的內容。 系統啟動過程 BIOS bootloader 段機制 作業系統的載入 C語言的一些相關知識 函式呼叫的實現 GCC內聯彙編 x86架構下的中斷處理過程 系統啟動過程 BIO

iOS 對應用程式啟動時所有方法的呼叫順序分析(董鉑然部落園)

一個應用程式的啟動過程要包括代理的建立,控制器的載入和控制器view的載入,這其中有很多關於生命週期的方法,每個方法都是有先後順序的,如果呼叫順序拿不準,或者某段程式碼寫的方法不恰當,就會遇到各種奇葩問題。本文不怕麻煩的在幾乎所有啟動時要呼叫的方法裡都用了 __FUNCT

Redis高可用詳解:持久化技術及方案選擇 (推薦)--轉載程式設計迷思部落www.cnblogs.com/kismetv/p/8654978.html

一、Redis高可用概述 在介紹Redis高可用之前,先說明一下在Redis的語境中高可用的含義。 我們知道,在web伺服器中,高可用是指伺服器可以正常訪問的時間,衡量的標準是在多長時間內可以提供正常服務(99.9%、99.99%、99.999% 等等)。但是在Redis語境中,高可用的含義似乎要寬泛一些,除

】Python技術部落——老王python

親愛的朋友:     歡迎你!很高興能在這裡見到你,你能來到這裡說明你真的很喜歡python,很想把python給學好!我覺的你很幸運,開始我學python的時候比較少資料,學起來也比較頭疼,現在隨著

這是三篇影響百度17年的技術部落,作者李彥巨集

來源 | DoNews 作者 | 李彥巨集 我與GO.COM 本文寫於2001年2月3日。         雖然早已是預料之中的事,但得知GO.COM關閉的訊息時,還是有些傷感,畢竟我為她和她的前身

java8之重新認識HashMap(美團技術團隊)

java8之重新認識HashMap(轉自美團技術團隊) java8之重新認識HashMap 摘要 HashMap是Java程式設計師使用頻率最高的用於對映(鍵值對)處理的資料型別。隨著JDK(Java Developmet Kit)版本的更新,JDK1.8對HashMap底層的

技術部落的太監

大多數小說,部落格,網站,主頁 最後都逃脫不了一種命運。 寫著寫著就沒有下面了。 這是很多網站的常態,為什麼? 因為一切最終的結局都是歸於平靜。 小說寫的自己編不下去就棄更了, 部落格沒流量沒動力也沒精力維護了, 網站伺服器費用交不起沒備案被404了, 發的說說0贊0評沒朋友純屬自嗨也就放棄了。 所以太監是整

我從寫技術部落收穫到了什麼?- J_Knight_

我是 J_Knight_,熟悉我的人都應該知道我是一名剛工作滿3年的非科班 iOS 開發者,而且一直堅持寫技術部落格快有2年半的時間了。 其實從去年開始就一直想分享我寫部落格的心得,但是一直也沒有找到合適的契機,剛好在今年年底前達成了掘金粉絲量過萬的小目標,索性就藉著這個機會分享一下我自己關於寫部落格的一些

為什麼要寫技術部落

                            前言            

技術部落的無限好處

沒有讀者,寫技術部落格文章感覺不到太多的作用,是浪費時間的事情,是這樣嗎? 不是。 釋出有關軟體技術的部落格將帶來數以千計的美元,儘管沒有人曾讀您的部落格。閒話少敘,首先,讀者可能是寫部落格的目標,但他們實際上是自然的結果。一路上還有很多其他的個人利益,包括更好的工

如何寫一篇好的技術部落

在工作過程中,發現對很多東西都一知半解,不是很透澈,到頭來很容易模糊,如果有一篇好的技術部落格予以總結,一來即使忘記了,回國頭來再看,仍然能夠從自己的思路中恢復;二來總結一下,還會發現一些潛在問題;三來,有利於大家交流技術。很多大公司都有自己的內部技術部落格平臺,寫

在windows下進行 linux 開發 (轉載第七星塵的技術部落

1,介紹Vagrant 我們做web開發的時候經常要安裝各種本地測試環境,比如apache,php,mysql,redis等等。出於個人使用習慣,可能我們還是比較習慣用windows。雖然說在windows下搭建各種開發環境是可行的,各大開發環境都有windows版本。然而在windows下配置有時候會顯

【天山雪的技術部落格】漢家煙塵在東北,漢將辭家破殘賊。男兒本自重橫行,天子非常賜顏色。摐金伐鼓下榆關,旌旆逶迤碣石間。校尉羽書飛瀚海,單于獵火照狼山。山川蕭條極邊土,胡騎憑陵雜風雨。戰士軍前半死生,美人帳下猶歌舞。大漠窮秋塞草腓,孤城落日鬥兵稀。身當恩遇恆輕

漢家煙塵在東北,漢將辭家破殘賊。男兒本自重橫行,天子非常賜顏色。摐金伐鼓下榆關,旌旆逶迤碣石間。校尉羽書飛瀚海,單于獵火照狼山。山川蕭條極邊土,胡騎憑陵雜風雨。戰士軍前半死生,美人帳下猶歌舞。大漠窮秋...

挨踢人,自由軟體開發者Tiandi的技術部落

最近正好有用excel的做些統計的東西,vba的一些用法又從新的review了一下,在此記錄一下: 1. 函式返回 VBA的函式返回通過一個和函式名的相同的變數進行返回,而不用寫return xxx ret = myfunction... 非技術