☰
达梦数据库命令行建库全攻略:dminit参数详解与避坑指南
2026/10/12 2:10:33 网站建设 项目流程

简介:在无图形界面的服务器或自动化部署场景中,达梦数据库的实例创建常依赖命令行工具完成。这份资料围绕 $DM_HOME/bin 下的 dminit 工具展开,面向需要远程部署或脚本化运维的数据库管理员与实施工程师,重点演示了从实例参数配置、数据库初始化到服务注册的完整流程。内容包含交互式配置中各关键参数(系统目录、端口、页大小、字符集、加密选项等)的逐一说明,以及通过 dm_service_installer.sh 注册 DmService 服务并启动实例的操作指引,可帮助读者避开默认参数带来的隐患。资源为 PDF 格式,共 1 个文件,压缩包大小约 44KB,便于快速查阅。目前已有 6867 人学习,是国产数据库命令行部署场景中简洁实用的参考材料。

1. 纯命令行创建达梦数据库实例:从 dminit 到 disql 的一站式路径

在没有图形界面的 Linux 服务器上,用纯命令行创建达梦数据库实例并完成初始化,是从安装包到可用库之间最常被忽略的一步。网上达梦数据库使用教程大多讲图形化配置助手,但真实交付场景里,远程服务器、批量环境、自动化编排都要求你在 shell 命令行里一次跑通。这正是 dminit 和 disql 要解决的问题:前者负责把实例骨架和数据文件落盘,后者登录实例完成业务侧的初始化。这套流程适合刚装完达梦、对着 bin 目录不知道下一步怎么走的新手,也适合要把建库动作固化到脚本里的交付工程师。命令行建库和图形化最大的区别是顺序:图形化允许你边点边想,命令行逼着你先把参数想清楚再一次性落盘。

2. dminit 建实例前必须定好的 5 个参数:页大小、字符集与大小写敏感

达梦的 dminit 工具是一次性初始化工具,执行完实例目录生成后,有几个参数就再也改不了了。我见过太多人装完 Linux 中的达梦数据库,急着跑命令建库,结果上线前发现字符集不对、大小写行为不对,只能重建实例重新导数据。所以先把参数讲透,再进入命令。

2.1 页大小 PAGE_SIZE:为什么 8K 能覆盖大多数业务

页大小是数据库存储的最小单位,直接影响单行最大长度、B 树层数和空间利用率。dminit 支持 4K、8K、16K、32K,默认 8K。页越大,单页能装的行越多,理论上扫描大表时 I/O 次数更少;但页越大,小事务读写时缓冲池浪费也越明显,并发小字段更新场景反而吃亏。

我一般建议 OLTP 系统保持 8K 默认值,字段都是几十字节的订单、用户、日志表,8K 页足够。数据仓库或分析型场景,单行字段多、长度大,可以上 16K。32K 不推荐轻易用,它对行长度放宽是以缓冲池利用率为代价的,而且后续很多参数都要跟着页大小重新配。

这里的关键坑是:PAGE_SIZE 在建库后不可修改,连 ALTER 都不行,只能重建。所以如果你预计未来要上大字段、宽表,宁可现在就选 16K,也别等生产数据灌进去之后再后悔。

2.2 字符集 CHARSET 和 LENGTH_IN_CHAR:中文乱码的第一道闸

dminit 的 CHARSET 参数决定数据库字符集:0 是 GB18030,1 是 UTF-8,2 是 EUC-KR。国内业务基本只在 0 和 1 之间选。如果整个技术栈、客户端工具、应用连接串都统一 UTF-8,选 1 最省心;如果周边系统全是 Windows 老客户端、GBK 编码的 Excel 导入,选 0 反而少一层转码。

比 CHARSET 更容易被忽略的是 LENGTH_IN_CHAR。这个参数决定 VARCHAR 的长度单位是按字节还是按字符:0 表示按字节,1 表示按字符。选了 UTF-8 字符集后,如果不把 LENGTH_IN_CHAR 设为 1,那么 VARCHAR(10) 实际只能存 3 个汉字,因为一个汉字在 UTF-8 下占 3 字节。很多从 Oracle、MySQL 迁过来的项目,表结构全是从旧库拷的,旧库按字符定义长度,到达梦这里直接截断报错。后续无论用 disql 还是 navicat 连接达梦,这类中文字段问题都会以乱码或超长形式暴露给你,而根子在初始化参数上。

