ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

达梦DM8实战:从安装迁移到备份调优的国产数据库指南

达梦DM8实战:从安装迁移到备份调优的国产数据库指南

说实话,刚接到要接触达梦 DM8 的任务时,我心里是打鼓的。国产数据库这几年呼声很高,但真到自己上手安装、迁移、调优,心里还是有点虚。带着这种心态,我给自己留了两周时间,白天处理手头工作,晚上在虚拟机里装环境、跑迁移、测兼容性,最后把一套原本跑在 MySQL 上的模拟业务系统完整迁到了 DM8 上。这篇笔记就是这段时间踩坑和实战的记录。从安装部署到 SQL 兼容,从备份恢复到性能调优,我会把每一步的决策思路和操作细节都交代清楚。如果你正在准备把系统切换到国产数据库,或者只是想把达梦 DM8 作为一门技能学起来,这篇文字应该能帮你少走不少弯路。

1. 学习 DM8 之前:为什么选它、怎么学

1.1 达梦 DM8 的真实定位与选型考量

达梦 DM8 是国产关系型数据库管理系统,采用自研内核,整体架构上对 Oracle 的兼容度做得非常高。对国内做应用开发的人来说,最直观的感受是它支持很多 Oracle 的习惯用法,比如 dual 表、NVL、DECODE、ROWNUM 这些,Oracle DBA 上手几乎没有额外成本。为什么国产化替代总是绕不开达梦?因为在党政、金融、能源这些对安全性和自主可控要求很高的行业里,达梦的适配案例和生态积累都比较靠前,很多项目的招标条件里直接写了必须支持国产数据库,DM8 自然成了优先候选。

选型不能只看标签,要看具体场景。我从实际体验出发的感受是:DM8 在 OLTP 场景下的稳定性是够用的,工具链也相对完整,比如 DTS 数据迁移工具、dmrman 备份恢复工具、disql 命令行客户端,能覆盖从开发到运维的基本诉求。但它不是一个让你无脑平替 MySQL 或者 Oracle 的东西,使用习惯上需要做不少调整。比如它的用户和表空间模型更接近 Oracle,和 MySQL 的那套"库就是 schema"的体系有明显差异。如果团队里全是 MySQL 背景的开发,前期适配成本要提前算进去。

再说一个很多人关心的点:达梦有没有生态?我的评估是,对于一个中小型业务系统,它该有的功能都有,官方文档也比较细,网上能搜到的实战帖子虽然不算海量,但解决 80% 的日常问题已经够了。真正冷门的问题,可能需要通过原厂支持来解决。所以选型时还要评估一下团队里有没有人能看懂日志、能不能做基础的问题排查,这比数据库本身的特性更重要。

1.2 从零开始的整体学习路线

我一开始也想把官方文档从头啃一遍,但很快就放弃了。原因很简单:DM8 的文档体量很大,一上来就啃细节容易迷失方向,而且很多内容不实际操作根本记不住。我后来采用的学习路线是:先装一个能跑的实例,再拿自己熟悉的业务 SQL 去试,然后重点过权限和备份恢复,最后才碰性能调优。

这样安排是有逻辑的。第一步是建立感性认识,至少要知道安装包怎么解压、服务怎么启动、disql 怎么登录。第二步是摸底兼容性,用你平时写的查询和增删改语句去测,哪些能跑通,哪些报错,报错了再查文档,这种带着问题去查的效率远高于盲读。第三步是运维基本功,权限体系和备份恢复是生产环境绝对不能跳过的环节,哪怕你只是做开发,也要了解账号怎么建、权限怎么授、备份怎么做。第四步是性能调优,如果没有真实压力和监控数据,调优就是空谈。

总的时间安排上,我建议第一周解决安装和基本使用,第二周做迁移适配和运维演练。如果项目周期紧,可以压缩到五天,但至少要把安装、建库、权限、备份、恢复这五件事完整走一遍。我的体会是,学 DM8 最好的方式不是看视频,而是拿一个具体的应用场景来驱动,比如把一个简单的 Web 系统从 MySQL 换成 DM8,跑一遍完整功能。这个过程里遇到的问题,比任何课程都值钱。

