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

资讯详情

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

达梦数据库服务注册全攻略:dmserver与systemd/Windows服务实践

达梦数据库服务注册全攻略:dmserver与systemd/Windows服务实践 1. 服务注册前先搞清楚达梦的进程模型和三种方法的选型1.1 达梦数据库有哪些需要注册的服务接触达梦数据库的这几年我每次在群里看到数据库重启后又连不上了这类问题十有八九是同一个原因安装完达梦之后只把数据库初始化出来了没有把进程注册成系统服务。服务器一重启dmserver不会自己起来业务自然就断了。先说清楚达梦数据库的核心进程这个搞明白了后面注册服务才不会糊里糊涂。达梦数据库安装完之后真正干活的核心进程是dmserver它对应一个数据库实例。每个实例在初始化的时候会生成一个 DM.ini 配置文件这个文件里写了端口号、内存参数、数据文件路径等核心配置。你执行启动命令的时候本质上就是告诉 dmserver 进程去读这个 DM.ini把实例跑起来。除了 dmserver还有一个非常容易被忽略的辅助进程叫dmap全称是 DaMeng Auxiliary Process。它负责备份还原、日志归档这些管理任务。很多人在 Linux 上只注册了 dmserver没注册 dmap结果后续做定时备份的时候发现备份任务起不来或者日志报无法连接辅助服务这时候才想起来补注册。在数据守护Data Watch和高可用场景下还会有 dmwatch、dmmonitor、dmrww 等服务。不过日常单机部署你只需要关注 dmserver 和 dmap 这两个就够了。搞清楚这个之后我再带你逐一看服务注册的三种主流方式。1.2 服务注册到底在干什么为什么不能偷懒很多人第一次接触注册服务这个概念的时候会把它理解成写一个启动脚本。这个理解不完全对。启动脚本是死的它只是把命令封装了一下进程起来之后跟操作系统没有任何关联。但服务注册不一样它是把进程托管给操作系统的服务管理器让系统在开机时自动拉起它在进程异常退出时按照策略重启它在系统关闭时优雅地停掉它。用 Linux 系统举个例子你把达梦的启动命令直接扔到/etc/rc.local里这叫开机自启脚本。但如果你用的是 systemd 管理的服务那么systemctl status DmServiceDM能看状态systemctl restart DmServiceDM能重启systemctl enable DmServiceDM能设开机自启进程崩溃后还能自动拉起。这个差距在真正出问题的时候会特别明显。Windows 上也是一样的道理。用任务计划程序或者启动文件夹去启动达梦跟你把达梦注册成一个 Windows 服务然后通过net start DmServiceDM这个命令来管理体验完全不同。尤其当服务器是无人值守的数据库服务能不能可靠地随系统启动直接决定了业务恢复的速度。所以注册服务的本质就是让达梦的进程从手工拉起的临时进程变成操作系统托管的受管服务。这一步偷懒后面运维会拿十倍的精力来偿还。1.3 三种注册方式怎么选达梦数据库在不同操作系统上提供的服务注册手段并不完全一样。根据我自己的使用经验我把最常见、也最可靠的三种方式整理成了下面这个表格方式适用平台操作方式定制程度推荐场景官方脚本 dm_service_installer.shLinux一条命令完成注册中单实例、多实例均可最推荐手写 systemd 单元文件Linux编写 .service 文件高多实例、特殊环境变量、资源限制场景Windows 服务工具Windows图形化界面 命令行中Windows 环境的安装与补注册如果你是刚接触达梦我建议你把重点放在第一种方案上这是官方提供、最不容易出错的方式。等你对服务注册底层原理熟悉了再去研究第二种因为它能让你在遇到奇葩环境时具备手工解决问题的能力。第三种是 Windows 专属如果你是运维人员Windows 服务器上部署达梦也是个常见场景不能忽视。下面我就把三种方法逐一拆开每一步都讲清楚为什么这么做参数怎么填坑在哪里。2. 方法一使用官方脚本 dm_service_installer.sh 注册2.1 脚本位置与基本用法在 Linux 下安装达梦数据库之后安装目录下会有两个关键目录一个是bin放着 dmserver、dminit、disql 这些可执行文件另一个是script里面放着各种辅助脚本。注册服务用的脚本就在script/root目录下名字叫dm_service_installer.sh。以默认安装路径/opt/dmdbms为例这个脚本的完整路径是/opt/dmdbms/script/root/dm_service_installer.sh注意这个脚本必须使用 root 用户执行因为创建系统服务需要 root 权限。如果你用 dmdba 用户去跑会直接报权限不足。基本用法如下/opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -p DAMENG -dm_ini /opt/dmdbms/data/DAMENG/DM.ini这里三个参数的含义我来拆解一下-t表示服务类型常见的有dmserver和dmap。注册 dmserver 的时候需要指定-dm_ini注册 dmap 的时候不需要。-p是实例名后缀最终生成的服务名是DmService加上这个后缀比如上面命令会生成DmServiceDAMENG.service。-dm_ini是数据库实例的 DM.ini 配置文件的绝对路径这个路径一定要写对写错的话服务能注册成功但启动必然会失败。这里有一个很容易忽略的细节-p参数的大小写会直接体现在服务名里。你写DmServiceDM还是DmServiceDm在系统里就是两个完全不同的服务名。所以最好在初始化实例的时候就定好规范的实例名比如统一用大写。2.2 完整实操从初始化实例到注册 dmserver 服务很多新手第一次搞这套流程容易在中间环节断掉。我把完整链路走一遍你照着做基本不会出问题。第一步先确认你已经初始化了实例。如果还没有实例用 dmdba 用户执行下面这条命令su - dmdba /opt/dmdbms/bin/dminit path/opt/dmdbms/data INSTANCE_NAMEDAMENG执行完能看到初始化成功的提示并且在/opt/dmdbms/data/DAMENG目录下生成 DM.ini、SYSTEM.DBF、ROLL.DBF 这些文件。到这一步实例就算初始化好了。第二步确认 DM.ini 的完整路径。如果你用的默认路径那大概率是/opt/dmdbms/data/DAMENG/DM.ini用ls -l看一看这个文件是否存在。第三步切回 root 用户执行注册命令su - root /opt/dmdbms/script/root/dm_service_installer.sh -t dmserver -p DAMENG -dm_ini /opt/dmdbms/data/DAMENG/DM.ini执行成功后脚本会打印一条注册成功的提示。第四步验证服务是否注册成功systemctl status DmServiceDAMENG如果能看到 loaded 的提示就说明服务已经被 systemd 接管了。接下来正常启动systemctl start DmServiceDAMENG systemctl enable DmServiceDAMENGstart是启动enable是设置开机自启这两个命令要分开执行。很多人在这一步只执行了start结果服务器重启后数据库还是没起来就是因为漏掉了enable。2.3 需要避开的坑这个脚本我第一次用的时候其实没有一次通过。后来踩了几个坑总结出来给你参考。第一个坑是环境变量问题。如果你在su - root之后直接执行脚本有可能会提示找不到dmserver相关路径。这个问题的根源是 root 用户的环境变量里没有达梦相关的配置。解决办法有两个要么在脚本路径前加上达梦的 bin 目录要么先执行一遍安装目录下的环境变量脚本比如source /opt/dmdbms/bin/dm_env.sh再执行注册命令。第二个坑是实例名的大小写。有些版本对大小写不敏感有些版本敏感这导致的主要问题不是注册失败而是你后续管理服务的时候分不清DmServiceDAMENG和DmServiceDameng到底哪个是自己注册的。所以我建议你在初始化实例的时候就把实例名定成统一格式比如全大写后续的服务名、脚本都按这个规范来。第三个坑是端口被占用。如果之前手动启动过 dmserver并且进程还没退出这时候再注册服务并启动会报端口绑定失败。解决方法是先杀掉残留的 dmserver 进程再通过 systemctl 启动服务。第四个坑dmap 服务忘了注册。我上面提到过dmap 负责备份、日志这些辅助功能。注册 dmap 的命令更简单不需要指定 DM.ini/opt/dmdbms/script/root/dm_service_installer.sh -t dmap执行完同样会有DmServiceDmap之类的服务生成。建议你在注册 dmserver 的同时把 dmap 也一起注册了避免后续要用的时候抓瞎。3. 方法二手写 systemd 单元文件实现定制化注册3.1 什么时候没必要用脚本而需要手写 unit官方脚本用起来确实方便一条命令就能生成服务。但在某些特殊场景下脚本生成的服务模板可能满足不了你的需求这时候就需要手工写一个 systemd 单元文件。我遇到过的典型场景有这几种。第一种是多实例部署。一台物理机上要跑两套达梦实例比如一套是生产库一套是测试库。官方脚本可以分别注册但如果你对两个实例的资源配额有不同要求比如生产库要限制LimitNOFILE最大文件句柄数为 65536测试库默认就行这时候脚本生成的服务模板就很难灵活处理。第二种是启动前需要设置额外的环境变量。有些业务场景下dmserver 启动前需要先加载某些 LD_LIBRARY_PATH或者需要设置特定的时区变量这些内容在官方生成的 unit 文件里不一定有手工改一下反而更清晰。第三种是官方脚本在某些特殊发行版上不稳定。我在华为欧拉系统上部署过一次达梦脚本本身能跑通但生成的 unit 文件在某些系统版本上会存在依赖问题比如Afternetwork.target在网络完全就绪前就启动了服务。这种时候手工调整 unit 文件的依赖关系能最大化避免启动顺序带来的坑。3.2 一个能用的 unit 文件模板既然选择了手工写那就得把 systemd 单元文件的关键字段搞清楚。我给你一个我实际用过的模板你在vim /etc/systemd/system/DmServiceDAMENG.service新建文件后直接替换路径就能用[Unit] DescriptionDM Database Server Instance Afternetwork.target [Service] Userdmdba Groupdmdba Typesimple EnvironmentPATH/opt/dmdbms/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin ExecStart/opt/dmdbms/bin/dmserver /opt/dmdbms/data/DAMENG/DM.ini Restarton-failure RestartSec10 LimitNOFILE65536 [Install] WantedBymulti-user.target这里逐一解释关键字段。Userdmdba和Groupdmdba是最重要的两行它决定了 dmserver 进程以哪个身份运行。绝大多数达梦文件在安装时就已经把属主设置成了 dmdba如果你非要用 root 去启动数据库会遇到权限校验失败的问题因为达梦的 symode 权限检查是不允许 root 直接操作数据库实例文件的。Typesimple表示 dmserver 直接在前台运行不做 fork 操作。dmserver 本身支持以非守护方式启动所以 Typesimple 是可行的。Restarton-failure表示当 dmserver 异常退出时自动重启RestartSec10表示重启前等 10 秒。这一步很关键生产环境全靠它来保证数据库挂了之后能自动恢复。写完之后执行下面两条命令让 systemd 重新加载配置并设置开机自启systemctl daemon-reload systemctl enable --now DmServiceDAMENGenable --now这个组合命令很实用它把设置开机自启和立即启动两步合并成一步执行了省得你再多敲一条命令。3.3 多实例与开机自启的进阶玩法手工写 unit 文件的真正优势在多实例场景下才能完全体现出来。假设你现在要在一台服务器上跑两套达梦实例一套生产库放在/opt/dmdbms/data/DAMENG一套测试库放在/opt/dmdbms/data/DMTEST。你需要准备两个 unit 文件内容基本一样但ExecStart指向不同的 DM.ini服务名也区分开。生产库的服务文件保持我刚才给的那个模板测试库的服务文件对资源限制做弱化处理比如把LimitNOFILE调低或者干脆不设置。这样两个实例共用一台物理机但各自有独立的资源配置互不干扰。多实例场景下还有一个容易踩的坑两个实例不能用同一个端口。DM 默认端口是 5236第二套实例在初始化的时候必须指定一个不同的端口比如 5237。如果你在 unit 文件里看到服务能启动但客户端连不上优先检查一下是不是端口冲突。另一个进阶玩法是设置服务依赖。如果你的达梦服务需要在某个网络挂载点比如 NFS 存储就绪之后才能启动可以在[Unit]区块里加一行Requiresnetwork-online.target Afternetwork-online.target这样 systemd 会等网络完全就绪后才去拉起达梦服务避免因为网络挂载点没起来导致数据文件读取失败。4. 方法三Windows 平台下注册达梦服务4.1 安装时勾选注册与 DBCA 补注册Windows 平台上的达梦数据库服务注册方式和 Linux 很不一样。Windows 没有 systemd但是有服务控制管理器SCM达梦在安装和配置时也提供了对应的图形化工具。最常见的一种方式是在安装达梦数据库的时候直接勾选注册为 Windows 服务。通常在安装向导的数据库配置环节会有一个选项让你选择是否把数据库实例注册成系统服务服务名一般就是DmServiceDAMENG这种格式。如果你在安装时勾选了这个选项装完数据库之后打开 Windows 的服务管理器按 WinR输入 services.msc就能看到达梦数据库的服务已经在列表里了。第二种方式是用达梦自带的数据库配置助手DBCA补注册。这种方式适合安装时没有勾选注册服务的场景比如你用免安装版解压部署的达梦或者安装时跳过了配置环节。打开 DBCA 之后选择注册数据库服务工具会扫描当前机器上已经初始化好的实例目录你只需要把实例的 DM.ini 路径指给它选择要注册的服务类型dmserver、dmap 等点确定工具就会帮你完成服务注册。这个过程和 Linux 上执行dm_service_installer.sh的底层逻辑是一样的只不过包装成了图形化向导。4.2 图形化注册与手动管理的区别Windows 下注册服务图形化工具的方便之处在于它会自动帮你处理好服务名、启动类型、登录账户这些配置不太容易出错。不过你要是想深入管理还是要知道几个关键操作。注册完成之后服务管理器里能看到类似下面的服务DmServiceDAMENG数据库实例服务DmServiceDmap辅助进程服务右键点击服务你可以设置启动类型为自动或手动。如果你希望数据库随系统开机自动启动启动类型一定要选择自动。如果只是为了测试选手动就行。实际操作中我有一个建议Windows 环境下如果数据盘是动态磁盘或者有外部存储依赖不要把达梦服务的启动类型设置成自动建议设置成自动延迟启动给外部存储留出加载时间。我遇到过几次 Windows 开机后数据库服务启动失败排查下来就是数据盘还没就绪服务已经尝试启动了结果读不到 DM.ini。4.3 Windows 服务的启动、停止与自启配置Windows 服务注册好之后日常运维主要靠两个命令和一个图形界面。图形界面就是 services.msc这是最直观的方式右键启动、停止、重启然后看一眼服务状态适合偶尔操作。命令行管理的效率更高在你需要写批处理脚本的时候特别管用。下面两个命令要记牢net start DmServiceDAMENG net stop DmServiceDAMENGnet start启动服务net stop停止服务。注意这些命令要以管理员身份运行的命令提示符来执行否则权限不足。如果你需要将某个服务设置成开机自启也可以用命令行操作sc config DmServiceDAMENG start autosc config是 Windows 服务控制管理器提供的命令start auto表示自动启动。注意等号后面有一个空格这个空格不能省否则命令会报错。Windows 下如果服务启动失败我一般会先看 Windows 事件查看器eventvwr.msc在Windows 日志 - 系统里按时间筛选有没有达梦相关的错误。这一步通常能直接定位到是文件权限问题、端口占用问题还是依赖服务没启动的问题比盲猜高效很多。5. 注册完成后的连接验证与常见问题排查5.1 服务状态与端口验证服务注册完成并启动之后我强烈建议做一次完整的全链路验证不要想当然地认为服务启动了就等于数据库能正常访问了。Linux 下用三个命令依次验证systemctl status DmServiceDAMENG ps -ef | grep dmserver ss -lntp | grep 5236第一条命令看服务状态是不是 active (running)第二条命令确认 dmserver 进程确实在跑第三条命令看端口 5236 是否处于监听状态。三条都通过说明数据库实例层面没问题。接下来验证数据库能不能正常登录。切到 dmdba 用户下用达梦自带的 disql 工具测试su - dmdba /opt/dmdbms/bin/disql SYSDBA/SYSDBA001localhost:5236如果看到服务器[localhost:5236]处于打开状态的提示说明数据库登录正常。执行一个最简单的查询select status$ from v$instance;确认实例状态为 OPEN这个数据库就算真正可用了。Windows 下验证类似net start | findstr DmService看服务启动状态netstat -ano | findstr 5236看端口监听然后同样用 disql 测试登录。5.2 Navicat 与 DBeaver 连接达梦的配置要点热词里提到 Navicat 连接达梦数据库还有 DBeaver 连接达梦数据库这确实是服务注册完成后最常见的验证手段。我在这里把两边的配置要点都提一下。Navicat 连接达梦时在连接配置界面选择达梦数据库类型如果版本支持主机填服务器 IP端口填 5236用户名填 SYSDBA密码填你安装时设置的密码。首次连接如果提示找不到达梦驱动需要在 Navicat 的驱动管理器里添加达梦的 JDBC 驱动包这个驱动包在达梦安装目录的drivers/jdbc目录下可以找到文件名一般是DmJdbcDriver18.jar。DBeaver 连接达梦的办法也类似它自带的驱动库可能不含达梦的驱动需要手动添加。下载好 DmJdbcDriver18.jar 之后在 DBeaver 的数据库驱动管理器里新建一个驱动类名填dm.jdbc.driver.DmDriverURL 模板填jdbc:dm://{host}:{port}然后把 jar 包加进去就能正常连接了。如果服务注册好了、端口也监听了但 Navicat 或 DBeaver 连接超时十有八九是服务器防火墙没放行 5236 端口。Linux 上用firewall-cmd --add-port5236/tcp --permanent firewall-cmd --reload放行Windows 上在高级安全 Windows Defender 防火墙里添加入站规则即可。5.3 常见问题排查速查表把我在实操中遇到的高频问题和排查思路整理成了一张速查表你可以直接保存起来充当运维笔记现象可能原因排查方法服务注册成功但启动失败DM.ini 路径写错或文件权限不对查看journalctl -u DmServiceDAMENG的日志用ll /opt/dmdbms/data/DAMENG/DM.ini确认属主是 dmdba服务启动后端口没监听实例启动到一半挂了或端口被占用ss -lntp | grep 5236查看是否被占用查看达梦运行日志$DM_HOME/log系统重启后数据库没起来服务没有设置开机自启systemctl enable DmServiceDAMENG重新设置Navicat 连接超时防火墙未放行端口检查防火墙规则用telnet IP 5236测试端口连通性执行备份任务时提示连接辅助进程失败dmap 服务没有注册补注册 dmap 服务并启动注册脚本提示找不到 dmserverroot 环境变量里没有达梦路径先source /opt/dmdbms/bin/dm_env.sh再执行注册脚本DISQL 登录提示端口错误实例实际端口不是默认 5236查看 DM.ini 里的 PORT_NUM 参数确认实际端口5.4 服务注册与国产化中间件适配的关系热词里有一组关键词很典型nacos 账户密码能登录但是服务注册失败 401、nacos 适配达梦数据库、flowable7.x 达梦数据库改造。这里我要专门提醒一句不要把数据库服务注册和中间件服务注册混为一谈。Nacos、Spring Cloud 里的服务注册指的是应用实例在注册中心里登记自己的网络地址让其他服务能找到它。达梦数据库的服务注册指的是把 dmserver 进程托管给操作系统服务管理器。两者完全是两个层面的东西。但在国产化替换的项目里这两者确实经常同时出现。原因很简单当你的 Nacos、Flowable 这些中间件要把数据源切换到达梦数据库时数据库实例本身必须先稳定可靠地运行起来。如果达梦服务没注册好开机不自启那么 Nacos 会把达梦库当成数据源来用一旦达梦数据库实例没起来Nacos 的数据源初始化就会失败后续的服务注册和配置管理自然也会报错。所以你在做这类项目时第一步就是先把达梦数据库服务注册好确保系统重启后数据库一定在线然后再去配置 Nacos 的数据源指向达梦最后才是业务服务的注册与发现。依赖顺序搞反了排查问题时会绕很多弯路。6. 我在生产环境里的注册服务习惯6.1 统一规范实例名、服务名、端口对应关系多次踩坑之后我给自己的所有达梦部署定了一套规范这里分享给你。实例名全部使用大写字母比如 DAMENG、DMTEST。服务名统一是DmService加上实例名这样就形成了DmServiceDAMENG这种形式。端口号单独用一个文档记录实例名、服务名、端口、数据目录一一对应绝不含糊。这套规范的意义在于当服务器上有五六套达梦实例时你不用去猜某个服务对应哪个数据库。看到服务名就能直接知道它的实例名和数据目录位置排查问题的速度能快很多。6.2 服务文件纳入版本控制我在生产环境里还有一个习惯就是把注册服务相关的文件纳入版本控制。Linux 下的 unit 文件、Windows 下的注册命令都写成文档或脚本放进 Git 仓库。这样即使服务器重装我也能快速复用之前的部署配置不用每次重新摸索。另外unit 文件里那些环境变量、资源限制参数都是项目积累下来的重要经验。把它们纳入版本控制相当于把踩过的坑也一起沉淀下来了对团队新人上手也有很大帮助。6.3 最后分享一个小技巧最后说一个我实际用过很多次的技巧注册完服务后不要急着把它当成万事大吉一定要先做一轮重启验证。具体做法是systemctl restart DmServiceDAMENG然后等几十秒再检查进程、端口、数据库状态。如果重启这一关能过说明服务注册基本没问题。如果重启后服务起不来那就是现在排查的好时机千万别把这个隐患留着。这个习惯帮我挡住了好几次生产事故。数据库服务看着是注册成功了但实际重启时会因为路径问题、权限问题起不来。早发现早处理总比业务真停了再手忙脚乱好得多。
返回列表