2.3 大小写敏感 CASE_SENSITIVE:迁移后最不好改的后悔药

CASE_SENSITIVE 参数设 Y 时,未加引号的标识符统一转成大写存储和匹配;设 N 时,数据库不区分标识符大小写,表名、列名怎么写都能对上。

这个参数没有绝对的好坏,取决于你的应用习惯。从 Oracle 迁过来的业务,SQL 里习惯性大写,选 Y 与原有行为一致。从 MySQL 迁过来的业务,SQL 里大小写混写,选 N 能省掉一大堆引号问题。但注意:选了 Y 之后,如果你建表时用了小写表名且加了双引号,比如 CREATE TABLE "user",后续每次查这张表都必须带双引号大写匹配,非常痛苦。更麻烦的是,这个参数同样建库后不可改,连官方工具都没提供在线切换。所以建库前一定把应用的 SQL 风格问清楚,别等代码跑不起来再回头。

2.4 日志与扩展尺寸:LOG_SIZE 和 EXTENT_SIZE 的配合

LOG_SIZE 是单个 redo 日志文件的大小,单位 MB。它影响实例频繁写日志时的切换频率。日志太小,系统忙时几秒就切一次,影响写入性能;日志太大,崩溃恢复时读日志的时间变长。常规 OLTP 我给 2048,写多读少的批处理环境可以给 4096。这个参数创建后想调也有办法,但属于额外操作,不如一开始就给够。

EXTENT_SIZE 是簇大小,也就是空间分配的最小单位。它最好是 PAGE_SIZE 的整数倍,这样分配空间时不会产生碎片化的跨页簇。8K 页配 16K 簇是达梦的经典组合,2 个页一个簇;如果你选了 16K 页,EXTENT_SIZE 就要给 32K。表空间数据文件的大小增长,也是按 EXTENT_SIZE 这个粒度往上加的,太小会导致频繁扩展元数据。

2.5 命令行传参还是参数文件:两种方式怎么选

dminit 支持两种方式传参:一种是命令后直接跟 参数=值,适合参数少、临时建库;另一种是把参数写进文本文件,每行一个 参数=值,用 INI_PATH 指定后让 dminit 读取。参数多、要留档、批量交付时,我一般选参数文件,因为建库参数本身就是重要的运维资产,后续排查字符集、页大小问题都要回头看。

参数文件的内容长这样:

PATH=/dm/data INSTANCE_NAME=DMSERVER PAGE_SIZE=8 EXTENT_SIZE=16 LOG_SIZE=2048 CASE_SENSITIVE=Y CHARSET=1 LENGTH_IN_CHAR=1 PORT_NUM=5236 SYSDBA_PWD=Dm_123456

执行时用dminit INI_PATH=/dm/conf/init_dmserver.txt。注意 INI_PATH 必须给绝对路径,dminit 不会相对当前目录去找。这种方式的好处是参数跟着文件走,出问题看一眼文件就知道当初怎么建的,不用翻 shell 历史记录猜参数。

下面是这套参数速查表,建库前对着过一遍即可:

参数作用建议取值是否可改
PAGE_SIZE页大小,单位 KB8 或 16建后不可改
EXTENT_SIZE簇大小,单位 KBPAGE_SIZE 的整数倍建后不可改
LOG_SIZE单个 redo 日志大小,单位 MB2048 起可调但需重启
CASE_SENSITIVE标识符大小写敏感Y 或 N建后不可改
CHARSET数据库字符集1 代表 UTF-8建后不可改
LENGTH_IN_CHARVARCHAR 按字符还是按字节1 代表按字符建后不可改
PORT_NUM实例监听端口5236可改
SYSDBA_PWDSYSDBA 用户口令强密码可改但别用默认值

