首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Kafka连接MySQL“服务器时区值'EDT‘无法识别”

Kafka连接MySQL“服务器时区值'EDT‘无法识别”
EN

Stack Overflow用户
提问于 2021-05-01 05:11:32
回答 2查看 474关注 0票数 1

我刚接触Kafka,但Debezium Connect/Mysql在Docker中运行得很好。突然之间,所有docker容器都消失了,在重新启动并尝试重新连接到MySQL时,JDBC连接失败,并对Connect rest API做出以下响应:

代码语言:javascript
复制
Using ZOOKEEPER_CONNECT=0.0.0.0:2181
Using KAFKA_LISTENERS=PLAINTEXT://172.19.0.5:9092 and KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://172.19.0.5:9092
HTTP/1.1 400 Bad Request
Date: Fri, 30 Apr 2021 20:39:56 GMT
Content-Type: application/json
Content-Length: 
Server: Jetty(9.4.33.v20201020)
                    
{"error_code":400,"message":"Connector configuration is invalid  
            and contains the following 1 error(s): \nUnable to connect: The server time  
            zone value 'EDT' is unrecognized or represents more than one time zone. You  
            must configure either the server or JDBC driver (via the 'serverTimezone'   
    configuration property) to use a more specifc time zone value if you want  
            to utilize time zone support.\nYou can also find the above list of errors  
            at the endpoint `/connector-plugins/{connectorType}/config/validate`"}

作为对运行以下命令的响应:

代码语言:javascript
复制
docker run -it --rm --net mynet_default debezium/kafka \
curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" \
mynet_connect_1:8083/connectors/ \
-d '{ 
"name": "my-connector-001",
"config": { 
"connector.class": "io.debezium.connector.mysql.MySqlConnector", 
"tasks.max": "1", 
"database.hostname": "my.domain.com", 
"database.port": "3306",
"database.user": "myuser",
"database.password": "mypassword", 
"database.server.id": "6400", 
"database.server.name": "dbserver001",
"database.include.list": "mydb", 
"database.history.kafka.bootstrap.servers": "kafka:9092", 
"database.history.kafka.topic": "dbhistory.metrics.connector004",
"table.include.list":"mydb.users,mydb.applications"

} }'

这在几个小时内工作得很好。然后,当我直接从Debezium教程观看更新时,所有的kafka容器都消失了,然后(使用完全相同的配置)将不再连接,原因是时区问题。我可以在mysql客户端中使用相同的凭据进行连接(通过docker网络),并且MySQL权限和授权没有更改。去年7月,Gitter提到,这个错误本身就是其他连接失败的错误指示。而且有很多关于它是JDBC中的bug的报告。除了有人在我们的数据库上改变了一些东西之外,还有其他的可能性吗?

这是连接日志:

代码语言:javascript
复制
connect_1    | 2021-04-30 20:28:47,254 INFO   ||  [Worker clientId=connect-1, groupId=1] Session key updated   [org.apache.kafka.connect.runtime.distributed.DistributedHerder]
connect_1    | 2021-04-30 20:39:56,996 ERROR  ||  Failed testing connection for jdbc:mysql://my.domain.com:3306/?useInformationSchema=true&nullCatalogMeansCurrent=false&useSSL=false&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL&connectTimeout=30000 with user 'myuser'   [io.debezium.connector.mysql.MySqlConnector]
connect_1    | java.sql.SQLException: The server time zone value 'EDT' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
connect_1    |  at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
connect_1    |  at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
connect_1    |  at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
connect_1    |  at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
connect_1    |  at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
connect_1    |  at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76)
connect_1    |  at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
connect_1    |  at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
connect_1    |  at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
connect_1    |  at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197)
connect_1    |  at io.debezium.jdbc.JdbcConnection.lambda$patternBasedFactory$1(JdbcConnection.java:231)
connect_1    |  at io.debezium.jdbc.JdbcConnection.connection(JdbcConnection.java:872)
connect_1    |  at io.debezium.connector.mysql.MySqlConnection.connection(MySqlConnection.java:79)
connect_1    |  at io.debezium.jdbc.JdbcConnection.connection(JdbcConnection.java:867)
connect_1    |  at io.debezium.jdbc.JdbcConnection.connect(JdbcConnection.java:413)
connect_1    |  at io.debezium.connector.mysql.MySqlConnector.validateConnection(MySqlConnector.java:98)
connect_1    |  at io.debezium.connector.common.RelationalBaseSourceConnector.validate(RelationalBaseSourceConnector.java:52)
connect_1    |  at org.apache.kafka.connect.runtime.AbstractHerder.validateConnectorConfig(AbstractHerder.java:375)
connect_1    |  at org.apache.kafka.connect.runtime.AbstractHerder.lambda$validateConnectorConfig$1(AbstractHerder.java:326)
connect_1    |  at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
connect_1    |  at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
connect_1    |  at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
connect_1    |  at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
connect_1    |  at java.base/java.lang.Thread.run(Thread.java:834)
connect_1    | Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'EDT' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to utilize time zone support.
connect_1    |  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
connect_1    |  at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
connect_1    |  at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
connect_1    |  at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
connect_1    |  at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
connect_1    |  at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85)
connect_1    |  at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:132)
connect_1    |  at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2120)
connect_1    |  at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2143)
connect_1    |  at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1310)
connect_1    |  at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:967)
connect_1    |  at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826)
connect_1    |  ... 17 more
connect_1    | 2021-04-30 20:39:56,998 INFO   ||  AbstractConfig values: 
connect_1    |    [org.apache.kafka.common.config.AbstractConfig]

我是否可以通过Connect rest API传入一个参数来指定JDBC字符串中的时区(显示在此日志顶部附近)?对于这个tutorial,我使用的是Debezium (1.5) Docker镜像。

EN

回答 2

Stack Overflow用户

发布于 2021-05-14 05:20:16

我认为EDT不在mysql.time_zone_name表中。

代码语言:javascript
复制
SELECT * FROM mysql.time_zone_name;

添加配置"database.serverTimezone“解决了我这方面的问题,例如

代码语言:javascript
复制
"config": {
    ...
    "database.serverTimezone": "America/Los_Angeles",
    ...
}
票数 1
EN

Stack Overflow用户

发布于 2021-09-15 09:49:38

在我的例子中,使用kafka connect,我必须修改连接器配置- mysql连接字符串(connection.url属性),如下所示:

代码语言:javascript
复制
jdbc:mysql://<server ip or dns>:<port>?serverTimezone=GMT%2b8:00&<more parameters>

注意:%2b+字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67340500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档