為什麼資料庫中大量的server process沒有對應的session?
轉自oracle官方部落格
https://blogs.oracle.com/database4cn/%e4%b8%ba%e4%bb%80%e4%b9%88%e6%95%b0%e6%8d%ae%e5%ba%93%e4%b8%ad%e5%a4%a7%e9%87%8f%e7%9a%84server-process%e6%b2%a1%e6%9c%89%e5%af%b9%e5%ba%94%e7%9a%84session
在什麼情況下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 oracle@mydb01 (P000)
29820 oracle@mydb01 (P001)
29822 oracle@mydb01 (P002)
......
31415 oracle@mydb01 (P031)
31417 oracle@mydb01 (P032)
31419 oracle@mydb01 (P033)
7523 oracle@mydb01
27740 oracle@mydb01
3283 oracle@mydb01
29116 oracle@mydb01
20006 oracle@mydb01
12831 oracle@mydb01
15681 oracle@mydb01
2139 oracle@mydb01
8606 oracle@mydb01
3963 oracle@mydb01
31811 oracle@mydb01
1613 oracle@mydb01
......
先確認一下當前時間是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/a@server_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 oracle@testsever
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無法連線。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26964624/viewspace-2646994/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 為什麼要對資料庫最佳化資料庫
- 為什麼中國人沒有自己的程式語言?
- 【譯】為什麼Rust中的BTreeMap沒有with_capacity()方法?Rust
- 為什麼?為什麼?Java處理排序後的陣列比沒有排序的快?想過沒有?Java排序陣列
- 你有沒有想過: 為什麼Java中String是不可變的?Java
- 使用Python分析大量資料應該學些什麼?Python
- 有沒有什麼網路請求攔截的庫?
- 為什麼DBA需要資料庫廠商的資料庫概念文件資料庫
- 為什麼Hook沒有ErrorBoundary?HookErrorORB
- 為什麼PostgreSQL是最成功的資料庫?SQL資料庫
- 【資料庫】簡單聊聊資料庫可以做什麼,有什麼用?資料庫
- 【資料庫】雲資料庫rds是什麼意思?有什麼優勢?資料庫
- 為什麼我沒有收到贈送的流量
- 資料治理到底治什麼?有沒有前景
- 時序資料庫-01-時序資料庫有哪些?為什麼要使用資料庫
- 資料庫產業為什麼需要規模效應資料庫產業
- 雲資料庫RDS是什麼?雲資料庫RDS有什麼優勢?資料庫
- MySQL Connectors為什麼沒有javaMySqlJava
- OptionalInt為什麼沒有ofNullable()方法Null
- Twitter為什麼沒有當機?
- 為什麼爬蟲需要大量的IP地址?爬蟲
- 為什麼資料庫列的字元長度為191? - Grouparoo資料庫字元
- 有什麼工具可以上載複雜的 excel 資料填報到資料庫中Excel資料庫
- 為什麼抄FGO的都沒有好下場?Go
- Redis分散式Session和普通的cookie session有什麼區別?Redis分散式SessionCookie
- 直播原始碼中Mysql資料庫有什麼優勢?原始碼MySql資料庫
- 幽默:沒有資料庫的架構來了資料庫架構
- 沒有大資料在手,該怎麼為NLP應用深度學習?大資料深度學習
- 資料庫是什麼意思?有什麼用?有哪些型別?資料庫型別
- 什麼是mysql資料庫?MySQL的特點有哪些?MySql資料庫
- [資料庫]資料庫中為什麼不推薦使用外來鍵約束資料庫
- 資料庫應用需要什麼樣的雲原生能力資料庫
- 資料庫倉庫系列:(一)什麼是資料倉儲,為什麼要資料倉儲資料庫
- Netflix:為什麼建立專門的媒體資料庫?資料庫
- 為什麼我的 PHP 資料庫連線失敗?PHP資料庫
- Web3的加密資料庫為什麼好? - AlbertWeb加密資料庫
- 為什麼中國至今沒有像樣的國產作業系統?作業系統
- PG資料庫為什麼要用autovacuum資料庫