3. 用 dminit 创建实例:最小命令、日志解读与产物确认

参数想清楚之后,真正执行 dminit 反而很快。这一章给出最小可用命令、执行完怎么判断成功、以及实例目录里应该有什么。

3.1 最小可用命令:从 PATH 到 SYSDBA 密码一次跑通

假设达梦安装在 /opt/dmdbms,数据目录规划在 /dm/data,实例名 DMSERVER。先用安装用户登录,配置环境变量,再执行 dminit。如果你当前已经是 dmdba 用户,前两步可以跳过。

su - dmdba export DM_HOME=/opt/dmdbms export PATH="$DM_HOME/bin:$PATH" export LD_LIBRARY_PATH="$DM_HOME/bin:$LD_LIBRARY_PATH" dminit PATH=/dm/data \ INSTANCE_NAME=DMSERVER \ PAGE_SIZE=8 \ EXTENT_SIZE=16 \ LOG_SIZE=2048 \ CASE_SENSITIVE=Y \ CHARSET=1 \ LENGTH_IN_CHAR=1 \ PORT_NUM=5236 \ SYSDBA_PWD=Dm_123456

逐项说下这里的逻辑。PATH 是实例文件落盘目录,dminit 会在该目录下自动创建以实例名命名的子目录,所以 PATH 写 /dm/data,实际实例目录是 /dm/data/DMSERVER。INSTANCE_NAME 决定目录名、默认服务名和日志前缀,一旦定了后面服务注册都跟着它走。PAGE_SIZE、EXTENT_SIZE、LOG_SIZE 三个参数控制存储粒度,PAGE_SIZE=8 配合 EXTENT_SIZE=16 是经典组合,LOG_SIZE=2048 给 redo 日志留够切换间隔。

中间三个参数是第 2 章强调过的不可逆项:CASE_SENSITIVE=Y 保持标识符大写语义,CHARSET=1 选 UTF-8,LENGTH_IN_CHAR=1 让 VARCHAR(n) 按 n 个字符存,中文按 60 长度定义就能存下 60 个汉字而不是 20 个。PORT_NUM=5236 是达梦默认端口,如果被占用自己换。SYSDBA_PWD 一定别用默认的 SYSDBA,初始化一次性的机会,在这里把密码设复杂,省得后面还要改。

dminit 执行过程中会往终端回显初始化进度,跑完会显示实例目录、数据文件路径、SYSDBA 和 SYSAUDITOR 账号等关键信息。这些信息值得截图或复制到运维记录里,后面注册服务和排查都要用。

3.2 看日志确认初始化成功:返回码与 DM 日志位置

判断 dminit 成功最简单的方式是看返回码和实例目录。命令结束后执行echo $?,返回 0 表示正常退出。但更可靠的是看实例目录是否生成了完整的文件结构,因为 dminit 偶发中途报错返回非 0,也有可能进程被系统 kill 但没来得及清理目录。

如果失败,屏幕上通常会直接打印错误信息,常见的有目录已存在、端口被占用、磁盘空间不足这几类。除了屏幕输出,还可以去 $DM_HOME/log 目录下拉出建档日志,日志文件名一般包含实例名或创建时间,用tail -100看最后一段,错误原因基本都在最后几十行里。实例目录下如果有半截生成的临时文件,说明建到一半失败了,把整个目录改名备份后重新执行,不要原地重跑,避免残留文件干扰。

提示:dminit 执行完不会自动启动实例,它只是落盘,后续启动和服务注册是独立步骤。

3.3 实例目录里有什么:数据文件、日志与初次配置

建库完成后进实例目录看一眼,能直观确认初始化是否完整。用 ls 和 du 检查:

ls -l /dm/data/DMSERVER du -sh /dm/data/DMSERVER

目录里应该包含 dm.ini、dm.ctl 这类控制文件,以及 SYSTEM.DBF、ROLL.DBF、MAIN.DBF 等系统表空间数据文件,还有以实例名命名的 redo 日志文件。dm.ini 是实例的核心配置,后续调整内存、线程、审计参数都改它;dm.ctl 是控制文件,记录数据库结构信息,不要手工编辑。

