达梦数据库dm.ini配置详解:从核心参数到调优实战
2026/9/18 12:17:38 网站建设 项目流程

最近在折腾达梦数据库的国产化适配,踩了一堆配置的坑之后,发现真正让人头疼的不是SQL语法差异,反而是最基础的dm.ini配置文件。这个文件相当于Oracle的spfile、MySQL的my.cnf,是整个达梦数据库实例的“总开关”,但网上讲它的资料总是零零散散,官方文档又把参数解释得让人看不懂。这篇文章就把我这段时间摸索和实践过的内容整理一遍,从“dm.ini到底是什么”开始,到关键参数怎么理解、怎么改、出了问题怎么排查,一次说清楚。不管你是刚装好达梦准备调参的DBA,还是正在做应用适配的开发,都值得花十分钟看完。

1. 一张图看懂dm.ini在达梦体系中的位置

1.1 它是达梦实例的“启动说明书”

我们平时说的达梦数据库,其实指的是一个数据库实例,而dm.ini就是实例启动时最早读取的配置文件。达梦数据库安装完成之后,会在安装目录下生成数据目录,比如默认的DAMENG,dm.ini就放在这个数据目录里面,和SYSTEM.DBF、MAIN.DBF这些数据文件放在一起。

这个文件的作用可以类比成家里的总电闸说明:端口的开启、内存怎么分配、日志怎么刷盘、会话数量上限、字符集规则,全部由它决定。实例一启动,后台进程dmserver就会读取dm.ini,根据里面的参数初始化整个运行环境。你在这个文件里写的每一个参数,都会直接影响数据库实例的性能、连接方式甚至稳定性。

实际操作中,我见过不少新手朋友把dm.ini和客户端的连接配置弄混。需要特别强调的是:dm.ini是数据库服务端的实例配置,而简单来说,客户端用什么工具去连(比如navicat连接达梦数据库、应用里配置的JDBC URL),那是另外一套东西。前者管的是“数据库本身怎么跑”,后者管的是“别人怎么找到你”。

1.2 参数类型其实分三类

打开dm.ini之后,你会看到大段大段的“参数名 = 值”结构,注释行以井号开头。一开始看会觉得乱,但如果按参数的生效方式分类,整个逻辑就很清晰了。

达梦的参数通常分成三种类型:静态参数、动态系统参数、动态会话参数。静态参数的意思就是改完之后必须重启实例才能生效,比如实例名、端口、数据缓冲区大小这类底层核心配置;动态系统参数可以在数据库运行状态下直接修改,不需要重启,适用于系统级调整;动态会话参数则只对当前会话生效,一般用于临时调试。

判断一个参数具体属于哪一类,不要靠猜,直接用V$PARAMETER视图去查最稳。视图里会标注每个参数的类型、当前会话值、系统值以及配置文件里的值。这一点很重要,后面排查“为什么改了不生效”的时候,多半就是栽在参数类型判断上。

1.3 三个最常用的查看姿势

想熟练管理dm.ini,先掌握三个命令。

第一个是直接看文件内容,适合快速浏览,比如在服务器的命令行里用grep过滤关键参数。第二个是登录到disql工具里执行SQL,这是最推荐的方式,可以同时看到参数的运行值和配置值,做对比很方便。第三个是使用达梦提供的系统函数,适合在脚本里批量采集参数值。

举几个最常用的写法:

# 在服务器上直接过滤dm.ini里的关键参数 grep -E "^(PORT_NUM|BUFFER|MAX_SESSIONS)" /dm8/data/DAMENG/dm.ini
-- 查看实例所有参数,重点是VALUE、SYS_VALUE、FILE_VALUE三列 SELECT NAME, TYPE, VALUE, SYS_VALUE, FILE_VALUE FROM V$PARAMETER WHERE NAME IN ('PORT_NUM','BUFFER','MAX_SESSIONS');
-- 使用系统函数直接获取参数值 SELECT SF_GET_PARA_VALUE(2, 'PORT_NUM');

这三招配合起来,基本覆盖了日常90%的查看需求。V$PARAMETER里的VALUE是当前会话实际生效值,SYS_VALUE是系统级实际值,FILE_VALUE是配置文件里的值,三段一对比,就能看出当前运行状态和配置文件是否一致,排查问题非常直观。

2. 高频参数解剖:这些配置项到底该怎么调

2.1 实例识别与连接入口

先讲几个所有场景都用得上的基础参数。

