任务同步中断

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

  • 【TiDB 版本】:
    tidb版本:3.0.4
    dm版本:1.0.2
  • 【问题描述】:
    上游mysql执行了tidb不支持的sql,dm同步中断,通过sql-skip跳过SQL不生效,

sql-skip跳过,resume-task office_ssp_test 之后,通过query-status office_ssp_test查看任务还是没有恢复,如下:



dm_worker的日志如下:

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

使用 binlog filter 跳过吧。在 task 配置文件中配置一下。

看了一下binlog filter的文档都是过滤表的,我这个是修改库的, filter该如何写呢:
https://pingcap.com/docs-cn/stable/reference/tools/data-migration/features/overview/#binlog-event-filter

[2019/12/13 12:29:57.090 +08:00] [ERROR] [subtask.go:252] [“unit process error”] [subtask=office_dip_test] [unit=Sync] [“error information”=“{“msg”:”[code=11007:class=functional:scope=internal:level=high] unknown type ddl \u0026{ddlNode:{stmtNode:{node:{text:ALTER SCHEMA db_casedb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_bin}}} Name:db_casedb AlterDefaultDatabase:false Options:[0xc00c778620 0xc00c778680]}
github.com/pingcap/dm/pkg/terror.(*Error).Generate
\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/pkg/terror/terror.go:232
github.com/pingcap/dm/pkg/parser.SplitDDL
\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/pkg/parser/common.go:290
github.com/pingcap/dm/syncer.(*Syncer).resolveDDLSQL
\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/ddl.go:132
github.com/pingcap/dm/syncer.(*Syncer).handleQueryEvent
\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:1591
github.com/pingcap/dm/syncer.(*Syncer).Run
\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:1292
github.com/pingcap/dm/syncer.(*Syncer).Process
\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:590
github.com/pingcap/dm/syncer.(*Syncer).Resume
\t/home/jenkins/agent/workspace/build_dm_master/go/src/github.com/pingcap/dm/syncer/syncer.go:2287
runtime.goexit
\t/usr/local/go/src/runtime/asm_amd64.s:1337",“error”:{“ErrCode”:11007,“ErrClass”:2,“ErrScope”:3,“ErrLevel”:3,“Message”:“unknown type ddl \u0026{ddlNode:{stmtNode:{node:{text:ALTER SCHEMA db_casedb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_bin}}} Name:db_casedb AlterDefaultDatabase:false Options:[0xc00c778620 0xc00c778680]}”}}"]

使用 binlog filter 跳过也不生效,是我配置的有问题嘛?


  1. 可以参考这里配置 TiDB parser 不支持的 SQL :过滤-tidb-不支持的-sql-语句
  2. 另外在配置完之后再 Stop-task , Start-task 进行尝试。

配置了,不生效,见我上面的截图,是我配置的有问题嘛

events 里面没有 alter ,有 alter table。不过对于你这个 case 是要过滤 alter schema 所以只能通过 sql-pattern 处理。请参考上面提及的官方文档。

通过 sql-pattern 也不行,帮忙看看我配置的哪里有问题


filter-alter-rule:
schema-pattern: "*"
sql-pattern: ["^alter\s+schema"]
action: Ignore

还是不行


这样可以了,但是这样会把所有库的这个操作都忽略掉,容易误伤其他库,我先这样解决吧,谢谢了

对了,我这样跳过这个错误之后是不是应该把这个过滤去掉,并更新task文件重启下task

是的。跳过之后可以把这个 规则注释掉。不过如果下次出现同样的 SQL 又会出现该问题。

好的,感谢

最开始设置的 filter 过滤,如果 schema-pattern 设置了库名, 这个时候还没通过 parser 获取到库名、表名,所以用库表、表名,就匹配不上。或者可以在正则表达式上添加上库名的信息,就不会误伤其他库。

1 个赞

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。