十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

达梦数据库dminit初始化:命令行参数详解与自动化部署实践

达梦数据库dminit初始化:命令行参数详解与自动化部署实践 简介针对无图形界面的数据库部署需求达梦数据库的 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_NAMEDAMENG INSTANCE_NAMEDMSERVER这条命令的含义很直白PATH指定数据文件存放根目录DB_NAME指定数据库名INSTANCE_NAME指定实例名。执行后dminit 会以编译内置的默认值补齐其余参数比如默认页大小 8 KB、默认字符集 GB18030、默认不启用加密等。对于纯测试环境这样做最快几十秒就能得到一个新实例。但我不建议把它直接套用到生产。原因有两个第一默认值不一定符合业务需要而页大小、大小写敏感、字符集这类参数初始化后几乎没法改第二快速模式虽然也接受PORT_NUM5336 PAGE_SIZE8 CHARSET1这样的键值追加但缺少交互式模式那套“非法输入重新问”的保护机制。参数一旦写错要么被静默忽略要么被当成默认值处理你甚至不知道哪里不对。比如PAGE_SIZE4096这种越界值dminit 可能直接跳回默认 8 KB后续建表时才发现表空间的大小计算和预期完全对不上。提示快速模式适合 CI/CD 里初始化临时库生产环境请务必走交互式或受控的脚本预填方式至少让每个参数都经过显式确认。2.2 交互式模式下每一个提问的默认值含义直接不带任何参数执行dminit会进入交互式配置流程。它会按顺序询问以下问题每一步都有默认值或取值范围我把它们整理成一张参数表基本覆盖了达梦数据库初始化的全部关键选项提示项取值范围 / 默认值说明推荐设置input system dir目录路径数据文件、控制文件等存放根目录独立数据盘避开根目录input db name字符串数据库名对应连接串中的库名语义清晰如 dmdbinput port num整数默认 5236实例监听端口非默认端口注意防火墙input page size4, 8, 16, 32KB数据库页大小影响读写粒度和表空间管理OLTP 选 8分析型选 16input extent size16, 32段空间每次分配的最小簇大小默认 16 即可input sec priv mode0, 1安全特权模式1 为更严格的权限控制等保要求选 1否则 0input time zone-12:59 ~ 14:00数据库时区建议显式指定 8:00与业务服务器一致string case sensitiveY/N标识符大小写是否敏感新项目建议 N兼容老库看原库which charset to use0:GB18030, 1:UTF-8, 2:EUC-KR默认字符集业务多语言选 1length in charY/N长度单位按字符还是字节多字节字符集选 Yenable database encryptY/N是否透明加密数据文件涉密数据选 Y但备份恢复更复杂page check mode0/1/2页校验级别0 不校验1 CRC2 更强生产建议 1input elog path路径日志文件路径可空默认放在数据目录auto_overwrite mode0/1/20 不覆盖已有目录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\n8: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/SYSDBAlocalhost: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 是 GB180301 是 UTF-82 是 EUC-KR。如果查询结果中CASE_SENSITIVE是 Y说明标识符区分大小写。除了参数视图还可以用SELECT SF_GET_CASE_SENSITIVE_FLAG();这类系统函数快速判断但参数视图返回的信息更全适合一次性核对多项设置。对于使用 navicat 连接达梦数据库的同事字符集和大小写敏感直接决定了建表语句能否原样执行。比如源库是小写表名目标库CASE_SENSITIVEY时navicat 里的表名会被自动转成大写导致 SQL 找不到对象所以这一步值得列为标准化流程。4.2 常见初始化报错及其原因根据我接触的部署案例初始化阶段高频报错集中在这几类报错现象可能原因处理方式input err , input again反复出现输入的值不在枚举范围内如页大小输入 6重新输入合法值或检查 printf 管道是否错位create dm database success但启动失败数据目录权限非 dmdbachown 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_NAMEdmdb INSTANCE_NAMEDMSERVER PORT_NUM5336 PAGE_SIZE8 EXTENT_SIZE16 CHARSET1 LENGTH_IN_CHARY CASE_SENSITIVEN 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\n8: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/SYSDBAlocalhost:$PORT_NUM EOF SELECT STATUS$ FROM V$INSTANCE; EOFV$INSTANCE中的STATUS$字段为OPEN代表实例可用。把这一系列命令固化后每次新建环境就是一次脚本调用不会再出现漏掉页大小或大小写参数导致的返工。本文还有配套的精品资源点击获取
返回列表