注册
DMDRS 将 MySQL 数据迁移至 DM8
专栏/技术分享/ 文章详情 /

DMDRS 将 MySQL 数据迁移至 DM8

歪比巴卜 2026/08/28 181 0 0
摘要

DMDRS 将 MySQL 数据迁移至 DM8

场景:MySQL 8.4 → DM8
操作系统:Kylin Linux Advanced Server V10 SP2(Sword),x86_64
DMDRS:V5.2.5.3-Build(2025.12.17-207725_trunc)_64

1. 环境规划

角色 地址 端口 模块/服务 说明
MySQL 源数据库 192.168.52.150 3306 MySQL 8.4 源库 appdb
DM8 目标数据库 192.168.52.149 5236 DM8 目标模式 APPDB

对象映射关系:

MySQL appdb.*  →  DM8 APPDB.*

2. 部署前检查

检查操作系统

lscpu nkvers

查看源端和目的端的CPU架构和操作系统,使用对应版本的drs,安装对应的数据库版本。

3. MySQL 8.4 源端准备

3.1 安装 MySQL

麒麟 V10 为 EL8 兼容系统,应使用 el8.x86_64 RPM。标准安装至少包括:

mysql-community-common
mysql-community-client-plugins
mysql-community-libs
mysql-community-icu-data-files
mysql-community-client
mysql-community-server

在 RPM 所在目录执行:

sudo yum install -y \ ./mysql-community-common-8.4.*.el8.x86_64.rpm \ ./mysql-community-client-plugins-8.4.*.el8.x86_64.rpm \ ./mysql-community-libs-8.4.*.el8.x86_64.rpm \ ./mysql-community-icu-data-files-8.4.*.el8.x86_64.rpm \ ./mysql-community-client-8.4.*.el8.x86_64.rpm \ ./mysql-community-server-8.4.*.el8.x86_64.rpm

如果系统预装 MariaDB,安装前应检查是否存在包冲突:

rpm -qa | grep -i mariadb systemctl status mariadb --no-pager

安装MySQL时可能会与 MariaDB 的 /etc/my.cnf 冲突,如下:

image.png

先备份一下文件,之后删除冲突文件:

sudo cp -a /etc/my.cnf /etc/my.cnf.mariadb.bak

sudo mv /var/lib/mysql/.bash_history /var/lib/mysql.bash_history.backup

sudo yum remove mariadb mariadb-server mariadb-common mariadb-errmsg

然后继续运行之前的安装命令进行安装。

安装好之后启动并设置开机启动,查看MySQL状态是否正常运行。

sudo systemctl enable --now mysqld
sudo systemctl status mysqld --no-pager

image.png

取得 MySQL 临时密码:

sudo grep 'temporary password' /var/log/mysqld.log

image.png

完成安全初始化:

sudo mysql_secure_installation

输入刚才的临时密码,再设置一个包含大小写字母、数字和特殊字符的强密码。其他问题通常可以选择 Y

查看数据库版本如下:

mysql --version

image.png

使用新的密码登录MySQL即可:

mysql -u root -p

3.2 配置 binlog 和兼容认证

在MySQL端编辑 /etc/my.cnf,在 [mysqld] 中加入或确认:

# DMDRS 当前 CPT 使用旧版 libmysqlclient.so.18 时需要 mysql_native_password=ON

重启 MySQL:

sudo systemctl restart mysqld sudo systemctl enable mysqld sudo systemctl status mysqld --no-pager

检查配置:

SHOW VARIABLES LIKE 'log_bin'; SHOW VARIABLES LIKE 'binlog_format';

image.png

3.3 创建测试库和测试表

在MySQL库执行:

CREATE DATABASE IF NOT EXISTS appdb DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci; USE appdb; DROP TABLE IF EXISTS drs_test; CREATE TABLE drs_test ( id BIGINT NOT NULL, business_code VARCHAR(32) NOT NULL, customer_name VARCHAR(100) NULL, amount DECIMAL(18,2) NOT NULL DEFAULT 0.00, business_date DATE NULL, updated_at DATETIME(6) NOT NULL, enabled TINYINT NOT NULL DEFAULT 1, remark TEXT NULL, PRIMARY KEY (id), UNIQUE KEY uk_drs_test_code (business_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; START TRANSACTION; INSERT INTO drs_test (id, business_code, customer_name, amount, business_date, updated_at, enabled, remark) VALUES (1, 'T0001', '北京客户', 100.00, '2026-08-01', '2026-08-25 09:00:00.000001', 1, '第一条测试数据'), (2, 'T0002', '上海客户', 999.99, '2026-08-02', '2026-08-25 09:01:00.000002', 1, '包含中文字符'), (3, 'T0003', NULL, 0.00, NULL, '2026-08-25 09:02:00.000003', 0, NULL), (4, 'T0004', '广州客户', 12345.67, '2026-08-04', '2026-08-25 09:03:00.000004', 1, '测试较大金额'), (5, 'T0005', '退款客户', -88.50, '2026-08-05', '2026-08-25 09:04:00.000005', 1, '测试负数金额'), (6, 'T0006', '深圳客户', 19.90, '2026-08-06', '2026-08-25 09:05:00.000006', 1, '普通数据'), (7, 'T0007', '杭州客户', 500000.01, '2026-08-07', '2026-08-25 09:06:00.000007', 1, '测试大额数据'), (8, 'T0008', 'O''Reilly测试客户', 1.23, '2026-08-08', '2026-08-25 09:07:00.000008', 1, '测试单引号'); COMMIT;

3.4 创建 MySQL 同步用户

当前 CPT 依赖 libmysqlclient.so.18,因此 MySQL 8.4 同步用户要使用兼容认证。示例密码为 Asd123***

CREATE USER 'dmdrs'@'%' IDENTIFIED WITH mysql_native_password BY 'Asd123***'; GRANT PROCESS, REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'dmdrs'@'%'; GRANT SELECT, LOCK TABLES ON appdb.* TO 'dmdrs'@'%';

4. DM8 目标端准备

创建目标用户和模式

DM8 用户与模式一一对应。先检查:

SELECT USERNAME FROM DBA_USERS WHERE USERNAME = 'APPDB';

如不存在,执行:

CREATE USER APPDB IDENTIFIED BY "Appdb_Test#2026"; GRANT PUBLIC TO APPDB; GRANT RESOURCE TO APPDB; GRANT SOI TO APPDB; GRANT VTI TO APPDB; GRANT CREATE SESSION TO APPDB;

5. 安装和部署 DMDRS

5.1 安装软件

创建安装目录并授权,源端和目标端的安装过程都一样,只是配置文件和用户不同:

# 用root用户执行创建文件并赋予权限 mkdir -p /sqllog/dmdrs chown -R dmdba:dinstall /sqllog/dmdrs # 切换到dmdba用户下,赋予执行权限,记得把bin安装文件移到这个目录下 chmod +x dmdrs_rev207725_x86_rh6_64_20251219.bin # 开始命令行安装 ./dmdrs_rev207725_x86_rh6_64_20251219.bin -i # 组件可自己选择,我这里没有选择组件安装

image.png

源端的DRS安装过程一样。

5.2 配置链路

5.2.1 源端CPT配置

在源端MySQL安装完DRS后,进入到dmdrs目录,会有一个bin目录文件,复制bin目录,按照需求改名为bin_cpt_mysql(这里源端为MySQL,所以命名为这个),这里要注意保留原始的bin目录,以便后续有新链路部署时使用

cp -r bin bin_cpt_mysql

进入到bin_cpt_mysql目录下,编写drs.xml文件。

cd bin_cpt_mysql
vi drs.xml
<?xml version="1.0" encoding="GB18030"?> <drs> <base> <mgr_port>5345</mgr_port> <!-- 源端mgr端口 --> <siteid>1</siteid> <!-- 源端站点号,全局唯一 --> <mem_size>32</mem_size> <!-- DRS可申请的最大内存,单位GB,取值0~255,为0表示无限制 --> <lang>ch-utf8</lang> </base> <cpt> <name>cpt_mysql_appdb</name> <!-- DRS服务名,用于标识该DRS服务在链路中的名称 --> <ddl_mask>OBJ:OP:DDL_REC</ddl_mask> <!-- 开启DDL同步,写DDL同步的掩码 --> <enable_check_date>0</enable_check_date> <login> <!-- 源端数据库(源库)连接配置 --> <dbtype>mysql</dbtype> <!-- 源库类型 --> <server>192.168.52.150</server> <!-- 源库服务名 --> <user>dmdrs</user> <!-- 源库用户名 --> <pwd>Asd123***</pwd> <!-- 源库用户密码 --> <port>3306</port> <dbname>appdb</dbname> </login> <send> <ip>192.168.52.149</ip> <!-- 目的端DRS的ip --> <port>5346</port> <!-- 目的端DRS的mgr_port --> <compress>0</compress> <!-- CPT发送消息给目的端EXEC时是否启用消息压缩,0禁用,1启用,启用时额外消耗cpu,但会减少网络带宽,大字段多时用 --> <target_name>exec_dm8_appdb</target_name> <!-- 目的端DRS服务名 --> <map> <!-- 同步黑白名单,不配置disable="1"则为白名单 --> <item type="table">appdb.*==APPDB.*</item> <!-- 配置表、用户、模式、角色和公共同义词的白名单或映射 -->这里我要迁移的就是MySQL库appdb下的所有表到dm8端的APPDB模式下 </map> </send> <load> <!-- 源DMDRS的数据装载功能 --> <enable>1</enable> <!-- 是否启用装载功能,1启用,0禁用,默认1 --> <load_thr>16</load_thr> <!-- 【性能参数】 装载读取源数据库数据的线程数,旧版本DRS参数名是threads,每一个装载线程会建立一个数据库连接,当装载结束时释放。源库数据量大时可适当调大该参数 --> <nets>1</nets> <!-- 【性能参数】 可以理解为CPT与EXEC的连接数,为1时所有表推送都走这1个连接,为2时则会分组走每个连接,取值1~3 --> </load> </cpt> </drs>

配置完drs.xml之后,DRS的后台启动脚本需要人工复制创建,然后才能注册服务,当前目录下有一个目录文件service_template,进入这个目录并复制里面的文件。

cd service_template

cp TemplateService ../DrsService
# 进入DrsService更改以下信息
vi DrsService

DMDRS服务运行过程中,需要使用数据库的驱动文件访问数据库数据。源DMDRS服务需要使用MySQL C API驱动文件访问MySQL源数据库数据,用户需要在源DMDRS服务器的环境变量中添加MySQL C API驱动文件路径。默认的MySQL C API驱动路径为:/usr/lib64/mysql
在终端的配置文件中添加设置环境变量命令:

export LD_LIBRARY_PATH=<MySQL C API驱动路径>:$LD_LIBRARY_PATH

image.png

5.2.2 目的端EXEC配置

目标端的配置过程和源端的一样,只是其中的命名不同

cp -r bin bin_exec_dm8
cd bin_exec_dm8
vi drs.xml
<?xml version="1.0" encoding="GB18030"?>
<drs>
        <base>
                <mgr_port>5346</mgr_port> <!-- 目的端mgr端口 -->
                <siteid>2</siteid> <!-- 目的端站点号,全局唯一 -->
                <mem_size>0</mem_size> <!-- DRS可申请的最大内存,单位GB,取值0~255,为0表示无限制 -->
                <lang>ch-utf8</lang>
        </base>
        <exec>
                <name>exec_dm8_appdb</name> <!-- DRS服务名,用于标识该DRS服务在链路中的名称 -->
                <login> <!-- 目的端数据库(目的库)连接配置 -->
                        <dbtype>dm8</dbtype> <!-- 目的库类型 -->
                        <server>192.168.52.149</server> <!-- 目的库ip -->
                        <user>APPDB</user> <!-- 目的库用户名 -->
                        <pwd>Asd123***</pwd> <!-- 目的库用户密码 -->
                        <port>5236</port> <!-- 目的库端口 -->
                </login>
                <work_thr>16</work_thr> <!-- 【性能参数】 执行入库的工作线程数,当配置的分组数较多,分组间并行度较高,且分组内执行策略配置为并行执行,提高该参数的值可提高同步性能,旧版本drs参数名是threads -->
                <site_buf_size>1024</site_buf_size> <!-- 【性能参数】 每一个EXEC模块站点私有缓冲区大小,单位MB,旧版本drs参数名是 site_buffer -->
                <recv_buf_size>512</recv_buf_size> <!-- 【性能参数】 EXEC模块站点消息接收缓冲区大小,单位MB,旧版本drs参数名是 recv_buffer -->
                <pub_buf_size>4096</pub_buf_size> <!-- 【性能参数】 EXEC模块公用缓冲区大小,单位MB,旧版本drs参数名是 buffer -->
                <load_thr>16</load_thr> <!-- 【性能参数】 执行入库的装载线程数,建议与源端保持一致,旧版本drs参数名是load_threads -->
                <load_buf_limit>20480</load_buf_limit> <!-- 【性能参数】 EXEC模块数据装载使用的站点缓冲区上限,单位MB,用于限制 site_buf_size 申请内存,旧版本drs参数名是load_buffer_limit -->
                <enable_plan_pool>1</enable_plan_pool> <!-- 【性能参数】 EXEC模块在执行DML语句时是否启用计划池,默认1,旧版本drs参数名是use_plan_pool -->
                <group> <!-- 【性能参数】 分组执行功能 -->
                        <item>
                                <id>1</id> <!-- 分组编号 -->
                                <exec_policy>0</exec_policy> <!-- 执行策略,表示该分组下的表的事务采用并行执行或者按照提交顺序执行,0并行执行,1提交顺序 -->
                                <level>41</level> <!-- 分组的优先级,值越大优先级越高,优先级高的先执行。若优先级相同则按分组在配置文件中的顺序执行 -->
                                <error_policy>1</error_policy> <!-- 同步错误处理策略,0终止同步,1忽略错误继续同步,仅忽略同步有错误的操作,不影响所在事务的其它操作同步 -->
                                <merge_policy>3</merge_policy> <!-- 执行合并策略,表示该分组下的表的事务执行时是否可以合并。当对同步表中数据有严格顺序要求时需配置该参数值为0,3根据并行行数合并 -->
                        </item>
                </group>
                <max_ckpt_num>500</max_ckpt_num> <!-- 【性能参数】 检查点缓存文件的最大数量,旧版drs参数名是ckpt_max -->
        </exec>
</drs>

然后复制启动脚本并编写

cd service_template

cp TemplateService ../DrsService
# 进入DrsService更改以下信息
vi DrsService
## 将以下信息进行修改
INSTALL_HOME=/sqllog/dmdrs #DRS安装目录
PROG_DIR=/sqllog/dmdrs/bin_exec_dm8 #exec的bin目录
CONF_PATH=/sqllog/dmdrs/bin_exec_dm8/drs.xml #exec的配置文件
NEED_LIB_PATH=/home/dmdbms/bin #DM8的bin目录
EXEC_PROG_NAME=drsvr
SERVICE_TYPE_NAME="drs server"

5.3 MySQL 客户端设置环境变量

源端MySQL配置依赖时MySQL8.4版本可能没有libmysqlclient.so.18这个文件,需要检查是否存在,如果有就跳过这一步。

image.png

检查 CPT 驱动依赖:

cd /sqllog/dmdrs/bin_cpt_mysql ldd ./libdrmysql.so | grep -E 'mysqlclient|ssl|crypto|not found'

本次遇到的依赖链:

libdrmysql.so
└── libmysqlclient.so.18
    ├── libssl.so.10
    └── libcrypto.so.10

MySQL 8.4 系统库为 libmysqlclient.so.24,不能将 .24 软链接为 .18,不同主版本可能存在 ABI 不兼容。

这里可以下载两个rpm包,链接如下:

https://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/mysql-community-libs-compat-5.7.44-1.el7.x86_64.rpm

https://update.cs2c.com.cn/NS/V10/V10SP1/os/adv/lic/base/sw_64/Packages/

mysql-community-libs-compat-5.7.44-1.el7.x86_64.rpm
compat-openssl10-1.0.2o-4.el8_6.x86_64.rpm

分别提取:

mkdir -p /home/dmdba/dmdrs_mysql18 cd /home/dmdba/dmdrs_mysql18 rpm2cpio /安装包目录/mysql-community-libs-compat-5.7.44-1.el7.x86_64.rpm | cpio -idmv mkdir -p /home/dmdba/dmdrs_ssl10 cd /home/dmdba/dmdrs_ssl10 rpm2cpio /安装包目录/compat-openssl10-1.0.2o-4.el8_6.x86_64.rpm | cpio -idmv

image.png

image.png

设置当前会话:

export LD_LIBRARY_PATH=/home/dmdba/dmdrs_mysql18/usr/lib64/mysql:/home/dmdba/dmdrs_ssl10/usr/lib64:$LD_LIBRARY_PATH

再次检查:

ldd /sqllog/dmdrs/bin_cpt_mysql/libdrmysql.so | grep 'not found'

6. 启动DRS

6.1 启动CPT端服务

cd /sqllog/dmdrs/bin_cpt_mysql ./DrsService start

image.png

进入控制台:

./drcsl

image.png

image.png

6.2 启动EXEC端服务

cd /sqllog/dmdrs/bin_exec_dm8 ./DrsService start

image.png

进入控制台:

./drcsl

image.png

7. 全量装载与增量同步

7.1 设置起始日志位置

配置起始LSN(仅用于测试链路是否通畅)执行后观察目的端日志是否收到请求并重置完成:

CSL> alter cpt_mysql_appdb set lsn

7.2 添加同步表并装载数据

CPT端执行:

CSL> alter cpt_mysql_appdb add table "sch.name='appdb' and tab.name='drs_test'" CREATE|INSERT|INDEX|GROUP
# 查看总体装载
show cpt_mysql_appdb load status

# 查看正在装载的表信息
ld
或
show cpt_mysql_appdb load table running

# 查看装载错误的表信息
show cpt_mysql_appdb load table error
说明:这是CPT端记录的装载错误信息,有时信息不够准确,需要去EXEC端查看日志确认。

# 停止装载
alter cpt_mysql_appdb stop load  #全停

掩码含义:

CREATE|INSERT|INDEX先迁移表结构(含主键、注释),然后迁移表数据,最后再迁移索引,这里GROUP是分组迁移。

掩码 作用
CREATE 在目标端创建表对象
INSERT 装载源端现有数据
INDEX 创建主键和索引

7.3 启动增量同步

CSL> start cpt_mysql_appdb

当表装载(迁移、推全量)完成后,就会对该表进行实时同步(增量)。在表装载(迁移、推全量)时,DRS会缓存该表未来产生的变更操作,装载(迁移、推全量)完成后就会开始追平,未装载(迁移、推全量)的表则不会缓存。

综上,无需等待所有表完成装载(迁移、推全量)再开实时同步(增量),执行装载(迁移、推全量)命令后,即可开启实时同步(增量)。

7.4 常见场景装载

7.4.1 不包含表结构和索引,只装载数据(迁移、推全量)

cp [<cpt>] "sch.name='模式1'" INSERT|GROUP|100000

7.4.2 多模式,以及指定装载(迁移、全量)部分表

cp [<cpt>] "sch.name in('模式1','模式2')" CREATE|INSERT|INDEX|GROUP|100000
cp [<cpt>] "sch.name='模式1' and tab.name='表1'" CREATE|INSERT|INDEX|GROUP
cp [<cpt>] "sch.name='模式1' and tab.name in('表1','表2')" CREATE|INSERT|INDEX|GROUP

7.4.3 大字段(大对象)装载(迁移、推全量)

因为大字段装载容易产生性能问题,一般在迁移完非大字段(大对象)的表后,再单独装载大字段(大对象)表。

cp [<cpt>] "sch.name='模式1'" CREATE|INSERT|INDEX|GROUP|100000|NOLOB
cp [<cpt>] "sch.name='模式1'" UPDATE|LOB 

也可以灵活选择,先装载(迁移、全量)所有表的表结构

cp [<cpt>] "sch.name='模式1'" CREATE

再装载(迁移、全量)非大字段(大对象)的数据

cp [<cpt>] "sch.name='模式1'" INSERT|GROUP|100000|NOLOB

最后装载(迁移、全量)大字段(大对象)列数据

cp [<cpt>] "sch.name='模式1'" UPDATE|LOB

或选择延迟装载(迁移、全量)含有大字段(大对象)的表

cp [<cpt>] "sch.name='模式1'" CREATE|INSERT|INDEX|GROUP|100000|DELAY

说明:INSERT|DELAY掩码组合,表示先迁移非大字段(大对象)列和字节长度小于4000的大对象列数据,后通过更新的方式迁移字节长度大于4000的大字段(大对象)列数据。

7.4.4 重新装载(迁移、全量)

DROP并CREATE重建表

cp [<cpt>] "sch.name='模式1'" DROP|CREATE|INSERT|INDEX|GROUP|100000 

表结构不变时用TRUNCATE

cp [<cpt>] "sch.name='模式1'" TRUNCATE|INSERT|GROUP|100000

全部重新装载(迁移、全量)时,可选择删除历史装载记录

alter [<cpt>] delete load_recored

或查询最后一次总体表装载(迁移、全量)信息,过滤历史装载记录

show [<cpt>] load table last
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服