注册
达梦数据库常见动态视图解析以及通过动态视图排查锁等待问题
专栏/技术分享/ 文章详情 /

达梦数据库常见动态视图解析以及通过动态视图排查锁等待问题

anon 2025/08/22 148 0 0
摘要

一、引言

在数据库管理领域,性能监控与调优是永恒的主题。达梦数据库作为国产数据库的代表,通过动态性能视图(以V$为前缀的系统视图)为管理员提供了一扇观察数据库内部运行状态的窗口。这些视图实时反映数据库的内存使用、会话活动、SQL 执行效率等关键指标,是诊断性能问题、优化系统配置的核心工具。

达梦动态性能视图作为数据库运行过程中的重要辅助工具,其数据构建于内存结构、进程状态及系统统计等信息之上。相较于常规用户表,这类视图呈现出较为独特的特性:数据状态往往与数据库运行状态紧密关联,呈现出随系统运行动态更新的特征,且在数据库关闭时,相关数据通常会失去存储状态。

本文将结合达梦官方文档与实际案例,全面解析动态性能视图的原理、分类、常用场景及最佳实践,帮助读者掌握通过动态视图实现高效运维的核心技能。了解一些常见动态视图,然后能通过这些动态视图排查问题。

二、动态性能视图的基础架构与权限管理

2.1 视图结构与命名规范

达梦的动态性能视图采用与 Oracle 类似的V$命名约定,例如V$SESSIONS(会话信息)、V$SQL_PLANSQL 执行计划)等。这些视图由系统自动维护,数据实时更新,无需用户干预。

  • 全局同义词:所有动态视图在SYS模式下定义,但 DM 为每个视图创建了同名的全局同义词,用户可直接通过V$VIEW_NAME访问,无需指定模式名。
  • DMDPC 环境支持:在 DMDPC 集群中,查询动态视图会自动汇总所有节点的信息,方便跨节点监控。

2.2 权限控制与安全注意事项

  • 权限要求:默认情况下,仅SYSDBA用户或具有DBA角色的用户可访问动态视图。普通用户需通过GRANT SELECT ON SYS.VIEW_NAME TO USER显式授权。
  • 敏感信息保护:动态视图包含数据库版本、内存分配、事务状态等敏感数据,需严格控制访问权限,避免信息泄露。

三、核心动态性能视图详解

达梦的动态性能视图覆盖系统信息、存储结构、SQL 执行、事务管理等多个维度,以下是关键视图的深度解析。

3.1 系统信息与资源监控

