標籤:
今天又遇到了11gR2串連數滿的問題,以前也遇到過,因為應用那邊沒有深入檢查,沒有找到具體原因,暫且認為是這個版本Oracle的BUG吧。
上次的處理辦法是用Shell指令碼定時在系統中kill v$session.status=‘INACTIVE‘的串連,但是這次現場沒有在作業系統中部署指令碼的許可權,只好在資料庫中做處理,幸好我們對這個 資料庫有完全的許可權。這次使用了profile+JOB定時alter system kill ‘sid,seral#‘ immediate的方式。具體指令碼如下:
- CREATE PROFILE KILLIDLE LIMIT IDLE_TIME 30;
- SELECT * FROM dba_profiles WHERE PROFILE=‘KILLIDLE‘;
- ALTER USER TEST_USER PROFILE KILLIDLE;
- SELECT username,PROFILE FROM dba_users WHERE username=‘TEST_USER‘;
- ALTER SYSTEM SET resource_limit=TRUE;
- CREATE OR REPLACE PROCEDURE sp_kill_idlesession
- /**********************************
- 清除idle逾時的會話進程
- **********************************/
- AS
- CURSOR c_kill_sqls
- IS SELECT ‘alter system kill session ‘‘‘||s.sid||‘,‘||s.SERIAL#||‘‘‘ immediate‘ sqlstr FROM v$session s WHERE s.STATUS=‘SNIPED‘;
- BEGIN
- FOR v_sql IN c_kill_sqls
- LOOP
- EXECUTE IMMEDIATE v_sql.sqlstr;
- END LOOP;
- END;
- --添加JOB,定時清理到期會話
- DECLARE jobnum NUMBER :=661;
- BEGIN
- dbms_job.submit(job => jobnum,
- what => ‘sp_kill_idlesession;‘,
- next_date => to_date(‘30-04-2014 18:00:00‘, ‘dd-mm-yyyy hh24:mi:ss‘),
- interval => ‘SYSDATE + 1/144‘);
- commit;
- END;
- --如果30分鐘到期時間太短,對資料庫訪問效能產生了影響,可以調整
- ALTER PROFILE KILLIDLE LIMIT IDLE_TIME 30;
解決Oracle 11gR2 空閑串連過多,導致串連數滿的問題