TiDB从0到1系列
- TiDB-从0到1-体系结构
- TiDB-从0到1-分布式存储
- TiDB-从0到1-分布式事务
- TiDB-从0到1-MVCC
- TiDB-从0到1-部署篇
- TiDB-从0到1-配置篇
- TiDB-从0到1-集群扩缩容
- TiDB-从0到1-数据导出导入
- TiDB-从0到1-BR工具
一、sync-diff-inspector工具
sync-diff-inspector是TiDB原生的数据对比工具,可以对比表与表的结构\数据差异
支持MySQL - MySQL、MySQL - TiDB的两两组合,其工具被开发出来主要的意义也是为了大家将数据从MySQL迁移
到TiDB后可以做校验。
sync-diff-inspector实现逻辑:
通过checksum,根据表结构表数据通过算法得到一个类MD5值然后进行比较。
如果整体扫描后checksum不同,则将checksum一分为二(二分法)再次比较,以此类推,当范围足够小时就对数据进行逐行对比
最终生成FIX SQL(修复SQL)
同时每10s生成一个checkpoint,用于断点后继续比较
需要权限
上下游:select show_databases reload
二、sync-diff-inspector使用限制
- 不支持json bit binary blob等类型的数据对比
- 如果是TiDB和mysql之间进行校验,Float,double等浮点数类型无法对比(因为底层排序规则逻辑不通,对比时会有差异)
- 没有主键或唯一键的表可以校验,但是无法正确生成修复sql
- 当数据正在同步时不支持数据在线校验
三、sync-diff-inspector操作
1、下载安装
wget https://download.pingcap.org/tidb-community-toolkit-v7.5.1-linux-amd64.tar.gz
------
tar -xvf tidb-community-toolkit-v7.5.1-linux-amd64.tar.gz
2、解压后在工具包就可看到
3、创建对比的配置文件
vim sync_diff_config.toml
--------------------------------
#对比时的线程数
check-thread-count=4
#是否输出修复语句
export-fix-sql=true
#true只查表结构,false检查表结构和数据
check-struct-only=false
#数据源
[data-sources]
[data-sources.mysql]
host = "172.21.243.119"
port = 3306
user = "dba"
password = "Dba1qaz@WSX"
#对比规则
route-rules = ["rule1"]
[data-sources.tidb]
host = "172.21.243.119"
port = 4000
user = "dba"
password = "Dba1qaz@WSX"
#对比规则
[routes]
[routes.rule1]
#原库名
schema-pattern = "test"
#目标库名
target-schema = "test"
[task]
#对比结果输出目录
output-dir = "/tmp/output"
#原端标识,对应上面的mysql
source-instances = ["mysql"]
#目标端标识,对应上面的tidb
target-instance = "tidb"
#对比哪些表
target-check-tables = ["test.*"]
4、执行对比
./sync_diff_inspector --config=/opt/sync_diff_config.tom
5、查看对比结果
- checkpoint:检查点
- fix-on-b:修复语句(需在目标端执行)
- summary.txt:对比内容记录
- sync_diff.log:对比日志
6、SQL修复内容
- 下游数据库缺失行,生成replace语句
- 下游数据库冗余,生成delete语句
- 下游数据库行部分数据不一致,则是replace语句,但会在SQL文件中通过注释的方法标明不同的列
7、执行修复SQL后再验证
8、操作注意事项
- 避免在业务高峰期
- 建议比对前先收集表的统计信息
- sql修复数据前需先确认
- sync-diff-inspector默认开启sharding校验,(如果不是比对分片数据,sharding需要设置为false)
- 如果表的主键或唯一键为varchar类型,需要在sync-diff-inspector的配置文件中增加collation配置(目的是为了保证check排序校验是顺序一致) collation=utf83
- 生成的修复SQL是单行的,差异较大时修复速度过慢
彩蛋
TiDB相较于其他数据库的一大优势就是工作中常用的组件都有原生工具,并且大多数都遵循Apache License 2.0开源协议。