当前位置: 首页 > news >正文

TiDB 和 MySQL 的迁移过程是什么?会遇到什么问题?怎么解决的?

Git高速下载
程序员面试资料大全|各种技术书籍等资料-1000G


一、迁移方案全景图

评估阶段
迁移设计
数据同步
业务验证
流量切换
监控优化

二、迁移全流程详解

1. 评估与设计阶段
步骤关键任务工具/方法
兼容性评估检查 SQL 语法、数据类型、事务隔离级别、自增 ID 等兼容性PingCAP TiDB DMchecker 组件
架构设计设计 TiDB 集群拓扑(PD/TiKV/TiDB 节点配比)、存储规划(SSD/NVMe)TiUP 部署工具 + 资源计算器
业务切割按业务模块分批次迁移(优先非核心模块)业务流量分析(如 Prometheus 监控)
2. 数据同步阶段

核心工具TiDB Data Migration (DM)
架构

MySQL
DM Worker
DM Master
TiDB

操作流程

  1. 全量迁移(Dumpling + Loader):
    # 导出 MySQL 全量数据
    dumpling -h 127.0.0.1 -P 3306 -u root -p xxx -o /data/dump# 导入 TiDB
    tiup tidb-lightning -config lightning.toml
    
  2. 增量同步(DM Binlog Replication):
    # dm-task.yaml
    name: test-task
    task-mode: incremental
    target-database:host: "tidb-cluster"user: "root"password: "***"
    mysql-instances:- source-id: "mysql-replica-01"loader-config-name: "global"syncer-config-name: "global"
    
3. 流量切换阶段
策略适用场景操作要点
业务双写容忍短暂不一致的读业务应用层同时写入 MySQL 和 TiDB,通过日志对比校验
DNS 切换简单业务修改域名解析指向 TiDB,TTL 需调低至 60s 内
Proxy 层切换高可用架构(如 ShardingSphere)通过配置中心动态切流,支持灰度发布
TiDB 读分流降低迁移风险写流量仍在 MySQL,读流量切至 TiDB(需解决主从延迟问题)

三、典型问题与解决方案

1. 数据兼容性问题
问题现象根因分析解决方案
自增主键冲突TiDB 分布式自增 ID 实现差异改用 AUTO_RANDOMSHARD_ROW_ID_BITS 分散写入热点
SQL 语法不兼容SELECT ... LOCK IN SHARE MODE业务改造:替换为 SELECT ... FOR UPDATE 或开启 TiDB 悲观事务
timestamp 默认值错误MySQL 允许 0000-00-00 00:00:00迁移前清理非法数据 或 设置 TiDB 的 sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES'
2. 性能问题
问题现象根因分析解决方案
写入热点单表自增 ID 导致 Region 热点提前做表分区(SHARD_ROW_ID_BITS=4) 或 改用 UUID 等分布式 ID
DDL 执行卡顿大表加列/索引阻塞复制使用 Online DDL 工具(如 gh-ost) 或 TiDB 的 ALGORITHM=INPLACE
TiCDC 同步延迟大事务(>5GB)阻塞复制拆分事务:innodb_flush_log_at_trx_commit=2 + 减小批量操作尺寸
3. 运维问题
问题现象根因分析解决方案
GTID 同步中断MySQL 主从切换导致 GTID 跳跃DM 开启 enable-gtid + 配置 relay_log_purge=0 保留 Relay Log
字符集乱码TiDB 默认字符集为 utf8mb4导出时指定字符集:dumpling --charset=utf8
外键约束失败TiDB 外键仅语法兼容(实际不生效)业务层移除外键,改由应用逻辑保证

四、关键优化策略

1. 迁移加速方案
  • 物理导入优化
    # lightning.toml
    [tikv-importer]
    backend = "local"  # 比 "log" 模式快 5 倍以上
    sorted-kv-dir = "/nvme_dir"  # 使用 NVMe 磁盘
    
  • 并行复制
    # dm-task.yaml
    syncer-config:worker-count: 16  # 根据 CPU 核数调整batch: 2000       # 增大批量提交
    
