场景: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
| 角色 | 地址 | 端口 | 模块/服务 | 说明 |
|---|---|---|---|---|
| MySQL 源数据库 | 192.168.52.150 |
3306 |
MySQL 8.4 | 源库 appdb |
| DM8 目标数据库 | 192.168.52.149 |
5236 |
DM8 | 目标模式 APPDB |
对象映射关系:
MySQL appdb.* → DM8 APPDB.*
lscpu nkvers
查看源端和目的端的CPU架构和操作系统,使用对应版本的drs,安装对应的数据库版本。
麒麟 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 冲突,如下:
先备份一下文件,之后删除冲突文件:
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
取得 MySQL 临时密码:
sudo grep 'temporary password' /var/log/mysqld.log
完成安全初始化:
sudo mysql_secure_installation
输入刚才的临时密码,再设置一个包含大小写字母、数字和特殊字符的强密码。其他问题通常可以选择 Y。
查看数据库版本如下:
mysql --version
使用新的密码登录MySQL即可:
mysql -u root -p
在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';
在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;
当前 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'@'%';
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;
创建安装目录并授权,源端和目标端的安装过程都一样,只是配置文件和用户不同:
# 用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
# 组件可自己选择,我这里没有选择组件安装
源端的DRS安装过程一样。
在源端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
目标端的配置过程和源端的一样,只是其中的命名不同
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"
源端MySQL配置依赖时MySQL8.4版本可能没有libmysqlclient.so.18这个文件,需要检查是否存在,如果有就跳过这一步。
检查 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
设置当前会话:
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'
cd /sqllog/dmdrs/bin_cpt_mysql
./DrsService start
进入控制台:
./drcsl
cd /sqllog/dmdrs/bin_exec_dm8
./DrsService start
进入控制台:
./drcsl
配置起始LSN(仅用于测试链路是否通畅)执行后观察目的端日志是否收到请求并重置完成:
CSL> alter cpt_mysql_appdb set lsn
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 |
创建主键和索引 |
CSL> start cpt_mysql_appdb
当表装载(迁移、推全量)完成后,就会对该表进行实时同步(增量)。在表装载(迁移、推全量)时,DRS会缓存该表未来产生的变更操作,装载(迁移、推全量)完成后就会开始追平,未装载(迁移、推全量)的表则不会缓存。
综上,无需等待所有表完成装载(迁移、推全量)再开实时同步(增量),执行装载(迁移、推全量)命令后,即可开启实时同步(增量)。
cp [<cpt>] "sch.name='模式1'" INSERT|GROUP|100000
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
因为大字段装载容易产生性能问题,一般在迁移完非大字段(大对象)的表后,再单独装载大字段(大对象)表。
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的大字段(大对象)列数据。
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
文章
阅读量
获赞
