alibaba / canal

阿里巴巴 MySQL binlog 增量订阅&消费组件
Apache License 2.0
28.47k stars 7.61k forks source link

canal1.1.6 adapter 全量同步mysql 到oracler失败 #4624

Open guojianming opened 1 year ago

guojianming commented 1 year ago

Question

ERROR com.alibaba.otter.canal.client.adapter.support.Util - sqlRs has error, sql: SELECT * FROM 表名 LIMIT 1

ERROR c.a.otter.canal.client.adapter.rdb.service.RdbEtlService - java.sql.SQLException: Invalid argument(s) in call: setFetchSize java.lang.RuntimeException: java.sql.SQLException: Invalid argument(s) in call: setFetchSize at com.alibaba.otter.canal.client.adapter.support.Util.sqlRS(Util.java:47) ~[client-adapter.common-1.1.6.jar:na] at com.alibaba.otter.canal.client.adapter.rdb.service.RdbEtlService.executeSqlImport(RdbEtlService.java:62) ~[na:na] at com.alibaba.otter.canal.client.adapter.support.AbstractEtlService.lambda$importData$1(AbstractEtlService.java:91) ~[client-adapter.common-1.1.6.jar:na] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na] at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na] Caused by: java.sql.SQLException: Invalid argument(s) in call: setFetchSize at oracle.jdbc.driver.OracleStatement.setPrefetchInternal(OracleStatement.java:2891) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0] at oracle.jdbc.driver.OracleStatement.setFetchSize(OracleStatement.java:4169) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0] at oracle.jdbc.driver.OracleStatementWrapper.setFetchSize(OracleStatementWrapper.java:246) ~[ojdbc6-11.2.0.4.jar:11.2.0.4.0] at com.alibaba.druid.filter.FilterChainImpl.statement_setFetchSize(FilterChainImpl.java:3051) ~[druid-1.2.11.jar:1.2.11] at com.alibaba.druid.filter.FilterAdapter.statement_setFetchSize(FilterAdapter.java:2656) ~[druid-1.2.11.jar:1.2.11] at com.alibaba.druid.filter.FilterChainImpl.statement_setFetchSize(FilterChainImpl.java:3048) ~[druid-1.2.11.jar:1.2.11] at com.alibaba.druid.proxy.jdbc.StatementProxyImpl.setFetchSize(StatementProxyImpl.java:441) ~[druid-1.2.11.jar:1.2.11] at com.alibaba.druid.pool.DruidPooledStatement.setFetchSize(DruidPooledStatement.java:721) ~[druid-1.2.11.jar:1.2.11] at com.alibaba.otter.canal.client.adapter.support.Util.sqlRS(Util.java:41) ~[client-adapter.common-1.1.6.jar:na] ... 6 common frames omitted

mortalxu commented 1 year ago

https://github.com/alibaba/canal/issues/3103

可以看看这个

guojianming commented 1 year ago

增量同步可以成功,但是在全量同步mysql到oracle时失败了 *sqlRs has error, sql: SELECT FROM 表名 LIMIT 1** oralce 获取行应该是rownum 而不是limit 不知道是哪里没有配置好,不是本身有bug

1120665184 commented 1 year ago

增量同步可以成功,但是在全量同步mysql到oracle时失败了 *sqlRs has error, sql: SELECT FROM 表名 LIMIT 1** oralce 获取行应该是rownum 而不是limit 不知道是哪里没有配置好,不是本身有bug

请问这个问题解决了吗

1120665184 commented 1 year ago

看了一下源码,严重怀疑,开发的时候没测过全量同步到oracle数据库,有些逻辑都是有问题的。 改了部分 RdbEtlService 类的executeSqlImport 方法的代码:

image image

获取字段源信息的sql加了个oracle的判断。

image

下面同步到oracle数据库时,获取数据库类型取值也不对。

1120665184 commented 1 year ago

看了一下源码,严重怀疑,开发的时候没测过全量同步到oracle数据库,有些逻辑都是有问题的。 改了部分 RdbEtlService 类的executeSqlImport 方法的代码: image image 获取字段源信息的sql加了个oracle的判断。 image 下面同步到oracle数据库时,获取数据库类型取值也不对。

少量数据用这个同步一下可以,大批量的就算了