我试图建立一个Debezium SQL Server连接器对SQL Server实例是由dba在我的工作场所控制。我已经能够启动Zookeeper和Kafka服务器没有问题,并且Kafka连接本身与示例连接器一起工作,但是当试图启动Debezium SQL Server连接器实例时,我一直得到错误"无法获得数据库名称"。
[2022-07-12 16:36:04,269] ERROR Stopping after connector error (org.apache.kafka.connect.cli.ConnectStandalone:117)
java.util.concurrent.ExecutionException: org.apache.kafka.connect.runtime.rest.errors.BadRequestException: Connector configuration is invalid and contains the following 1 error(s):
Unable to connect. Check this and other connection properties. Error: Couldn't obtain database name
这是我的debezium配置:
name=Dbz-SqlServer-connector
connector.class=io.debezium.connector.sqlserver.SqlServerConnector
database.hostname=MyDbHost
database.port=1433
database.user=MyUsername
database.password=MyPassword
database.dbname=MyDatabase
database.server.name=MyDbHost
table.include.list=dbo.CdcTest
database.history.kafka.bootstrap.servers=localhost:9092
database.history.kafka.topic=dbhistory.CdcTest
我已经试过这个. properties文件传递给一个独立的连接实例,以及一个JSON分布式连接实例。我已经试了所有的本地Windows机器上相同的步骤以及linux VM上,相同的结果。
在这种情况下,Confluent和Docker不是我的选择。对于SQL Server登录凭据,我使用的是SQL Server实例上的本地帐户,该帐户确实可以访问所讨论的数据库。我在他们的github上找到了debezium连接器的源代码,并能够在代码中找到特定的错误消息:
private static final String GET_DATABASE_NAME = "SELECT name FROM sys.databases WHERE name = ?";
...
public String retrieveRealDatabaseName(String databaseName) {
try {
return prepareQueryAndMap(GET_DATABASE_NAME,
ps -> ps.setString(1, databaseName),
singleResultMapper(rs -> rs.getString(1), "Could not retrieve exactly one database name"));
}
catch (SQLException e) {
throw new RuntimeException("Couldn't obtain database name", e);
}
}
我不完全熟悉Java,但当连接器试图运行"SELECT name FROM sys时,似乎基本上有些事情出错了。数据库WHERE name = 'MyDatabase'"当我自己运行这个数据库时,用我使用的相同帐户登录,它似乎工作得很好,所以我真的不知道从这里去哪里。这是公平地说,因为我不是在完全控制的SQL Server环境,我正在使用,可能有一些权限问题,我不知道,但从我能够测试它似乎应该工作。
我将非常感谢任何帮助,无论是关于设置/配置检查或全面的解决方案的建议。
谢谢!
更新:我已经建立了一个简单的控制台应用程序来运行这个系统。数据库查询MyDbHost,主数据库,作为相关的帐户,它工作得很好,所以我觉得这证实了我的连接信息是正确的,帐户权限也是正确的。似乎这是Debezium连接器内部的问题。
原来我的问题是连接器配置设置中的错误。我误解了它特定的数据放入数据库。hostname和database.server.name,如果我纠正了这些字段,连接器就可以工作。