du -sh 看到的目录大小和预期一致,说明数据文件落盘完整。初次初始化后目录通常只有几百 MB,如果只有几 KB,说明数据文件没写进去,建库失败。另外注意整个实例目录的属主必须是安装用户,如果看到属主是 root,说明你刚才用 root 执行了 dminit,后续 dmserver 用 dmdba 启动时会碰到权限拒绝,趁没启动赶紧 chown -R dmdba:dinstall /dm/data/DMSERVER 改回来。

4. 启动实例并初始化数据库内容:服务注册、disql 登录与脚本导入

dminit 生成的是实例骨架:数据文件、控制文件、系统表空间和内置管理员账号。但这离"能跑业务"还差两步:让实例作为服务稳定跑起来,以及把业务侧的表空间、用户、基础数据灌进去。这一章把两条线都走完。

4.1 把实例注册成服务:前台调试与后台服务的差别

刚建完实例,想快速验证参数是否正确,可以直接前台启动:

/opt/dmdbms/bin/dmserver /dm/data/DMSERVER/dm.ini

dmserver 把 dm.ini 作为参数,前台运行,日志实时打到终端。启动过程中能看到实例从 MOUNT 到 OPEN 的状态变化。验证完参数后按 Ctrl+C 退出,注意前台模式只是调试手段,终端一关实例就停。

生产环境要把实例注册成系统服务,用达梦自带的注册脚本。以 root 执行:

/opt/dmdbms/bin/dm_service_installer.sh \ -t dmserver \ -p DMSERVER \ -dm_ini /dm/data/DMSERVER/dm.ini systemctl enable DmServiceDMSERVER systemctl start DmServiceDMSERVER

-t 指定服务类型为 dmserver,-p 是服务名后缀,生成的系统服务叫 DmServiceDMSERVER,-dm_ini 指向刚生成的配置文件。加 enable 是为了机器重启后实例自动拉起,否则遇到断电重启你还得手动去 start 一次。部分没有 systemd 的环境,用service DmServiceDMSERVER start等效。

4.2 disql 首次登录:用 SYSDBA 确认实例状态

服务起来后,用 disql 登录验证实例状态。disql 是达梦自带的命令行客户端,路径在安装目录 bin 下:

/opt/dmdbms/bin/disql SYSDBA/Dm_123456@127.0.0.1:5236

进入 SQL 提示符后执行:

SELECT * FROM v$instance;

这条语句返回当前实例的基本信息,重点看 NAME 是不是 DMSERVER,状态列是不是 OPEN。如果状态是 MOUNT,说明实例只挂载了控制文件但数据库没有完全打开,执行ALTER DATABASE OPEN;即可。不同小版本 v$instance 的列名略有差异,用 select * 看全量字段最稳。

这里顺便验证端口连通性:如果 disql 报连接超时,先看实例是否起来了,再netstat -tlnp | grep 5236确认监听。注意 127.0.0.1 通不代表外部 IP 通,服务器防火墙要把 5236 放开,客户端才能连。

4.3 初始化业务数据:建用户、建表空间、导入基础数据

dminit 已经建好了系统表空间和 SYSDBA、SYSAUDITOR 等内置账号,这里说的初始化数据库,是指业务侧的初始化准备。我习惯把这些动作写成一个 init.sql,用 disql 执行,保证可重复。示例:

-- 建业务表空间,数据文件放在实例目录下 CREATE TABLESPACE APP_TS DATAFILE '/dm/data/DMSERVER/APP_TS.DBF' SIZE 128; -- 建业务账号,默认表空间指向 APP_TS CREATE USER app IDENTIFIED BY App_123456 DEFAULT TABLESPACE APP_TS; -- 开发环境方便调试先给 DBA,生产环境按最小权限收敛 GRANT DBA TO app; -- 初始化基础字典表 CREATE TABLE app.dict_area ( area_code VARCHAR(10) NOT NULL, area_name VARCHAR(60) NOT NULL ); INSERT INTO app.dict_area VALUES ('001', '北京'); INSERT INTO app.dict_area VALUES ('002', '上海'); COMMIT;

