5.常见问题 - squids-io/dts-doc GitHub Wiki

技术点问答

全量数据初始化是否需要临时空间中转数据?

不需要,dbmotion是直接fetch数据,写出到目标,程序会控制每次的fetch size和目标commit批次,仅维持很小的内存空间循环使用,直到迁移结束,整个迁移过程数据不落地

程序多线程并发是如何工作的?

可以利用--work-threads来控制服务协程数量,我们会对每张表进行行数预估,并根据--split-rowcount参数 进行数据分片,然后将分片分散交给多个协程去处理,并行参数您可以直接运行./dbmotion,参考WorkSetting部分

表数据是如何分片的?

利用表行数,--split-rowcount参数进行分片数量的估算,根据主键/唯一键进行分片where范围子句的生成,如果表字段不具备范围筛选条件,将不做分片

增量同步能否并行?

  • Canal增量模式,我们是解析的canal event事件数据,根据主键/唯一键进行Event分发,并发复制,无主键表只支持单线程同步,目前也支持DDL,truncate自动同步
  • Slave模式,是将目标转换成slave接入源端MySQL,会走原生态的master/slave并行复制

数据校验如何工作

  • PT Check模式,需要走slave增量才能支持,源端库发送statement模式的DML语句,自动同步到目标库,两边的结果进行对比,会包括行数,内容CRC值的对比,该校验模式的好处是不停业务,在线校验
  • CheckSum模式,无需slave增量支持,但是整个校验过程不能有数据更新,需要停止业务

如何访问QFusion上的MySQL

QFusion机器上部署dbmotion后,如果迁移时和QFusion集群vip网络不通,需要在dbmotion所在的物理节点调整网络策略,调整命令如下:

sysctl -a 2>/dev/null |grep "\.rp_filter = 1" |awk '{print $1}' |xargs -I {} sysctl -w {}=0

初始化失败,日志中报错Unknown database 'dbmotion_web'

有可能是由于VPN或者浏览器的安全设置导致的,如果是chrome,可以登录chrome://flags/#block-insecure-private-network-requests并设置Block insecure private network requests为disable。

用户迁移导致目标端管理系统失效

如果目标端root@‘localhost’是某管理系统的管理用户,迁移的时候,用户选择了root@'localhost',dbmotion会覆盖目标端的用户,可能导致数据库管理没法管理实例,从而导致高可用和监控的异常。

支持的数据类型

DataType isSupport
tinyint yes
smallint yes
mediumint yes
int yes
bigint yes
integer yes
tinyint unsigned yes
smallint unsigned yes
mediumint unsigned yes
int unsigned yes
bigint unsigned yes
integer unsigned yes
double yes
float yes
decimal yes
numeric yes
char yes
varchar yes
tinytext yes
smalltext yes
mediumtext yes
text yes
longtext yes
tinyblob yes
smallblob yes
mediumblob yes
blob yes
bool yes
date yes
time yes
datetime yes
timestamp yes