INSTANCE_NAME是实例名,相当于数据库实例的名字。规划环境时最好统一命名规范,因为后面做数据守护、集群部署的时候,实例名是识别成员的依据之一。PORT_NUM是实例对外提供服务的TCP端口,默认是5236,这个参数在安装初始化时就会被写进dm.ini。很多人装完数据库之后发现navicat连接达梦数据库连不上,第一反应是找网络问题,结果最后发现是端口被改了或者防火墙没放通5236。

MAX_SESSIONS控制最大会话数,默认值因版本和平台略有差异。连接数告满的时候,数据库会拒绝新的连接,最直接的影响就是业务报“无法建立连接”。这个参数调大之前一定要结合系统的进程数限制来评估,不是说设成多少就一定能支撑多少并发。

我在实际调优时还有一个习惯:把LISTEN_PORT相关、数据库实例名、字符集、大小写敏感这些“元信息”类的参数单独记一份文档。因为这些参数不仅影响运行,还影响迁移和备份恢复,一旦不一致,后患无穷。

2.2 内存缓冲调优:先理解命中率

达梦的内存体系里,和性能关系最密切的是BUFFER(数据缓冲区)、SORT_BUF_SIZE(排序缓冲区)、DICT_BUF_SIZE(字典缓冲区)、HJ_BUF_SIZE(哈希连接缓冲区),以及全局的CACHE_POOL_SIZE(缓存池大小)。

BUFFER是达梦数据页的缓存区,相当于Oracle的DB_CACHE_SIZE。读请求会先去BUFFER里找数据页,找到了就是命中,找不到就得去磁盘读。命中率直接决定数据库的IO压力,所以调BUFFER之前建议先观察命中率:

SELECT name, total_gets, total_misses, (1 - total_misses / NULLIF(total_gets, 0)) AS hit_ratio FROM v$bufferpool;

如果命中率长期低于90%甚至85%,说明BUFFER偏小,业务在频繁读磁盘;如果已经超过99%,加BUFFER的收益就很有限了,不要盲目堆内存。

SORT_BUF_SIZE影响的是排序操作。业务中经常跑大排序、分组统计、创建索引这类操作时,这个值如果太小,排序就会落盘,性能断崖式下降。经验上,复杂报表场景建议至少给到16MB以上。

调内存参数的思路不是每个参数独立放大,而是要做整体预算。假设一台机器物理内存64GB,操作系统留20%,剩余可用约50GB。这时BUFFER给20GB,CACHE_POOL_SIZE给8GB,LOG_BUF_SIZE给1GB,SORT_BUF_SIZE给32MB(限制并发排序数),HJ_BUF_SIZE给16MB,DICT_BUF_SIZE给128MB,整体控制在30GB以内,留出足够余量应对突发连接和工具进程。这是我个人比较保守的算法,仅供参考,具体要看你的业务模型。

2.3 日志与检查点参数

日志参数里面,RLOG_APPEND_MODE和日志刷盘方式直接关系到数据安全与性能的取舍。RLOG_APPEND_MODE等于0时,每个提交事务都同步刷盘,安全性最高,但并发高时事务提交延迟会比较明显;等于1时会批量刷盘,性能更友好,但异常断电时丢失已提交事务的概率会增大。

这个参数没有绝对的对错,核心是业务侧能接受多长的恢复窗口。金融类事务建议保留刷盘模式,分析类报表库可以适当放宽,换性能。

CKPT_RLOG_SIZE和检查点触发机制相关,它表示联机日志文件达到多少MB时触发检查点。检查点本质是“把脏页写回磁盘+推进日志复用”的动作,触发太频繁会浪费IO,触发太迟又会拖长崩溃恢复时间。如果你发现数据库运行一段时间后日志目录异常增长,或者恢复时间明显变长,就要关注这一组参数了。

2.4 编码与字符集:容易被忽略的“兼容开关”

字符集相关的参数在dm.ini里包括CHARSET、LENGTH_IN_CHAR、CASE_SENSITIVE等。这些参数在初始化实例的时候就已经固化,后期修改非常麻烦,甚至需要重建库,所以安装阶段就要规划好。

CHARSET决定了数据库内部存储字符的编码方式,常见的取值有0(GB18030)、1(UTF-8)等。LENGTH_IN_CHAR表示定义列长度时按字符计算还是按字节计算,如果设置为1,VARCHAR(100)就代表100个字符,而不是100个字节,这对从Oracle迁过来的业务特别重要。