VARCHAR(60) 在 LENGTH_IN_CHAR=1 的实例里按 60 个字符算,中文地名怎么放都够;如果当初建库没开 LENGTH_IN_CHAR,60 按字节算,UTF-8 下只够 20 个汉字,这里就是隐患。表空间数据文件路径和 dminit 的 PATH 要保持一致,文件落在实例目录里,管理起来最清晰。

执行脚本有两种方式。一种是交互式进入 disql 后用 start 命令:

/opt/dmdbms/bin/disql SYSDBA/Dm_123456@127.0.0.1:5236
start /dm/scripts/init.sql

另一种是直接用 heredoc 方式非交互执行,适合写进自动化脚本:

/opt/dmdbms/bin/disql SYSDBA/Dm_123456@127.0.0.1:5236 <<EOF start /dm/scripts/init.sql exit EOF

start 后面要用绝对路径。如果 init.sql 里 insert 上万条,逐条执行会很慢,这时候就别硬用 disql 灌数据,改用达梦的 DTS 迁移工具做批量导入,disql 负责结构和小批量数据初始化就够了。执行完后可以用SELECT count(*) FROM app.dict_area;确认数据落库。

5. 避坑:命令行建实例最容易翻车的 5 个点

命令行建库的过程不算复杂,但翻车点集中在参数选择和运行环境上。下面五条是我实际踩过或帮别人排查过的典型问题,按"现象、原因、解决"展开。

5.1 大小写敏感建错,业务表查询时全部要加引号

现象:建库时 CASE_SENSITIVE=Y,业务表建好后,应用里执行 select 语句报"表或视图不存在",但数据字典里明明能看到表名;手动把 SQL 里的表名改成大写或加双引号后能查出来。

原因:CASE_SENSITIVE=Y 时,未加引号的标识符统一转成大写存储。如果建表 SQL 里写了小写表名且没加引号,实际落库的表名是大写;应用查询里写的是小写,匹配不上,自然报错。

解决:上线前发现,直接重建实例改成 CASE_SENSITIVE=N 成本最低,数据没灌多少时别犹豫。如果已经灌了大量数据,就只能统一代码规范:所有 SQL 里的表名、列名一律不带引号,按大写书写,或者全部小写,保持一种风格。达梦的迁移工具里有大小写映射选项,但那只管迁移过程,应用侧的行为改不了。

5.2 页大小与簇大小配合不当,实例起来后反复报日志错误

现象:dmserver 启动后,告警日志里频繁出现与页大小或簇大小相关的错误,创建表空间时提示"簇大小不是页大小的整数倍"。

原因:PAGE_SIZE 改了但 EXTENT_SIZE 没跟着改。比如页面选了 16K,EXTENT_SIZE 还是默认 16K,两者相等时簇跨页分配就会出现碎片和告警;部分版本在 dminit 时没有强校验,落盘后才暴露问题。

解决:EXTENT_SIZE 取 PAGE_SIZE 的整数倍,8K 页配 16K 簇,16K 页配 32K 簇。建库前把这两个参数写进参数文件,别只改一个。已经建错的实例,趁数据量小尽早重建,簇大小同样建后不可改。

5.3 dminit 最后一步卡住,多半是端口和主机名解析的问题

现象:dminit 执行后长时间停在某一行不回显,或者命令结束后实例启动不了,disql 连接超时。

原因:端口被其他进程占用,dminit 在绑定监听地址时阻塞;或者 /etc/hosts 里主机名解析异常,工具在探测网络时卡住。还有一例是磁盘配额满了,数据文件写一半停住。

解决:先netstat -tlnp | grep 5236看端口是否被占,被占就换 PORT_NUM;检查 /etc/hosts 和 hostname 配置,确保主机名能解析到本机 IP;df -h看数据目录所在分区剩余空间。如果卡住后 Ctrl+C 退出,记得检查实例目录里是否有半截文件,有就清掉再重跑。

5.4 用 root 建实例或漏配环境变量,工具起不来、文件权限全乱

