量删除之前,目标库insert 操作的commit(01:50:58.606390Z) 也是在源库delete 操作的commit(01:50:58.717251Z)之前
***在目标库的commit执行后0.11s 期间,pt-archiver发生异常终止(这概率是很小的#_#), 源库的commit没有执行,delete操作就会回滚,出现源库的数据和目标库的数据不一致的问题***
注意
MySQL8.0 执行load data infile 命令除了设置secure_file_priv 外,还需要在[client] 和[mysqld] 中设置local-infile=1,不然会出现错误
DBD::mysql::st execute failed: The used command is not allowed with this MySQL version
pt-archiver commit
- 操作的相关代码可见是在目标库完成commit 操作后,源库才进行commit操作的
- 当事务中操作的数据量很大时,源库delete的commit操作耗时也会比较长,pt-archiver发生异常终止后(源库的commit还没完成,delete操作会回滚),会出现目标库已存在数据,源库还未删除数据不一致的情况
7068 if ( $dst ) {
7069 trace('commit', sub {
7070 $dst->{dbh}->commit;
7071 });
7072 }
7073 trace('commit', sub {
7074 $src->{dbh}->commit;
7075 });
7076 $txn_cnt = 0;
7077 }
7078 }
结论
- 在pt-archiver归档非commit期间,pt-archiver异常终止,源库和目标库都会rollback,不会出现不一致情况
- 在commit的时刻pt-archiver异常终止,可能出现不一致情况:目标库已经insert ,源库还没有delete的情况
- pt-archiver异常终止后(没按时归档完,手动kill pt进程等),需手动校验目标库和源库的主键情况,否则再次归档会出现主键冲突的错误
pt-archiver归档工具的使用详解
pt-archiver
pt-archiver数据归档