ARTICLE DETAIL

资讯详情

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

达梦数据库Windows创建实例:图形化助手与dminit命令行详解

达梦数据库Windows创建实例:图形化助手与dminit命令行详解 达梦数据库在 Windows 上创建数据库实例这件事说简单是真简单向导点几下就出来了说麻烦也真麻烦参数里随便选错一个后面数据迁移、备份策略、性能调优全得推倒重来。我在国产化替换项目里陆陆续续初始化过几十个达梦实例从测试机上随手一建的玩具库到生产上跑核心业务、还要做读写分离的正式实例踩过的坑基本能凑成一本小册子。这篇就专门聊 Windows 环境下创建数据库实例的完整流程包含图形化配置助手和 dminit 命令行两条路参数怎么选、服务怎么注册、建完怎么验都会给到可以直接复制的方案。不管你是第一次接触达梦数据库的新手还是从其他数据库转过来想快速上手的老手看完应该都能在自己的机器上把实例稳稳跑起来。1. 动手之前先把实例这件事想清楚1.1 实例和数据库到底差在哪达梦的文档里数据库和实例是两个被反复强调的概念但很多人第一次看会直接略过。我用自己的话翻译一遍数据库是躺在磁盘上的那一堆文件——数据文件、控制文件、重做日志、参数文件 dm.ini实例是内存里的那套运行时结构——数据缓冲区、SQL 缓存、后台线程、会话管理。启动一次 dmserver 进程本质就是拿 dm.ini 里的参数把磁盘上的数据库文件挂载进内存形成一个能接受客户端连接的实例。这个区分在实操里非常关键。你在 Windows 上做的“创建数据库实例”这个动作实际上是 dminit 帮你一次性完成两件事按参数在指定路径铺一套初始数据文件、控制文件和日志文件同时把参数固化进 dm.ini。以后每次启动服务dmserver 读的都是这份 dm.ini。所以数据库名、实例名、端口、页大小、字符集这些东西在建库那一秒就写死了事后想改就得重建实例再导数据。我见过最常见的错误是有人把“实例”当成可以随便改名字的东西。实例名 INSTANCE_NAME 一旦确定服务名、监听配置、工具里的连接标识都会跟着它走改名之后各种配置文件对不上排查起来非常折磨。所以我的建议永远是动手之前先在纸上把库名、实例名、端口、路径四项定下来后面照着填别中途改主意。1.2 Windows 上的目录规划别图省事Windows 环境跑达梦目录规划是最容易被忽略、又最容易埋雷的一环。官方安装包默认会把程序装在类似D:\dmdbms这样的路径下实例数据默认落在D:\dmdbms\data\DAMENG。测试环境这么放没问题生产环境我建议至少拆成三块程序目录、数据目录、备份目录分别放在不同的物理盘或者不同的卷上。理由很直接。数据目录是随机读写最密集的地方备份目录是顺序写大文件程序目录基本只读。三者混在一个盘上备份一跑起来磁盘 IO 就被打满业务查询跟着变慢。另外 Windows 上还有一个要命的坑如果路径里带空格或者带中文某些脚本、服务注册、第三方工具解析路径时就会出问题。我现在的习惯是全程用英文短路径比如D:\dmdbms、D:\dmdata\DAMENG、D:\dmbak一个空格都不给。权限方面也得注意。达梦服务默认以本地系统账户或者你指定的账户运行如果数据目录的 NTFS 权限没给足服务启动时会报“无法打开数据文件”之类的错误而且报错信息往往很含糊。稳妥做法是给运行服务的账户对数据目录和备份目录授予完全控制权限别指望它自己继承。1.3 安装包和版本先确认再动手创建实例之前先确认你手上这套达梦是什么版本、什么架构。DM8 是当前主流安装包分 Windows x64 等不同架构官网下载页面上型号挺多拿错了装完跑不起来。安装完成后D:\dmdbms\bin目录下应该有dminit.exe、dmserver.exe、disql.exe、dminit的图形化封装工具等一堆可执行文件目录里还有tool子目录放管理工具。版本确认还有个实际用途不同小版本的 dminit 参数会有细微差异比如某些版本新增了页校验参数、时区参数。你先用dminit help看一眼当前版本支持哪些参数比你翻半天旧文档靠谱得多。我就吃过这个亏照着一份两年前的博客写命令结果参数名对不上白白折腾半小时。注意同一个 Windows 机器上可以存在多套达梦程序目录但注册成 Windows 服务时服务名必须唯一否则后注册的会失败或者覆盖前面的。多实例场景建议在服务名里带上实例名和端口。2. 用图形化配置助手创建第一个实例2.1 从开始菜单找到配置助手装完达梦开始菜单里会出现一个达梦的程序组里面有“DM数据库配置助手”这一项有些版本叫“数据库配置工具”。点开之后是一个向导式的界面整体交互和其他数据库的建库向导很像先选操作类型创建数据库实例 / 删除实例 / 注册服务再一路往下填参数。向导第一屏通常让你选“创建数据库实例”然后指定数据库目录。这里填的就是你要铺数据文件的那个空目录注意是空目录如果目录里已经有 dm.ini 或者数据文件向导会提示冲突。下一页是数据库标识数据库名、实例名、端口号。数据库名建议用大写英文实例名同样端口默认 5236如果机器上已经有别的实例在跑这里必须换一个没被占用的端口。再往后就是参数页也是整个向导里最需要动脑的一屏。向导会把页大小、簇大小、字符集、大小写敏感、varchar 长度单位、空格填充模式、日志文件大小这些东西全列出来每一项都有默认值。新手最常见的做法是无脑下一步这在纯测试环境没问题但只要你后面要接生产数据就必须在这一屏停下来认真选。2.2 参数页每一项到底该怎么选页大小PAGE_SIZE是第一个要决策的。达梦支持 4K、8K、16K、32K 四档默认 8K。这个值决定了数据块的大小一旦建库就不能改。我的经验是纯 OLTP 的交易类系统选 8K跟主流数据库对齐兼容性最好如果是分析型、批处理为主、单行数据比较宽的库可以上 16K 甚至 32K减少行溢出。但页越大单次 IO 的粒度越大小随机读多的场景反而不划算。别为了“看起来大”就选 32K那是给自己找麻烦。簇大小EXTENT_SIZE默认 16K可选 16K、32K、64K。簇是分配空间的最小单位簇越大大表顺序写的效率越高但小表会浪费空间。绝大多数场景保持默认 16K 就够了除非你明确知道这个库里全是大宽表可以考虑 32K。字符集CHARSET是重中之重。达梦默认是 GB18030编码值 0UTF-8 是 1。这里的选择取决于你的业务数据里有没有生僻字、多语言文本。如果系统后续要对接 Java 应用、要存 emoji 或者其它语言字符直接选 UTF-8。如果全是中文、且历史系统就是 GBK 体系选 GB18030 也能省一些存储空间。但要注意字符集建库后不可更改选错了只能重建实例再迁移。大小写敏感CASE_SENSITIVE默认是敏感。这个参数影响对象名和字符串比较。如果你的应用是从大小写不敏感的数据库迁过来的代码里表名大小写混着写那建库时就要考虑关掉大小写敏感或者干脆统一改代码。我一般倾向保持默认敏感然后在应用层规范命名因为不敏感模式下索引行为、字符串比较会有一些反直觉的地方。还有两个容易被忽略的varchar 长度单位按字符还是按字节和空格填充模式。前者影响你定义VARCHAR(20)到底是 20 个字符还是 20 个字节如果业务里有中文按字节算的时候一个汉字占 3 字节实际能存的字就少了。后者影响字符串比较时尾部空格的行为从 Oracle 风格系统迁移过来的通常要保持兼容。2.3 口令和路径这两处新手最容易翻车向导走到后面会让你设置 SYSDBA 的口令有些版本还会让你一并设置 SYSAUDITOR 的口令。达梦对口令复杂度是有要求的默认策略下至少 8 位且要包含大小写字母、数字、特殊字符中的若干类。测试环境图省事用SYSDBA当密码向导大概率直接拒绝提示口令不满足复杂度要求。这里有个实操心得如果确实是本地测试库可以在建库参数里指定口令策略或者建完之后用 SYSDBA 登录去调整口令策略参数。但生产环境请老老实实设强口令并且把口令交给专门的凭据管理别写在脚本里。路径这处我要再强调一次。向导里如果让你填多个路径数据文件路径、日志文件路径、备份路径务必确认每个目录都存在且有写权限。Windows 上有个很隐蔽的问题你用管理员账户登录图形界面操作向导创建的文件属主是管理员但服务实际是以另一个账户启动的结果服务一启动就报权限错误。解决办法是注册服务时显式指定运行账户并且保证这个账户对目录有完全控制权限。提示向导创建完成后建议不要立刻点“完成”就关掉它会弹出一步询问是否“注册数据库服务”。这一步勾上能省掉后面手动注册的麻烦。3. 命令行 dminit 建库可复制的参数模板3.1 dminit 的基本用法和参数速查图形向导适合第一次接触达梦的人建立直观印象但真到了批量部署、自动化脚本、或者要精确控制每一个参数的时候dminit 命令行才是主力。它的位置在D:\dmdbms\bin\dminit.exe基本语法是dminit.exe PATH数据库路径 [参数值 ...]其中 PATH 是必填项其余参数不填就走默认值。想快速看当前版本支持哪些参数直接执行dminit.exe help这条命令会打印出完整的参数列表和取值范围比翻文档快。我整理了一份最常用的参数对照表可以直接当备忘录用参数名含义常用取值是否可后期修改PATH数据文件存放路径绝对路径英文无空格否DB_NAME数据库名大写英文如 DAMENG否INSTANCE_NAME实例名大写英文如 DMSERVER否PORT_NUM监听端口默认 5236冲突需换可改 dm.iniPAGE_SIZE页大小KB4 / 8 / 16 / 32否EXTENT_SIZE簇大小KB16 / 32 / 64否CHARSET字符集0GB180301UTF-8否CASE_SENSITIVE大小写敏感Y / N否LENGTH_IN_CHAR长度按字符计Y / N否LOG_SIZE单份重做日志大小64~2048单位 MB否SYSDBA_PWDSYSDBA 口令满足复杂度策略可改TIME_ZONE时区如 08:00可改 dm.ini3.2 一套可以直接抄的初始化命令下面是我在 Windows 上初始化生产前测试实例时最常用的一套命令参数注释都写在后面D:\dmdbms\bin\dminit.exe ^ PATHD:\dmdata\DAMENG ^ DB_NAMEDAMENG ^ INSTANCE_NAMEDMSERVER ^ PORT_NUM5236 ^ PAGE_SIZE8 ^ EXTENT_SIZE16 ^ CHARSET1 ^ CASE_SENSITIVEY ^ LENGTH_IN_CHARY ^ LOG_SIZE1024 ^ SYSDBA_PWDDm12345678 ^ TIME_ZONE08:00注意 Windows 命令行的换行符是^不是 Linux 的\这是很多人从 Linux 迁移过来第一个撞的墙。执行成功后终端会打印一串初始化进度最终提示“init database success”之类的字样。这时候你去D:\dmdata\DAMENG目录下看应该能看到dm.ini、dm.ctl、SYSTEM.DBF、若干DAMENG01.LOG文件。这套参数的选择逻辑说清楚页大小选 8K 是为了兼容主流 OLTP 负载字符集选 UTF-8 是因为这个库后面要跟 Java 应用对接避免中文和特殊符号出问题varchar 按字符计是为了让应用侧定义字段长度时不用做字节换算日志单份 1G是因为这个库有批量写入场景日志太小会频繁切换影响性能。每一项目标都对应一个具体的业务特征别照抄参数却不理解原因。3.3 页大小和日志大小怎么算才合理参数里最需要算一算的是日志大小。达梦的重做日志通常是两份或多份每份大小由 LOG_SIZE 决定取值范围一般在 64MB 到 2048MB。日志用来做实例恢复和主备同步太小会导致频繁的日志切换切换瞬间有性能抖动太大会拉长恢复时间一旦实例异常重启重放日志要很久。一个粗略的估算办法看你的业务峰值写入速率。假设高峰期每秒产生 20MB 的重做日志你希望日志切换不要太频繁让单份日志能撑 1 到 2 分钟那么单份日志大小取 1200MB 到 2400MB 之间结合上限取 1024MB 或 2048MB。这只是一个起点真正上线前还是要压测看日志切换频率。页大小虽然没有“算”的余地但它的选择会间接影响单行最大长度和行内存储效率。达梦单行数据不能跨页存储如果一行超过了页大小能容纳的极限就会触发行溢出。所以当你的表里有很多很宽的 VARCHAR 字段时选 16K 页会比 8K 页少很多溢出全表扫描时效率差别明显。这就是为什么参数选择要和业务表结构一起看而不是孤立地拍脑袋。注意dminit 执行过程中不要中途 CtrlC 打断否则会留下半成品目录。如果确实需要重来先把目录整个删干净再重新执行不要试图在残留目录上继续初始化。4. 注册 Windows 服务与日常启停4.1 两种注册方式各有适用场景实例创建出来之后还是不能算完事。dminit 只是把磁盘文件铺好了要让实例开机自动运行、能被 Windows 服务管理器统一管理还得注册成服务。达梦在 Windows 上提供了两种注册途径。第一种是图形化方式用“DM服务查看器”在开始菜单的达梦程序组里能找到。打开之后界面很简单右键空白区域或者点工具栏选择“注册服务”然后浏览到你的dm.ini文件服务名会自动带出来通常形如DmServiceDMSERVER。确认之后服务就注册好了可以在 Windows 服务管理器里看到它。第二种是命令行方式一般用bin目录下的相关工具指定实例名、dm.ini 路径、服务名等参数完成注册。这种方式适合写进自动化脚本批量部署时特别省事。但要注意不同小版本的工具名和参数可能有差异执行前先用 help 看一眼别硬套。我更推荐生产环境用图形化方式注册然后把注册结果记录下来。原因很简单图形化界面会帮你处理掉一些路径转义和权限继承的问题命令行参数写错一个字符服务注册成功了但启动失败排查成本反而更高。4.2 多实例场景的服务命名规范一台服务器上跑多个达梦实例是常态比如一个主库实例加一个测试实例或者主备两个实例。这时候服务命名就很重要了。默认命名是DmService加实例名如果两个实例的实例名都是 DMSERVER服务名就撞了。我现在的命名习惯是DmService 业务代号 端口例如DmServiceOrder5236、DmServiceTest5237。这样在服务管理器里一眼就能看出来这个服务对应哪个库、哪个端口出问题的时候不需要再去翻配置。同时每个实例的 dm.ini 里端口必须和实际监听一致服务名里的端口只是给人看的标识真正生效的是 dm.ini 里的 PORT_NUM。还有一个容易忽略的点多实例环境下每个实例的服务账户最好保持一致目录权限也按同一套规则配。混用账户容易出现“A 实例能启动、B 实例报权限错误”这种诡异现象排查起来很费时间。4.3 启停顺序和开机自启的取舍Windows 服务默认可以设置自动启动、手动启动、延迟启动。达梦实例我一般建议设成“自动延迟启动”。原因是服务器开机时网络、磁盘、依赖服务都在初始化如果达梦服务启动太早可能因为磁盘还没就绪导致挂载数据文件失败。延迟启动能把这个风险降到很低。停止服务的时候也有讲究。生产实例不要直接点 Windows 服务管理器里的“停止”因为那是强制终止进程可能让实例处于异常关闭状态。正确做法是先用 disql 连上去执行正常关闭命令或者用达梦自己的服务管理工具发出停止指令让数据库把脏页刷盘、做一次干净的检查点。只有在实例已经卡死、无法正常关闭的情况下才动用服务管理器的强制停止。提示实例首次注册服务之后建议手动启动一次并观察服务日志确认没有报错再把它设置为自动启动。别注册完就直接重启服务器去验证那样一旦起不来排查环境更复杂。5. 实例连通性验证与首轮体检5.1 用 disql 做本地登录验证服务跑起来之后第一件事是验证本地能不能连上。达梦自带的命令行客户端是disql.exe在bin目录下。最简单的登录方式disql.exe SYSDBA/Dm12345678localhost:5236密码里有特殊字符的时候Windows 命令行下要注意转义必要时用引号把整段包起来。登录成功会进入SQL提示符这时候可以先跑几条命令看看SELECT * FROM V$INSTANCE; SELECT NAME, STATUS$ FROM V$DATABASE; SELECT * FROM V$VERSION;第一条看实例状态和启动时间第二条看数据库挂载状态第三条看版本号。这几条都正常返回说明实例本身没有问题。如果连不上先检查服务是否真的在运行、端口是否被防火墙拦了、监听地址是否是0.0.0.0还是只绑了本地。5.2 用管理工具和客户端连接本地验证通过之后下一步是图形化工具连接。达梦自带的“DM管理工具”在tool目录下打开之后新建连接填主机、端口、用户名、密码即可。它能连上说明实例的网络监听和认证都没问题。如果是外部应用连接比如 Java 应用、报表工具、其他数据库客户端常见的连接失败原因有几类端口没放开、实例的监听配置只允许本地、连接串里的服务名或实例名写错、驱动版本与数据库版本不匹配。达梦的 JDBC 连接串格式大致是jdbc:dm://host:5236具体写法以后续章节再细说这里先记住一点连接问题永远先分层排查从网络到服务再到认证一层层往下看不要一上来就怀疑数据库本身。5.3 建库之后必须做的几项检查实例刚建好我通常会做一轮“体检”把几项关键配置确认一遍避免后面踩坑。检查清单如下检查项检查方式期望结果实例状态V$INSTANCE状态正常启动时间合理页大小与字符集查 dm.ini 或系统视图与建库时设定一致日志文件位置与大小看数据目录和 dm.ini与规划一致无遗漏归档是否开启查归档相关参数按业务要求决定开或不开监听端口查看端口占用与 dm.ini 一致未被误占服务启动类型Windows 服务属性生产建议延迟自动启动其中归档这一项要特别说。刚建好的实例默认可能没有开归档如果你后面要做热备、主备同步、增量备份归档是前提。开归档需要把实例切到配置状态修改参数后重启步骤本身不复杂但一定要在建库初期就规划好别等数据量大了再折腾。6. 创建实例常见报错与排查实录6.1 报错速查表建实例这个阶段报错类型其实就那么几种我按遇到频率排了个序做成速查表报错现象可能原因处理思路目录已存在数据文件初始化失败路径非空或上次初始化残留清空目录后重试口令不符合复杂度要求密码太简单或策略未放宽换强口令或在参数中调整策略服务注册成功但启动失败目录权限不足或 dm.ini 路径错检查服务账户权限与配置路径端口被占用实例起不来已有其他实例或程序占用端口换端口或关掉占用进程客户端连不上本地能连监听地址或防火墙限制检查监听配置与入站规则中文显示乱码字符集与应用编码不一致确认建库字符集与应用一致这张表能覆盖八成以上的问题。真正难缠的是那些不报错但行为不对的情况比如实例能启动、能连上但查询结果中文是问号那基本就是字符集或客户端编码的问题需要从客户端环境变量和应用连接参数两头查。6.2 端口占用和服务启动失败端口占用在建多实例的时候特别常见。默认端口 5236 一旦被第一个实例占了第二个实例如果不改端口启动时就会失败。表现是服务启动后很快又停了日志里能看到监听失败的记录。处理方法很简单打开 dm.ini 把 PORT_NUM 改成别的值比如 5237重启服务即可。服务启动失败的另一个高频原因是权限。Windows 服务默认以本地系统账户运行如果你的数据目录是某个普通用户创建的系统账户可能没有完全控制权限。解决办法是在服务属性里把登录账户改成创建目录的那个账户或者干脆给系统账户补齐目录权限。我一般选后者权限模型更清晰。还有一种情况是 dm.ini 路径写错了。服务注册的时候指向了旧路径你把数据目录挪了位置服务启动就会找不到配置文件。这种问题排查方法是看 Windows 事件查看器里的服务日志或者直接手动执行dmserver.exe dm.ini路径前台启动报错信息会直接打在屏幕上比看服务日志快得多。6.3 字符集选错之后怎么办字符集是建库时定死、后期最难处理的参数之一。如果发现选错了比如应用需要 UTF-8 但你建成了 GB18030不要指望改参数能解决唯一可靠的路子是重建实例然后用逻辑导出导入的方式把数据迁过去。这个教训可以避免建库前把应用侧的编码要求问清楚特别是要跨系统对接的库。还有一个细节是客户端编码即使数据库是 UTF-8如果 disql 或者管理工具的客户端编码设成 GBK查出来的中文照样乱码。所以乱码问题要从“库端字符集”和“客户端编码”两个方向同时确认只改一头是没用的。提示如果只是测试库、数据可以丢那最快的办法就是删掉目录重建实例别浪费时间研究字符集转换。6.4 几个我踩过的实操心得第一dminit 建库时把参数完整记录下来包括每一个值和选择理由存在项目文档里。半年后你回头看能省掉大量猜测时间。我现在的习惯是建完库就把完整的 dminit 命令存成一个.sh或者.bat文件放在数据目录旁边。第二第一次建库别用生产目录练手找一个临时目录先跑一遍完整流程包括注册服务、连接验证、启停测试确认所有环节都通了再在正式目录上重做。这个习惯帮我避免过好几次“把正式环境当试验田”的尴尬。第三实例建完之后立刻做一次干净的全量备份。刚建好的库很小备份几秒钟就完事但它是你的基线。后面万一配置改崩了回滚到这个基线比重装一遍快得多。第四Windows 上路径里的空格和中文一定要避开。我见过因为程序目录带中文导致服务注册工具解析失败的案例排查了一下午最后发现就败在一个中文字符上。我个人在 Windows 环境里建达梦实例的体会是图形向导和 dminit 两条路都要会前者用来快速建立理解和处理单实例后者用来做批量部署和参数精确控制。参数里真正不能拍脑袋的只有页大小、字符集、大小写敏感这三个其它的都有比较宽的容错空间而这三个恰恰是最容易被无脑下一步带过去的。养成建库前先列参数清单的习惯比事后补救划算得多。后续如果要做主备同步或者读写分离这些建库参数还得保持主备两端完全一致到时候你会感谢现在认真填参数的自己。
返回列表