数据传输工具,在全量同步中,往往是并发执行的,dts有个重写逻辑,是:
1)DTS碰到死锁的时候,会当前session中重试,继续写入数据。比如:DTS一批写入1024条数据,写到第1000条失败了,会在当前session中继续从头写入这1024条数据。这个过程可能会出现数据重复写入,会发生主键冲突。
2)DTS写入检测到主键冲突报错,就会将insert转换成delete + insert执行,先对当前1024条做delete操作,删除完成后,做insert操作。
因此,在某些场景下,会导致不断删除重写数据,导致产生大量的事务日志。
比如oracle的bitmap索引,会enq-TX mode=4的锁堵塞,进而产生死锁,进而引发问题:
并且在后续,不仅出现insert对insert的死锁,由于dts还要删除数据,会delete数据,因此然后又加上了delete和insert的死锁,后续还有delete和delete的死锁。
死锁的频率越来越高,重写次数越来越高,因此事务日志的量,可能会变成平时的10多倍,打爆磁盘空间,从而引发事故。