信创迁移总踩坑?达梦DM8新版VARCHAR居然不按“字符”存了

你也在搞信创?这份麒麟V10+达梦DM8“保姆级”安装指南请收好

作者: ShunWah
公众号: "shunwah星辰数智社"主理人。

持有认证: OceanBase、MySQL、OpenGauss、崖山、金仓KingBase、KaiwuDB、亚信AntDBCA、翰高、GBase、Galaxybase、Neo4j、NebulaGraph、东方通TongTech、TiDB 等多项权威认证。

获奖经历: 崖山YashanDB YVP、浪潮KaiwuDB MVP、墨天轮 MVP、金仓社区KVA、TiDB社区MVA、NebulaGraph社区之星、IFClub星珩联盟·智库星系技术专家、ITPUB 技术专家,社区版主及布道师。在OceanBase&墨天轮征文大赛、OpenGauss、TiDB、YashanDB、Kingbase、KWDB、Navicat 征文等赛事中多次斩获一、二、三等奖,原创技术文章常年被墨天轮、CSDN、ITPUB 等平台首页推荐。

公众号封面文案612生成 7.jpg

? 前言:

接触信创数据库已有一段时间,信创化这事儿,前几年能明显感受到信创化建设一直在循序渐进推进,而今年开始,整个改造落地的步伐明显加快。近期手上多个项目启动信创改造,需要把原有CentOS 7+MySQL架构,整体迁移为银河麒麟 V10 SP2 + 达梦 DM8(最新补丁版)。为此我整理了全套实操指南,覆盖巡检、环境配置、数据库安装初始化、日常运维全环节,每一步都附带执行命令和现场截图,跟着操作就能一次性部署成功。

之前我也觉得,装个数据库嘛,按文档下一步下一步不就完了?
结果真上手达梦 + 麒麟才发现——文档写得像法律条文,每一步都对,但连在一起就卡住。尤其是从 MySQL 转过来的,什么大小写敏感、页大小、VARCHAR 长度单位……全是暗坑。

这次项目要求:

  • 操作系统从 CentOS 7 换到 银河麒麟 V10 SP2
  • 数据库从 MySQL 迁移到 达梦 DM8 最新补丁版

我把自己从零开始的全流程记录下来,包括 系统巡检、用户创建、内核参数调整、命令行静默安装、实例初始化、服务注册、启停命令,以及新版 VARCHAR 的行为测试
每一条命令我都跑过,每一张截图都是现场拍的。你跟着做,基本不会翻车。

? 如果你用的是鲲鹏、飞腾、海光等信创 CPU,步骤完全一样,只要下载对应架构的安装包即可。


一、安装前的软硬件摸底(先看看家里有多少粮)

1.1 操作系统版本确认

[root@bogon ~]# cat /etc/os-release NAME="Kylin Linux Advanced Server"VERSION="V10 (Halberd)"ID="kylin"VERSION_ID="V10"PRETTY_NAME="Kylin Linux Advanced Server V10 (Halberd)"ANSI_COLOR="0;31"

image.png

1.2 磁盘空间检查(数据放哪要心里有数)

[root@bogon ~]# df -Th文件系统              类型      容量  已用  可用 已用% 挂载点
devtmpfs              devtmpfs   16G     0   16G    0% /dev
tmpfs                 tmpfs      16G  2.4M   16G    1% /dev/shm
tmpfs                 tmpfs      16G   74M   16G    1% /run
tmpfs                 tmpfs      16G     0   16G    0% /sys/fs/cgroup
/dev/mapper/klas-root xfs       184G   18G  166G   10% /
tmpfs                 tmpfs      16G   36K   16G    1% /tmp
/dev/sda1             xfs      1014M  212M  803M   21% /boot
/dev/sdb1             ext4     1007G  4.1G  952G    1% /data
...

/data 下有 952G 可用,装库绰绰有余。

image.png

1.3 内存要够用(别让数据库跑起来像老头乐)

[root@bogon ~]# free -hm
              total        used        free      shared  buff/cache   available
Mem:           30Gi        11Gi        12Gi       250Mi       5.4Gi        16Gi
Swap:          15Gi          0B        15Gi

30G 内存 + 15G swap,跑 DM8 典型业务没问题。

image.png

二、服务器初始配置(把地基打牢)

2.1 新建 dmdba 用户(严禁使用 root 装库!)

⚠️ 这条是铁律:数据库必须用自己的普通用户跑,root 只负责系统级操作。就像住酒店,root 是万.能总卡,但你住进去还是要用房卡(dmdba)。