3.1.1 V$INSTANCE:实例状态监控

  • 核心功能:提供数据库实例的基本信息,包括版本号、启动时间、运行状态(如MOUNTEDOPEN)、主机名等。该视图的查询结果能够快速判断数据库是否正常运行、是否启用归档(影响数据恢复能力)、以及当前版本是否需要补丁更新等关键信息。

  • 核心字段

    • INSTANCE_NAME: 实例名称(默认与数据库名称一致);
    • STATUS$: 实例状态(STARTUP/MOUNTED/OPEN/SUSPENDED
    • START_TIME: 实例启动时间
    • SVR_VERSION: 数据库版本号
    • HOST_NAME: 运行实例的主机名
    • BUILD_TIME: 实例初始化时间
  • 典型应用场景:

    SELECT INSTANCE_NAME, VERSION, STARTUP_TIME, STATUS FROM V$INSTANCE;

如下图所示,即为查询视图V$INSTANCE所展示结果。image.png

3.1.2 V$MEM_POOL:内存池管理

  • 核心功能:达梦数据库采用内存池(Memory Pool)机制管理内存,V$MEM_POOL视图详细记录了各内存池的分配与使用情况。监控达梦内存池(MEMORY_POOL)的使用情况,包括总内存、已用内存、碎片率等。

  • 核心字段

    • NAME: 内存池名称
    • ORG_SIZE:初始大小,参数文件配置大小(字节)
    • RESERVED_SIZE:实际使用大小(字节)
    • DATA_SIZE:当前分配出去的数据占用大小(字节)
    • TOTAL_SIZE:当前内存池总大小(字节)
    • EXTEND_SIZE: 每次拓展的块大小(字节)
    • TARGET_SIZE: 可以扩展到的大小,当TARGET_SIZE为0时,不限制此内存池的扩展;对于共享内存池,即时TARGET_SIZE不为0,也不限制其扩展,TARGET_SIZE 用于提示系统尽快把内存占用释放到 TARGET_SIZE 以下
  • 典型应用场景: 检查内存池使用情况

    SELECT NAME, ROUND(ORG_SIZE/1024/1024, 2) AS ORG_MB, ROUND(RESERVED_SIZE/1024/1024, 2) AS RESERVED_MB, ROUND(DATA_SIZE/1024/1024, 2) AS DATA_MB, ROUND(TOTAL_SIZE/1024/1024, 2) AS TOTAL_MB, ROUND(EXTEND_SIZE/1024/1024, 2) AS EXTEND_MB, ROUND(TARGET_SIZE/1024/1024, 2) AS TARGET_MB FROM V$MEM_POOL

image.png

3.1.3 V$BUFFERPOOL:数据缓冲区监控

  • 核心功能:数据缓冲区(Buffer Pool)是内存中最重要的部分,V$BUFFERPOOL视图专门用于监控缓冲区性能,分析数据缓冲区(BUFFER)的使用效率,包括命中率、脏页数量、缓冲区大小等。

  • 核心字段:

    • NAME: 缓冲区名称

    • PAGE_SIZE: 基缓冲区页大小,不包括扩展池页

    • N_PAGES: 页数

    • FREE: 空闲页数目

    • N_DIRTY: 脏页数目

    • N_TOTAL_PAGES: 页总数,包括扩展池页

    • N_LOGIC_READS: READ 命中的次数

    • N_PHY_READS: READ 未命中的次数

    • RAT_HIT: 命中率

  • 典型应用场景:

    • 命中率计算

      SELECT NAME,CASE WHEN (N_LOGIC_READS + N_PHY_READS)=0 THEN 0 ELSE(1 - (N_PHY_READS / (N_LOGIC_READS + N_PHY_READS))) * 100 END AS BUFFER_HIT_RATIO FROM V$BUFFERPOOL;
      SELECT NAME,RAT_HIT * 100 as BUFFER_HIT_RATIO FROM V$BUFFERPOOL;

    image.png

    • 若命中率低于 80%,需考虑增加BUFFER参数值或优化 SQL 减少物理读。

3.2 会话与事务管理

3.2.1 V$SESSIONS:会话状态监控

  • 核心功能:实时跟踪所有会话的详细信息,包括会话 ID、用户、客户端 IP、执行的 SQL 语句、等待事件等。

  • 核心字段:

    • SESS_ID: 会话 ID,系统内部标识

    • SQL_TEST: 取 sql 的头 1000 个字符

    • STATE: 会话状态。
      CREATE 创建,表示会话对象已创建,但还不能使用;
      STARTUP 启动,表示会话正在启动中;
      IDLE 空闲,表示会话当前没有执行操作;
      ACTIVE 活动,表示会话当前正在执行操作;
      PENDING 限流等待,当 INI 参数 MAX_CONCURRENT_TRX>0 时,会话可能会因为并行事务限流而处于此状态;
      FREEING 正在释放,表示会话正在被释放;

    • USER_NAME: 当前用户

    • TRX_ID: 事务 id,为 0 表示事务未开始或事务已结束

    • CLNT_IP: 客户端 IP

    • CLNT_HOST: 客户端主机名

  • 典型应用场景

    • 查询活跃会话

      SELECT SESS_ID, USER_NAME, CLNT_IP, SQL_TEXT FROM V$SESSIONS WHERE STATE= 'ACTIVE';
    • 定位阻塞会话:结合V$LOCKV$TRXWAIT视图分析锁等待问题。

    image.png

3.2.2 V$TRX:事务监控

  • 核心功能:记录当前所有事务的状态,包括事务 ID、开始时间、锁持有情况、回滚段使用等。

  • 核心字段:

    • ID: 当前活动事务的 ID 号

    • STATUS: 当前事务的状态。
      NOT START 未开始任何操作;
      ACTIVE 活动;
      LOCK WAIT 锁等待;
      ROLLING 正在回滚;
      PRE_COMMIT 两阶段事务的预提交状态;
      TO_RELEASE DPC 环境下分布式事务的等待释放状态。分布式事务完成第二阶段提交后转入 TO_RELEASE 状态,分布式事务在所有节点都转入 TO_RELEASE 状态后才允许释放

    • ISOLATION: 隔离级。0:读未提交;1:读提交;2:可重复读;3:串行化

    • SESS_ID: 当前事务的所在会话 ID,系统内部标识

    • THRD_ID: 当前事务对应的线程 ID

  • 典型应用场景

    等待事务排查:

    //查询正在等待的事务列表 SELECT * FROM V$TRXWAIT;

    //根据查询出来的事务id查询事务详情
    SELECT ID,SESS_ID,SQL_TEST,CLNT_IP, SQL_TEXT
    FROM VTRXALEFTJOINVTRX A LEFT JOIN VSESSIONS B WHEN A.SESS_ID = B.SESSID
    WHERE ID = (上面查询出来的id)

3.3 SQL 执行与优化

3.3.1 V$SQLTEXT:缓冲区中SQL 语句信息

  • 核心功能:V$SQL视图存储了数据库缓存的 SQL 语句信息,是 SQL 性能优化的核心依据。

  • 核心字段:

  • SQL_ID:SQL 语句唯一标识​

  • SQL_TEXT:SQL  语句内容

  • N_EXEC:执行次数​

  • 典型应用场景

    • 查找执行次数最多的SQL
SELECT SQL_ID,SQL_TEXT,N_EXEC FROM V$SQLTEXT ORDER BY N_EXEC DESC LIMIT 1

image.png

3.3.2 V$SQL_PLAN:执行计划分析

  • 核心功能:展示 SQL 语句的执行计划,包括操作符类型、访问路径、成本估算等。在 ini 参数 USE_PLN_POOL !=0 时才统计。

  • 核心字段:

    • SQL_ID: 语句编号

    • SQLSTR: 语句内容

    • N_SUBPLNS: 子计划个数

    • PLN_ADDR: 计划在缓存中的地址

    • RT_METHOD: 计划的运行时方法

  • 典型应用场景

    • 生成执行计划

      EXPLAIN SELECT * FROM TABLE_NAME WHERE COLUMN = 'VALUE'; SELECT * FROM V$SQL_PLAN;

3.3.3 V$LONG_EXEC_SQLS:慢查询监控

  • 核心功能:当 INI 参数 ENABLE_MONITOR=1 时,显示系统最近 n 条执行时间超过预定值的 SQL 语句。n 由 INI 参数 LONG_EXEC_SQLS_CNT 指定。默认预定值为 1000 毫秒,可通过 SP_SET_LONG_TIME 系统函数修改,通过 SF_GET_LONG_TIME 系统函数查看当前值。记录执行时间超过阈值的 SQL 语句,包括执行时长、逻辑读、物理读等指标。

  • 核心字段:

    • SESS_ID: 会话 ID,系统内部标识

    • SQL_TEXT: SQL 文本

    • EXEC_TIME: 执行时间,单位毫秒

    • FINISH_TIME: 执行结束时间

    • N_RUNS: 执行次数

    • TRX_ID: 事务号

  • 典型应用场景

    • TOP 10 慢查询

      SELECT SQL_TEXT, EXEC_TIME, SESS_ID FROM V$LONG_EXEC_SQLS ORDER BY EXEC_TIME DESC FETCH FIRST 10 ROWS ONLY;
    • 对频繁执行的慢查询,需检查索引是否缺失或执行计划是否合理。

3.4 存储与 I/O 管理

3.4.1 V$SYSTEMINFO:系统信息视图

  • 核心功能:监控操作系统的内存,磁盘,CPU负载和IO等信息

  • 核心字段:

    • TOTAL_PHY_SIZE: 物理内存总大小,单位 BYTE

    • FREE_PHY_SIZE: 剩余物理内存大小,单位 BYTE

    • TOTAL_DISK_SIZE: 磁盘总大小,单位 BYTE

    • FREE_DISK_SIZE: 剩余磁盘大小,单位 BYTE

    • CPU_USER_RATE: 用户模式占用 CPU 使用率,仅 LINUX 环境有效

    • CPU_SYSTEM_RATE: 系统模式占用的 CPU 使用率,仅 LINUX 环境有效

    • SEND_BYTES_PER_SECOND: 当前每秒发送字节数,仅 LINUX 环境有效

    • RECEIVE_BYTES_PER_SECOND: 当前每秒接收字节数,仅 LINUX 环境有效

  • 典型应用场景

    SELECT TOTAL_PHY_SIZE,FREE_PHY_SIZE, TOTAL_DISK_SIZE, FREE_DISK_SIZE, CPU_USER_RATE, CPU_SYSTEM_RATE, SEND_BYTES_PER_SECOND,RECEIVE_BYTES_PER_SECOND FROM V$SYSTEMINFO;

image.png

四、锁等待问题排查

为了便于我们更好的理解动态性能视图的使用,这里我们模拟演示如何通过达梦动态性能视图排查锁等待问题。

场景描述:应用程序出现响应超时,怀疑存在事务阻塞。

1.准备测试环境

首先创建测试表并插入数据

-- 创建测试表 CREATE TABLE test_lock ( id INT PRIMARY KEY, name VARCHAR(50) ); -- 插入测试数据 INSERT INTO test_lock VALUES (1, 'test'); COMMIT;

image.png

2.模拟锁等待

锁等待通常由于并发更新同一资源且未及时释放锁导致,以下通过两个会话模拟:

会话1(阻塞方): 开启事务更新数据,但不提交(持有排他锁)

-- 会话1:开启事务,更新id=1的行(不提交,持有行级排他锁) BEGIN TRANSACTION; UPDATE test_lock SET name = 'session1_update' WHERE id = 1; -- 注意:此处不执行COMMIT或ROLLBACK,保持事务活跃

会话2(被阻塞方): 尝试更新同一行数据(触发锁等待)

-- 会话2:尝试更新同一行,此时会进入锁等待(等待会话1释放锁) UPDATE test_lock SET name = 'session2_update' WHERE id = 1;

执行上述sql语句后,会话2会处于阻塞状态,需等待会话1释放锁才能继续,此时锁等待场景已模拟完成。

以下是会话1执行:

image.png

当会话2执行时,我们会发现会话二阻塞了:
image.png

3.通过动态性能视图排查锁等待

核心思路:

  • 是否存在锁等待

  • 哪个事务再等待,被哪个事务阻塞?

  • 阻塞事务和等待事务执行了什么SQL?

步骤1:确定是否存在锁等待

通过V$TRXWAIT视图查询当前活跃的锁等待关系

SELECT ID as 被阻塞的事务id, WAIT_FOR_ID as 阻塞的事务id, WAIT_TIME as 等待时间, THRD_ID as 阻塞事务的线程id FROM V$TRXWAIT;

image.png

说明当前存在锁等待,事务74260正在等待事务74259释放锁,以等待421772秒。

步骤2:关联事务与会话,定位操作源

通过V$TRX(事务信息)和V$SESSIONS(会话信息)关联,获取事务对于的会话id和操作用户:

SELECT t.ID AS 事务ID, t.SESS_ID AS 会话ID, s.USER_NAME AS 操作用户, s.CLNT_IP AS 客户端IP, t.STATUS AS 事务状态 FROM V$TRX t JOIN V$SESSIONS s ON t.SESS_ID = s.SESS_ID WHERE t.TRX_ID IN ( SELECT ID FROM V$TRXWAIT UNION SELECT WAIT_FOR_ID FROM V$TRXWAIT );

查询的结果如下:
image.png

步骤3:查看事务执行的SQL语句

-- 查看阻塞事务和等待事务执行的SQL SELECT s.SESS_ID AS 会话ID, t.ID AS 事务ID, CASE WHEN t.ID IN (SELECT WAIT_FOR_ID FROM V$TRXWAIT) THEN '阻塞方' WHEN t.ID IN (SELECT ID FROM V$TRXWAIT) THEN '等待方' END AS 角色, SUBSTR(s.SQL_TEXT, 1, 200) AS 执行的SQL FROM V$SESSIONS s JOIN V$TRX t ON s.SESS_ID = t.SESS_ID WHERE t.ID IN ( SELECT ID FROM V$TRXWAIT UNION SELECT WAIT_FOR_ID FROM V$TRXWAIT );

执行的结果如下:

image.png

4.解决锁等待

(1).正常释放锁

通过查询出来的阻塞事务的操作方(通过客户端IP和操作用户定位),让其提交或者回滚事务:

COMMIT; ROLLBACK;

执行后,会话2的等待自动解除

(2).强制终止阻塞对话

若阻塞事务无法正常释放,可通过SP_CLOSE_SESSION存储过程种植阻塞会话

-- 终止阻塞会话(会话ID从步骤2的查询结果中获取,此处为281355455893000) SP_CLOSE_SESSION(281355455893000);

image.png

再次查看会话2,发现语句执行完成

<img src=“file:///C:/Users/15299/AppData/Roaming/marktext/images/2025-08-06-14-58-46-image.png” title="" alt="" width=“382”>

记录也被成功修改
image.png

五、总结

动态性能视图是达梦数据库运维的核心工具,掌握其使用方法可显著提升故障诊断和性能优化效率。数据库性能优化是一个持续迭代的过程,动态性能视图提供的实时数据是这一过程的基础。只有通过不断实践,才能熟练掌握这些工具,将其转化为解决实际问题的能力,最终实现数据库系统的稳定、高效运行。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服