在使用阿里云 DTS(Data Transmission Service)进行数据同步时,必须先执行全量数据同步,再执行增量数据同步。这是由 DTS 的设计机制决定的,目的是确保目标数据库的数据完整性和一致性。PolarDB-X 的分片是分库与分表的结合,通过水平拆分实现数据分布式存储。
全量同步阶段
数据导出:DTS 从源库按分块(Chunk)导出数据,提升大表同步效率。
数据加载:将导出的数据批量加载到目标库,支持并行加载以加速同步。
增量日志缓存:在全量同步过程中,DTS 会持续捕获并缓存增量日志,避免数据丢失。
一、迁移前准备
1. MySQL 侧配置
• 开启 Binlog:确保 MySQL 已开启 Binlog,并设置 binlog_format=ROW
和 binlog_row_image=FULL
(DTS 要求)。
• 业务分片字段选择:确定分库分表字段(如 user_id
或 order_id
),需保证该字段在业务中具有高基数(避免数据倾斜)。
2. PolarDB-X 侧配置
• 创建目标库与分片规则:
-- 创建分库分表示例(HASH 分片,分 4 张表)
CREATE DATABASE orders
PARTITION_MODE="sharding"
SHARDING_ALGORITHM="HASH"
SHARDING_FIELDS="user_id"
SHARDING_NUM=4;
• 全局序列预创建:
-- 创建全局序列(用于主键生成)
CREATE SEQUENCE order_id_seq
INCREMENT BY 1
START WITH 1
MINVALUE 1
MAXVALUE 9223372036854775807
CACHE 1000;
二、DTS 迁移任务配置
1. 任务创建
• 选择链路:在阿里云 DTS 控制台,选择 MySQL → PolarDB-X 链路。
• 配置源库与目标库:填写 MySQL 和 PolarDB-X 的连接信息,确保网络互通。
2. 分库分表规则配置
• 手动指定分片策略:
• 分片算法:选择 HASH
或 RANGE
(根据业务场景)。
• 分片字段:填写预定义的分片字段(如 user_id
)。
• 分片数量:与 PolarDB-X 中定义的分片数一致(如 4 张表)。
• 示例配置:
yaml sharding: mode: "HASH" fields: ["user_id"] num: 4
3. 主键与全局序列映射
• 禁用 MySQL 自增主键:在 DTS 任务中勾选 “忽略自增主键”,避免与 PolarDB-X 序列冲突。
• 映射全局序列:
• 在 DTS 的 “对象映射” 中,为目标表的 id
字段指定 PolarDB-X 序列生成规则:
sql -- 示例:使用 SEQUENCE.NEXTVAL() 生成主键 INSERT INTO orders (id, user_id, ...) VALUES (NEXT VALUE FOR order_id_seq, ?, ...);
三、全局序列生效机制
1. PolarDB-X 序列特性
• 分布式协调:基于内部协调服务(如 Zookeeper)实现多节点同步,保证全局唯一性。
• 高可用性:序列数据通过多副本存储,故障时自动切换,确保业务连续性。
2. DTS 与序列的集成
• 增量同步适配:
• DTS 在增量同步阶段会捕获 MySQL 的 AUTO_INCREMENT
值,但需通过 “主键冲突处理策略” 改为 “覆盖” 或 “忽略”。
• 若业务主键由 PolarDB-X 序列生成,需在 DTS 中禁用 MySQL 主键同步。
3. 性能优化
• 序列缓存调整:增大 PolarDB-X 序列的 CACHE
值(如 CACHE 10000
),减少协调服务调用频率。
• 批量获取 ID:在应用层通过 SELECT NEXT VALUE FOR seq FROM DUAL CONNECT BY LEVEL 1000
预取批量 ID,降低延迟。
CACHE
的作用
PolarDB-X 的序列通过分布式协调服务(如 Zookeeper)保证全局唯一性。每次生成 ID 需要与协调服务交互。
增大 CACHE 值(如 CACHE 1000)会一次性预取多个 ID 到本地内存,后续生成 ID 时直接从内存读取,减少协调服务调用频率。
提升 ID 生成速度
预取 ID 到内存后,生成速度由内存操作(O(1))替代网络/磁盘操作(O(logN)),延迟从毫秒级降至微秒级。
四、迁移后验证与修复
1. 数据一致性校验
• DTS 校验工具:使用 DTS 的 “数据校验” 功能,对比源库和目标库的记录数、主键范围。
• 手动校验示例:
-- 检查分片数据分布
SELECT COUNT(*) FROM orders_0000;
SELECT COUNT(*) FROM orders_0001;
-- 检查序列连续性
SELECT MIN(id), MAX(id) FROM orders;
2. 常见问题处理
• 分片字段缺失:若迁移后数据未按分片规则分布,需检查 DTS 分片字段配置,并重新执行全量迁移。
• 序列冲突:若出现主键重复,可通过 ALTER SEQUENCE
调整序列起始值:
ALTER SEQUENCE order_id_seq RESTART WITH 1000000;
五、完整操作流程
A[MySQL 开启 Binlog] --> B[创建 PolarDB-X 分片表]
B --> C[预创建全局序列]
C --> D[配置 DTS 分片规则]
D --> E[启动迁移任务]
E --> F[校验数据一致性]
F -->|成功| G[业务切换]
F -->|失败| H[修复分片/序列配置]
六、注意事项
- 分片字段业务强相关:避免后续因业务变更导致分片失效。
- 序列跨分片有序性:若需全局有序,选择
RANGE
分片或使用 PolarDB-X 的TSL
时序分片。 - 大表迁移优化:对 TB 级数据,建议分批次迁移,减少单任务压力。
通过以上步骤,可实现 MySQL 到 PolarDB-X 的分库分表迁移,并确保全局序列的稳定生成与数据一致性。