# 创建用户组[root@bogon ~]# groupadd dinstall -g 2001# 创建用户,指定家目录、shell、UID[root@bogon ~]# useradd -G dinstall -m -d /home/dmdba -s /bin/bash -u 2001 dmdba# 设置密码(别学我用弱密码,生产环境一定要强密码)[root@bogon ~]# passwd dmdba更改用户 dmdba 的密码 。
新的密码: 
重新输入新的密码: 
passwd:所有的身份验证令牌已经成功更新。

image.png

2.2 修改文件打开数限制(不然高并发直接崩)

Linux 默认限制一个进程只能打开 1024 个文件,DM8 一开起来几百个线程,瞬间打满就会报 too many open files

用 root 编辑 /etc/security/limits.conf,追加以下内容:

dmdba  soft      nice       0
dmdba  hard      nice       0
dmdba  soft      as         unlimited
dmdba  hard      as         unlimited
dmdba  soft      fsize      unlimited
dmdba  hard      fsize      unlimited
dmdba  soft      nproc      65536
dmdba  hard      nproc      65536
dmdba  soft      nofile     65536
dmdba  hard      nofile     65536
dmdba  soft      core       unlimited
dmdba  hard      core       unlimited
dmdba  soft      data       unlimited
dmdba  hard      data       unlimited

image.png

改完后要重新登录 dmdba 用户才会生效,可以用 ulimit -n 检查。

2.3 目录规划(数据、归档、备份分开放,别搞成一锅粥)

# 实例数据目录mkdir -p /data/dmdata/data# 归档日志目录mkdir -p /data/dmdata/arch# 备份文件目录mkdir -p /data/dmdata/dmbak

image.png

⚠️ 注意:以上目录目前是 root 创建的,等会儿必须把所有权交给 dmdba,否则安装程序写不进去。

2.4 修改目录权限(把钥匙交给 dmdba)

[root@bogon ~]# chown -R dmdba:dinstall /data/dmdata/data[root@bogon ~]# chown -R dmdba:dinstall /data/dmdata/arch[root@bogon ~]# chown -R dmdba:dinstall /data/dmdata/dmbak[root@bogon ~]# chmod -R 755 /data/dmdata/data[root@bogon ~]# chmod -R 755 /data/dmdata/arch[root@bogon ~]# chmod -R 755 /data/dmdata/dmbak

image.png

image.png

三、数据库安装(全程命令行,稳如老狗)

3.1 上传安装包

把下载好的 ISO 放到某个目录,比如 /soft

[root@bogon ~]# cd /soft/[root@bogon soft]# lsdm8_20260506_x86_kylin10_sp1_64.iso  kingbase  Kingbase  software

image.png

3.2 挂载镜像

[root@bogon ~]# cd /soft/[root@bogon soft]# mount -o loop dm8_20260506_x86_kylin10_sp1_64.iso /mnt/mount: /mnt: WARNING: source write-protected, mounted read-only.

image.png

3.3 命令行安装(-i 静默安装,不用管图形界面)

切换到 dmdba 用户,进入挂载目录:

[root@bogon soft]# su - dmdba[dmdba@bogon ~]$ cd /mnt/
[dmdba@bogon mnt]$ ls'DM8 Install.pdf'   DMInstall.bin

image.png

开始安装:

[dmdba@bogon mnt]$ ./DMInstall.bin -i
安装语言: 
[1]: 简体中文
[2]: English
请选择安装语言 [1]:1
解压安装程序......... 
硬件架构校验通过!
欢迎使用达梦数据库安装程序

image.png

是否输入Key文件路径? (Y/y:是 N/n:否) [Y/y]:n   # 没有 key 直接跳过

image.png

是否设置时区? (Y/y:是 N/n:否) [Y/y]:y# 选择 21(中国标准时间)请选择时区 [21]:21

image.png

请选择安装目录 [/home/dmdba/dmdbms]:
可用空间: 164G
是否确认安装路径(/home/dmdba/dmdbms)? (Y/y:是 N/n:否)  [Y/y]:y
安装前小结
安装位置: /home/dmdba/dmdbms
所需空间: 2023M
可用空间: 164G
安装类型: 典型安装
是否确认安装? (Y/y:是 N/n:否):y

image.png
然后就是 1-2 分钟的自动安装,最后你会看到:

2026-06-09 14:38:30 
[INFO] 安装达梦数据库完成。
请以root系统用户执行命令:
/home/dmdba/dmdbms/script/root/root_installer.sh
安装结束