实际做数据迁移时,我吃过一次亏:源库是其他数据库,导出的文件编码和目标库字符集不一致,导入时出现中文乱码。这种问题跟dm.ini里的字符集参数直接相关。导出导入时必须确认源库编码、文件编码、目标库CHARSET三者对齐。如果只是临时导数据,可以留意工具端的编码参数;但如果库本身的CHARSET设置错了,恐怕只能重建数据库实例。

3. 修改参数的正确姿势:文件、命令、动态调整选哪个

3.1 直接改文件的标准流程和备份习惯

最直接的改法是用vim等编辑器打开dm.ini,改掉目标参数后保存,再重启数据库实例。这种方式适合静态参数和初始化固化参数,也是很多运维同学的“肌肉记忆”。

但这里有一个很容易忽略的坑:dm.ini文件里有大量注释说明,参数名大小写有统一规范,冒号还是等号,逗号还是空格,格式写错一点,实例都可能起不来。所以直接改文件,我强烈建议遵循以下流程:

第一步,先备份当前配置文件,备份命令非常简单:

cp /dm8/data/DAMENG/dm.ini /dm8/data/DAMENG/dm.ini.bak_$(date +%Y%m%d%H%M)

第二步,用grep定位到要改的参数,看清当前值,再决定改成多少。

第三步,修改后先不要直接重启,用数据库日志检查语法配置是否正确。

第四步,重启实例,重启后立刻执行V$PARAMETER查询,确认参数已加载,并观察相关日志有无报错。

这套流程听起来繁琐,但能避免绝大多数“手滑改错文件”的悲剧。尤其是生产环境,备份这一步绝对不能省。

3.2 动态调整:SP_SET_PARA_VALUE和ALTER SYSTEM

很多参数其实不需要重启,达梦提供了系统存储过程支持动态修改,而且可以把值同步写回配置文件。

最常用的是SP_SET_PARA_VALUE和SP_SET_PARA_VALUE_EX。其中scope参数1是只修改内存中的值,2是修改内存并写回dm.ini。如果希望重启之后依然生效,一定要用scope=2。对于静态参数,用SP_SET_PARA_VALUE_EX可以写入配置文件,但依然需要重启才能真正生效。

具体用法如下:

-- 修改动态参数并写回dm.ini,立即生效 CALL SP_SET_PARA_VALUE(2, 'BUFFER', 2048); -- 修改静态参数,写入dm.ini,但需要重启 CALL SP_SET_PARA_VALUE_EX(2, 'MAX_SESSIONS', 200);

达梦也支持类似Oracle的ALTER SYSTEM语法:

ALTER SYSTEM SET 'BUFFER' = 2048 BOTH;

这里BOTH的含义是同时修改内存值并写回配置文件。如果只想在本次运行生效,用SYSTEM关键字;只想让当前会话生效,用SESSION关键字。实际管理时我建议统一用BOTH,因为“改完内存生效但文件没改”的状态很容易在后续重启时凭空消失,排查起来很费劲。

动态调整虽然方便,但同样要克制。修改之前最好把原值记录下来,尤其是在调内存类参数时,一次不要跨幅度太大,比如BUFFER从256MB直接跳到2GB,很可能在扩大分配时就把内存撑爆了。稳妥的做法是每次增加50%以内,观察稳定后再继续。

3.3 配置文件的边界感:dm.ini不是应用配置的替代品

在调达梦的过程中,我发现一个很普遍的认知混淆:不少人会把dm.ini和应用层的配置文件混在一起处理。比如看到“nacos适配达梦数据库”“logback.xml配置文件”“maven配置文件”这些词,就以为问题出在数据库配置上,其实完全是两层东西。

达梦相关的配置体系可以分成三个层面,它们各管一摊:

层面典型文件/配置作用范围
数据库实例配置dm.ini决定实例运行行为,位于服务端数据目录
客户端访问配置dm_svc.conf配置服务名、负载均衡、连接超时等,位于客户端
应用数据源配置application.properties、nacos配置、logback.xml等应用如何连接数据库、打印日志,位于应用侧

比如业务方反馈“用nacos适配达梦数据库连接不上”,排查路径是先看应用数据源里的JDBC URL是否指向正确的IP、端口、实例名,再看dm_svc.conf里的服务名映射,最后才轮得到看dm.ini的PORT_NUM和MAX_SESSIONS。直接一头扎进dm.ini里面改参数,方向就错了。

同样,在Linux部署达梦时,操作系统层面的配置也要单独管理。比如防火墙是否有放通TCP端口、系统的进程数限制这些,属于系统配置文件的管理范畴,出了问题不会写在dm.ini里,DBA要养成先分层定位的习惯。

