本周DTS一个增量迁移任务出现一个很诡异的问题,之所以说诡异是因为DTS已经为该用户的库同步了很长一段时间的增量数据(数据量在15G+),今天突然出现了这个问题:
从异常的信息大致可以推测出出错的原因是新插入的一行数据需要存储在数据页的实际数据长度大于一个数据页的长度(8126).所以首先对比了一下源表和目标表的数据结构(可能是两边的表结构不一致导致的),两边的表结构是一致的,但却是定义了许多Text类型的大字段而已
然后查询了两边的innodb_file个配置,源库:
目标库:
这样一看出错的原因就一目了然了.简单解释一下,Barracuda对应row_format(dynamic, compress),其中dynamic下text的所有内容都是off-page存放的;Antelope 对应row_format(compact, redundant),其中compact下的text是存786B在row中,超过部分存在off-page.所以要解决问题就必须将innodb_file的给是改成Barracuda与源库一致,当这并不能马上解决问题,因为innodb表的存储格式在创建时已经确定了,那么就只能重建表了.为跟用户确认目标库无业务写入的情况下通过create table * select * ,insert into * select 以及rename在目标库重建了该表,之后就完美解决了.