在数据架构不断演进的背景下,从 MySQL 迁移至 Doris 成为许多企业提升数据处理效率的关键选择。本文将深入剖析三种经过实践验证的 MySQL 迁移至 Doris 的最佳方案,涵盖全量迁移、增量同步、混合迁移以及基于 CDC(Change Data Capture)的实时迁移。每种方案都将从技术原理、实施步骤、适用场景、资源消耗等维度展开分析,并通过对比选型帮助读者结合自身业务需求与技术栈,找到最契合的迁移路径,实现数据平稳过渡与性能跃升。
一、JDBC Catalog 联邦查询方案(适合跨库实时查询)
1. 方案概述
通过 Doris 1.2 + 引入的JDBC Catalog功能,直接通过标准 JDBC 协议连接 MySQL 数据库,实现跨库联邦查询和数据写入。相比 ODBC,JDBC 接口更统一、兼容性更强,且无需复杂的驱动安装和版本匹配。
2. 环境要求
组件 | 版本要求 | 说明 |
---|---|---|
Doris | 1.2.0+ | 支持 JDBC Catalog 功能 |
MySQL | MySQL 5.7, 8.0 或更高版本 | 需开启远程访问权限 |
MySQL JDBC | 8.0.28+ | 驱动下载:MySQL JDBC 驱动 |
3. 实施步骤
3.1 安装 JDBC 驱动(所有 FE/BE 节点)
步骤 1:创建驱动目录
mkdir -p /your_path/doris/jdbc_drivers
步骤 2:上传驱动包下载 MySQL JDBC 驱动(如mysql-connector-java-8.0.31.jar
),并上传至所有 FE/BE 节点的/your_path/doris/jdbc_drivers
目录。
步骤 3:配置驱动路径编辑fe.conf
和be.conf
,添加以下配置(如果你使用的是默认的路径就不需要修改这个了):
jdbc_drivers_dir = /opt/doris/jdbc_drivers
步骤 4:重启服务
# 重启FE
cd /opt/doris/fe
bin/stop_fe.sh && bin/start_fe.sh --daemon
# 重启BE
cd /opt/doris/be
bin/stop_be.sh && bin/start_be.sh --daemon
3.2 创建 JDBC Catalog
使用 MySQL 客户端连接 Doris,执行以下 SQL 创建 Catalog:
CREATE CATALOG mysql PROPERTIES (
"type"="jdbc",
"user"="root",
"password"="secret",
"jdbc_url" = "jdbc:mysql://example.net:3306",
"driver_url" = "mysql-connector-j-8.3.0.jar",
"driver_class" = "com.mysql.cj.jdbc.Driver"
)
jdbc_url
:MySQL 连接地址,可指定数据库(如jdbc:mysql://host:port/dbname
)。
driver_url
:驱动文件名,需与/opt/doris/jdbc_drivers
目录下的文件一致,默认就是/your_path/doris/jdbc_drivers
。
3.3 创建查询或者导入
执行联邦查询
-- 直接查询mysql表
SELECT * FROM mysql_catalog.mysql_db.user_table LIMIT 10;
-- 与Doris表关联查询
SELECT a.id, a.name, b.sales
FROM mysql_catalog.mysql_db.user_table a
JOIN doris_table b ON a.id = b.user_id;
执行数据导入
-- 建表
create table as select mysql_catalog.mysql_db.user_table
-- 导入
insert into doris_table select * from mysql_catalog.mysql_db.user_table
4. 注意事项
数据类型映射:
MySQL 的BIT
类型映射为 Doris 的STRING
,需在查询时转换(如CAST(bit_col AS BOOLEAN)
)。
大字段类型(如BLOB
)建议通过VARCHAR
映射,避免查询性能问题。
权限控制:
为 Doris 创建专用 MySQL 用户,仅授予SELECT
权限,避免数据泄露。
在 Doris 中通过GRANT
语句限制外部表访问权限。
连接安全
如果您使用数据源上安装的全局信任证书配置了 TLS,则可以通过将参数附加到在 jdbc_url 属性中设置的 JDBC 连接字符串来启用集群和数据源之间的 TLS。
二、Binlog 实时同步方案(适合增量数据同步)
1. 方案概述
通过 Canal 解析 MySQL Binlog,实时同步增量数据至 Doris,支持 INSERT/UPDATE/DELETE 操作,适用于实时数据仓库场景。
2. 环境要求
组件 | 版本要求 | 说明 |
---|---|---|
MySQL | 5.7+ | 需开启 Binlog(ROW 模式) |
Canal | 1.1.5+ | 下载地址:Canal 官网 |
Doris | 1.2.0+ | 支持 BATCH_DELETE 特性 |
3. 实施步骤
3.1 配置 MySQL 开启 Binlog
步骤 1:编辑 my.cnf
[mysqld]
log-bin=mysql-bin # 开启Binlog
binlog-format=ROW # 使用ROW模式
binlog-row-image=FULL # 记录完整行数据
server-id=1 # 唯一服务器ID
步骤 2:重启 MySQL 服务
sudo systemctl restart mysqld
3.2 部署 Canal 服务
步骤 1:下载并解压
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
tar -zxvf canal.deployer-1.1.5.tar.gz
步骤 2:创建 Instance 配置
mkdir conf/demo
cp conf/example/instance.properties conf/demo/
vim conf/demo/instance.properties
关键配置:
canal.instance.master.address=192.168.1.100:3306 # MySQL地址
canal.instance.dbUsername=canal # 具有Binlog读取权限的用户
canal.instance.dbPassword=canal # 用户密码
canal.destination=demo # Instance名称
步骤 3:启动 Canal
sh bin/startup.sh
# 验证日志:cat logs/demo/demo.log,显示"start successful"表示启动成功
3.3 在 Doris 中创建同步任务
步骤 1:创建 Doris 目标表(需开启 BATCH_DELETE)
--create Mysql table
CREATE TABLE `test.source_test` (
`id` int(11) NOT NULL COMMENT "",
`name` int(11) NOT NULL COMMENT ""
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- create Doris table
CREATE TABLE `target_test` (
`id` int(11) NOT NULL COMMENT "",
`name` int(11) NOT NULL COMMENT ""
) ENGINE=OLAP
UNIQUE KEY(`id`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`id`) BUCKETS 8
PROPERTIES (
"replication_allocation" = "tag.location.default: 3"
);
步骤 2:创建同步作业
CREATE SYNC demo_job (
FROM mysql.test_table INTO target_test (id, name)
)
FROM BINLOG (
"type" = "canal",
"canal.server.ip" = "192.168.1.101", # Canal服务器IP
"canal.server.port" = "11111", # Canal默认端口
"canal.destination" = "demo", # Canal Instance名称
"canal.username" = "canal",
"canal.password" = "canal",
"sync.mode" = "incremental" # 增量同步模式
);
4. 注意事项
权限要求:需为 Canal 创建专用用户(如 canal),并授予REPLICATION SLAVE
权限:
CREATE USER 'canal'@'%' IDENTIFIED BY 'canal';
GRANT REPLICATION SLAVE ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
数据一致性:建议在 Doris 目标表中使用UNIQUE KEY
模型,并确保 MySQL 源表与 Doris 表字段一一对应。
三、Flink CDC 流式同步方案(适合高实时性场景)
1. 方案概述
基于 Flink CDC(Change Data Capture)实时捕获 MySQL 变更数据,通过 Flink-Doris 连接器写入 Doris,支持秒级延迟,适用于实时分析、实时报表场景。
2. 环境要求
组件 | 版本要求 | 说明 |
---|---|---|
Flink | 1.13+ | 支持 Flink CDC 2.0+ |
Doris | 1.2.0+ | 支持 Delete 操作 |
依赖库 | flink-cdc-2.1.0, flink-doris-connector-1.1.0 | 需下载对应版本 JAR 包 |
3. 实施步骤
3.1 构建 Flink 作业
步骤 1:添加 Maven 依赖
<dependency>
<groupId>org.apache.doris</groupId>
<artifactId>flink-doris-connector-1.16</artifactId>
<version>25.1.0</version>
</dependency>
步骤 2:编写 Flink SQL 脚本
-- enable checkpoint
SET 'execution.checkpointing.interval' = '30s';
-- 创建MySQL CDC源表
CREATE TABLE mysql_cdc_source (
id INT PRIMARY KEY NOT ENFORCED,
name STRING,
age INT,
ts TIMESTAMP(3) METADATA FROM 'source_ts' VIRTUAL
) WITH (
'connector' = 'mysql-cdc',
'hostname' = '192.168.1.100',
'port' = '3306',
'username' = 'root',
'password' = 'your_mysql_password',
'database-name' = 'test',
'table-name' = 'user_table'
);
-- 创建Doris目标表
CREATE TABLE doris_sink (
id INT,
name STRING,
age INT,
update_time TIMESTAMP(3)
) WITH (
'connector' = 'doris',
'fenodes' = 'doris-fe:8030',
'table.identifier' = 'test.user_table',
'username' = 'root',
'password' = '',
'sink.properties.format' = 'json',
'sink.enable-delete' = 'true',
'sink.label-prefix' = 'flink_cdc_'
);
-- 启动数据同步
INSERT INTO doris_sink SELECT id, name, age, ts FROM mysql_cdc_source;
3.2 提交 Flink 作业
<FLINK_HOME>bin/flink run \
-Dexecution.checkpointing.interval=10s \
-Dparallelism.default=1 \
-c org.apache.doris.flink.tools.cdc.CdcTools \
lib/flink-doris-connector-1.16-24.0.1.jar \
mysql-sync-database \
--database test_db \
--mysql-conf hostname=127.0.0.1 \
--mysql-conf port=3306 \
--mysql-conf username=root \
--mysql-conf password=123456 \
--mysql-conf database-name=mysql_db \
--including-tables "tbl1|test.*" \
--sink-conf fenodes=127.0.0.1:8030 \
--sink-conf username=root \
--sink-conf password=123456 \
--sink-conf jdbc-url=jdbc:mysql://127.0.0.1:9030 \
--sink-conf sink.label-prefix=label \
--table-conf replication_num=1
4. 注意事项
并行度优化:根据 MySQL 表数量和数据量调整 Flink 作业并行度,避免单任务压力过大。
写入机制:开启 Flink Checkpoint,Doris Flink Connector 提供了两种攒批模式,默认使用基于 Flink Checkpoint 的流式写入方式。
写入方式 | 流式写入 | 批量写入 |
---|---|---|
触发条件 | 依赖 Flink 的 Checkpoint,跟随 Flink 的 Checkpoint 周期写入到 Doris 中 | 基于 Connector 内的时间阈值、数据量阈值进行周期性提交,写入到 Doris 中 |
一致性 | Exactly-Once | At-Least-Once,基于主键模型可以保证 Exactly-Once |
延迟 | 受 Checkpoint 时间间隔限制,通常较高 | 独立的批处理机制,灵活调整 |
容错与恢复 | 与 Flink 状态恢复完全一致 | 依赖外部去重逻辑(如 Doris 主键去重) |
四、Datax 同步方案(适合全量 / 批量数据迁移)
1. 方案概述
Datax 是一款异构数据源之间数据同步工具,通过编写 JSON 格式的配置文件,实现 MySQL 与 Doris 之间的数据抽取、转换和加载(ETL)。该方案适用于全量数据迁移、定期批量数据同步场景,对实时性要求不高,但配置灵活,可自定义数据处理逻辑。
2. 环境要求
组件 | 版本要求 | 说明 |
---|---|---|
Datax | 3.0+ | 下载地址:Datax 官网 |
MySQL | 5.6+ | 支持标准 JDBC 协议 |
Doris | 1.0+ | 支持通过 JDBC 或 Broker 导入数据 |
3. 实施步骤
3.1 安装 Datax
# 下载Datax压缩包
wget https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/202308/datax.tar.gz
tar -zxvf datax.tar.gz
3.2 编写同步配置文件
创建mysql_to_doris.json
文件,示例配置如下:
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": [xxx],
"connection": [
{
"jdbcUrl": ["jdbc:mysql://localhost:3306/demo"],
"table": ["table_name"]
}
],
"username": "root",
"password": "xxxxx",
"where": ""
}
},
"writer": {
"name": "doriswriter",
"parameter": {
"loadUrl": ["127.0.0.1:8030"],
"column": [xxxx],
"username": "root",
"password": "xxxxxx",
"postSql": ["select count(1) from table_name"],
"preSql": [],
"flushInterval":30000,
"connection": [
{
"jdbcUrl": "jdbc:mysql://127.0.0.1:9030/demo",
"selectedDatabase": "demo",
"table": ["table_name"]
}
],
"loadProps": {
"format": "json",
"strip_outer_array":"true",
"line_delimiter": "\\x02"
}
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}
3.3 执行同步任务
python bin/datax.py mysql_to_doris.json
4. 注意事项
数据类型映射:确保 MySQL 与 Doris 字段类型兼容,如 MySQL 的DATETIME
对应 Doris 的DATETIME
,避免类型转换错误。
性能调优:通过调整channel
参数控制并发度,但过高的并发可能导致资源耗尽,建议根据数据库负载测试后设置。
五、方案对比与选型建议
方案 | 适用场景 | 复杂度 | 资源依赖 |
---|---|---|---|
JDBC Catalog | 跨库实时查询、联邦分析 | ★★☆☆☆ | 依赖 Doris JDBC 功能 |
Binlog 同步 | 增量数据实时同步 | ★★★☆☆ | 需部署 Canal 及相关组件 |
Flink CDC 同步 | 高实时性流式处理、复杂清洗 | ★★★★☆ | 依赖 Flink 集群 |
Datax 同步 | 全量 / 批量数据迁移、离线同步 | ★★★☆☆ | 轻量级工具,独立部署 |
优先选择 JDBC Catalog:当需要快速验证跨库查询功能,或需要与 Doris 本地表进行关联分析时。
推荐 Binlog 同步:常规增量同步场景,兼顾实时性和部署复杂度。
选择 Flink CDC:对实时性要求高(如实时看板),或需要复杂数据清洗(通过 Flink SQL 实现)。
使用 Datax 同步:适合一次性全量迁移,或周期性批量同步历史数据。
五、数据迁移最佳实践要点
全量初始化与增量同步结合:
首次迁移时,先通过DataX
导入 MySQL 全量数据,再启动 Binlog 或 Flink CDC 同步增量数据,避免历史数据积压。
数据类型兼容性测试:
重点验证 MySQL 的ENUM
、SET
、BIT
等类型在 Doris 中的映射是否符合预期。
监控与告警体系:
结合 Prometheus + Grafana 监控或者Doris Manager工具观察资源使用情况。
这份文档已涵盖多种迁移方式。若还想对某个迁移方式补充更多细节,或增加其他方面的内容,欢迎讨论。