2. 环境准备与 DM8 安装部署全流程实录

2.1 安装前的软硬件准备

物料上需要准备一份 DM8 安装包,可以在达梦官方申请试用授权,同时准备好操作系统。我用的是某 Linux 发行版,内存建议 4GB 以上,磁盘至少 20GB。如果条件有限,虚拟机也可以,但要注意磁盘 IO 不要太差,否则后续初始化实例和备份恢复会慢得让人烦躁。

这里特别强调一件事:数据库千万不要用 root 用户直接安装和运行。官方也推荐新建一个专用用户,比如 dmdba。原因有两层:第一是安全,数据库进程以普通用户身份运行,即使出现安全问题,攻击者也不会直接拿到系统最高权限;第二是文件权限干净,避免安装出来的文件只能 root 读写,后面维护时切换到 dmdba 会到处碰壁。我用下面的命令完成了用户和环境准备:

groupadd dinstall useradd -g dinstall -m -d /home/dmdba dmdba passwd dmdba cat >> /etc/security/limits.conf <<EOF dmdba soft nofile 65536 dmdba hard nofile 65536 dmdba soft stack 10240 dmdba hard stack 10240 EOF

这个操作对应的是系统层面允许数据库进程打开足够多的文件、拥有足够的栈空间。如果不设置,高并发场景下容易出现"打开文件过多"或者栈溢出的问题。注意,修改 limits.conf 之后最好重新登录 dmdba 用户,用ulimit -n确认生效,不要想当然。

2.2 安装和建库实操

安装包上传到服务器后,一般是一个可执行的 .bin 文件。可以走图形界面安装,也可以静默安装。我在模拟环境里用的是命令行方式,命令很直接:

chmod +x DMInstall.bin ./DMInstall.bin -q

安装目录默认是/dm/dmdbms,我建议保持默认。原因是后面各种工具、日志、服务脚本都会基于这个路径去查找,保留默认可以省心不少。安装完成后,重心就转移到建库上。这里的核心工具是 dminit,你可以把它理解为达梦版的CREATE DATABASE命令,但需要在实例启动之前执行。

我执行的一条典型初始化命令是这样:

su - dmdba cd /dm/dmdbms/bin ./dminit PATH=/dm/data DB_NAME=DMSERVER INSTANCE_NAME=DMSERVER \ PORT_NUM=5236 PAGE_SIZE=16 EXTENT_SIZE=16 CHARSET=1 CASE_SENSITIVE=0

把几个关键参数解释一下。PATH 是数据文件存放目录;DB_NAME 是数据库名;INSTANCE_NAME 是实例名;PORT_NUM 是达梦的服务端口,默认 5236。PAGE_SIZE 是页大小,我设成 16K,OLTP 场景下比较稳妥,同时它也会影响表空间容量上限,初始化后再改基本不现实。CHARSET=1 表示使用 UTF-8 字符集,如果跟现有系统的字符集不一致,后续迁移容易出现乱码。CASE_SENSITIVE 控制标识符是否区分大小写,默认是 1,也就是区分大小写,和 Oracle 行为一致;如果将来要从 MySQL 老系统迁移,表名一般是小写,初始化为 0 会省很多麻烦。这几个参数在初始化之后基本不能动态修改,一定要在动手前想清楚。

dminit 执行成功后,会在 PATH 目录下生成数据库文件,同时在安装目录的 bin 下生成一个以实例名命名的服务脚本,比如 DmServiceDMSERVER。这说明实例的骨架已经搭好了。

2.3 启动服务并用 disql 验证

启动服务有两种方式。开发环境图省事,直接执行服务脚本:

/dm/dmdbms/bin/DmServiceDMSERVER start

如果想让数据库开机自启,可以切换到 root 用户执行DmServiceDMSERVER install,把它注册成系统服务。我在模拟环境里一般直接 start,重启机器后再手动起,毕竟演练环境没必要弄得太复杂。

