如何使用达梦命令查看当前正在执行的SQL语句?
如何使用达梦数据库的系统视图和命令查看当前正在执行的SQL语句?在实际运维中,常需监控长时间运行或阻塞其他会话的SQL。达梦提供V$SESSIONS和V$SQLTEXT等动态性能视图,可通过查询这些视图获取会话当前执行的SQL内容。但许多用户不清楚具体查询语句写法,或无法关联会话与SQL文本,导致无法准确定位问题SQL。此外,权限不足或视图未启用也会导致查询失败。如何正确使用DM管理工具或disql命令行,结合V$SESSIONS、V$SQLTEXT和V$TRXWAIT视图,实时查看正在执行的SQL及其执行时间、会话状态等信息?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
请闭眼沉思 2025-12-04 13:09关注一、达梦数据库监控基础:理解动态性能视图的作用
在达梦数据库(DM Database)的日常运维中,实时掌握当前正在执行的SQL语句是保障系统稳定性和性能调优的关键环节。达梦提供了多个动态性能视图(Dynamic Performance Views),这些视图基于内存中的运行时信息生成,能够反映数据库实例的实时状态。
其中最核心的三个视图包括:
- V$SESSIONS:记录所有活动会话的信息,如会话ID、客户端IP、登录用户、状态、等待事件等;
- V$SQLTEXT:存储最近执行过的SQL语句的文本内容,按SQL哈希值分片存储;
- V$TRXWAIT:用于查看事务阻塞关系,帮助识别哪些会话正在被其他会话阻塞。
这些视图共同构成了SQL监控的基础框架。通过合理关联它们,可以精准定位长时间运行或造成锁等待的问题SQL。
二、权限与配置前提:确保可访问动态视图
许多用户在尝试查询V$SESSIONS等视图时遇到“权限不足”或“视图不存在”的错误,这通常源于以下两个原因:
- 当前用户未被授予
SELECT ON SYS.V_$SESSIONS等相关权限; - 数据库未启用SQL跟踪或相关参数未开启。
解决方法如下:
问题类型 检查项 解决方案 权限问题 用户是否为SYSDBA或已授权 使用SYSDBA账户执行: GRANT SELECT ON V_$SESSIONS TO username;视图不可见 是否启用了SVI(System View Interface) 确认dm.ini中ENABLE_MONITOR = 1 SQL文本缺失 是否开启SQL捕获 设置SVR_LOG = 1 并重启服务以启用SQL日志 三、基本查询:从V$SESSIONS获取活跃会话信息
首先,我们需要列出当前所有活跃会话的基本信息。以下是在disql命令行工具中常用的查询语句:
-- 查询当前所有非空闲会话 SELECT SESS_ID, CLNT_IP, USER_NAME, STATUS, TRX_START_TIME, LAST_SQL_TIME, STATE FROM V$SESSIONS WHERE STATUS != 'IDLE' AND STATE != 'SLEEP';该查询返回结果示例如下:
SESS_ID CLNT_IP USER_NAME STATUS TRX_START_TIME LAST_SQL_TIME STATE 102 192.168.1.100 APP_USER ACTIVE 2025-04-05 10:23:12 2025-04-05 10:23:15 EXECUTE 105 192.168.1.101 REPORT_USER ACTIVE 2025-04-05 10:24:01 2025-04-05 10:24:03 WAITING 110 192.168.1.102 BATCH_JOB ACTIVE 2025-04-05 09:15:22 2025-04-05 10:25:10 EXECUTE 112 192.168.1.103 APP_USER WAITING 2025-04-05 10:25:15 2025-04-05 10:25:15 LOCK_WAIT 四、深入分析:关联V$SQLTEXT获取完整SQL文本
仅看会话信息不足以判断具体执行了什么操作,必须结合V$SQLTEXT来还原SQL语句。由于SQL可能被分段存储,需按
SQL_ID和PIECE排序拼接。以下是一个典型的联合查询:
-- 获取指定会话的完整SQL文本 SELECT S.SESS_ID, S.USER_NAME, ST.PIECE, ST.SQL_TEXT FROM V$SESSIONS S JOIN V$SQLTEXT ST ON S.LAST_SQL_ID = ST.SQL_ID WHERE S.SESS_ID = 110 ORDER BY ST.PIECE;注意:V$SQLTEXT中每条SQL最多分为64段(PIECE从0到63),因此需要程序化拼接才能还原完整语句。若发现某会话LAST_SQL_ID为空,则说明其当前无SQL执行或已超时清除。
五、阻塞检测:利用V$TRXWAIT识别锁等待链
当出现会话阻塞时,可通过V$TRXWAIT视图快速定位源头。该视图显示了“谁在等谁”的事务依赖关系。
-- 查看当前存在的事务等待 SELECT WAITER_ID AS 等待者会话, BLOCKER_ID AS 阻塞者会话, WAIT_TYPE AS 等待类型, LOCK_MODE AS 锁模式, TABLE_NAME AS 涉及表名 FROM V$TRXWAIT;输出示例:
等待者会话 阻塞者会话 等待类型 锁模式 涉及表名 112 110 TABLE_LOCK X ORDER_DETAIL 115 110 ROW_LOCK SX CUSTOMER 结合此信息,可进一步查询阻塞者(SESS_ID=110)正在执行的SQL,判断其是否长时间持有锁而未提交。
六、综合实战:构建实时监控脚本
为了便于日常巡检,可将上述逻辑整合成一个综合查询脚本,用于快速诊断问题:
-- 综合查询:查找执行时间超过60秒且处于活动状态的SQL SELECT S.SESS_ID, S.USER_NAME, S.CLNT_IP, S.STATUS, ROUND((SYSDATE - S.LAST_SQL_TIME)*24*3600) AS 执行耗时_秒, T.SQL_TEXT AS 当前SQL片段 FROM V$SESSIONS S LEFT JOIN V$SQLTEXT T ON S.LAST_SQL_ID = T.SQL_ID AND T.PIECE = 0 WHERE S.STATE = 'EXECUTE' AND (SYSDATE - S.LAST_SQL_TIME) > INTERVAL '60' SECOND ORDER BY 执行耗时_秒 DESC;七、可视化工具辅助:使用DM管理工具图形化监控
除了命令行方式,达梦提供的Manager工具也支持图形化查看当前会话与SQL执行情况。
- 打开DM Manager,连接目标实例;
- 进入【性能】→【会话监视】页面;
- 右键选中可疑会话,选择“查看当前SQL”;
- 系统自动执行类似V$SQLTEXT的查询并展示SQL文本;
- 同时可在【锁管理】页签查看V$TRXWAIT对应的阻塞图谱。
此外,还可配置告警规则,对持续运行超过阈值的SQL自动触发通知。
八、流程图:SQL监控与问题定位全过程
graph TD A[启动监控] --> B{是否有慢SQL?} B -- 是 --> C[查询V$SESSIONS筛选活跃会话] B -- 否 --> Z[结束] C --> D[提取SESS_ID与LAST_SQL_ID] D --> E[关联V$SQLTEXT获取SQL文本] E --> F{是否存在LOCK_WAIT?} F -- 是 --> G[查询V$TRXWAIT确定阻塞源] G --> H[定位阻塞会话的SQL] H --> I[评估是否需KILL会话] F -- 否 --> J[分析执行计划与资源消耗] I --> K[执行ALTER SYSTEM KILL SESSION 'SID'] J --> L[优化SQL或索引]本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报