2. 数据一致性校验

工具TiDB Data Check (Sync-diff-inspector)

./sync_diff_inspector \--config=diff-config.toml \--table=test.t1 \   # 指定校验表--range="id > 1000 and id < 2000"  # 分段校验

校验结果处理

  • 自动修复:--fix-sql-file=fix.sql
  • 忽略无关差异(如 AUTO_INCREMENT 值)
3. 回滚预案
切流异常
是否数据错乱?
切回 MySQL DNS
启用 MySQL 备份
DM 增量回灌
恢复业务

五、迁移后监控要点

监控项工具告警阈值
复制延迟DM Metrics + Grafana> 30s 持续 5min
TiDB 响应时间Prometheus + AlertmanagerP99 > 1s
Region 均衡TiDB DashboardStore 间 Region 数差异 > 20%
大查询TiDB Slow Query Log执行时间 > 10s

六、实战经验总结

  1. 避坑指南

    • 提前测试 事务隔离级别:TiDB 默认 SI(快照隔离) vs MySQL RR(可重复读)
    • 禁用 外键/存储过程:TiDB 兼容度有限
    • 处理 大字段:LOB 类型数据需调大 txn-entry-size-limit
  2. 性能压测必做项

    # 使用 Sysbench 验证 TPS/QPS
    sysbench oltp_read_write --tables=32 --table-size=1000000 run# 对比迁移前后指标
    MySQL QPS: 15k → TiDB QPS: 38k (横向扩展后)
    
  3. 成本优化

    • TiFlash 替代 ES 做实时分析,减少技术栈复杂度
    • 冷热数据分离:将历史数据归档至 S3(通过 TiDB 外部表访问)

程序员面试资料大全|各种技术书籍等资料-1000G
Git高速下载

在这里插入图片描述

http://www.dtcms.com/a/310893.html

相关文章:

  • 编译器工作原理的显微镜级拆解
  • 【读代码】 KAG项目:开源知识图谱自动构建与推理平台原理与实践
  • PYTHON从入门到实践-18Django从零开始构建Web应用
  • SpringBoot3.x入门到精通系列:2.1 自动配置原理
  • 【软考中级网络工程师】知识点之 VRRP
  • 关于Web前端安全防御CSRF攻防的几点考虑
  • 关于人工智能AI>ML>DL>transformer及NLP的关系
  • MySQL(173)MySQL中的存储过程和函数有什么区别?
  • 【DeepSeek-R1 】分词系统架构解析
  • 快速了解决策树
  • API征服者:Python抓取星链卫星实时轨迹
  • Docker 部署与配置 MySQL 5.7
  • 四、Portainer图形化管理实战与Docker镜像原理
  • 2024年网络安全案例
  • 从数据丢失到动画流畅:React状态同步与远程数据加载全解析
  • Jotai:React轻量级原子化状态管理,告别重渲染困扰
  • 《深潜React列表渲染:调和算法与虚拟DOM Diff的优化深解》
  • 《React+TypeScript实战:前端状态管理的安全架构与性能优化深解》
  • Oracle 11g RAC集群部署手册(三)
  • SQL 四大语言分类详解:DDL、DML、DCL、DQL
  • Oracle 11g RAC集群部署手册(一)
  • 探索:Uniapp 安卓热更新
  • flink写paimon表的过程解析
  • cmd怎么取消关机命令
  • 【DL学习笔记】yaml、json、随机种子、浮点精度、amp
  • hcip---ospf知识点总结及实验配置
  • 学习嵌入式第十八天
  • rag学习-以项目为基础快速启动掌握rag
  • 深入 Go 底层原理(十):defer 的实现与性能开销
  • Vue3+ts自定义指令