启动完成后,用 disql 登录验证,命令如下:

/dm/dmdbms/bin/disql SYSDBA/SYSDBA@localhost:5236

登录成功后,执行一句最简单的SELECT 1;或者SELECT * FROM V$INSTANCE;,能正确返回就说明实例正常。这里有一个安全提示:首次登录后必须要立即修改 SYSDBA 的默认密码。默认密码在很多地方都能搜到,不修改等于把数据库大门敞开着。修改密码用ALTER USER SYSDBA IDENTIFIED BY "新密码";即可。

3. 从建库到迁移:DM8 核心功能实操笔记

3.1 表空间、用户与权限体系

实际生产环境里,没有人会用 SYSDBA 直接跑业务。标准做法是:先建独立的表空间,再创建业务用户,最后按最小权限原则授权。我在模拟项目X里是这样操作的:

CREATE TABLESPACE TS_APP DATAFILE '/dm/data/DMSERVER/TS_APP01.DBF' SIZE 1024 AUTOEXTEND ON NEXT 64 MAXSIZE 8192; CREATE USER APP_USER IDENTIFIED BY "App@123456" DEFAULT TABLESPACE TS_APP; GRANT CREATE SESSION TO APP_USER; GRANT CREATE TABLE TO APP_USER; GRANT SELECT, INSERT, UPDATE, DELETE ON 业务表 TO APP_USER;

这里涉及达梦一个重要的设计:用户和模式(schema)是打通的,创建一个用户会自动生成同名模式,表默认建在自己的模式下。这个机制和 Oracle 几乎一样,所以 Oracle 背景的人上手非常快。如果团队原来是 MySQL 背景,就要先把这个概念讲清楚,否则容易产生"库在哪里"的困惑。

权限方面,我强烈建议不要在非测试环境直接GRANT DBA TO APP_USER。虽然这样省事,但权限过大意味着风险过高。正确做法是像日常运维那样,按需授权,比如只给 SELECT、INSERT、UPDATE、DELETE。特别是生产环境,最小权限是底线,这个原则和数据库品牌无关,但在达梦上执行起来并不复杂。

3.2 SQL 兼容性实测

这一节是我最想分享的内容。很多开发担心国产数据库 SQL 不兼容,实际测下来,达梦对 Oracle 的兼容做得确实用力。我挑了几个最常用的点验证过:

  • 虚拟表 dual 和函数,比如SELECT NVL(NULL, 'ok') FROM dual;能直接跑。
  • DECODE、ROWNUM 这些 Oracle 常用特性,在 DM8 里有对应实现。
  • 分页查询同时支持 MySQL 风格的LIMIT和 Oracle 风格的ROWNUM。比如SELECT * FROM T ORDER BY ID LIMIT 20,10;可以正常执行。
  • 序列操作SELECT SEQ_APP_ID.NEXTVAL FROM dual;也能用。

这说明什么?如果团队原来基于 Oracle 开发,迁移到 DM8 的成本比想象中低。但如果是 MySQL 背景,就需要注意类型体系和使用习惯的差异。MySQL 的 tinyint、datetime、text 在 DM8 里不一定有完全同名的类型,通常需要映射成 INT、TIMESTAMP、CLOB。DTS 迁移工具会自动做一部分映射,但映射结果一定要人工检查,尤其是精度和长度,否则很容易埋坑。

3.3 从 MySQL 迁移到 DM8 的适配要点

我用达梦自带的 DTS 工具把一套原本跑在 MySQL 上的模拟业务系统迁了过去。流程上很简单:选择源、选择目标、做字段映射、跑迁移、做数据校验。真正花时间的不是搬数据,而是改 SQL。我遇到的典型问题有三类。

