CodeMaster 2025-12-04 12:45 采纳率: 98.9%
浏览 16
已采纳

如何使用达梦命令查看当前正在执行的SQL语句?

如何使用达梦数据库的系统视图和命令查看当前正在执行的SQL语句?在实际运维中,常需监控长时间运行或阻塞其他会话的SQL。达梦提供V$SESSIONS和V$SQLTEXT等动态性能视图,可通过查询这些视图获取会话当前执行的SQL内容。但许多用户不清楚具体查询语句写法,或无法关联会话与SQL文本,导致无法准确定位问题SQL。此外,权限不足或视图未启用也会导致查询失败。如何正确使用DM管理工具或disql命令行,结合V$SESSIONS、V$SQLTEXT和V$TRXWAIT视图,实时查看正在执行的SQL及其执行时间、会话状态等信息?
  • 写回答

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等视图时遇到“权限不足”或“视图不存在”的错误,这通常源于以下两个原因:

    1. 当前用户未被授予SELECT ON SYS.V_$SESSIONS等相关权限;
    2. 数据库未启用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_IDCLNT_IPUSER_NAMESTATUSTRX_START_TIMELAST_SQL_TIMESTATE
    102192.168.1.100APP_USERACTIVE2025-04-05 10:23:122025-04-05 10:23:15EXECUTE
    105192.168.1.101REPORT_USERACTIVE2025-04-05 10:24:012025-04-05 10:24:03WAITING
    110192.168.1.102BATCH_JOBACTIVE2025-04-05 09:15:222025-04-05 10:25:10EXECUTE
    112192.168.1.103APP_USERWAITING2025-04-05 10:25:152025-04-05 10:25:15LOCK_WAIT

    四、深入分析:关联V$SQLTEXT获取完整SQL文本

    仅看会话信息不足以判断具体执行了什么操作,必须结合V$SQLTEXT来还原SQL语句。由于SQL可能被分段存储,需按SQL_IDPIECE排序拼接。

    以下是一个典型的联合查询:

    -- 获取指定会话的完整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;
    

    输出示例:

    等待者会话阻塞者会话等待类型锁模式涉及表名
    112110TABLE_LOCKXORDER_DETAIL
    115110ROW_LOCKSXCUSTOMER

    结合此信息,可进一步查询阻塞者(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执行情况。

    1. 打开DM Manager,连接目标实例;
    2. 进入【性能】→【会话监视】页面;
    3. 右键选中可疑会话,选择“查看当前SQL”;
    4. 系统自动执行类似V$SQLTEXT的查询并展示SQL文本;
    5. 同时可在【锁管理】页签查看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或索引]
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 12月5日
  • 创建了问题 12月4日