参考资料 :DM8 系统管理员手册 适用版本:DM8
前言
达梦数据库(DM)是武汉达梦数据库股份有限公司自主研发的大型通用关系型数据库管理系统。理解 DM8 的体系架构,是掌握数据库管理、性能优化和故障排查的基石。
本文从 数据库与实例的关系 、存储结构 、内存结构 、线程结构 以及实例状态管理五个维度,系统剖析 DM8 的体系架构。
一、数据库与数据库实例
| 概念 | 类型 | 说明 |
|---|---|---|
| 数据库 (Database) | 物理概念 | 磁盘上存放数据的文件集合:数据文件、日志文件、控制文件等 |
| 数据库实例 (Instance) | 逻辑概念 | 操作数据库的运行时环境,由内存结构 + 后台线程组成 |
引自手册 :"DM 数据库存储在服务器的磁盘上,而 DM 实例则存储于服务器的内存中。通过运行 DM 实例,可以操作 DM 数据库中的内容。在任何时候,一个实例只能与一个数据库进行关联。"
在实际应用中,单节点(单机)架构是最基础的部署形态,即一个数据库实例对应一个数据库。 为了应对高并发、高可用等复杂场景,达梦也提供了如 **达梦数据共享集群(DSC)** 等高级架构。在 DSC 架构中,多个数据库实例可以同时访问和管理同一个数据库(即多对一)。
下图展示的便是一个达梦数据库单体架构,呈现了实例与数据库(磁盘文件)之间的对应交互关系:

二、存储结构
DM8 的存储结构分为 逻辑存储结构 和 物理存储结构。数据库通过逻辑存储结构来管理物理存储结构。
2.1 逻辑存储结构
DM8 的逻辑存储结构采用层次化设计,从大到小依次为:表空间、段、簇、页、记录。
这种从宏观的表空间到微观的数据页的自顶向下的包含关系,构成了数据库空间分配与管理的基础。具体的细分规则和逻辑层级结构如下图所示:

2.1.1 表空间 (Tablespace)
表空间是数据库逻辑划分的最大单元。所有数据库对象在逻辑上都存放在表空间中,物理上存储在所属表空间的数据文件中。
DM8 创建时自动创建 4个表空间:
| 表空间 | 类型 | 说明 |
|---|---|---|
| SYSTEM | 系统表空间 | 存放数据字典信息,用户不能在其中创建表和索引 |
| ROLL | 回滚表空间 | 存储事务 UNDO 数据,系统自动维护,提供读一致性视图 |
| MAIN | 主表空间 | 用户默认表空间,初始 128MB 数据文件,为混合表空间(可存 HUGE 表) |
| TEMP | 临时表空间 | 排序、索引创建、临时表等操作的临时空间,系统自动管理 |
手册建议:"用户自己创建一个表空间来存放业务数据,或者将数据存放在默认的用户表空间 MAIN 中。"
查看表空间信息:
SELECT * FROM V$TABLESPACE;

查看日志表空间信息:
SELECT * FROM V$RLOGFILE;