image.png

3.4 执行 root 脚本(这一步千万不能省!)

不跑这个脚本,后面无法备份(DmAPService 没启动)。

[root@bogon soft]# /home/dmdba/dmdbms/script/root/root_installer.sh移动 /home/dmdba/dmdbms/bin/dm_svc.conf 到/etc目录
创建DmAPService服务
Created symlink /etc/systemd/system/multi-user.target.wants/DmAPService.service → /usr/lib/systemd/system/DmAPService.service.
创建服务(DmAPService)完成
启动DmAPService服务

image.png


四、配置环境变量(让系统知道达梦在哪)

[root@bogon soft]# cd /home/dmdba/[root@bogon dmdba]# vim .bash_profile

image.png

在文件末尾添加:

export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool

image.png

然后切换回 dmdba 用户并使之生效:

[root@bogon dmdba]# su - dmdba上一次登录: 二 6月  9 14:07:32 CST 2026 pts/0 上
[dmdba@bogon ~]$ source .bash_profile

image.png

? 如果你日后想用图形化工具(比如 ./dbca.sh),记得先执行 xhost + 并设置 DISPLAY。不过我们这次全程命令行,跳过图形部分。


五、配置实例(初始化数据库)

5.1 使用 dminit 命令初始化(⚠️ 部分参数一锤定音,后期无法修改)

进入 bin 目录:

[dmdba@bogon ~]$ cd /home/dmdba/dmdbms/bin

image.png

先看看有哪些参数(不用全记住,但关键的几个要懂):

[dmdba@bogon bin]$ ./dminit help

image.png

重要参数说明(初始化后无法更改,谨慎选择):

参数 说明 我的选择
PAGE_SIZE 页大小(4/8/16/32 KB),越大单行长度上限越大 32 KB
EXTENT_SIZE 簇大小(16/32/64 页) 32
CASE_SENSITIVE 大小写敏感(Y/N) N(不敏感,方便迁移)
CHARSET 字符集(0=GB18030,1=UTF-8,2=EUC-KR) 1(UTF-8)
BLANK_PAD_MODE 是否兼容 Oracle 空格填充 0
PAGE_CHECK 页校验模式(默认 3) 3

我的完整初始化命令(数据目录 /data/dmdata/data,实例名 DBSERVER,端口 5237):

./dminit path=/data/dmdata/data \
        PAGE_SIZE=32 \
        EXTENT_SIZE=32 \
        CHARSET=1 \
        DB_NAME=DMTEST \
        INSTANCE_NAME=DBSERVER \
        CASE_SENSITIVE=0 \
        PORT_NUM=5237 \
        SYSDBA_PWD=Rootcaip#2019 \
        SYSAUDITOR_PWD=Rootcaip#2019

? 生产环境密码一定要复杂,我这里只是演示。

image.png

5.2 注册服务(让操作系统管理达梦进程)

切换到 root,进入服务脚本目录:

[dmdba@bogon bin]$ exitlogout[root@bogon dmdba]# cd /home/dmdba/dmdbms/script/root/

image.png
注册服务:

[root@bogon root]# ./dm_service_installer.sh -t dmserver -dm_ini /data/dmdata/data/DMTEST/dm.ini -p DMTESTCreated symlink /etc/systemd/system/multi-user.target.wants/DmServiceDMTEST.service → /usr/lib/systemd/system/DmServiceDMTEST.service.
创建服务(DmServiceDMTEST)完成

image.png

注册完成后,在 /home/dmdba/dmdbms/bin 下会出现 DmServiceDMTEST 脚本。

image.png

5.3 启停数据库(像操作普通服务一样)

[dmdba@bogon ~]$ cd /home/dmdba/dmdbms/bin
[dmdba@bogon bin]$ ./DmServiceDMTEST start
Starting DmServiceDMTEST:                                  [ OK ]
[dmdba@bogon bin]$

image.png

5.4 停止数据库

[dmdba@bogon bin]$ ./DmServiceDMTEST stop
Stopping DmServiceDMTEST:                                  [ OK ]
[dmdba@bogon bin]$

image.png

5.5 重启数据库

[dmdba@bogon bin]$ ./DmServiceDMTEST restart
DmServiceDMTEST service is stopped.
Starting DmServiceDMTEST:                                  [ OK ]
[dmdba@bogon bin]$

image.png

5.6 查看数据库状态,如下所示:

