简介:针对无图形界面的数据库部署需求,达梦数据库的 dminit 命令行工具提供了一套完整的实例创建与初始化方案。这份 PDF 教程面向 DBA、运维人员及国产数据库学习者,系统讲解了快速带参创建与交互式逐步配置两种方式,并详细说明系统目录、数据库名、服务端口、页大小、扩展大小、字符集、时区、加密策略等关键参数的设置含义,同时附有服务注册脚本的使用步骤,帮助读者在远程服务器或自动化部署环境中高效完成实例初始化。资源共 1 个 PDF 文件,大小仅 44KB,内容精炼实用,已有 6861 人学习下载,适合需要掌握命令行数据库管理技能的从业者参考。
1. 没有图形界面时,dminit 才是初始化达梦实例的正道
当你只有 SSH 端口、没有 X11 转发时,达梦数据库的图形化创建工具就像摆设。图形界面确实能一步步点出实例,但在生产环境、云主机或自动化发布流水线里,最小干预和可重复才是硬道理。dminit 是达梦自带的核心初始化工具,位于 $DM_HOME/bin 下,它不依赖图形库,却可以完整设置页大小、字符集、大小写敏感、时区等关键属性。这里直接拆解 dminit 的两种调用方式、参数语义与默认值陷阱,接着是注册系统服务、用 disql 验证,最后给出一套自动化预置参数的方法。适合要批量部署达梦的 DBA,也适合刚接触国产数据库、想弄明白初始化参数到底影响什么的开发人员。
2. dminit 的两种调用方式:全参数指定与交互式填写的异同
2.1 快速全参数模式的正确用法与隐藏陷阱
dminit 支持像大多数初始化工具那样,在命令行里直接以“参数=值”的方式传入,例如:
dminit PATH=/dm/dmdbms/data DB_NAME=DAMENG INSTANCE_NAME=DMSERVER这条命令的含义很直白:PATH指定数据文件存放根目录,DB_NAME指定数据库名,INSTANCE_NAME指定实例名。执行后,dminit 会以编译内置的默认值补齐其余参数,比如默认页大小 8 KB、默认字符集 GB18030、默认不启用加密等。对于纯测试环境,这样做最快,几十秒就能得到一个新实例。
但我不建议把它直接套用到生产。原因有两个:第一,默认值不一定符合业务需要,而页大小、大小写敏感、字符集这类参数初始化后几乎没法改;第二,快速模式虽然也接受PORT_NUM=5336 PAGE_SIZE=8 CHARSET=1这样的键值追加,但缺少交互式模式那套“非法输入重新问”的保护机制。参数一旦写错,要么被静默忽略,要么被当成默认值处理,你甚至不知道哪里不对。比如PAGE_SIZE=4096这种越界值,dminit 可能直接跳回默认 8 KB,后续建表时才发现表空间的大小计算和预期完全对不上。
提示:快速模式适合 CI/CD 里初始化临时库,生产环境请务必走交互式或受控的脚本预填方式,至少让每个参数都经过显式确认。
2.2 交互式模式下每一个提问的默认值含义
直接不带任何参数执行dminit,会进入交互式配置流程。它会按顺序询问以下问题,每一步都有默认值或取值范围,我把它们整理成一张参数表,基本覆盖了达梦数据库初始化的全部关键选项:
| 提示项 | 取值范围 / 默认值 | 说明 | 推荐设置 |
|---|---|---|---|
| input system dir | 目录路径 | 数据文件、控制文件等存放根目录 | 独立数据盘,避开根目录 |
| input db name | 字符串 | 数据库名,对应连接串中的库名 | 语义清晰,如 dmdb |
| input port num | 整数,默认 5236 | 实例监听端口 | 非默认端口注意防火墙 |
| input page size | 4, 8, 16, 32(KB) | 数据库页大小,影响读写粒度和表空间管理 | OLTP 选 8,分析型选 16 |
| input extent size | 16, 32 | 段空间每次分配的最小簇大小 | 默认 16 即可 |
| input sec priv mode | 0, 1 | 安全特权模式,1 为更严格的权限控制 | 等保要求选 1,否则 0 |
| input time zone | -12:59 ~ +14:00 | 数据库时区,建议显式指定 +8:00 | 与业务服务器一致 |
| string case sensitive | Y/N | 标识符大小写是否敏感 | 新项目建议 N,兼容老库看原库 |
| which charset to use | 0:GB18030, 1:UTF-8, 2:EUC-KR | 默认字符集 | 业务多语言选 1 |
| length in char | Y/N | 长度单位按字符还是字节 | 多字节字符集选 Y |
| enable database encrypt | Y/N | 是否透明加密数据文件 | 涉密数据选 Y,但备份恢复更复杂 |
| page check mode | 0/1/2 | 页校验级别,0 不校验,1 CRC,2 更强 | 生产建议 1 |
| input elog path | 路径 | 日志文件路径,可空 | 默认放在数据目录 |
| auto_overwrite mode | 0/1/2 | 0 不覆盖已有目录,1 覆盖,2 忽略已有文件 | 生产必须用 0 |
这里最容易踩坑的是string case sensitive。选 Y 的话,建表时CREATE TABLE UserInfo与CREATE TABLE userinfo会被视为两个对象,同时未加引号的标识符会被转成大写存储。对于从 MySQL 迁过来的应用,通常选 N 更接近原行为。另一个高频失误是length in char:选 N 时VARCHAR(20)表示 20 个字节,UTF-8 下只能存 6 个汉字,应用侧很容量报“字符串长度超限”;选 Y 则按字符计数,20 就是 20 个汉字,更符合大多数开发者的直觉。
2.3 用 printf 管道预填交互输入,实现无人值守初始化
交互式虽然安全,但无法直接用于脚本循环。实际部署时,我通常用printf把预设答案按提问顺序发给 dminit,例如:
printf "/data/dmdb\ndmdb\n5336\n8\n16\n0\n+8:00\nN\n1\nY\nN\n1\n\n0\n" | dminit这段代码按顺序对应 2.2 表中的参数:第一行/data/dmdb是系统目录,第二行dmdb是数据库名,第三行5336是端口,第四行8是页大小,第五行16是扩展大小,第六行0是安全特权模式,第七行+8:00是时区,第八行N表示大小写不敏感,第九行1表示 UTF-8,第十行Y表示按字符计长,第十一行N不加密,第十二行1开启页 CRC 校验,第十三行是空行对应 elog path,第十四行0不覆盖已有目录。
使用这种预填方式时,必须保证回答行数与 dminit 提问数完全一致。如果某个非法输入会导致 dminit 重新追问,后续答案将全部错位,最后可能创建出一个参数错乱的实例。因此,建议先在测试机上手工跑一遍交互式流程,完整记录提问顺序,再固化成脚本。相比expect工具,printf不需要额外安装依赖,在最小化安装的操作系统上更友好。
3. 从实例到服务:dm_service_installer.sh 注册与启动控制
3.1 为什么 dminit 不会自动注册系统服务
dminit 的职责只是把“数据文件 + 控制文件 + 初始化参数”落盘,它不会把自己生成的实例注册成操作系统服务。所以很多初次接触达梦的工程师会发现,明明初始化成功,却找不到service DmServiceDMSERVER start这样的命令。原因是达梦把“实例初始化”和“服务注册”拆成了两个独立阶段。dminit 完成后,磁盘上会生成dm.ini、DAMENG01.log等文件,但此时实例还不能被系统的启动工具管理。
如果直接执行dmserver /dm/dmdbms/data/DAMENG/dm.ini来启动,前台会占用终端且无法纳入 systemd 或 init.d 管理。生产环境必须注册为系统服务,实现开机自启和统一状态查询。这一步与图形界面“创建实例并注册服务”中的注册部分是等价的,只是换成了命令行脚本。
3.2 注册命令的完整参数拆解
达梦在安装路径下提供了服务注册脚本dm_service_installer.sh,常见位置是/dm/dmdbms/script/root/。使用前需要切换到 root 用户,因为要写/etc/init.d/和系统服务软链接。典型用法:
cd /dm/dmdbms/script/root/ ./dm_service_installer.sh -t dmserver -i /dm/dmdbms/data/DAMENG/dm.ini -p DMSERVER这里三个参数分别对应:-t dmserver指定服务类型为实例服务,-i指向 dminit 生成的dm.ini配置文件,-p DMSERVER指定服务名后缀。最终生成的服务名是DmServiceDMSERVER,其中DmService是固定前缀,DMSERVER来自-p参数。如果需要区分多套环境,比如订单库,可以改成-p ORDERS,得到DmServiceORDERS。
执行成功后,脚本会在/etc/init.d/下生成服务脚本。在 systemd 环境下,它也会自动注册对应的 unit 文件。如果-p参数不填,默认取dm.ini中的实例名。为了后续连接串与服务名保持一致,建议显式指定。
3.3 用 service 与 init.d 两种方式管理实例状态
注册完成后,可以用两种方式管理服务。传统 SysV 风格:
cd /etc/init.d/ ./DmServiceDMSERVER start ./DmServiceDMSERVER stop ./DmServiceDMSERVER status也可以直接调用service命令:
service DmServiceDMSERVER start service DmServiceDMSERVER stop service DmServiceDMSERVER status两种方式最终都会执行同一个服务脚本。start通过dmserver读取dm.ini启动实例,status会检查进程号和端口监听状态。启动后可以用ps -ef | grep dmserver确认进程存在,也可以监听端口:
ss -lntp | grep 5336如果端口冲突或dm.ini路径配置错误,服务会启动失败,此时查看数据目录下的dm_实例名_DMSERVER.log或/dm/dmdbms/log下的日志,通常能找到具体报错。相比前台启动,注册成服务后日志由服务框架接管,排错时更容易定位。
4. 初始化后必做三项检查:页大小、字符集与大小写敏感
4.1 用 disql 连接实例并查询关键参数
实例初始化并启动后,第一件事不是急着建表,而是确认关键参数是否真正生效。达梦自带命令行工具disql,类似 Oracle 的 sqlplus。先用dmdba用户连接:
cd /dm/dmdbms/bin ./disql SYSDBA/SYSDBA@localhost:5336连接成功后,执行下面的 SQL 查询参数视图:
SET LINESIZE 200 SELECT NAME, VALUE, DESCRIPTION FROM V$DM_INI WHERE NAME IN ('PAGE_SIZE', 'LENGTH_IN_CHAR', 'CASE_SENSITIVE', 'DB_CHARSET');V$DM_INI是达梦的参数视图,PAGE_SIZE对应页大小,LENGTH_IN_CHAR对应字符长度单位,CASE_SENSITIVE对应大小写敏感标志,DB_CHARSET对应字符集编号。字符集编号 0 是 GB18030,1 是 UTF-8,2 是 EUC-KR。如果查询结果中CASE_SENSITIVE是 Y,说明标识符区分大小写。
除了参数视图,还可以用SELECT SF_GET_CASE_SENSITIVE_FLAG();这类系统函数快速判断,但参数视图返回的信息更全,适合一次性核对多项设置。对于使用 navicat 连接达梦数据库的同事,字符集和大小写敏感直接决定了建表语句能否原样执行。比如源库是小写表名,目标库CASE_SENSITIVE=Y时,navicat 里的表名会被自动转成大写,导致 SQL 找不到对象,所以这一步值得列为标准化流程。
4.2 常见初始化报错及其原因
根据我接触的部署案例,初始化阶段高频报错集中在这几类:
| 报错现象 | 可能原因 | 处理方式 |
|---|---|---|
input err , input again反复出现 | 输入的值不在枚举范围内,如页大小输入 6 | 重新输入合法值,或检查 printf 管道是否错位 |
create dm database success但启动失败 | 数据目录权限非 dmdba | chown dmdba:dinstall /dm/dmdbms/data -R |
| 端口被占用 | 端口参数与已启动实例冲突 | 改用空闲端口,或停止占用进程 |
dm.key not found | 缺少授权文件,且未设置 license | 将有效 dm.key 放到 $DM_HOME 下 |
auto_overwrite mode输错导致数据目录被清空 | 0/1/2 语义混淆 | 生产环境永远用 0,脚本中显式校验 |
auto_overwrite mode尤其需要注意。0 表示目标目录已存在且非空时报错;1 表示覆盖已存在的数据库文件;2 表示忽略已有文件继续创建。在自动化脚本里如果误填 1,可能把旧实例的文件直接覆盖,且没有二次确认。因此我在所有部署脚本里都会先检查目标目录是否为空:
if [ -d "$DATA_DIR/DAMENG" ] && [ "$(ls -A $DATA_DIR/DAMENG)" ]; then echo "directory not empty, exit" exit 1 fi这段检查放在 dminit 之前,用条件判断目录是否存在且有内容,如果有就终止执行,防止误操作。实际生产环境中的大多数初始化事故,都是由“覆盖模式”和“非空目录”组合导致的。
4.3 参数选错后的处理策略:重建还是修改
页大小、大小写敏感、字符集这三项在达梦初始化后无法通过修改dm.ini或 ALTER 语句变更。页大小影响物理块与表空间配额换算;大小写敏感影响系统表中对象名的存储形式;字符集则与所有字符串字段的编码绑定。如果上线后发现这三项与预期不符,唯一干净的路径是重新执行 dminit 创建新实例,再把业务数据导入。
导入时要注意源库与目标库的字符集必须一致,或者至少能无损互转。例如源库是 UTF-8,目标库是 GB18030,虽然大部分常用汉字能表示,但排序规则和字符串长度计算会出现偏差。另一个典型问题是length_in_char选错:如果源库按字节算,目标库按字符算,VARCHAR(20)字段在目标库能存更多内容,但反过来就可能频繁报超出长度。这些细节在 navicat 等客户端里往往表现得很隐蔽,只有写入时才会报错。
因此,初始化前和开发确认参数是一件性价比极高的事。一旦实例上线并跑了业务,重建的成本会指数级上升。如果你在测试环境已经用快速模式建了一批库,建议直接删掉重来,不要试图修改参数继续用。
5. 把 dminit 参数预置封装成可复用脚本的要点
把 4.2 的非空目录检查和 2.3 的参数预填合并,可以写成一个可重复执行的初始化脚本。核心思路是把所有参数抽成变量,并把合法性校验前置。示例如下:
#!/bin/bash DM_HOME=/dm/dmdbms DATA_ROOT=/data/dmdbdata DB_NAME=dmdb INSTANCE_NAME=DMSERVER PORT_NUM=5336 PAGE_SIZE=8 EXTENT_SIZE=16 CHARSET=1 LENGTH_IN_CHAR=Y CASE_SENSITIVE=N DATA_DIR="$DATA_ROOT/$DB_NAME" if [ -d "$DATA_DIR" ]; then echo "$DATA_DIR already exists, exit" exit 1 fi printf "%s\n%s\n%s\n%s\n%s\n0\n+8:00\n%s\n%s\n%s\nN\n1\n\n0\n" \ "$DATA_ROOT" "$DB_NAME" "$PORT_NUM" "$PAGE_SIZE" "$EXTENT_SIZE" \ "$CASE_SENSITIVE" "$CHARSET" "$LENGTH_IN_CHAR" | \ "$DM_HOME/bin/dminit"脚本先检查目标目录是否存在,存在则退出,防止覆盖已有数据。接下来用printf传入与 2.2 表一一对应的参数。这里的换行顺序必须严格匹配 dminit 的提问顺序,如果后续达梦版本增加了新提问项,脚本会错位,所以建议在脚本头部注释里附上参数序列表。
更进一步的封装是把参数定义成数组,循环拼接输入串。例如:
params=( "$DATA_ROOT" "$DB_NAME" "$PORT_NUM" "$PAGE_SIZE" "$EXTENT_SIZE" "0" "+8:00" "$CASE_SENSITIVE" "$CHARSET" "$LENGTH_IN_CHAR" "N" "1" "" "0" ) printf '%s\n' "${params[@]}" | "$DM_HOME/bin/dminit"这种写法的好处是新增或调整参数时只改数组定义,不需要改动执行逻辑。配合后续服务注册一段,整个部署过程可以完全自动化:
cd "$DM_HOME/script/root" ./dm_service_installer.sh -t dmserver -i "$DATA_DIR/$DB_NAME/dm.ini" -p "$INSTANCE_NAME" service "DmService$INSTANCE_NAME" start启动后,用 disql 对实例做一次连通性探测:
"$DM_HOME/bin/disql" SYSDBA/SYSDBA@localhost:$PORT_NUM <<EOF SELECT STATUS$ FROM V$INSTANCE; EOFV$INSTANCE中的STATUS$字段为OPEN代表实例可用。把这一系列命令固化后,每次新建环境就是一次脚本调用,不会再出现漏掉页大小或大小写参数导致的返工。
本文还有配套的精品资源,点击获取