Oracle連線數過多釋放機制

2021-09-08 12:06:55 字數 2820 閱讀 6668

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

mysql連線數過多

如果您得到 too many connections 錯誤資訊,並且想要了解正在發生的情況,本語句是非常有用的。mysql保留乙個額外的連線,讓擁有super許可權的 賬戶使用,以確保管理員能夠隨時連線和檢查系統 假設您沒有把此許可權給予所有的使用者 show processlist檢視連線數目 k...

mySQL連線數過多的問題

當你試圖連線到mysqld伺服器時遇到 過多連線 錯誤,這表示所有可用的連線均已被其他客戶端使用。允許的連線數由max connections 系統變數控制。預設值為100 如果需要支援更多的連線,應使用該變數的較大值重啟mysqld。mysqld實際上允許max connections 1 個客戶...

TCP連線數過多問題

在一次生產上線後,發現使用的 8086 埠相關的 tcp 連線數竟然多大 6k 有時候甚至會逼近 1w 這個數量對於乙個只是在內部使用的監控系統來說,無論如何都是無法接受的,於是開始一系列的排查過程.本文記錄了這個問題的主要解決過程,算是對這一次殺 bug 過程的乙個總結.使用命令 netstat ...