[dmdba@bogon bin]$ ./DmServiceDMTEST status
DmServiceDMTEST (pid 801808) is running.
[dmdba@bogon bin]$

image.png


六、连接数据库(推荐 disql 命令行工具)

6.1 登录数据库

[dmdba@bogon ~]$ cd /home/dmdba/dmdbms/bin
[dmdba@bogon bin]$ ./disql SYSDBA@localhost:5237
密码:   # 输入你设置的 SYSDBA_PWD服务器[localhost:5237]:处于普通打开状态
登录使用时间 : 4.159(ms)
disql V8
SQL>

image.png

如果密码包含特殊字符,可以用单引号包双引号的写法: '*****'

6.2 常用管理操作(在 disql 内执行)

操作 命令
查看数据库状态 SELECT STATUS$ FROM V$INSTANCE;
查看归档配置 SELECT ARCH_DEST, ARCH_TYPE FROM V$DM_ARCH_INI;
创建表空间 CREATE TABLESPACE TBS_DATA DATAFILE '/data/dmdata/data/DMTEST/tbs01.dbf' SIZE 128;
创建用户 CREATE USER TEST IDENTIFIED BY "Test123" DEFAULT TABLESPACE TBS_DATA;
授予 DBA 权限 GRANT DBA TO TEST;
全库备份 BACKUP DATABASE FULL TO "fullbak" BACKUPSET '/data/dmdata/dmbak/full_bak';
查看备份历史 SELECT * FROM V$BACKUPSET;
退出 disql EXIT;


七、新版达梦 VARCHAR 长度测试(按字节还是按字符?)

这是从 MySQL 迁移到达梦时最容易踩的坑之一。
从 2024 年 Q2 的 8.1.3.162 版本开始,全局参数 LENGTH_IN_CHAR 被废弃了,默认 按字节 存储。
但你可以用 VARCHAR(n CHAR) 在字段级别强制 按字符 存储。

我用的这个补丁版本正好支持这个新特性。先确认字符集(UTF-8,一个中文 3 字节):

SQL> SELECT UNICODE();
行号     UNICODE()  
---------- -----------1          1
已用时间: 2.058(毫秒). 执行号:1011.
SQL>
...

image.png

查询版本

SQL> SELECT * FROM V$VERSION;
行号     BANNER                           
---------- ---------------------------------
1          DM Database Server 64 V8
2          DB Version: 0x7000d
3          03134284368-20260430-325233-20149
4          Msg Version: 44
5          Gsu level(5) cnt: 0
已用时间: 2.889(毫秒). 执行号:1010.
SQL>

image.png

7.1 默认行为(按字节)

这是新版本数据库的默认行为,varchar(3) 只能存储最多3个字节的数据。

SQL> CREATE TABLE TEST_BYTE ( C1 VARCHAR(3) );
操作已执行
已用时间: 9.274(毫秒). 执行号:1001.
SQL>

image.png

(按字符)2个字符

SQL> INSERT INTO TEST_BYTE (C1) VALUES ('ABC');
影响行数 1
已用时间: 2.604(毫秒). 执行号:1002.
SQL>

image.png

7.2 显式按字符存储

SQL> CREATE TABLE TEST_CHAR ( C1 VARCHAR(3 CHAR) );
操作已执行
SQL> INSERT INTO TEST_CHAR (C1) VALUES ('一二');   -- 3个字符容量,两个汉字轻松影响行数 1
SQL> INSERT INTO T_OLD (C1) VALUES ('一二');
影响行数 1
已用时间: 5.919(毫秒). 执行号:1006.
SQL> 
SQL> INSERT INTO T_OLD (C1) VALUES ('一二三四五');INSERT INTO T_OLD (C1) VALUES ('一二三四五');
[-6169]:列[C1]长度超出定义.
已用时间: 3.117(毫秒). 执行号:0.
SQL>

image.png

7.3 迁移对比(旧表 vs 新表)

-- 模拟旧方式(依赖已废弃的全局参数,不推荐)SQL> CREATE TABLE T_OLD ( C1 VARCHAR(10) );-- 推荐的新写法SQL> CREATE TABLE T_NEW ( C1 VARCHAR(10 CHAR) );
SQL> CREATE TABLE T_OLD ( C1 VARCHAR(10) );
操作已执行
已用时间: 9.623(毫秒). 执行号:1004.
SQL> 
SQL> 
SQL> CREATE TABLE T_NEW ( C1 VARCHAR(10 CHAR) );
操作已执行
已用时间: 8.149(毫秒). 执行号:1005.
SQL>