2.1.2 段 (Segment)
段是簇的上级逻辑分区单元,由一组簇组成。段可以包含来自不同文件的簇 ,即一个段可以跨越不同的数据文件。
常见段类型:
-
数据段:存储表数据,表中每行数据以数据段结构存储
-
索引段:存储索引数据
-
临时段:排序操作、中间结果集等临时数据,系统自动分配和释放
-
回滚段:存储事务回滚信息,提供读一致性和多版本并发控制
手册说明:"DM 支持延迟段分配功能,创建表/索引时先不申请存储空间,当插入数据时才尝试申请。可通过
DEFERRED_SEGMENT_CREATION=1开启。"
2.1.3 簇 (Extent)
簇由同一个数据文件中连续的数据页组成,是空间分配的基本单位。
| 属性 | 说明 |
|---|---|
| 组成 | 16 / 32 / 64 个连续数据页(建库时指定,默认 16) |
| 约束 | 一个簇只能来自同一个数据文件 |
| 分配 | 按需分配,不同簇在磁盘上不一定连续 |
| 不可变更 | 建库后簇大小不能更改 |
空间分配机制:创建表/索引时初始分配 1 个簇,用完后系统自动扩展。对象被删除后,簇被标记为空闲状态,供其他对象使用。
2.1.4 页 (Page)
数据页是 DM8 中最小的数据存储单元,也是最小的 IO 单元。
| 属性 | 说明 |
|---|---|
| 可选大小 | 4KB / 8KB / 16KB / 32KB,建库时指定,默认 8KB |
| 不可变更 | 建库后整个生命周期不能更改 |
| 页面结构 | 页头控制信息 + 数据区 + 空闲空间 + 行偏移数组 |
| FILLFACTOR | 控制数据页初始可用空间百分比,影响页分裂频率和空间利用率 |
手册说明:"记录不能跨页存储,因此每条记录的总长度不能超过页面大小的一半。"
2.1.5 记录 (Record)
记录是存储在页中的实际数据行,是逻辑结构的最小单位。
2.2 物理存储结构
物理存储结构是数据在磁盘上的实际文件组成。
2.2.1 数据文件 (*.dbf)
存储实际数据的物理文件。每个表空间至少关联一个数据文件,默认文件对应关系:
| 表空间 | 默认数据文件 |
|---|---|
| SYSTEM | SYSTEM.DBF |
| MAIN | MAIN.DBF |
| ROLL | ROLL.DBF |
| TEMP | TEMP.DBF |
查看数据文件路径:
SELECT * FROM V$DATAFILE;

2.2.2 重做日志文件 (*.log)
记录所有对数据库的修改操作,是崩溃恢复的关键。
-
初始化时自动创建 2 个日志文件(DAMENG01.LOG、DAMENG02.LOG)
-
当前日志文件写满后自动切换 到下一个,日志文件循环使用
-
日志文件大小受
LOG_SIZE参数控制
⚠️ 生产环境警告 :日志循环使用会导致旧日志被覆盖。强烈建议开启归档模式,将写满的日志备份到归档目录。
表空间数据文件与操作系统物理文件的映射关系,以及重做日志文件在底层是如何实现循环覆盖写入的,可以通过以下示意图进行全局梳理:

2.2.3 控制文件 (dm.ctl)
记录数据库物理结构信息:数据库名称、文件路径、表空间信息、检查点信息等。控制文件损坏将导致数据库无法启动。
2.2.4 配置文件 (dm.ini)
DM8 的核心配置文件,每创建一个数据库就自动生成。参数属性分为三种:
| 参数属性 | 说明 |
|---|---|
| 静态参数 | 修改配置文件更改,且必须重启后才能生效。 |
| 动态参数 - 系统级 | 可以在线动态修改,无需重启 即可生效。修改后对数据库实例全局生效 |
| 动态参数 - 会话级 | 在系统级的基础上,可选择仅对当前会话生效,不影响其他会话 |
2.2.5 其他文件
| 文件 | 作用 |
|---|---|
| sqllog.ini | SQL 日志配置 |
| dmarch.ini | 归档存储 |
| dmmal.ini | MAL 多机通信配置 |
| 归档日志文件 | Redo 日志的持久化备份 |
| 备份文件 | BACKUP 或 dmrman 生成的备份 |
| 事件日志文件 | 记录系统运行事件 |
| 物理逻辑日志文件 | 用于 DBMS_LOGMNR 包进行日志分析 |
三、内存结构
DM8 实例的内存结构由共享内存 和运行时内存两大部分组成。
整个实例的内存区域被精细划分为两大块:由系统统一分配的共享内存池,以及供各线程或会话独享的运行时内存池。具体内存架构划分如下:

3.1 内存池
3.1.1 共享内存池
共享内存池为实例中所有线程共享的内存区域,由 DM 管理。
| 参数 | 默认值 | 说明 |
|---|---|---|
| MEMORY_POOL | 500 MB | 共享内存池总大小 |
| MEMORY_TARGET | 15000 MB | 空闲时收缩的目标大小 |
| MEMORY_EXTENT_SIZE | 32 MB | 每次扩充大小 |
| MEMORY_N_POOLS | 1 | 共享内存池分片数 |
3.1.2 运行时内存池
每个线程/会话独享的内存区域:
| 参数 | 默认值 | 说明 |
|---|---|---|
| VM_POOL_SIZE | 64 KB | 虚拟机内存池大小 |
| SESS_POOL_SIZE | 64 KB | 会话缓冲区大小 |
| WORK_THRD_STACK_SIZE | 8192 KB | 工作线程堆栈大小 |
3.2 缓冲区
3.2.1 数据缓冲区 (Buffer Cache)
数据缓冲区是最核心的内存区域,直接决定数据库性能。
-
缓存从磁盘读取的数据页,减少物理 I/O
-
使用 LRU 算法 管理(也可选时钟置换算法,
BUFFER_MODE=1) -
分为 NORMAL 缓冲区 和 FAST 缓冲区(热点数据快速访问)
| 参数 | 默认值 | 说明 |
|---|---|---|
| BUFFER | 8000 MB | NORMAL 缓冲区大小,推荐物理内存 60%~80% |
| BUFFER_POOLS | 19 | 缓冲区分区数 |
| FAST_POOL_PAGES | 3000 | 快速缓冲区页数 |
| RECYCLE | 300 MB | RECYCLE 缓冲区大小 |
查看缓冲区命中率(判断是否需要增大缓冲区):
SELECT * FROM V$BUFFERPOOL;

3.2.2 日志缓冲区 (Redo Log Buffer)
暂存事务产生的重做日志。遵循 WAL(Write-Ahead Logging) 机制:日志必须先于数据落盘,保证事务持久性。支持 Group Commit 优化。
3.2.3 字典缓冲区 (Dictionary Cache)
缓存系统元数据信息(表名、列名、权限等),减少对 SYSTEM 表空间的物理 I/O。参数 DICT_BUF_SIZE 控制大小,默认 50MB。
3.2.4 SQL 缓冲区 (Plan Cache)
缓存已解析的 SQL 语句和执行计划,避免重复硬解析。参数 CACHE_POOL_SIZE 控制大小,默认 100MB。USE_PLN_POOL 控制是否启用计划重用。
3.3 排序区
用于 ORDER BY、GROUP BY、DISTINCT 等排序操作。DM8 支持两种排序机制(SORT_FLAG):
| SORT_FLAG | 模式 | 说明 |
|---|---|---|
| 0 | 原排序 | 按 SORT_BUF_SIZE 大小获取数据排序 |
| 1 | 大内存排序 | 将 SORT_BUF_GLOBAL_SIZE 分片排序再归并(默认) |
关键参数:SORT_BUF_SIZE(默认 20MB)、SORT_BUF_GLOBAL_SIZE(默认 1000MB)。
3.4 哈希区
用于 HASH JOIN、HASH GROUP BY 等哈希操作。
关键参数:HJ_BUF_GLOBAL_SIZE(默认 5000MB)、HJ_BUF_SIZE(单个操作符默认 500MB)、HAGR_HASH_SIZE(HASH 表桶数,默认 100000)。
四、线程结构
DM8 采用单进程多线程 架构,所有操作在一个 dmserver 进程中通过多个专业化线程协同完成。
在这种单进程架构下,各个核心后台线程(如监听、工作、IO、调度、日志相关线程等)是如何各司其职、高效流转与协同的,可参见下方的线程分工协作图:

4.1 监听线程
在指定端口(默认 5236)监听客户端连接请求。接收新连接后将其分配给工作线程处理。
4.2 工作线程
处理所有用户 SQL 请求的核心线程组,负责 SQL 的解析、优化、执行和结果返回。
| 参数 | 默认值 | 说明 |
|---|---|---|
| WORKER_THREADS | 16 | 工作线程数量(取值 1~64) |
| TASK_THREADS | 16 | 任务线程数量 |
手册说明:可通过
STHD_FLAG参数启用 SESS/ESESS 线程池模式,进一步优化会话管理。
4.3 IO 线程
执行数据页的异步读写操作:将缓冲区脏页批量写回数据文件,预读取即将需要的数据页,减少工作线程的 IO 等待。
4.4 调度线程
管理后台调度任务:
-
检查点 (Checkpoint):定期将脏页写回磁盘
-
定时作业调度
-
空闲会话超时检测和回收
4.5 日志 FLUSH 线程
将日志缓冲区的 Redo Log 写入磁盘的重做日志文件。事务提交时触发同步刷盘,保证 WAL 机制。
4.6 日志归档线程
开启归档模式后生效。将写满切换的 Redo 日志文件归档到指定目录。
4.7 日志 APPLY 线程
在备库(STANDBY 模式)上运行,接收主库发送的 Redo 日志并重做,保持主备数据一致。
4.8 定时器线程
处理超时检测和资源回收。
4.9 MAL 系统线程
多机通信线程,负责集群节点间的数据同步和消息传递。
查看所有线程信息:
SELECT * FROM V$THREADS;

