dm-worker任务报错求解

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v3.0.3
  • 【问题描述】:dm版本为v1.0.3

dm-worker任务同步阿里云5.7版本的rds-mysql,出现以下报错,根据报错信息排查binlog位置日志为XA日志相关信息。这种binlog sql应该不属于"incompatible DD"范围吧 , 这种情况下Binlog event filter该如何进行配置予以过滤呢? 谢谢

                    "errors": [
                        {
                            "Type": "UnknownError",
                            "msg": "[code=11006:class=functional:scope=internal:level=high] current pos (mysql-bin|000001.001822, 84989524): encountered incompatible DDL in TiDB:\n\tplease confirm your DDL statement is correct and needed.\n\tfor TiDB compatible DDL, please see the docs:\n\t  English version: https://pingcap.com/docs/dev/reference/mysql-compatibility/#ddl\n\t  Chinese version: https://pingcap.com/docs-cn/dev/reference/mysql-compatibility/#ddl\n\tif the DDL is not needed, you can use a filter rule with \"*\" schema-pattern to ignore it.\n\t : parse statement: line 1 column 2 near \"XA START X'647264732d313032393238633565643066303030304070745f6f72646572',X'50545f4f524445525f3135363938333635313535323044555a535f503851445f30303730',1\" %!!(MISSING)(EXTRA string=XA START X'647264732d313032393238633565643066303030304070745f6f72646572',X'50545f4f524445525f3135363938333635313535323044555a535f503851445f30303730',1)\ngithub.com/pingcap/dm/pkg/terror.(*Error).Delegate\n\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/pkg/terror/terror.go:267\ngithub.com/pingcap/dm/pkg/parser.Parse\n\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/pkg/parser/common.go:42\ngithub.com/pingcap/dm/syncer.(*Syncer).parseDDLSQL\n\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/ddl.go:68\ngithub.com/pingcap/dm/syncer.(*Syncer).handleQueryEvent\n\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:1564\ngithub.com/pingcap/dm/syncer.(*Syncer).Run\n\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:1310\ngithub.com/pingcap/dm/syncer.(*Syncer).Process\n\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:598\ngithub.com/pingcap/dm/syncer.(*Syncer).Resume\n\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:2306\nruntime.goexit\n\t/usr/local/go/src/runtime/asm_amd64.s:1357",
                            "error": null
                        }
                    ],

#200213 3:28:39 server id 1281286294 end_log_pos 84989524 CRC32 0x771d389c Query thread_id=1733961 exec_time=0 error_code=0
SET TIMESTAMP=1581535719/!/;
/!\C utf8mb4 //!/;
SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=45/!/;
XA START X’647264732d313032393238633565643066303030304070745f6f72646572’,X’50545f4f524445525f3135363938333635313535323044555a535f503851445f30303730’,1
/!/;

看报错是出现了不兼容的 DDL 语句,参考这里:https://pingcap.com/docs-cn/v2.1/reference/tools/data-migration/faq/

上游mysql没有ddl 。这里是不是判断错误 ?

根据报错信息,对应的binlog位置是一个XA事务日志 ,如下 。 这种属于DDL吗 ? 是属于什么类型的event呢? 如果是该怎么跳过呢 ?

#200213 3:28:39 server id 1281286294 end_log_pos 84989524 CRC32 0x771d389c Query thread_id=1733961 exec_time=0 error_code=0 SET TIMESTAMP=1581535719/ ! /; / !\C utf8mb4 // ! /; SET @@session.character_set_client=45,@@session.collation_connection=45,@@session.collation_server=45/ ! /; XA START X’647264732d313032393238633565643066303030304070745f6f72646572’,X’50545f4f524445525f3135363938333635313535323044555a535f503851445f30303730’,1 / ! /;

请问上游的表是 myisam 引擎的吗?

是阿里云5.7版本的mysql,是innodb引擎

所有的表都是 Innodb 引擎吗?另外能否根据出现 XA 的信息找到对应的表,看下表的存储引擎?如果有非 Innodb 引擎,建议跳过对应的表再进行同步。

所有的表都是 Innodb 引擎 。这个场景是分库分表合表,是多个rds实例里的分表合并到tidb中,在多个rds的前面是阿里云的drds分布式数据库。我查查日志观察下看看,谢谢大佬支持

好的,建议根据日志再排查下,根据已有的信息能够得到的就是上面的结论。辛苦再仔细排查下,有问题欢迎提问。

你好,确认了一下,报错的信息binlog位置处是RDS for MySQL XA 分布式事务日志,一个事务同时修改多个rds实例下的分库数据时会存在这个情况,此次是dml类型sql,不是ddl类型sql。 请问这种情况dm任务该如何避免报错呢?谢谢

https://help.aliyun.com/document_detail/71230.html

可能是阿里云可能对 binlog 格式做了一些修改,或者 DM 暂时还没有支持这种 binlog 类型,还需要确认。 现在的解决方法是可以设置 sql-skip 过滤这种 binlog,其中的 sql-pattern 需要能匹配上以 “XA START” 开头的语句,可以参考文档 https://pingcap.com/docs-cn/stable/reference/tools/data-migration/skip-replace-sqls/#sql-skip

好的,谢谢大佬,我试一下看看

:+1::+1::+1:

任务配置文件中添加以下XA事务的语法,过滤掉相应binlog后,任务恢复正常了。:+1::+1::+1:

“XA START” “XA END” “XA COMMIT” “XA PREPARE” “XA ROLLBACK” “XA RECOVER” “XA BEGIN”

麻烦大佬帮确认下目前dm组件对XA事务特性的支持如何。

如果所有XA事务涉及到的binlog都是提交的类型,目前这种过滤策略应该不会影响到下游tidb数据的一致性;但如果存在回滚类型的binlog event,那么这种过滤就会影响下游数据的一致性了 。

:+1:好的,我们后续会确认一下

想问下,任务中具体是怎么配置的?能给个截图看看吗,谢谢


filters:
  filter-supported-rule:
    schema-pattern: "pt_order_gxfa_*"
    events: ["all dml", "alter table"]
    action: Do
  filter-unsupported-rule:
    schema-pattern: "*"
    sql-pattern: ["XA PREPARE", "XA START", "XA END", "XA COMMIT", "unsupported-sql", "create database", "drop database", "create table", "drop table", "truncate table", "rename table"]
    action: Ignore

1赞

:+1:

果然能解决,非常感谢悟空的解答,谢谢。

@qq悟空 感谢分享~