image.png

插入数据测试:

-- T_OLD 最多只能放 3 个汉字(10字节 ÷3 ≈ 3.3)SQL> INSERT INTO T_OLD (C1) VALUES ('一二三');    -- 成功SQL> INSERT INTO T_OLD (C1) VALUES ('一二三四');  -- 失败-- T_NEW 可以放 10 个汉字SQL> INSERT INTO T_NEW (C1) VALUES ('一二三四五六七八九十');   -- 成功SQL> INSERT INTO T_NEW (C1) VALUES ('一二三四五六七八九十壹'); -- 失败

image.png

7.4 结论与建议

场景 推荐写法 原因
新建表且希望按字符数限制(如用户名、地址) VARCHAR(30 CHAR) 不依赖废弃参数,行为清晰
严格控制存储字节数(如固定长度编码) VARCHAR(30) 按字节存,省空间
从旧版本迁移 VARCHAR(N CHAR) 改造旧字段 避免被已废弃的 LENGTH_IN_CHAR 影响

? 批量改造脚本(在 disql 里执行,生成 ALTER 语句):

SELECT 'ALTER TABLE ' || OWNER || '.' || TABLE_NAME || ' MODIFY ' || COLUMN_NAME || ' VARCHAR2(' || DATA_LENGTH || ' CHAR);'FROM DBA_TAB_COLUMNSWHERE DATA_TYPE='VARCHAR' AND OWNER='YOUR_SCHEMA';

八、DM 管理工具(图形化,可选)

8.1 新建连接

  1. 点击【新建连接】
    创建连接数据库的对象导航,不进行保存,下次开启后需重新连接。
    image.png

  2. 测试连接
    输入主机名(IP 地址)、端口、用户名、密码,点击【测试】,测试是否连通,点击【确定】,连接数据库,如下图所示:

image.png

  1. 查看数据库链接信息
    image.png

  2. 连接数据库
    点击【新建连接】,输入主机名(IP 地址)、端口、用户名、密码,点击【确认】即可直接进行数据库连接,如下图所示:
    image.png

  3. 【确认】后即可像 Navicat 一样使用
    连接数据库后,左侧显示对象导航;右侧为新建查询窗口,通过窗口可编写 SQL 语句进行执行;顶部为工具栏;底部为消息和结果集。
    查看数据库实例版本信息:

image.png

? 总结

信创化这几年从“试点”慢慢变成“硬指标”,今年开始明显感觉项目都在往前赶。
很多朋友以前没碰过达梦,突然从 CentOS + MySQL 迁移到 麒麟 + DM8,确实容易慌。

其实没你想的那么复杂,你只要按顺序做完下面这几件事,一次就能成功:

  1. 新建 dmdba 用户 —— 绝对不要用 root 装库。
  2. 修改 limits.conf —— 把文件打开数拉到 65536,避免高并发报错。
  3. 规划目录(数据/归档/备份)并 改权限给 dmdba。
  4. 挂载 ISO,用 ./DMInstall.bin -i 命令行静默安装。
  5. 执行 root_installer.sh —— 这一步漏了后面没法备份。
  6. 用 dminit 初始化实例 —— 页大小、字符集、大小写敏感一次选对,后期改不了。
  7. 注册服务,然后就可以用 DmServiceXXX start/stop 愉快启停。
  8. disql 连上去,顺手测一下 VARCHAR 是字节还是字符,避免迁移后数据被截断。

公众号封面文案生成614 8.jpg

最后再啰嗦一句:数据库的密码、备份策略、归档模式这些,一定要按生产环境的要求来设,别学我在演示里用弱密码。安全无小事,祝大家信创改造顺利!?

? 作者注:
本文围绕达梦 DM8(新版补丁包)在银河麒麟 V10 SP2 环境下的部署全流程,均基于 x86_64 物理机 / 虚拟机实测整理。文中涉及的 dmdba 用户权限、limits.conf 文件句柄限制、dminit 初始化参数(大小写敏感、页大小、字符集)以及新版 VARCHAR 长度单位(字节 vs 字符)等配置要点,均为真实信创改造项目中反复踩坑后总结的案例。
操作系统版本、内核参数、存储 I/O 性能、安全加固策略等环境差异,可能导致部分操作表现不同,请以你实际环境为准。

本文方案仅作技术参考,不代表唯一标准解法。以上内容为个人经验总结, 不构成线上生产环境落地建议

请使用浏览器的分享功能分享到微信等