第一类是大小写困惑。如果建库时选了区分大小写,MySQL 里的小写表名到了 DM8 里会被转成大写,程序里动态拼接 SQL 时特别容易踩空。最稳妥的解法是应用层统一大写表名,或者在初始化实例时就把 CASE_SENSITIVE 设为 0。第二类是函数差异。MySQL 的 IFNULL 达梦支持,但 GROUP_CONCAT 这类聚合函数没有完全对应的同名函数,要改成达梦的 LISTAGG 或者 WM_CONCAT。这个阶段最好做一次全量 SQL 扫描,把所有 SQL 都过一遍 EXPLAIN,提前发现语法问题。第三类是隐式类型转换。MySQL 对大字段的隐式转换比较宽松,达梦偏严格,迁移后有些 SQL 会报类型不匹配错误,解决办法是写 SQL 时显式使用 CAST。

另外,DTS 迁移完成后一定要做数据校验。不能只看迁移过程报没报错,有的类型转换会静默丢失精度。我习惯随机抽样对比源和目标的行数以及关键字段值,至少抽 10% 的数据,核心大表全量比对。这一步虽然繁琐,但能避免很多上线后才发现的数据问题。

4. 备份恢复与性能调优实战

4.1 备份策略与恢复演练

数据库最重要的能力不是性能,而是能不能找回数据。DM8 提供逻辑备份工具 dexp/dimp,也支持物理备份命令 BACKUP/RESTORE,以及配套的 dmrman 工具。我个人的建议是:生产环境以物理备份为主,逻辑备份作为补充。物理备份可以做全量加增量组合,恢复粒度更细;逻辑备份适合导出特定表或者结构定义,适合做迁移和归档。

在 disql 里执行一个全量备份,最简单的写法是:

BACKUP DATABASE FULL TO "FULL_BAK_001" BACKUPSET '/dm/backup/full_bak_001';

如果习惯用 dmrman,也可以把同样的命令放到备份工具里执行。备份的产物是一个备份集目录,里面包含数据文件的可恢复镜像。这里我想分享一个很多人忽略的点:备份文件一定要存储到和数据库不同的磁盘,最好是异机或者独立存储。我听说过不止一个团队,数据库和备份在同一块磁盘上,磁盘坏了数据全没了,备份也没了。

比备份本身更重要的是恢复演练。我见过太多团队,备份任务每天都在跑,但从没真正恢复验证过。真到了要恢复的时候才发现备份集权限不对、路径变了、归档没开启,各种意外。所以备份策略里必须包含一项"定期恢复演练"。我自己的习惯是每两周拿备份在测试环境做一次完整恢复,确认恢复后的数据能正常启动和查询,然后把这个过程记录下来。这个习惯看起来麻烦,真到用时能救命。

4.2 性能调优的切入点

调优这块,我不建议一上来就改一堆参数,先要搞清楚问题到底出在哪里。达梦的动态视图体系很接近 Oracle,常用的有 V$INSTANCE、V$SESSIONS、V$LOCK、V$BUFFERPOOL、V$SYSSTAT。碰到性能问题,先问自己三个问题:是某个 SQL 慢,还是整个库都慢?是偶发还是持续?慢的时候系统在做什么,有没有大事务或者锁等待?

如果定位到单个 SQL 慢,正确的动作是看执行计划。在 disql 里使用EXPLAIN SELECT ...;就能看到。根据我的经验,最常见的原因是统计信息过期导致达梦选择了全表扫描,或者表的关联顺序不合理。解决办法是收集统计信息:

CALL DBMS_STATS.GATHER_SCHEMA_STATS('APP_USER');

收集完成后,很多 SQL 的性能会自动变好。如果依然慢,再考虑建立合适的索引,或者调整 SQL 写法。注意,索引不是越多越好,每个索引都会拖慢写入,得不偿失。

如果是全局性的性能问题,才需要动 INI 参数。举个最典型的例子:当实例的缓冲池命中率长期偏低时,可以适当调大 BUFFER 参数,命令是ALTER SYSTEM SET 'BUFFER' = 1024;。但调完之后要持续观察,不能今天调完明天又加。参数调整有个原则:每次只改一个,并且记录修改前后的监控数据。否则多个参数一起改,出了问题根本不知道是谁引起的。

