经常遇到项目中达梦数据库OOM问题,大部分都是个别SQL执行期间占用内存较大导致,可通过以下方式创建定时作业,定时抓取实时会话中占用内存比较高的SQL语句记录到数据表中,当出现OOM问题后,可通过记录结果进行分析,定位是哪些SQL语句占用的内存。
1、创建SQL_HIS表用于记录占用内存比较高的SQL信息
create table SQL_HIS
(
MEM_MB NUMBER,
TIME_S INTEGER,
USER_NAME VARCHAR(128),
SQL_TEXT VARCHAR(32767),
CLNT_IP VARCHAR(300),
SESS_TIME INTEGER,
TIME1 TIMESTAMP
);
2、查询实时活跃会话占用内存较高的前5条插入SQL_HIS表中
insert into SQL_HIS SELECT CAST( M.TS * 1.0 / 1024 / 1024 AS NUMBER(38, 2)) AS "MEM_MB",
DATEDIFF(SS, LAST_RECV_TIME, SYSDATE) AS "TIME_S",
USER_NAME,
DBMS_LOB.SUBSTR(SF_GET_SESSION_SQL(SESS_ID)) AS "SQL_TEXT",
THRD_ID || ' ' || APPNAME || ' ' || CLNT_IP,
DATEDIFF(SS, LAST_SEND_TIME, SYSDATE) AS "SESS_TIME" ,
sysdate
FROM V$SESSIONS S
LEFT JOIN (SELECT SUM(TOTAL_SIZE) TS,
CREATOR
FROM V$MEM_POOL
GROUP BY CREATOR) M
ON S.THRD_ID = M.CREATOR
where s.state='ACTIVE'
ORDER BY "MEM_MB" DESC limit 5 ;
3、查询SQL_HIS表确认数据插入正常
select * from SQL_HIS;
4、将第二步的插入语句配置为定时作业,可配置为每5分钟执行一次
call SP_CREATE_JOB('SQL_MON',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('SQL_MON');
call SP_ADD_JOB_STEP_EX('SQL_MON', 'B1', 0, 'insert into SQL_HIS SELECT CAST( M.TS * 1.0 / 1024 / 1024 AS NUMBER(38, 2)) AS "MEM_MB",
DATEDIFF(SS, LAST_RECV_TIME, SYSDATE) AS "TIME_S",
USER_NAME,
DBMS_LOB.SUBSTR(SF_GET_SESSION_SQL(SESS_ID)) AS "SQL_TEXT",
THRD_ID || '' '' || APPNAME || '' '' || CLNT_IP,
DATEDIFF(SS, LAST_SEND_TIME, SYSDATE) AS "SESS_TIME" ,
sysdate
FROM V$SESSIONS S
LEFT JOIN (SELECT SUM(TOTAL_SIZE) TS,
CREATOR
FROM V$MEM_POOL
GROUP BY CREATOR) M
ON S.THRD_ID = M.CREATOR
where s.state=''ACTIVE''
ORDER BY "MEM_MB" DESC limit 5 ;
COMMIT;', 0, 1, 0, 0, NULL, 0, '');
call SP_ADD_JOB_SCHEDULE('SQL_MON', 'D1', 1, 1, 1, 0, 5, '00:00:00', '23:59:59', '2026-07-31 09:47:29', NULL, '');
call SP_JOB_CONFIG_COMMIT('SQL_MON');
call SP_JOB_SET_SCHEMA('SQL_MON', 'SYSDBA');
文章
阅读量
获赞
