Oracle連接數過多釋放機制


Oracle連接數過多釋放機制

 sqlplus /nolog 
 打開sqlplus  
  
  
 connect /as sysdba  
 使用具有dba權限得用戶登陸oracle  
   
  
 show parameter resource_limit 
 顯示資源限定是否開啟,value為true是開啟,為false是關閉  
 
 alter system set resource_limit=true 
 如果未開啟,則使用此命令開啟資源限定功能  
  
   
 create profile profileName limit connect_time 60 idle_time 30 
 創建profile文件,profileName任意起,connect_time設置連接超過多少分鍾后強制釋放,idle_time設置連續不活動的會話超過多少分鍾后強制釋放  
 
 alter user oracleUser profile profileName 
 將profile文件作用於指定用戶 

 

 

從上周起,服務器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

2.通過ALTER PROFILE DEFAULT LIMIT IDLE_TIME 10; 命令修改,記得重啟下oracle。

 

修改ORACLE 中的SESSION和PROCESS

會話sessions和進程pocesses的關系
一個process可以有0個、1個或者多個session,一個session也可以存在若干個process中,並行同樣是一個session對應一 個process,主session是coordinator session,每個parallel process同樣會對應數據庫里一個單獨的session。可以從v$px_session和v$session中驗證這點。
連接connects,會話sessions和進程pocesses的關系

每個sql login稱為一個連接(connection),而每個連接,可以產生一個或多個會話,如果數據庫運行在專用服務器方式,一個會話對應一個服務器進程(process),如果數據庫運行在共享服務器方式,一個服務器進程可以為多個會話服務。

Oracle的sessions和processes的數量關系是:sessions=1.1 * processes + 5

下面我們用兩種方法修改PROCESS的最大值
一、通過Oracle Enterprise Manager Console在圖形化管理器中修改
以系統管理員的身份登入,進入界面 數據庫的例程 - 配置 - 一般信息 - 所有初始化參數,修改processes的值

二、在SQLPLUS中修改
以DBA權限登錄,修改PROCESS的值(SESSION的值會跟着改);創建pfile;重新啟動數據庫。輸入的SQL命令如下,回顯信息省略了
SQL> connect sys/sys as sysdba
SQL> alter system set processes=400 scope = spfile;
SQL> create pfile from spfile;
SQL> shutdown immediate;
SQL> startup


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM