达梦数据库监控正在执行的长SQL

我们在运维中经常会遇到一个需求:就是业务组请求支援,说跑批卡死,要求定位出哪条SQL语句在执行。确认语句无误后kill掉该会话。


在ORACLE数据库中,v$session视图中有一个SQL_EXEC_START字段代表会话正在调用sql的本次开始执行时间。用如下语句可以方便查出系统中正运行超过1小时的长SQL:

select session_id,program,username,sql_id,event
from v$session 
where status='ACTIVE' and SQL_EXEC_START<sysdate-1/24

当然可以根据实际情况修改时长。比如定位执行超过半小时的语句,上面1/24修改为1/48。定位执行时间超过10分钟的语句,修改为1/24/6。

通过select sql_text from v$sqlarea where sql_id='xxx';或者v$sqltext视图查出sql_id对应的真实语法。业务组确认sql语句无误后,kill掉该会话。


达梦数据库引入了一个视图v$long_exec_sqls,可以方便地查询出执行时间超过1000毫秒的语句。但在实验中发现该视图只能显示已经执行完了的语句,尚未结束的长SQL无法追踪。因此我编了一个小程序实现此功能:

select elapsed,clnt_ip,appname,user_name,RUN_STATUS,sql_text,b.sql_id,
to_char(create_time,'yyyy-mm-dd hh24:mi:ss') session_logon_time,to_char(sql_start_time,
'yyyy-mm-dd hh24:mi:ss') sql_exec_start,sess_id,state
from
(  select sec_to_time(count(*)) elapsed,min(sample_time) sql_start_time,
   session_id,session_serial#,sql_id
   from v$active_session_history 
   group by  session_id,session_serial#,sql_id,sql_exec_id
   having time_to_sec(max(sample_time))>time_to_sec(sysdate)-2
) active_session,v$sessions b
where active_session.session_id=b.sess_id and active_session.session_serial#=b.SESS_SEQ
and active_session.sql_id=b.sql_id
order by elapsed desc
limit 10

上面程序输出系统中所有正在执行的SQL语句,按照已执行时间倒排序,显示TOP10。

业务组确认语句无误后,通过sp_close_session(session_id)kill掉会话。

还有更简单的实现方法:

select clnt_ip,sec_to_time(datediff(ss,last_send_time,sysdate)) elapsed,appname,user_name,RUN_STATUS,sql_id,sql_text,last_send_time
from v$sessions where state in ('ACTIVE','WAIT')
order by elapsed desc
limit 10

通过last_send_time和sysdate的差值计算sql语句的执行时间。last_send_time每次发起新的调用时重置,相当于ORACLE里的sql_exec_start字段。不过在测试中发现,极个别时last_send_time停留在上次调用没有刷新,计算出的elapsed有可能偏大。

<think>好的,我现在要帮用户解决如何在达梦数据库中查看当前正在执行SQL的问题。首先,我需要回顾之前用户的问题之前的回答,确保这次回答的一致性准确性。 用户之前问过关于V$SESSIONS查询SQL执行时因为过导致不完整的情况,我之前给出了使用V$SESSION、V$SQLAREA等方法。现在用户的新问题是查看当前正在执行SQL,可能他们需要了解实时监控的方法。 首先,我需要确认达梦数据库的相关视图。根据之前的回答,正确的视图是V$SESSION而不是V$SESSIONS,所以这次需要再次强调正确的视图名称。然后,查看当前正在执行SQL通常会涉及到V$SESSIONV$SQLAREA这些动态性能视图,可能还需要关联其他视图如V$PROCESS或者V$LOCK来获取更多信息。 接下来,我需要考虑用户可能的实际使用场景。用户可能是DBA或开发人员,需要实时监控数据库的性能,找出时间运行的SQL或者锁定情况。他们可能需要具体的SQL示例,以及如何解读结果中的关键字段,比如SESS_ID、SQL_TEXT、STATUS等。 另外,用户可能需要知道如何获取完整的SQL语句,尤其是当SQL_TEXT被截断时,如何通过SQL_ID关联到V$SQLTEXT来拼接完整的SQL。这部分在之前的回答中已经提到过,可以在这里简要提及,并引用之前的解决方案作为扩展方法。 同时,用户可能对权限问题不太清楚,需要提醒查询这些视图所需的权限,比如SELECT ANY TABLE或者特定的系统权限。此外,性能影响也是一个需要注意的点,频繁查询动态视图可能会对数据库造成负担,建议在低峰期操作。 还需要考虑不同版本的达梦数据库是否有差异,比如V$LONG_EXEC_SQLS在8.0及以上版本才支持,如果用户使用的是旧版本,可能需要调整方法。 最后,用户可能需要一些扩展建议,比如如何结合其他工具或日志来监控SQL执行,或者如何优化SQL。这部分可以放在注意事项或扩展建议中,帮助用户更全面地解决问题。 总结下来,回答的结构应该是先介绍核心方法,给出具体查询示例,解释关键字段,然后提到处理SQL的方法,最后注意事项扩展建议。确保步骤清晰,代码示例正确,并且语言简洁明了,符合用户的需求。</think>在达梦数据库中,查看当前正在执行SQL 语句主要通过动态性能视图实现。以下是详细方法及操作步骤: --- ### **一、核心方法:通过动态性能视图查询** #### **1. 查询 `V$SESSION` 视图** `V$SESSION` 是监控会话 SQL 执行状态的核心视图,可实时获取当前活跃会话的 SQL 信息。 **基本查询示例:** ```sql SELECT SESS_ID, -- 会话ID SQL_TEXT, -- 当前执行SQL片段 SQL_ID, -- SQL唯一标识(用于关联完整SQL) STATUS, -- 会话状态(ACTIVE表示正在执行) CLNT_IP, -- 客户端IP USER_NAME, -- 数据库用户 CREATED_TIME, -- SQL开始时间 TIME_USED -- SQL执行时间(秒) FROM V$SESSION WHERE STATUS = 'ACTIVE'; -- 筛选正在执行的会话 ``` **关键字段说明:** - `SQL_TEXT`:显示当前执行SQL 片段,可能因度限制被截断。 - `SQL_ID`:唯一标识符,用于关联 `V$SQLTEXT` 获取完整 SQL。 - `TIME_USED`:帮助识别时间运行的 SQL。 --- #### **2. 关联 `V$SQLTEXT` 获取完整 SQL** 若 `SQL_TEXT` 被截断,通过 `SQL_ID` 关联 `V$SQLTEXT` 拼接完整 SQL。 **操作步骤:** ```sql -- 1. 获取目标会话的 SQL_ID SELECT SQL_ID FROM V$SESSION WHERE SESS_ID = <会话ID>; -- 2. 按分片顺序拼接完整 SQL SELECT LISTAGG(SQL_TEXT, '') WITHIN GROUP(ORDER BY PIECE_NO) AS FULL_SQL FROM V$SQLTEXT WHERE SQL_ID = '<上一步查到的SQL_ID>'; ``` --- #### **3. 查看时间运行或阻塞的 SQL** 通过 `V$LOCK` `V$SESSION` 关联,定位阻塞会话及其 SQL。 **示例:** ```sql SELECT S.SESS_ID, S.SQL_TEXT, L.TABLE_ID, -- 被锁定的表ID L.LTYPE, -- 锁类型(TAB为表级锁) L.BLOCKED -- 是否被阻塞(1表示是) FROM V$SESSION S JOIN V$LOCK L ON S.SESS_ID = L.SESS_ID WHERE L.BLOCKED = 1; -- 筛选被阻塞的会话 ``` --- ### **二、扩展方法:使用系统工具与日志** #### **1. 通过 `disql` 监控工具** 在达梦命令行工具 `disql` 中实时监控: ```sql -- 开启文本显示(避免截断) SET LONG 1000000; SELECT * FROM V$SESSION WHERE STATUS = 'ACTIVE'; ``` --- #### **2. 启用 SQL 审计日志** 在 `dm.ini` 中配置审计参数,记录所有 SQL 执行详情: ```ini AUDIT_SQL = 1 -- 开启 SQL 审计 AUDIT_FILE_PATH = /opt/dm/logs -- 审计日志路径 ``` --- ### **三、注意事项** 1. **权限要求** - 查询动态视图需 `SELECT ANY TABLE` 权限或 `DBA` 角色。 - 审计日志配置需 `SYSDBA` 权限。 2. **性能影响** - 频繁查询 `V$SESSION` 可能增加系统负载,建议适度使用。 3. **版本兼容性** - 达梦 7.0+ 支持 `V$SQLTEXT`,8.0+ 新增 `V$LONG_EXEC_SQLS` 视图(专用于监控耗时 SQL)。 --- ### **四、快速诊断脚本** ```sql -- 列出所有正在执行SQL 及其耗时 SELECT SESS_ID, USER_NAME, SQL_TEXT, TIME_USED, CLNT_IP, CREATED_TIME FROM V$SESSION WHERE STATUS = 'ACTIVE' AND SQL_TEXT IS NOT NULL ORDER BY TIME_USED DESC; ``` --- ### **五、常见问题** **Q1:`SQL_TEXT` 显示为 `NULL` 是为什么?** - 会话可能处于空闲状态(`STATUS` 为 `IDLE`),未执行 SQL。 - 若确认会话活跃但无 SQL,检查是否启用了参数 `ENABLE_MONITOR=1`。 **Q2:如何终止时间运行的 SQL?** 使用系统函数强制关闭会话: ```sql SP_CLOSE_SESSION(<SESS_ID>); -- 终止指定会话 ``` --- 通过以上方法,可精准定位达梦数据库正在执行SQL,并结合扩展工具实现性能分析与优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值