环境信息
canal version canal.deployer-1.1.2 mysql version 5.7.22-log MySQL Community Server (GPL)
问题描述
启动canal服务器时候报错:信息如下
h resource [example/instance.properties] 2019-01-30 11:31:48.769 [main] ERROR com.alibaba.druid.pool.DruidDataSource - testWhileIdle is true, validationQuery not set 2019-01-30 11:31:48.884 [Druid-ConnectionPool-Create-1363560175] ERROR com.alibaba.druid.pool.DruidDataSource - create connection SQLException, url: jdbc:h2:../conf/example/h2;CACHE_SIZE=1000;MODE=MYSQL;, errorCode 90020, state 90020 org.h2.jdbc.JdbcSQLException: Database may be already in use: null. Possible solutions: close all other connection(s); use the server mode [90020-196] at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) ~[h2-1.4.196.jar:1.4.196] at org.h2.message.DbException.get(DbException.java:168) ~[h2-1.4.196.jar:1.4.196] at org.h2.mvstore.db.MVTableEngine$Store.convertIllegalStateException(MVTableEngine.java:188) ~[h2-1.4.196.jar:1.4.196] at org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:168) ~[h2-1.4.196.jar:1.4.196] at org.h2.mvstore.db.MVTableEngine.init(MVTableEngine.java:100) ~[h2-1.4.196.jar:1.4.196] at org.h2.engine.Database.getPageStore(Database.java:2476) ~[h2-1.4.196.jar:1.4.196] at org.h2.engine.Database.open(Database.java:697) ~[h2-1.4.196.jar:1.4.196] at org.h2.engine.Database.openDatabase(Database.java:276) ~[h2-1.4.196.jar:1.4.196] at org.h2.engine.Database.(Database.java:270) ~[h2-1.4.196.jar:1.4.196] at org.h2.engine.Engine.openSession(Engine.java:64) ~[h2-1.4.196.jar:1.4.196] at org.h2.engine.Engine.openSession(Engine.java:176) ~[h2-1.4.196.jar:1.4.196] at org.h2.engine.Engine.createSessionAndValidate(Engine.java:154) ~[h2-1.4.196.jar:1.4.196] at org.h2.engine.Engine.createSession(Engine.java:137) ~[h2-1.4.196.jar:1.4.196] at org.h2.engine.Engine.createSession(Engine.java:27) ~[h2-1.4.196.jar:1.4.196] at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:354) ~[h2-1.4.196.jar:1.4.196] at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:116) ~[h2-1.4.196.jar:1.4.196] at org.h2.jdbc.JdbcConnection.(JdbcConnection.java:100) ~[h2-1.4.196.jar:1.4.196] at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.196.jar:1.4.196] at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1513) ~[druid-1.1.9.jar:1.1.9] at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1578) ~[druid-1.1.9.jar:1.1.9] at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2466) ~[druid-1.1.9.jar:1.1.9] Caused by: java.lang.IllegalStateException: The file is locked: nio:/usr/local/canal/conf/example/h2.mv.db [1.4.196/7] at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:765) ~[h2-1.4.196.jar:1.4.196] at org.h2.mvstore.FileStore.open(FileStore.java:173) ~[h2-1.4.196.jar:1.4.196] at org.h2.mvstore.MVStore.(MVStore.java:347) ~[h2-1.4.196.jar:1.4.196] at org.h2.mvstore.MVStore$Builder.open(MVStore.java:2930) ~[h2-1.4.196.jar:1.4.196] at org.h2.mvstore.db.MVTableEngine$Store.open(MVTableEngine.java:155) ~[h2-1.4.196.jar:1.4.196] ... 17 common frames omitted
步骤重现
mysql: mysql binlog 已经开启,format格式也为row
canal: conf/canal.properties 仅仅修改了canal.ip
canal.id = 1 canal.ip = 192.168.31.139 canal.port = 11111
conf/example/instance.properties 修改了position info 和 username/password 信息
canal.instance.mysql.slaveId=234
canal.instance.gtidon=false
canal.instance.master.address=127.0.0.1:3306 canal.instance.master.journal.name=log-bin.000001 canal.instance.master.position=2465 canal.instance.master.timestamp= canal.instance.master.gtid=
canal.instance.rds.accesskey= canal.instance.rds.secretkey= canal.instance.rds.instanceId=
canal.instance.tsdb.enable=true
canal.instance.dbUsername=canal canal.instance.dbPassword=canal canal.instance.connectionCharset = UTF-8 canal.instance.defaultDatabaseName =test_canal canal.instance.enableDruid=false
canal.instance.filter.regex=.\.. canal.instance.filter.black.regex=
canal.mq.topic=example canal.mq.partition=0
原提问者GitHub用户pdudo
java.lang.IllegalStateException: The file is locked: nio:/usr/local/canal/conf/example/h2.mv.db
是否有多进程启动或者上次异常crash,h2文件没有清理正常
原回答者GitHub用户agapple
针对这个问题,您可以尝试以下解决方法:
确认 instance.properties 文件是否存在并且配置正确。instance.properties 是 Canal Server 的配置文件,其中包含了与数据库连接相关的配置信息。请确认文件路径是否正确,并检查数据库连接信息是否正确。
检查数据库连接是否正常。Canal Server 会使用 Druid 连接池来管理连接,错误信息中提到了 testWhileIdle is true, validationQuery not set,这意味着在连接闲置时 Druid 会测试连接是否超时,但是没有设置验证查询语句(validationQuery)。这个问题可能导致连接池无法正确地管理连接。建议您在 instance.properties 中配置正确的 validationQuery。
如果以上两种方法都无法解决问题,您可以尝试升级 Canal Server 的版本或切换数据库。在一些情况下,Canal Server 的版本过低或者使用的数据库版本不兼容会导致连接异常。同时,如果您使用的是 H2 数据库,可能需要使用 server 模式启动 H2 数据库,以解决 Database may be already in use 的问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。