注册
达梦数据库后台线程的查看及其作用
技术分享/ 文章详情 /

达梦数据库后台线程的查看及其作用

何处惹尘埃 2026/07/31 238 1 0

问题11:如何查看达梦后台有哪些线程?分别什么作用?

一、背景说明

达梦数据库采用 单进程、多线程 架构。整个数据库只有一个操作系统进程(dmserver),但内部包含多种类型的线程,协同完成数据库的各项任务。通过查看线程信息,可以了解数据库的运行状态、资源分配和潜在的性能瓶颈。

二、查看线程的方法

2.1 查看所有线程信息(V$THREADS)

SELECT * FROM V$THREADS;

输出示例(共156行,以下为前3行):

ID NAME START_TIME THREAD_DESC SESS_ID PROCESSOR_ID WAIT_SEQ WAIT_STATUS WAIT_TIME
13896 temp_worker_thd 2026-07-30 09:11:18.000000 Temp worker thread NULL 65535 0 NOTHING TO WAIT -1
13897 dm_tskwrk_thd 2026-07-30 09:11:23.000000 Task Worker Thread for SQL parsing and execution NULL 65535 0 NOTHING TO WAIT -1
13898 dm_tskwrk_thd 2026-07-30 09:11:23.000000 Task Worker Thread for SQL parsing and execution NULL 65535 0 NOTHING TO WAIT -1

各列含义

列名 说明
ID 线程 ID(内部标识)
NAME 线程名称(用于区分线程类型)
START_TIME 线程启动时间
THREAD_DESC 线程描述(说明该线程的具体作用)
SESS_ID 关联的会话 ID(如果是用户会话线程)
PROCESSOR_ID 处理器 ID(CPU 亲和性,65535 表示无绑定)
WAIT_SEQ 等待序列号(用于调试)
WAIT_STATUS 当前等待状态(NOTHING TO WAIT 表示空闲)
WAIT_TIME 等待时间(毫秒,-1 表示无等待)

2.2 按线程类型分组统计

SELECT NAME, THREAD_DESC, COUNT(*) FROM V$THREADS GROUP BY NAME, THREAD_DESC ORDER BY COUNT(*) DESC;

输出

线程名称(NAME) 说明(THREAD_DESC) 数量
temp_worker_thd Temp worker thread 75
dm_pthd_thd Parallel working thread 16
dm_osio_thd os io thread 16
dm_lpq_thd Local parallel working thread 10
dm_tskwrk_thd Task Worker Thread for SQL parsing and execution 9
dm_wrkgrp_thd User working thread 6
dm_hio_thd IO thread for HFS to read data pages 4
dm_rsyswrk_thd Asynchronous archiving thread 2
dm_audit_thd Thread for flush audit logs 2
其他16种 各类专用线程 各 1 个

2.3 查看等待中的线程(排查阻塞)

SELECT * FROM V$THREADS WHERE WAIT_STATUS != 'NOTHING TO WAIT';

输出:未选定行(当前没有线程在等待资源)。

2.4 查看操作系统进程信息(V$PROCESS)

SELECT * FROM V$PROCESS;

输出

PID PNAME TRACE_NAME TYPE$
13796 dmserver 1

验证了达梦是单进程多线程架构。

2.5 查看锁存器等待(V$LATCHES)

SELECT * FROM V$LATCHES;

输出:未选定行(当前没有线程在等待锁存器)。

2.6 查看锁等待(V$LOCK)

SELECT * FROM V$LOCK WHERE BLOCKED = 1;

输出:未选定行(当前没有被阻塞的锁)。

2.7 查看事务等待关系(V$TRXWAIT)

首先查看列结构:

DESC V$TRXWAIT;

输出

NAME TYPE$ NULLABLE
ID BIGINT Y
WAIT_FOR_ID BIGINT Y
WAIT_TIME INT Y
THRD_ID INT Y
LOCK BIGINT Y
WAIT_FOR_LOCK BIGINT Y

各列含义:

  • ID:等待事务的 ID(被阻塞的事务)
  • WAIT_FOR_ID:持有锁的事务 ID(阻塞方)
  • WAIT_TIME:等待时间(毫秒)
  • THRD_ID:线程 ID
  • LOCK / WAIT_FOR_LOCK:锁相关地址
SELECT * FROM V$TRXWAIT;

输出:未选定行(当前没有事务在等待锁)。

2.8 查看活动会话

SELECT SESS_ID, USER_NAME, STATE, CLNT_IP, TRX_ID FROM V$SESSIONS WHERE STATE = 'ACTIVE';

输出

SESS_ID USER_NAME STATE CLNT_IP TRX_ID
140711410203816 SYSDBA ACTIVE ::1:45552 90190

当前有 1 个活动会话。

三、各类线程名称及作用说明