现象:执行 dminit 报找不到动态库或命令不存在;建完库后实例目录属主是 root,换 dmdba 启动时提示权限拒绝。

原因:环境变量没配好,shell 找不到 bin 目录下的工具和依赖库;或者直接用 root 跑了 dminit,导致所有数据文件属主变成 root。

解决:创建实例和启动实例统一用安装用户,常见叫 dmdba。执行前先 export DM_HOME 和 LD_LIBRARY_PATH。如果已经用 root 建了库,在实例没启动的情况下chown -R dmdba:dinstall /dm/data/DMSERVER把属主改回来,再切到 dmdba 启动。这个操作趁没人用时做,别在数据库运行中动文件属主。

5.5 字符集与客户端不一致,中文进库变乱码

现象:初始化脚本跑完,用 disql 或 navicat 查询中文数据,显示为问号或乱码;插入中文时直接报"字符串截断"。

原因:CHARSET、LENGTH_IN_CHAR 与客户端字符集三方不一致。比如数据库建成了 GB18030,客户端工具用 UTF-8 连,中文转换出问题;或者库是 UTF-8 但 LENGTH_IN_CHAR=0,VARCHAR 长度按字节算,中文一超过长度就截断。

解决:建库时统一 CHARSET=1、LENGTH_IN_CHAR=1;客户端和终端工具全部设成 UTF-8;初始化 SQL 脚本本身保存成 UTF-8 无 BOM 格式。如果库已经建错且数据量小,重建实例一步到位,别在乱码上耗时间。

6. 把建实例写成脚本:一套参数出多套环境的最后一步

当你要在测试、预发、生产环境重复建库时,手动敲 dminit 就不现实了。把三章讲的步骤串成一个脚本,参数留待外部覆盖,可以做到一套脚本出多套环境。下面是一个可以直接改参数用的模板:

#!/bin/bash set -e DM_HOME=/opt/dmdbms DATA_DIR=/dm/data INST_NAME=DMSERVER PORT_NUM=5236 SYSDBA_PWD="Dm_123456" export DM_HOME export PATH="$DM_HOME/bin:$PATH" export LD_LIBRARY_PATH="$DM_HOME/bin:$LD_LIBRARY_PATH" dminit PATH=$DATA_DIR \ INSTANCE_NAME=$INST_NAME \ PAGE_SIZE=8 EXTENT_SIZE=16 LOG_SIZE=2048 \ CASE_SENSITIVE=Y CHARSET=1 LENGTH_IN_CHAR=1 \ PORT_NUM=$PORT_NUM SYSDBA_PWD=$SYSDBA_PWD # 以下注册服务一行需要 root 权限执行 # 若当前用户不是 root,请单独执行这一行 $DM_HOME/bin/dm_service_installer.sh \ -t dmserver -p $INST_NAME \ -dm_ini $DATA_DIR/$INST_NAME/dm.ini systemctl start DmService$INST_NAME $DM_HOME/bin/disql SYSDBA/$SYSDBA_PWD@127.0.0.1:$PORT_NUM <<EOF start /dm/scripts/init.sql exit EOF echo "init done: $INST_NAME on $PORT_NUM"

set -e 的作用是前面任何一步失败就立即退出,避免 dminit 失败后还继续注册服务,把状态搞得更乱。脚本里 dminit 和 disql 用安装用户跑,dm_service_installer.sh 必须切 root,所以实际使用时把脚本拆成两个阶段或在这行前面加 sudo。init.sql 和参数文件建议放进 Git 管理,每次建库的参数差异一目了然,排障时不用靠记忆。

我自己的教训是早期图省事跳过 LENGTH_IN_CHAR,结果交付前联调发现 varchar 按字节算,中文全截断,最后重建实例重新导数据,白熬一个通宵。从那以后,脚本里每个参数都写成显式赋值,不留默认值,宁可啰嗦也不要靠手气。环境参数写完跑一遍,再对着第 5 章的避坑清单过一遍,基本能避免大多数翻车。希望帮到你。

本文还有配套的精品资源,点击获取

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

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

立即咨询