4. 高频问题排查记录:实例起不来、不生效、编码错乱

4.1 实例起不来的自救顺序

先分享一个最让人“慌”的场景:改完dm.ini重启数据库,结果实例起不来了。

这时候不要急着反复重启,盲目重启只会让故障更混乱。我的排查顺序是固定的:先看日志,再看内存,最后回看配置。

达梦实例在启动时如果发现配置错误,通常会把具体原因写到运行日志里,日志一般位于数据目录的log子目录,文件名类似dm_DMSERVER_日期.log。打开日志文件,搜索ERROR或FATAL关键词,往往能直接定位到哪个参数不合法。

如果是内存相关参数改坏了,比如BUFFER给到超过物理内存,启动阶段分配失败,日志里会明确提示内存分配失败。解决办法很简单:用之前备份的dm.ini恢复正常启动,把参数改成合理值后再启动。

如果怀疑是端口被占用导致的启动失败,在Linux上可以用netstat或ss命令确认端口状态。比如之前遇到过5236端口被其他程序占用,dmserver启动时就一直报监听失败,用netstat -tlnp查一下立刻就暴露了。

整个过程中,一个完善的备份习惯能救命。这也是为什么我在前面反复强调,改dm.ini前一定要备份。有了备份,启不来就恢复,恢复完再调整,几乎没有风险。

4.2 参数没生效?先检查这三点

改完参数重新查询,发现值还是老的,这种情况也经常发生。我总结下来,大部分“没生效”都逃不过这三个原因。

第一,改的是静态参数,没重启。比如PORT_NUM、INSTANCE_NAME这类参数,即使通过系统函数写回配置文件,也必须在重启后才能加载。判断方法是看V$PARAMETER里FILE_VALUE和SYS_VALUE是否已经更新,如果FILE_VALUE变了但SYS_VALUE没变,说明文件已改,但运行值还是旧的。

第二,改的是会话级参数,影响范围比预期小。动态会话参数只对当前会话生效,换个新的连接查询又回到系统默认值。如果希望全局统一,必须用scope=2的写法或ALTER SYSTEM BOTH。

第三,参数名称或值判断错误。这种情况往往发生在多实例环境,修改时指向了错误的实例数据目录。一台服务器上安装了多个达梦实例时,一定要确认你改的dm.ini和正在运行的dmserver是否是同一个。可以用grep实例名和端口版本来交叉验证。

顺带说一句,如果多人协作管理服务器,我建议养成“配置变更留痕”的习惯,在每次修改dm.ini之前都写入一个变更注释,这样后面的人看到文件内容就能知道改动了什么、为什么改。

4.3 三个实际现场案例

案例一:navicat连接达梦数据库报“网络通信异常”。排查了半天网络,最后发现是实例初始化时把PORT_NUM改成了5237,应用配置还按5236在连。这类问题在dm.ini里一眼就能看出来,修改端口后相关系统的连接串要及时同步更新。

案例二:运行库很慢,查V$BUFFERPOOL发现命中率只有78%,BUFFER明显偏小。原本是64MB,先调到128MB,观察一天后命中率到93%;又过两天调到256MB,命中率稳定在97%以上。这一步一步加的过程特别重要,一次调太猛反而容易引发内存换页。

案例三:数据迁移中文乱码。从其他数据库导出文件时源库编码是GBK,导入目标库时目标实例的CHARSET是UTF-8,两边不一致导致乱码。最后统一了文件编码重新导入才解决。这里要提醒的是,字符集相关参数在实例初始化后很难平滑改变,规划库的时候就要定好标准。

再补充一个涉及“达梦数据库dw和dsc区别”的进阶提醒:如果你搭建了数据守护(DW)或共享存储集群(DSC),每个节点的实例都有自己独立的dm.ini。DW主备环境的dm.ini建议保持核心参数一致,否则主备切换后性能表现会突然变化;DSC环境下改共享参数时,更要注意所有节点的配置对齐,逐节点验证,不能只改一台。

最后说几句我个人实际体会。管理dm.ini这些年,最深的感受是:它不像某些数据库的参数那么“弹性”,很多关键参数在初始化时一旦定下,后续改动成本极高。所以新装数据库时,宁可在初始化前多花半小时规划好端口、字符集、大小写敏感、数据目录这些“命根子”参数,也别等业务跑起来之后再想着迁移调整。改配置之前先备份,调优之前先看指标,排查问题先看日志,这三个习惯看着简单,但真能在关键时刻省下你一整天的折腾时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询