线程名称(NAME) 说明(THREAD_DESC) 作用
dm_lsnr_thd Service listener thread 监听线程,在服务器端口上循环监听客户端连接请求
dm_wrkgrp_thd User working thread 工作线程,负责处理用户会话的 SQL 请求
dm_tskwrk_thd Task Worker Thread for SQL parsing and execution 任务工作线程,负责服务器自身的 SQL 解析和执行
dm_osio_thd os io thread OS IO 线程,负责磁盘数据页的读写操作
dm_redolog_thd Redo log thread, used to flush log 重做日志线程,负责将日志缓冲区中的 Redo 日志写入日志文件
dm_rsyswrk_thd Asynchronous archiving thread 异步归档线程,负责将 Redo 日志归档到归档目录
dm_chkpnt_thd Flush checkpoint thread 检查点线程,触发检查点将脏页写入数据文件
dm_sched_thd Server scheduling thread 调度线程,触发后台检查点、时间触发器等任务
dm_pwr_thd flush PWR log thread PWR 日志刷新线程
dm_sqllog_thd Thread for writing dmsql dmserver SQL 日志写入线程
dm_sql_thd User session thread 用户会话线程
dm_sql_aux_thd User session auxiliary thread 用户会话辅助线程
dm_audit_thd Thread for flush audit logs 审计日志刷新线程
dm_deadlock_chk_thd Thread for transaction deadlock check 死锁检查线程,定期检测事务死锁
dm_purge_thd Purge thread 清理线程,清理过期数据
dm_trxbro_thd trx active view broadcast thread 事务活跃视图广播线程
dm_trctsk_thd Thread for writing trace information Trace 信息写入线程
dm_tlog_thd Thread for writing tlog dmserver Tlog 写入线程
dm_pthd_thd Parallel working thread 并行工作线程,用于并行查询
dm_lpq_thd Local parallel working thread 本地并行工作线程
dm_hio_thd IO thread for HFS to read data pages HFS 数据页读取 IO 线程
dm_quit_thd Thread for executing shutdown-normal operation 正常关闭执行线程
temp_worker_thd Temp worker thread 临时工作线程,用于排序、哈希等临时操作
nlgn_task_thread Thread for writing login information 登录信息写入线程
nsvr_console_thread Thread for nsvr console 控制台线程

四、线程监控命令速查

-- 1. 查看所有线程 SELECT * FROM V$THREADS; -- 2. 按类型统计线程数量 SELECT NAME, THREAD_DESC, COUNT(*) FROM V$THREADS GROUP BY NAME, THREAD_DESC ORDER BY COUNT(*) DESC; -- 3. 查找等待中的线程(排查阻塞) SELECT * FROM V$THREADS WHERE WAIT_STATUS != 'NOTHING TO WAIT'; -- 4. 查看进程信息 SELECT * FROM V$PROCESS; -- 5. 查看被阻塞的锁 SELECT * FROM V$LOCK WHERE BLOCKED = 1; -- 6. 查看事务等待关系 DESC V$TRXWAIT; SELECT * FROM V$TRXWAIT; -- 7. 查看活动会话 SELECT SESS_ID, USER_NAME, STATE, CLNT_IP, TRX_ID FROM V$SESSIONS WHERE STATE = 'ACTIVE'; -- 8. 查看等待的锁存器 SELECT * FROM V$LATCHES;

五、诊断流程(判断线程争用)

当系统响应变慢时,按以下顺序排查线程争用:

  1. 查看线程等待状态

    SELECT * FROM V$THREADS WHERE WAIT_STATUS != 'NOTHING TO WAIT';

    如果返回非空,说明有线程在等待资源,查看 WAIT_TIME 判断等待时长。

  2. 查看锁阻塞

    SELECT * FROM V$LOCK WHERE BLOCKED = 1;

    如果返回非空,说明存在锁阻塞,结合 V$TRXWAIT 定位阻塞方。

  3. 查看事务等待

    SELECT * FROM V$TRXWAIT;

    如果返回非空,说明存在事务等待,通过 WAIT_FOR_ID 找到持有锁的事务。

  4. 查看活动会话

    SELECT SESS_ID, SQL_TEXT, STATE FROM V$SESSIONS WHERE STATE = 'ACTIVE';

    找到长时间运行的 SQL,分析是否需要优化。

六、当前环境诊断结论

执行所有诊断命令后,结果汇总如下:

检查项 结果 状态
V$THREADS 等待状态 所有线程均为 NOTHING TO WAIT 正常
V$LOCK WHERE BLOCKED=1 无阻塞锁 正常
V$TRXWAIT 无事务等待 正常
V$LATCHES 无锁存器等待 正常
V$SESSIONS 活动会话 1 个活动会话 正常

结论:当前系统运行正常,无任何线程争用或锁阻塞。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服