还有一个和具体参数无关的经验:不要在业务高峰期做大批量数据清理或者大事务操作。长时间未提交的事务在达梦上对其他会话的影响比某些数据库更明显。很多性能问题表面上是数据库慢,实际上是锁等待和堵车。

5. 常见问题排查与避坑指南

5.1 高频报错与解决方案

这两周里我实际遇到的高频问题,整理成了一张速查表:

报错现象可能原因解决办法
dminit 提示内存不足或无法分配共享内存系统共享内存限制过低,或实例参数不匹配检查 sysctl.conf 的 shmmax、shmall 设置,必要时候重新配置后重启
服务启动失败,端口被占用5236 端口被其他进程占用执行 netstat -lnp | grep 5236 查看占用进程,换端口或释放端口
disql 登录报认证失败密码错误、账号被锁、字符集问题确认密码,查看实例日志定位原因,必要时通过系统管理员重置
建表后应用程序找不到表大小写敏感机制导致表名被转成大写统一标识符大小写,或者建库时设置 CASE_SENSITIVE=0
备份还原后实例无法启动备份集不完整或参数文件路径不一致用 dmrman 校验备份集,检查 dm.ini 中的路径配置
SQL 报类型不匹配或函数不存在语法兼容问题对照官方函数手册改写 SQL,使用 CAST 显式转换类型

新手遇到问题,第一反应应该是查日志,而不是乱试命令。达梦的日志文件在$DM_HOME/log目录下,文件名一般带实例名,内容已经写得比较直白。比如登录失败,日志里会明确记录是什么原因导致的认证失败,这比对着屏幕干瞪眼强得多。

5.2 几个独家避坑心得

先说初始化参数的问题。页大小、字符集、大小写敏感,这三个参数一旦定了,后期基本没法改。特别是大小写敏感,如果建库前没想好,后面迁移老系统时会非常痛苦。我的做法是在新环境里先初始化一个测试实例,把所有参数都试明白,再决定生产环境的最终方案,宁可多花一小时也不冒险。

第二个心得是不要在测试环境里偷懒。很多人喜欢在测试库上随意建用户、随意授权,开发和测试环境一团糟,结果就是上线前各种权限问题集中爆发。测试环境的表空间、用户、权限模型尽量和生产保持一致,这样迁移上线的过程才是平滑的。

第三个心得是针对迁移场景的。DTS 迁移完成不等于所有工作都结束了。我建议迁移后做一次全量回归,尤其是事务、锁、并发场景,因为很多问题不是单条 SQL 的语法错误,而是并发环境下才暴露出来的。自动化脚本在这个环节很有用,把核心业务的增删改查全部跑一遍,比自己手工点鼠标可靠得多。

第四个心得是遇到问题先查官方文档。达梦的官方文档其实写得挺细,很多参数都有解释和示例。我在调试过程中发现,网上搜到的碎片化文章有时会互相矛盾,反而官方手册里能查到准确的说明。所以我的习惯是:先看手册,再看社区,最后才动手改配置。

5.3 学习建议

如果你是在没有生产压力的情况下自学 DM8,我的建议很简单:找一个具体的应用场景来驱动。光看文档很容易产生"什么都会"的错觉,一动手就废。拉一个虚拟机或者容器,把安装、建库、迁移、备份、恢复、调优完整走一遍,这个过程比任何课程都有效。

刚开始接触国产数据库,难免会拿它和 Oracle 或者 MySQL 做对比。有对比是好事,但不要带着偏见去学。接受它设计上的一些差异,理解每个选择的背景,才能真正用好。国产数据库这些年进步很明显,但最终拼的还是使用者解决问题的能力,而解决问题的能力只能在真实环境里练出来。

这段时间用下来,我的总体感受是:达梦 DM8 在中小型系统上做核心业务支撑是够用的,关键是别拿习惯的那套思维硬套,要理解它自己的设计取舍。最后再分享一个我自己的小习惯:每次做完备份,我都会顺手在测试环境做一次完整恢复演练,再写一行记录。看起来麻烦,但真到出事的时候,你会发现这个习惯值回所有时间。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进