引言
DM(达梦)数据库作为国产数据库的标杆产品,其物理存储结构的设计直接决定了数据存储的安全性、可靠性和访问性能。物理存储结构是数据库底层数据组织的核心载体,包含配置文件、控制文件、数据文件、日志文件等多个关键组件,各组件协同工作,实现数据的持久化存储、事务一致性保障和故障恢复能力。深入理解DM数据库的物理存储结构,对于数据库管理员进行系统配置优化、故障排查和性能调优具有重要意义。
一、DM物理存储结构整体架构
DM数据库的物理存储结构采用分层设计理念,从功能上可划分为配置层、核心数据层、日志层和辅助文件层四大模块,各模块通过标准化的交互机制实现数据的有序管理。
- 配置层:以INI格式配置文件为核心,负责定义数据库启动参数、功能开关和性能阈值,是数据库运行的"参数蓝图"。
- 核心数据层:包含控制文件和数据文件,控制文件作为"元数据中枢"记录数据库基础信息,数据文件作为"数据容器"存储用户实际数据。
- 日志层:由重做日志文件、归档日志文件和物理逻辑日志文件组成,是保障事务ACID特性和故障恢复的关键。
- 辅助文件层:涵盖备份文件、SQL日志文件和事件日志文件,为数据备份恢复、问题诊断提供支持。
这种分层架构的设计理论基于"职责分离"原则,确保各组件既独立发挥功能,又通过标准化接口协同工作,提升了系统的可维护性和扩展性。
二、关键物理存储组件理论与实践
(一)配置文件:数据库的"运行参数中枢"
配置文件是DM数据库启动和运行的基础,以INI为扩展名,通过参数化配置实现功能启用/禁用和性能优化,核心设计理论是"动态适配"和"分层生效"。
1. 核心配置文件分类及作用
- dm.ini:数据库核心配置文件,包含控制文件路径、实例名、内存分配、线程管理等关键参数,是数据库启动的必要条件。其设计遵循"最小依赖"原则,仅包含启动必需的核心参数,其他扩展功能通过专项配置文件实现。
- 专项配置文件:dmmal.ini(MAL系统配置)、dmarch.ini(归档配置)、dm_svc.conf(客户端配置)等,采用"功能模块化"设计,便于针对特定功能进行独立配置和维护。
2. 配置参数的核心理论特性
- 参数属性分类:手动参数(需修改文件并重启生效)、静态参数(动态修改后需重启)、动态参数(即时生效,分会话级和系统级),该分类基于"配置生效时效"理论,平衡了系统稳定性和灵活性。
- 参数合法性校验机制:当参数设置为非法值时,系统会自动进行修正(如超出范围时取边界值)或报错,体现了"容错性设计"思想,避免非法配置导致系统异常。
3. 关键参数设计原理
- 内存相关参数(如MEMORY_POOL、BUFFER):基于"内存分层分配"理论,将内存划分为共享内存池、缓冲区等区域,按功能需求分配资源,避免内存竞争。
- 线程相关参数(如WORKER_THREADS、TASK_THREADS):遵循"并发控制"理论,通过控制线程数量平衡并发处理能力和系统资源消耗。
(二)控制文件:数据库的"元数据中枢"
控制文件(dm.ctl)是二进制文件,记录数据库的核心元数据,其设计理论核心是"数据一致性保障"和"故障可恢复性"。
1. 核心功能与理论依据
- 记录表空间信息、数据文件路径、数据库版本等关键元数据,作为数据库启动时的"校验依据",确保系统加载的文件完整性。
- 内置校验码机制,每次修改后自动计算校验码,防止文件损坏或手工篡改,体现了"数据完整性校验"理论。
2. 备份策略设计
控制文件采用双重备份策略,确保故障时可恢复:
- 策略一:修改前自动备份,修改成功后删除备份,失败则保留备份,基于"写前备份"理论,避免修改过程中故障导致文件损坏。
- 策略二:修改成功后按配置自动备份,遵循"定期备份+版本控制"思想,通过CTL_BAK_NUM限制备份文件数量,自动清理老备份。
(三)数据文件:用户数据的"存储容器"
数据文件(扩展名为dbf)是存储用户实际数据的核心文件,其设计遵循"存储效率最大化"和"访问性能优化"理论。
1. 数据文件的核心特性
- 自动扩展能力:支持通过MAXSIZE参数限制扩展上限,平衡了存储灵活性和空间可控性,避免磁盘空间耗尽。
- 多粒度管理:采用"页-簇-段"三级管理模式,页作为最小I/O单位,簇作为空间分配单位,段作为对象存储单位,基于"分层存储管理"理论,优化空间分配和访问效率。
2. 数据组织形式及理论基础
- B树数据:适用于普通表和B树索引,基于B树平衡查找理论,保证数据访问的时间复杂度为O(log n),是应用最广泛的存储形式。
- 堆表数据:采用链表存储,支持高并发插入,基于"无序存储"理论,牺牲部分查询性能换取插入效率,适用于高频插入场景。
- 列存储数据:按列组织数据,基于"列级访问局部性"理论,在OLAP场景中大幅提升聚合查询性能。
- 特殊数据文件:ROLL文件(存储回滚记录,保障事务回滚)、TEMP文件(存储临时结果集,优化查询性能),体现了"专项数据分离存储"思想。
(四)日志文件:事务一致性与故障恢复的"保障核心"
日志文件是DM数据库保障事务ACID特性的关键,其设计基于"Write-Ahead Logging(WAL)"理论,即日志先写磁盘,数据后写磁盘。
1. 重做日志文件(REDO日志)
- 核心功能:记录所有数据修改操作,采用循环写入机制,确保事务的持久性。其设计遵循"最小日志原则",仅记录数据修改的必要信息,减少日志量。
- 故障恢复原理:数据库重启时,通过重做日志重演未刷盘的事务,恢复到故障前状态,体现了"事务可重演"理论。
2. 归档日志文件
- 模式切换机制:非归档模式下仅使用联机日志,归档模式下同时写入归档日志,基于"日志冗余存储"理论,提升数据安全性。
- 恢复能力扩展:通过归档日志可实现"时间点恢复",将数据库还原到任意指定时间点,解决了联机日志循环覆盖导致的恢复限制。
3. 物理逻辑日志文件
- 设计目的:专门用于日志挖掘,记录服务器逻辑操作,基于"操作轨迹追溯"理论,支持通过DBMS_LOGMNR包分析历史执行语句。
(五)辅助文件:系统运维与故障诊断的"支撑体系"
辅助文件包括备份文件、SQL日志文件和事件日志文件,其设计围绕"运维便捷性"和"问题可追溯性"理论。
- 备份文件:以bak为扩展名,包含完整的数据库或增量数据,基于"数据冗余备份"理论,是灾难恢复的最后保障。
- SQL日志文件:记录用户执行的SQL语句及执行信息,基于"操作轨迹记录"理论,用于性能分析和故障排查。
- 事件日志文件:记录系统关键事件(启动、关闭、错误等),采用分级日志(INFO/WARNING/ERROR/FATAL)设计,基于"问题分级诊断"理论,便于管理员快速定位严重问题。
三、DM物理存储结构的设计原则与优化方向
(一)核心设计原则
- 一致性原则:通过控制文件校验、日志WAL机制等保障数据一致性。
- 可恢复性原则:多重日志和备份机制确保故障后可恢复。
- 模块化原则:功能组件独立封装,便于配置和维护。
- 性能优化原则:内存分层分配、数据组织优化等提升访问效率。
(二)优化方向
- 配置参数优化:根据硬件资源和业务场景调整内存、线程参数,平衡性能和资源消耗。
- 存储布局优化:合理规划数据文件和日志文件的存储路径,避免I/O竞争。
- 日志策略优化:归档模式下调整归档频率和日志保留时间,兼顾安全性和存储成本。
- 备份策略优化:结合全量备份和增量备份,制定合理的备份周期,提升恢复效率。
四、DM物理存储结构核心参数配置指南
核心配置文件(dm.ini)关键参数
1. 控制文件相关(不建议手动修改)
| 参数名 | 缺省值 | 属性 | 取值范围 | 核心说明 | 配置建议 |
|---|---|---|---|---|---|
| CTL_PATH | 安装时指定 | 手动 | - | 控制文件路径 | 保持安装默认值,避免修改导致文件找不到 |
| CTL_BAK_NUM | 10 | 手动 | 1~100 | 控制文件备份个数限制,超出自动删除最早备份 | 建议设为20,增强故障恢复冗余 |
| SYSTEM_PATH | 安装时指定 | 手动 | - | 系统库目录 | 与安装路径保持一致,不随意变更 |
| BAK_PATH | 安装时指定 | 手动 | - | 备份文件存放路径 | 建议单独配置独立磁盘分区,避免占用系统空间 |
2. 内存相关(性能核心配置)
| 参数名 | 缺省值 | 属性 | 取值范围 | 核心说明 | 配置建议 |
|---|---|---|---|---|---|
| MEMORY_POOL | 500MB | 静态 | 32位:642000MB;64位:6467108864MB | 共享内存池大小 | 64位服务器建议设为物理内存的10%~15% |
| BUFFER | 8000MB | 静态 | 8~1048576MB | 系统缓冲区大小 | 推荐为可用物理内存的60%~80%,提升数据缓存效率 |
| SORT_BUF_SIZE | 20MB | 动态(会话级) | 1~2048MB | 原排序机制下排序缓存区最大值 | 复杂排序场景设为100~500MB |
| SORT_BUF_GLOBAL_SIZE | 1000MB | 动态(系统级) | 10~4294967294MB | 新排序机制下全局内存上限 | 需大于SORT_BUF_SIZE,建议设为500~2000MB |
| HUGEPAGE_THRESHOLD | 16 | 动态(系统级) | 0~1024 | Linux下巨页内存申请阈值(单位:2MB) | 内存大于32GB时设为32,启用巨页优化 |
3. 线程相关(并发控制)
| 参数名 | 缺省值 | 属性 | 取值范围 | 核心说明 | 配置建议 |
|---|---|---|---|---|---|
| WORKER_THREADS | 16 | 静态 | 1~64 | 并发处理会话连接的线程数 | 按CPU核心数的12倍配置,8核CPU设为1632 |
| TASK_THREADS | 16 | 静态 | 非DMDSC:11000;DMDSC:161000 | 任务线程个数 | 复杂查询场景设为32~64,提升并行处理能力 |
| STHD_FLAG | 0 | 静态 | 0~3 | 线程池启用开关 | 高并发场景设为2(开启SESS线程池) |
| SPIN_TIME | 4000 | 静态 | 0~400000 | 线程自旋次数 | 多核心服务器设为8000,减少线程切换开销 |
4. 日志相关(数据安全核心)
| 参数名 | 缺省值 | 属性 | 取值范围 | 核心说明 | 配置建议 |
|---|---|---|---|---|---|
| RLOG_BUF_SIZE | 1024 | 静态 | 1~20480 | 单个日志缓冲区大小(日志页数) | 高并发写入场景设为4096,减少日志刷盘次数 |
| RLOG_POOL_SIZE | 256MB | 静态 | 1~4096MB | 最大日志缓冲区大小 | 建议设为512~1024MB,提升日志缓存能力 |
| CKPT_INTERVAL | 180秒 | 动态(系统级) | 0~2147483647秒 | 检查点时间间隔 | 核心业务设为60~90秒,平衡性能与恢复速度 |
| CKPT_DIRTY_PAGES | 0 | 动态(系统级) | 0~4294967294页 | 脏页达到阈值触发检查点 | 设为BUFFER总页数的20%,避免集中刷盘IO峰值 |
5. 事务相关(一致性保障)
| 参数名 | 缺省值 | 属性 | 取值范围 | 核心说明 | 配置建议 |
|---|---|---|---|---|---|
| ISOLATION_LEVEL | 1 | 静态 | 1(读提交)、3(可串行化) | 系统默认隔离级别 | OLTP场景用1(读提交),OLAP场景按需设为3 |
| UNDO_RETENTION | 90秒 | 动态(系统级) | 0~86400秒 | 事务提交后回滚页保留时间 | 需闪回查询场景设为3600秒(1小时) |
| MAX_CONCURRENT_TRX | 0 | 动态(系统级) | 0~1500 | 最大并发事务数限制 | 高并发场景设为800~1200,避免事务拥堵 |
其他关键配置文件核心参数
1. MAL系统配置(dmmal.ini)
| 参数名 | 缺省值 | 核心说明 | 配置建议 |
|---|---|---|---|
| MAL_CHECK_INTERVAL | 30秒 | MAL链路检测时间间隔 | 集群环境设为10秒,快速发现链路故障 |
| MAL_CONN_FAIL_INTERVAL | 10秒 | 链路断开判定时间 | 设为30秒,避免网络抖动误判 |
| MAL_BUF_SIZE | 100MB | 单个MAL缓存大小限制 | 跨节点通信频繁场景设为500MB |
| MAL_INST_NAME | - | 实例名(集群中唯一) | 按“实例名+节点IP”命名,便于识别 |
| MAL_PORT | - | MAL监听端口 | 配置未占用端口(如5336),与PORT_NUM区分 |
2. 归档配置(dmarch.ini)
| 参数名 | 缺省值 | 核心说明 | 配置建议 |
|---|---|---|---|
| ARCH_TYPE | - | 归档类型(LOCAL/REALTIME/ASYNC等) | 核心业务配置REALTIME(实时归档)+LOCAL(本地归档) |
| ARCH_DEST | - | 归档目标路径/实例名 | 本地归档路径单独配置,实时归档指向备库实例 |
| ARCH_FILE_SIZE | 1024MB | 单个归档文件大小 | 设为512~2048MB,平衡文件数量与恢复效率 |
| ARCH_SPACE_LIMIT | 0 | 归档空间限制(0为无限制) | 设为磁盘空间的80%,避免归档占满磁盘 |
3. 客户端配置(dm_svc.conf)
| 参数名 | 缺省值 | 核心说明 | 配置建议 |
|---|---|---|---|
| EP_SELECTOR | 0 | 连接节点选择策略 | 集群环境设为0,实现负载均衡 |
| AUTO_RECONNECT | 0 | 连接异常处理策略 | 设为3(1+2),支持故障自动切换+节点恢复切换 |
| CONNECT_TIMEOUT | 5000毫秒 | 连接超时时间 | 跨网络连接设为10000毫秒,避免频繁超时 |
| RW_SEPARATE | 0 | 读写分离开关 | 主备集群设为1,启用读写分离提升性能 |