五、数据库实例的状态与模式
5.1 实例状态 (Status)
SELECT INSTANCE_NAME, STATUS$, MODE$ FROM V$INSTANCE;

| 状态 | 说明 | 典型场景 |
|---|---|---|
| OPEN | 正常对外服务,可访问所有对象 | 日常运行 |
| MOUNT | 不允许访问对象,只能进行控制文件维护和归档配置 | 配置归档模式 |
| SUSPEND | 挂起,限制磁盘写入,修改数据页时用户会话被挂起 | 磁盘故障或者集群同步异常 |
5.2 实例模式 (Mode)
| 模式 | 读写 | 日志行为 | 适用场景 |
|---|---|---|---|
| NORMAL | 读写 | 正常 | 单机数据库(默认) |
| PRIMARY | 读写 | 生成 Redo,根据同步策略发送日志到备库 | 主备集群 --- 主库 |
| STANDBY | 只读 | 接收主库 Redo 并重做 | 主备集群 --- 备库 |
实例在不同维护阶段的状态转换路径(OPEN / MOUNT / SUSPEND),以及 NORMAL、PRIMARY 和 STANDBY 三种运行模式在读写权限及日志行为上的核心差异,可通过下图进行全局概览:

六、回滚数据管理
6.1 UNDO vs REDO
| 对比项 | UNDO (回滚) | REDO (重做) |
|---|---|---|
| 存储内容 | 修改前的旧值 | 修改后的新值 |
| 存储位置 | ROLL 表空间 | 重做日志文件 |
| 主要用途 | 事务回滚、读一致性、MVCC | 崩溃恢复 |
6.2 回滚段的作用
手册说明:"DM 数据库提供了全自动回滚管理机制。事务被提交后,回滚数据不能再回滚或恢复,但从读一致性角度出发,长时间运行查询可能需要这些早期的回滚信息来生成早期的数据页镜像,数据库根据需求配置,保留指定时间的回滚信息。"
DM8 会自动根据系统中最长查询的运行时间调整回滚信息的保存周期。
6.3 多版本并发控制 (MVCC)
DM8 通过回滚段实现多版本并发控制:
-
物理记录中包含事务标识
-
通过可见性原则判断某个版本对当前事务是否可见
-
读操作不阻塞写操作,写操作不阻塞读操作
6.4 闪回查询
DM8 支持闪回技术(FLASHBACK),依赖 UNDO 数据的保留时间(UNDO_RETENTION 参数)。
七、总结
DM8 的体系架构核心脉络:
实例 (Instance) = 内存结构 + 线程结构
│
│ 内存结构: 数据缓冲区 / 日志缓冲区 / 字典缓冲区 / SQL缓冲区 / 排序区 / 哈希区
│ 线程结构: 监听 / 工作 / IO / 调度 / 日志FLUSH / 归档 / MAL / APPLY ...
│
▼ 读写交互
│
数据库 (Database) = 磁盘文件集合
│
├── 逻辑结构: 表空间 → 段 → 簇 → 页 → 记录
└── 物理文件: *.dbf / *.log / dm.ctl / dm.ini / 归档日志 / 备份文件
关键要点:
-
数据库是物理的,实例是逻辑的,例如DMDSC 集群,N 个实例可对应 1 个数据库
-
逻辑存储通过 表空间→段→簇→页 的层次管理物理空间
-
数据缓冲区是性能核心,推荐配置为可用物理内存 60%~80%
-
单进程多线程模型,各线程分工明确、高效协作
-
理解状态 (OPEN/MOUNT/SUSPEND)和模式(NORMAL/PRIMARY/STANDBY)的使用场景
本文基于 DM8 版本编写,内容参考《DM8 系统管理员手册》。