注册
DM8:达梦数据库批量关闭会话
技术分享/ 文章详情 /

DM8:达梦数据库批量关闭会话

祢真伟大 2023/06/20 2522 1 0

DM8:达梦数据库批量关闭会话

环境介绍

  • 在大量SELECT 活动会话堆积,导致CPU占用极高,可以使用下面语句进行批量关闭会话;

1 简洁 sql

BEGIN FOR V_SESSID IN (SELECT SESS_ID FROM V$SESSIONS WHERE SQL_TEXT LIKE 'SELECT%') LOOP SP_CLOSE_SESSION(V_SESSID.SESS_ID); END LOOP; END;

2 完整sql

/* disql 打印日志需要开启,先单独执行;图形化管理工具忽略 */ --SET SERVEROUTPUT ON; DECLARE CURSOR C_SQL; V_SESSID VARCHAR(32); V_COUNT VARCHAR(8); V_TEXT VARCHAR; TYPE C_SESSION IS REF CURSOR RETURN V$SESSIONS%ROWTYPE; V_SESSION C_SESSION; /* WHERE 对V$SESSIONS 系统视图配置查询条件 根据需求选择WHERE 条件 */ -- 关闭SELECT 开头的全部会话 V_WHERE VARCHAR(64) := 'WHERE SQL_TEXT LIKE ''SELECT%'''; --V_WHERE VARCHAR(64) := 'WHERE SQL_TEXT LIKE ''select%'''; -- 关闭全部会话 --V_WHERE VARCHAR(64) := 'WHERE SQL_TEXT NOT LIKE ''DECLARE%'''; BEGIN -- 输出统计符合条件的会话数量 OPEN C_SQL FOR 'SELECT COUNT(*) FROM V$SESSIONS ' || V_WHERE; LOOP FETCH C_SQL INTO V_COUNT; EXIT WHEN C_SQL%NOTFOUND; PRINT '总计:' || V_COUNT; END LOOP; CLOSE C_SQL; -- 关闭会话,并输出会话的SESS_ID OPEN C_SQL FOR 'SELECT SESS_ID FROM V$SESSIONS ' || V_WHERE; LOOP FETCH C_SQL INTO V_SESSID; EXIT WHEN C_SQL%NOTFOUND; PRINT V_SESSID; SP_CLOSE_SESSION(V_SESSID); END LOOP; CLOSE C_SQL; --输出未关闭的会话 OPEN C_SQL FOR 'SELECT SESS_ID,SQL_TEXT FROM V$SESSIONS ' || V_WHERE; IF C_SQL%FOUND THEN LOOP FETCH C_SQL INTO V_SESSID,V_TEXT; EXIT WHEN C_SQL%NOTFOUND; PRINT '未关闭的会话:'; PRINT 'SESS_ID: '||V_SESSID||', V_TEXT: '||V_TEXT; PRINT '可以重复执行此操作'; END LOOP; ELSE PRINT '会话已经全部关闭'; END IF; CLOSE C_SQL; --输出全部会话 --SELECT SESS_ID,SQL_TEXT,STATE,RUN_STATUS,USER_NAME,CLNT_TYPE,TIME_ZONE 时区,CREATE_TIME 创建时间,MSG_STATUS,LAST_RECV_TIME 最近接收时间,LAST_SEND_TIME 最近发送时间,CLNT_IP,CLNT_VER,THRD_ID FROM V$SESSIONS; END;
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服