Oracle session连接数和inactive的问题记录【转】
從上周起,服務器Oracle數據庫出現問題,用不到半天,就會報maxsession(150)的問題,肯定是數據庫的會話超過最大數了。
? 由于服務器跑的是文件傳輸應用,占用的請求和會話肯定很大,因此用戶數不大就已經讓oracle的會話數達到最大值。
? 處理方式不外乎兩種:擴大oracle最大session數以及清除inactive會話,當然還有,就是從數據庫連接池和程序bug上面下手。
從各處收集了一些查看當前會話的語句,記錄一下:
1.select count(*) from v$session;
? select count(*) from v$process;
? 查看當前總會話數和進程數,這兩個視圖就是跟會話及進程有關的重要視圖啦,信息都是從這里面取的。
2.查詢那些應用的連接數此時是多少
select? b.MACHINE, b.PROGRAM , count(*) from v$process a, v$session b where a.ADDR = b.PADDR and? b.USERNAME is not null?? group by? b.MACHINE? , b.PROGRAM order by count(*) desc;
3.查詢是否有死鎖
select * from v$locked_object;
如果查詢結果為no rows selected,說明數據庫中沒有死鎖。否則說明數據庫中存在死鎖。
接下來說明一下會話的狀態:
1.active 處于此狀態的會話,表示正在執行,處于活動狀態。
2.killed 處于此狀態的會話,表示出現了錯誤,正在回滾,當然,也是占用系統資源的。還有一點就是,killed的狀態一般會持續較長時間,而且用windows下的工具pl/sql developer來kill掉,是不管用的,要用命令:alter system kill session 'sid,serial#' ;
3.inactive 處于此狀態的會話表示不是正在執行的,比如select語句已經完成。我一開始以為,只要是inactive狀態的會話,就是該殺,為什么不釋放呢。其實,inactive對數據庫本身沒有什么影響,但是如果程序沒有及時commit,那么就會造成占用過多會話。解決inactive的方法最好的就是在oracle中直接設置超時時間,也是有兩種方法,區別暫時還不清楚:
1.修改sqlnet.ora文件,新增expire_time=x(單位是分鐘)??
我的sqlnet.ora位置在D:\oracle\ora92\network\admin
sqlnet.expire_time = xx 的意思是如果 xx秒沒有連接上數據庫就會通知你連接超時,而不是自動斷開超時連接。
2.通過ALTER PROFILE DEFAULT LIMIT IDLE_TIME 10; 命令修改,記得重啟下oracle。
對應的用戶的profile(概要文件)設置~,察看相應的文檔里面有如何建立你所需要的profile.
ALTER PROFILE "DEFAULT"
? ? LIMIT IDLE_TIME 15
15分鐘空閑自動斷開
轉載于:https://www.cnblogs.com/chinhr/archive/2011/06/20/2085231.html
總結
以上是生活随笔為你收集整理的Oracle session连接数和inactive的问题记录【转】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 仿UC菜单的实现
- 下一篇: [Buzz.Today]2011.06.