TIDB DM 不能跳过 上游定时EVENT 任务

上游做了一个定时任务,但同步到下游TIDB时,报下面的错误,我尝试用此命令跳过对应的点位:

sql-skip --worker=xxxx.xxx.xxx.xxx:8262 --binlog-pos=mysql-bin|000001.007763:456911620 frxs_report_base_db
但查询状态还是不能执行,请问这个该如何处理?

“subTaskStatus”: [
{
“name”: “frxs_report_base_db”,
“stage”: “Paused”,
“unit”: “Sync”,
“result”: {
“isCanceled”: false,
“errors”: [
{
“Type”: “UnknownError”,
“msg”: “”,
“error”: {
“ErrCode”: 11006,
“ErrClass”: 2,
“ErrScope”: 3,
“ErrLevel”: 3,
“Message”: "current pos (mysql-bin|000001.007763, 456911620): encountered incompatible DDL in TiDB:
\tplease confirm your DDL statement is correct and needed.
\tfor TiDB compatible DDL, please see the docs:
\t English version: https://pingcap.com/docs/dev/reference/mysql-compatibility/#ddl\
\t Chinese version: https://pingcap.com/docs-cn/dev/reference/mysql-compatibility/#ddl\
\tif the DDL is not needed, you can use a filter rule with "*" schema-pattern to ignore it.
\t : parse statement: line 1 column 33 near "EVENT delete_old_data\r
ON SCHEDULE EVERY 5 SECOND\r
DO begin \r
delete from t_trigger_order_log where orderdate\u003cdate_format(date_sub(now(),interval 1 day),‘%!!(MISSING)Y(string=CREATE(MISSING) EVENT delete_old_data\r
ON SCHEDULE EVERY 5 SECOND\r
DO begin \r
delete from t_trigger_order_log where orderdate\u003cdate_format(date_sub(now(),interval 1 day),’%!Y(MISSING)-%!m(MISSING)-%!d(MISSING) 00:00:00’);\r
\r
delete from t_trigger_order_log_101 where orderdate\u003cdate_format(date_sub(now(),interval 1 day),‘%!Y(MISSING)-%!m(MISSING)-%!d(MISSING) 00:00:00’);\r
end)-%!!(MISSING)m(MISSING)-%!!(MISSING)d(MISSING) 00:00:00’);\r
\r
delete from t_trigger_order_log_101 where orderdate\u003cdate_format(date_sub(now(),interval 1 day),‘%!!(MISSING)Y(MISSING)-%!!(MISSING)m(MISSING)-%!!(MISSING)d(MISSING) 00:00:00’);\r
end" ",
“RawCause”: "line 1 column 33 near "EVENT delete_old_data\r
ON SCHEDULE EVERY 5 SECOND\r
DO begin \r
delete from t_trigger_order_log where orderdate\u003cdate_format(date_sub(now(),interval 1 day),‘%Y-%m-%d 00:00:00’);\r
\r
delete from t_trigger_order_log_101 where orderdate\u003cdate_format(date_sub(now(),interval 1 day),‘%Y-%m-%d 00:00:00’);\r
end" "
}
}
],
“detail”: null
},

message 中有相关提示,需要使用 filter rules 进行过滤,、
https://docs.pingcap.com/zh/tidb-data-migration/stable/feature-overview#binlog-event-filter

过滤某些规则

filters:
filter-event-rule:
schema-pattern: “*”
sql-pattern: [“CREATE EVENT”]
action: Ignore
我在yml文件中,加上了如下配置,执行update-task resume-task 命令,查看状态还是对应的错误,是否是我配置写错了?

filters:
  filter-partition-rule:
    schema-pattern: "*"
    sql-pattern: ["CREATE\\s+EVENT"]
    action: Ignore

试下呢,sql-pattern 根据当前 event 进行编写

改了,但貌似还是不生效,还有什么方法吗?

辛苦描述下添加 filter event 之后得操作步骤呢。
再看下 create event 得语句和 task 得配置。

添加完以后,就做了以下两个动作

update-task ./frxs_report_base_db.yml
resume-task frxs_report_base_db

这个是我的event事件语句

CREATE EVENT delete_old_data ON SCHEDULE EVERY 5 SECOND STARTS ‘2020-07-23 16:54:11’ ON COMPLETION PRESERVE ENABLE DO begin
delete from xxxxxx; end

配置task的文件
frxs_report_base_db.yml (794 字节)

执行 stop-task 和 start-task 看下。

执行过,还是同样的问题

额,yml 文件中的 create event 的正则辛苦自己写一下。。。

好的,我试着把create event关键信息都写上,然后再stop-task, start-task试试

再问一下,我是否可以直接skip这个点位?其实我上午尝试跳过这个点位,但貌似也不成功,不知道为什么

skip 和 binlog filter 处理不同的事件,可以先看下文档,看是否能总结出一下
https://docs.pingcap.com/zh/tidb-data-migration/stable/skip-or-replace-abnormal-sql-statements

1.不管是调整任务ignore 还是执行skip命令都不行。
2.最后实在没办法,就
stop-task
修改syncer_checkpoint表中第一个binlog的点位 这个点位通过mysqlbinlog 的命令查看DDL命令
start-task
最后才跳过,执行成功。
3.通过这个暴露出咱们 的DM工具还是不怎么友善,filter部分中,ignore必须要自己手动去填写正则表达式,但正则不是所有人都写的好啊,我这搞了半天都通不过:joy:
希望DM 工具,咱们TIDB团队还是可以多投入点力量好好的开发一下

这个只是暂时的解决办法,如果后面还有 CREATE DEFINER= lookup @ % EVENT 的语句,在 dm 中还是会报错,建议还是使用 sql-pattern 进行过滤,

"errors": [
                        {
                            "Type": "ExecSQL",
                            "msg": "",
                            "error": {
                                "ErrCode": 10006,
                                "ErrClass": 1,
                                "ErrScope": 0,
                                "ErrLevel": 3,
                                "Message": "execute statement failed: REPLACE INTO `service_station`.`t_report` (`id`,`name`,`identification`,`templateId`,`data`,`requestJson`,`status`,`fileUrl`,`error`,`tmCreate`,`tmSmp`) VALUES (?,?,?,?,?,?,?,?,?,?,?): Error 8025: entry too large, the max entry size is 6291456, the size of data is 12866746",
                                "RawCause": "Error 8025: entry too large, the max entry size is 6291456, the size of data is 12866746"
                            }

这个坑又怎么处理嗯?

解决办法可你提供的截图中一致,如果无法调整业务,只能将其忽略

这解决方法就有点鸡肋了

这个是 tikv 这边的事务限制,6m 已经不小了,如果存大字段可能会超过此限制,如果单行数据较大对数据库性能也是有影响的。

好吧,我在规则中去配置
ignore-tables:
- db-name: “xxx”
tbl-name: “xxx”
然后通过myloader对这个表,进行单独的同步,
等跳过这个大事务以后,再把ignore-tables规则去掉