【DBA笔记】Oracle之定期清理inactive会话
-- 设置SQL*Plus环境的服务器输出到文件
SET SERVEROUTPUT ON SIZE UNLIMITED FORMAT WORD_WRAPPED
-- 设置SQL*Plus环境的时间格式
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
-- 存储过程:清理inactive会话
CREATE OR REPLACE PROCEDURE cleanup_inactive_sessions IS
v_start_time TIMESTAMP;
v_sid NUMBER;
v_serial# NUMBER;
v_username VARCHAR2(30);
v_program VARCHAR2(64);
v_type VARCHAR2(10);
v_sql VARCHAR2(200);
v_count NUMBER;
BEGIN
v_start_time := SYSTIMESTAMP;
DBMS_OUTPUT.PUT_LINE('清理无效会话开始于:' || TO_CHAR(v_start_time));
-- 查询并遍历inactive会话
FOR r IN (SELECT sid, serial#, username, program, type FROM v$session WHERE username IS NOT NULL AND username != 'SYS' AND username != 'SYSTEM' AND type != 'BACKGROUND' AND logon_time < SYSDATE - INTERVAL '10' MINUTE) LOOP
v_sid := r.sid;
v_serial# := r.serial#;
v_username := r.username;
v_program := r.program;
v_type := r.type;
-- 杀掉inactive会话
v_sql := 'ALTER SYSTEM KILL SESSION ''' || v_sid || ',' || v_serial# || ''' IMMEDIATE';
EXECUTE IMMEDIATE v_sql;
v_count := v_count + 1;
DBMS_OUTPUT.PUT_LINE('会话被杀:' || v_sid || ',' || v_serial# || ' 用户:' || v_username || ' 程序:' || v_program || ' 类型:' || v_type);
END LOOP;
IF v_count = 0 THEN
DBMS_OUTPUT.PUT_LINE('没有找到10分钟内的inactive会话。');
END IF;
DBMS_OUTPUT.PUT_LINE('清理无效会话结束于:' || TO_CHAR(SYSTIMESTAMP));
END;
/
-- 调用存储过程
BEGIN
cleanup_inactive_sessions;
END;
/
这段代码首先设置了SQL*Plus环境的输出和时间格式,然后创建了一个存储过程cleanup_inactive_sessions
,该过程查询v$session
视图以找到10分钟内的非活跃会话,并将它们标记为inactive,然后杀掉这些会话。最后,调用这个存储过程。这个脚本可以被定期执行,以防会话无限期地占用系统资源。
评论已关闭