我正在尝试在MySQL中使用模式时间戳,因为表大小为2.6 GB,所以行数有限。
这是我正在使用的连接器属性:
{
"name": "jdbc_source_mysql_registration_query",
"config": {
"connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector",
"key.converter": "io.confluent.connect.avro.AvroConverter",
"key.converter.schema.registry.url": "http://localhost:8081",
"value.converter": "io.confluent.connect.avro.AvroConverter",
"value.converter.schema.registry.url": "http://localhost:8081",
"connection.url": "jdbc:mysql://localhost:3310/users?zeroDateTimeBehavior=ROUND&useCursorFetch=true&defaultFetchSize=1000&user=kotesh&password=kotesh",
"query": "SELECT matriid,DateUpdated from users.employee WHERE date(DateUpdated)>='2018-11-28' ",
"mode": "timestamp",
"timestamp.column.name": "DateUpdated",
"validate.non.null": "false",
"topic.prefix": "mysql-prod-kot-"
}
}
我得到如下信息:
INFO TimestampIncrementingTableQuerier {table = null,query ='SELECT matriid,Date从users.employee WHERE更新 date(DateUpdated)> ='2018-11-28'',topicPrefix ='mysql-prod-kot-', crementingColumn =“,timestampColumns = [DateUpdated]}准备了SQL 查询:SELECT matriid,DateUpdates from users.employee WHERE date(DateUpdated)> ='2018-11-28'
DateUpdated
在哪里?和DateUpdated
<吗?按DateUpdated
ASC排序 (io.confluent.connect.jdbc.source.TimestampIncrementingTableQuerier:161) [2018-11-29 17:29:00,981]错误无法运行表TimestampIncrementingTableQuerier {table = null,query ='SELECT matriid,Date从users.employee WHERE更新 date(DateUpdated)> ='2018-11-28'',topicPrefix ='mysql-prod-kot-', incrementingColumn =“,timestampColumns = [DateUpdated]}:{} (io.confluent.connect.jdbc.source.JdbcSourceTask:328) java.sql.SQLSyntaxErrorException:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册 在'WHEREDateUpdated
>'1970-01-01附近使用的正确语法 00:00:00.0'和DateUpdated
<'2018-11-29 17'在第1行
答案 0 :(得分:1)
错误如下所示:
java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near
'WHERE `DateUpdated` > '1970-01-01 00:00:00.0' AND `DateUpdated` < '2018-11-29 17' at line 1
这是因为您同时使用query
和"mode": "timestamp"
,因此当您在查询中还指定了一个子句时,连接器会尝试附加它自己的WHERE
子句,从而导致无效的SQL
对于JDBC源连接器,每个docs:
为了正确地构造增量查询,必须有可能在此查询后附加WHERE子句(即不得使用WHERE子句)。如果使用WHERE子句,则它本身必须处理增量查询。
答案 1 :(得分:0)
发生这种情况是因为您尝试同时使用"mode": "timestamp"
和query
。 TimestampIncrementingTableQuerier
将WHERE
子句附加到与WHERE
中现有的query
子句冲突的查询中。
JDBC source connector docs很清楚:
query
如果指定,则执行查询以选择新的或更新的行。采用 此设置(如果要联接表),请选择 表格或过滤数据。如果使用,此连接器将仅复制数据 使用此查询-将禁用整个表复制。不同 查询模式可能仍用于增量更新,但为了 正确构造增量查询,必须有可能 将WHERE子句附加到此查询(即,不得将WHERE子句 用过的)。 如果使用WHERE子句,则它必须处理增量查询 本身。
作为一种解决方法,您可以将查询修改为(取决于您使用的是哪种SQL风格)
SELECT * FROM ( SELECT * FROM table WHERE ...)
或
WITH a AS
SELECT * FROM b
WHERE ...
SELECT * FROM a
例如,在您的情况下,查询应为
"query":"SELECT * FROM (SELECT matriid,DateUpdated from users.employee WHERE date(DateUpdated)>='2018-11-28') o"