標籤:
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
Oracle串連數過多釋放機制