ARTICLE DETAIL

资讯详情

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

达梦数据库注册服务3种方法详解:自动注册/脚本注册/图形工具

达梦数据库注册服务3种方法详解:自动注册/脚本注册/图形工具 前阵子在一台Linux服务器上部署达梦数据库实例初始化倒是很顺利结果到了“把数据库变成系统服务”这一步旁边几个同事开始各显神通有人直接改/etc/rc.local有人手动去写systemd单元文件还有人干脆每次重启后手动执行dmserver。我当时就意识到很多人对达梦数据库注册服务这件事的理解是碎片化的。其实达梦官方和安装包自带的工具已经封装好了非常成熟的注册机制而且不止一种路子。这篇文章我就把达梦数据库注册服务的3种方法一次性讲透dminit初始化时自动注册、dm_service_installer.sh脚本手动注册、dmservice.sh图形化工具注册。三种方式分别适合什么场景、底层到底做了什么、操作中有哪些坑我都会结合实际操作记录说明白。内容主要面向Linux环境下的达梦DBA和运维工程师Windows环境略有差异但思路相通也可以参考。1. 整体思路注册服务到底在做什么三种方式怎么选很多人第一次接触“注册服务”这个概念时有点懵我一个数据库初始化完直接启动不就行了吗为什么非要注册成服务这里面的差异主要体现在三个方面开机自启、统一管理、异常拉起。手动启动的dmserver进程Linux一重启就没了你得手动再拉起来注册成服务后可以通过systemctl或service命令统一管理还能设置开机自启对于生产环境来说这是刚需。1.1 服务注册的本质生成启动脚本并交给系统守护进程达梦数据库注册服务的底层逻辑并不复杂。不管是哪种方式最终做的是这么几件事根据实例的dm.ini配置生成一个服务启动脚本通常以DmService为前缀然后把这个脚本注册到系统的服务管理体系中。在systemd环境下注册到的位置是/usr/lib/systemd/system/目录在SysV init环境下脚本会放到/etc/init.d/目录。所以本质上三种方法之间的关系不是互斥的而是“同一个目标的三种实现路径”。dminit自动注册是在初始化实例时顺手把脚本生成好dm_service_installer.sh是事后手工补注册dmservice.sh则是把手工操作包了一层图形界面。理解了这一点后面不管用什么方法你都不会慌。1.2 三种方式的适用场景对比注册方式触发时机操作门槛灵活性适用场景dminit自动注册实例初始化时最低一般新部署环境推荐首选dm_service_installer.sh任何时间中等最高已存在实例补注册、批量部署、多实例管理dmservice.sh图形化工具任何时间最低中等有图形桌面的环境适合不熟悉命令行的同学从我实际项目经验来看最推荐的组合是新环境直接用dminit自动注册存量实例或需要精细控制时用dm_service_installer.sh。图形工具适合单机有人值守的场景批量操作还是命令行效率高。2. 实操前准备环境检查与关键工具定位不管用哪种方法动手之前有几件事必须先确认否则后面要么注册失败要么注册完服务起不来。我在项目里见过太多次因为准备工作没做好白白折腾一两个小时的情况。2.1 确认安装目录、实例状态和运行账号首先要确认达梦数据库装在哪里。通常安装时会有一个DM_HOME的概念比如/home/dmdba/dmdbms。确认方式很简单用安装时的用户一般是dmdba执行echo $DM_HOME如果没有输出可以在安装目录下找关键文件确认ls -l /home/dmdba/dmdbms/bin/dmserver ls -l /home/dmdba/dmdbms/tool/dmservice.sh ls -l /home/dmdba/dmdbms/script/root/dm_service_installer.sh这三个文件对应了三种注册方法的核心工具只要这些文件在后面就没什么大问题。其次要确认实例是否已经初始化完成。注册服务本身不会初始化实例它只是给已有实例做一个“壳”。如果还没有dm.ini文件不管哪种注册方式都会失败。实例的dm.ini通常在数据目录下比如/data/dmdata/DAMENG/dm.ini。最后是运行账号。达梦服务不能以root账号启动这是安全基线要求所以注册服务前必须先确认实例文件属主是普通用户如dmdba后续服务也是以这个用户身份运行的。2.2 搞清楚三个工具各自的位置和分工三条路径对应的工具分别在安装目录的不同位置我用表格整理一下工具典型路径用途dminit$DM_HOME/bin/dminit初始化实例支持自动注册服务dm_service_installer.sh$DM_HOME/script/root/dm_service_installer.sh命令行注册/卸载服务最灵活dmservice.sh$DM_HOME/tool/dmservice.sh图形化注册服务低门槛注意dm_service_installer.sh在script/root目录下意味着它需要root权限执行而dmservice.sh在tool目录下通常用普通用户执行也行但注册动作本质还是要sudo提权。这些细节在后面操作里会反复遇到。3. 方法一dminit初始化时自动注册服务新环境首选这是我最推荐的方式前提是你正在做全新部署。它的好处是一次初始化实例和服务同时搞定不用额外操作。很多人在dminit跑完后发现没有注册服务其实是忽略了一个关键参数和后续的root脚本执行步骤下面拆开讲。3.1 自动注册的两个阶段dminit生成脚本 root执行脚本dminit本身不会直接去改systemd配置它不是root身份运行的也没权限改系统目录。它的逻辑是初始化参数里如果指定了实例名和端口那么在数据目录初始化完成后自动生成一个服务启动脚本如DmServiceDMSERVER和对应的systemd/init配置模板放在安装目录的script/root/下。所以完整的自动注册流程其实是两段式的# 第一阶段以 dmdba 用户初始化实例 su - dmdba cd /home/dmdba/dmdbms/bin ./dminit PATH/data/dmdata INSTANCE_NAMEDMSERVER PAGE_SIZE8 EXTENT_SIZE16 SYSDBA_PWDYourStrongPwd1 # 第二阶段以 root 用户执行自动生成的服务注册脚本 cd /home/dmdba/dmdbms/script/root ./dm_service_installer.sh -t dmserver -dm_ini /data/dmdata/DMSERVER/dm.ini -p DMSERVER第二阶段就是脚本注册所以严格来说自动注册也绕不开dm_service_installer.sh。但没关系第一阶段执行完dminit后系统会明确提示你去script/root目录执行这个脚本。很多人只做了第一步就以为完事了这是最常见的误区。3.2 dminit关键参数说明dminit参数有不少但和服务注册直接相关的就这几个参数含义示例PATH数据文件存放目录必须是绝对路径/data/dmdataINSTANCE_NAME实例名默认DAMENG服务名和它强相关DMSERVERPAGE_SIZE页大小单位KB一般选8或168SYSDBA_PWD系统管理员密码必须有复杂度YourStrongPwd1PORT_NUM数据库服务端口默认52365236页大小和端口如果规划不好后面迁移数据或改配置会非常痛苦。页大小一旦初始化就不能改后面想调只能重新初始化所以这一步一定要想清楚。3.3 自动注册方式的注意事项第一dminit生成的服务脚本是和你指定的INSTANCE_NAME绑定的如果初始化时没指定INSTANCE_NAME默认实例名是DAMENG服务名也会变成DmServiceDAMENG。这本身没问题但如果你一台机器上规划多个实例建议显式指定实例名避免搞混。第二root执行注册脚本时如果/etc/systemd/system/下已经有同名服务会提示覆盖或失败所以实例名要唯一。第三注册完成后立刻验证一下服务状态systemctl status DmServiceDMSERVER如果显示active (running)说明自动注册这条链路已经打通了。4. 方法二dm_service_installer.sh命令行手动注册最灵活如果说dminit自动注册是“顺带手”的那dm_service_installer.sh就是专门干注册这件事的。它最大的价值在于实例已经存在、甚至实例目录被移动过都可以用它补注册而且参数控制精细适合批量部署和多实例管理。4.1 脚本核心参数逐项拆解dm_service_installer.sh的参数不多但每个都得理解透./dm_service_installer.sh -t dmserver -p DMSERVER -dm_ini /data/dmdata/DMSERVER/dm.ini -m true参数含义备注-t服务类型填dmserver代表数据库服务还有dmap等其他类型-p服务名后缀最终服务名会是 DmService p值如DmServiceDMSERVER-dm_ini实例配置文件路径必须指向dm.ini否则服务不知道启动哪个实例-m是否注册为系统服务填true会用systemd方式注册默认也是true注意-t和-p别搞反了我见过有人把实例名写进-t参数结果服务起不来。4.2 已存在实例的补注册完整流程假设你的实例目录是/data/dmdata/DMSERVER但之前初始化时忘记注册服务现在要补上。完整操作是这样的# 切到root sudo su - # 进入脚本目录 cd /home/dmdba/dmdbms/script/root # 执行注册 ./dm_service_installer.sh -t dmserver -p DMSERVER -dm_ini /data/dmdata/DMSERVER/dm.ini # 重载systemd配置 systemctl daemon-reload # 启动服务 systemctl start DmServiceDMSERVER # 设置开机自启 systemctl enable DmServiceDMSERVER # 确认状态 systemctl status DmServiceDMSERVER执行完systemctl start后我通常会补两个验证动作一是看端口监听二是看进程归属。ss -lnpt | grep 5236 ps -ef | grep dmserver | grep -v grep如果端口在监听进程属主是dmdba说明服务已经正常接管实例了。4.3 多实例环境下的注册实战一个物理机跑多个达梦实例时dm_service_installer.sh的价值最明显。我有一次在一台机器上部署了三个实例端口分别是5236、5237、5238实例名分别是DM1、DM2、DM3。三个服务注册逻辑完全一样只是参数不同./dm_service_installer.sh -t dmserver -p DM1 -dm_ini /data/dmdata/DM1/dm.ini ./dm_service_installer.sh -t dmserver -p DM2 -dm_ini /data/dmdata/DM2/dm.ini ./dm_service_installer.sh -t dmserver -p DM3 -dm_ini /data/dmdata/DM3/dm.ini这里有一个很重要的经验每个实例的dm.ini里PORT_NUM必须不同否则会出现端口冲突服务能启动但客户端连接串到别的实例上去了。注册前最好统一核对一遍端口规划。4.4 命令行注册的避坑心得使用dm_service_installer.sh时有几个容易被忽视的细节会影响成败。第一个是关于-m参数。有些版本里服务注册默认会写入systemd但如果你在容器环境中操作systemd可能不是PID 1进程此时注册服务会失败或产生警告。容器场景推荐直接用命令方式启动实例非要注册服务的话需要额外处理容器的init问题。第二个是关于脚本执行路径。脚本在script/root下如果你用普通用户执行会直接报权限错误如果找不到脚本先检查是否切换了root用户或者安装目录权限有没有问题。第三个是服务名别用下划线。systemd的unit名称建议由字母、数字、连字符组成下划线虽然不一定报错但后续用systemctl操作时容易遇到各种解析问题。实例名里带下划线时注册前先评估一下要不要改。5. 方法三dmservice.sh图形化工具注册低门槛但依赖桌面环境三种方法里图形化工具dmservice.sh是我觉得最能降低新手门槛的。它把服务注册、卸载、启停集中在一个界面里鼠标点一点就能完成。不过它有个硬性前提当前环境得有图形化桌面环境或者能做X11转发。纯命令行服务器上基本用不了。5.1 工具界面能干什么在安装了达梦的机器上进入$DM_HOME/tool目录执行./dmservice.sh界面会列出当前机器上所有达梦相关的服务和实例状态常见的操作集中在这几个功能操作方式说明注册服务点击菜单/按钮选择实例dm.ini底层还是调dm_service_installer.sh注销服务选中服务后点击注销同时停止服务并移除自启配置启动/停止服务选中服务点击对应按钮等价于systemctl start/stop查看服务状态界面状态列直接显示比命令行直观很多5.2 图形化注册的具体操作步骤这里以我实际用过的一个场景为例某台测试服务器上装的是带GNOME桌面的系统开发同事不熟悉命令行我让他用dmservice.sh注册一个新初始化的实例操作路径是这样的。第一步打开终端切到达梦tool目录启动工具cd /home/dmdba/dmdbms/tool ./dmservice.sh工具启动后界面上会列出当前用户能发现的达梦数据目录和配置。第二步点击“注册服务”或类似按钮在弹出框中指定实例的dm.ini路径比如/data/dmdata/DMSERVER/dm.ini工具会自动识别实例名。第三步确认服务名默认是DmServiceDMSERVER可以按规范调整。第四步点击确认工具会弹出一个终端窗口要求输入root密码完成注册。本质上它内部也是调用dm_service_installer.sh只是把参数包装好了。注册完成后直接在界面里点击“启动”按钮看到状态变为“运行中”就完事了。5.3 没有图形界面时的两个替代思路生产环境大多数是没有桌面的但我还是想提两个替代方案。一个是用SSH的X11转发。如果你的本机是Windows/Mac/Linux桌面可以用支持X11转发的SSH客户端比如MobaXterm、Xshell配合Xmanager连接服务器后执行dmservice.sh图形界面就会弹到本地。另一个是干脆不用图形工具改用命令行脚本。我的原则是凡是图形工具能干的命令行脚本基本都能干而且更好批量操作。图形工具适合单机临时处理自动化运维场景还是老老实实用dm_service_installer.sh。6. 注册完成后的服务管理与日常运维服务和实例绑定之后日常管理就不再是直接操作dmserver了而是通过系统服务命令来统一调度。这一章我要把注册完成后怎么管、怎么看、怎么查这件事讲透。6.1 systemctl与service命令双轨制达梦服务注册后在systemd环境下推荐用systemctl在SysV init环境下用service命令。两者本质上都是去调用服务脚本。# systemd 风格 systemctl start DmServiceDMSERVER systemctl stop DmServiceDMSERVER systemctl restart DmServiceDMSERVER systemctl enable DmServiceDMSERVER systemctl status DmServiceDMSERVER # SysV init 风格 service DmServiceDMSERVER start service DmServiceDMSERVER stop service DmServiceDMSERVER status有一点要特别注意systemctl enable设置的开机自启依赖的是服务注册时生成的systemd配置如果注册时没有用root权限或注册脚本有问题enable会失败并提示找不到unit文件。6.2 服务启停的日志排查路径服务启动失败时第一反应不应该是瞎试而是按顺序排查这四类信息1. 服务状态信息systemctl status DmServiceDMSERVER 2. 服务脚本内容cat /usr/lib/systemd/system/DmServiceDMSERVER.service 3. 达梦实例日志/data/dmdata/DMSERVER/log/dm_DMSERVER_*.log 4. 操作系统日志journalctl -u DmServiceDMSERVER我尤其推荐先看第三项达梦实例日志会记录启动过程中的关键错误比如数据文件损坏、redo日志异常、端口冲突等这些信息直接决定了你下一步怎么处理。journalctl里的信息往往比较抽象而达梦自己的日志会告诉你“哪个文件打不开”“哪个参数不合法”定位问题的效率高很多。6.3 服务启停常用命令速查操作命令启动服务systemctl start DmServiceDMSERVER停止服务systemctl stop DmServiceDMSERVER重启服务systemctl restart DmServiceDMSERVER查看状态systemctl status DmServiceDMSERVER开机自启systemctl enable DmServiceDMSERVER取消自启systemctl disable DmServiceDMSERVER查看服务文件systemctl cat DmServiceDMSERVER7. 常见问题与排查技巧实录最后这部分我整理了实际项目中遇到的几类高发问题按出现频率排了个序。有些问题看起来很小但在现场能把人卡半天。7.1 高频问题速查表现象可能原因处理思路执行注册脚本报Permission denied没有使用root用户切换到root再执行systemctl找不到服务注册脚本没执行成功或unit文件路径不对检查/etc/systemd/system/下是否有DmService文件服务启动后立即退出dm.ini路径不对或数据目录权限不对查看实例日志确认具体报错端口5236被占用同一台机器多实例未改端口或其他应用占用用ss -lnpt确认占用方服务状态active但连不上数据库监听地址或防火墙问题检查dm.ini的LISTENER_IP确认防火墙放行数据库重启后服务没自启enable没执行或使用普通用户注册root执行systemctl enable7.2 现场印象最深的两个坑第一个坑是服务名带了下划线导致systemd管理异常。当时一个实例名是DM_PROD注册后服务名叫DmServiceDM_PROD。看着没什么问题但systemctl start时偶尔会报“Failed at step EXEC spawning /bin/sh: Permission denied”之类的诡异错误折腾了半天最后把实例名改成DMPROD重新注册就好了。systemd的unit名里带下划线虽然不算非法但在某些版本或SELinux策略下有各种幺蛾子。我的建议是实例名和服务名统一用大写字母数字组合别用下划线。第二个坑是实例目录被迁移过但没同步更新注册服务。有一次开发反馈“数据库连不上”排查后发现服务起的是另一个旧路径的实例新目录的实例根本没被服务托管。原因是实例目录从/data/dmdata迁移到了/data2/dmdata但服务脚本里的ExecStart还指向旧目录。解决办法很简单# 先停止服务 systemctl stop DmServiceDMSERVER # 重新注册指向新路径 ./dm_service_installer.sh -t dmserver -p DMSERVER -dm_ini /data2/dmdata/DMSERVER/dm.ini # 重新加载并启动 systemctl daemon-reload systemctl start DmServiceDMSERVER7.3 注册服务前的最终检查清单每次注册服务前我都习惯按这份清单过一遍基本可以避开90%的坑[ ] 实例是否已经用dminit初始化完成dm.ini文件是否存在[ ] 数据目录属主是否已改成dmdba权限是否为755[ ] root用户是否已准备好注册脚本需要有写systemd目录的权限[ ] 端口规划是否合理本机有没有其他实例占用相同端口[ ] 实例名是否符合命名规范避免下划线[ ] dm.ini里的PORT_NUM、INSTANCE_NAME和注册参数是否一致在实际工作中服务注册看着是小事但它是数据库能否稳定跑起来、能否被上层应用正常纳管的关键环节。三种方法各有适用场景新环境推荐dminit自动注册存量实例和批量管理用dm_service_installer.sh最舒服偶尔维护用一下图形工具也完全够用。我自己在项目里用得最多的是命令行脚本方式因为服务器基本都是纯命令行的而且一套脚本走遍所有环境可重复性高。不过如果你是刚接触达梦第一次部署建议老老实实走一遍图形工具的操作流程把服务和实例之间的对应关系看清楚后面再用命令行心里就有底了。最后再提醒一句注册完一定先systemctl status确认状态别只看到服务文件生成就觉得万事大吉。
返回列表