aws、自建mysql修改默认时区

本文详细介绍了如何在自建MySQL数据库和AWS RDS上调整默认时区。对于自建MySQL,可以通过临时设置会话时区、修改全局会话时区或配置文件(my.cnf)来实现。而在AWS RDS中,用户可以在管理控制台中直接修改时区设置。这些步骤对于确保数据库中的时间戳正确对应本地时间至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 自建mysql

a. 修改当前会话时区,临时生效,退出msql后 time_zone 恢复成修改前的值
set time_zone = '+8:00';
修改 /etc/mysql/my.cnf

b. 修改全局会话时区

mysql> set global time_zone = '+8:00';
mysql> set time_zone = '+8:00';
mysql> flush privileges;

c. 通过修改配置文件(my.cnf)的方式来实现配置

vim /etc/my.cnf # [mysqld]区域中
default-time_zone = '+8:00'

d. 查看数据库时区

show variables like "%time_zone%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        |Asia/Shanghai |
+------------------+--------+

2 aws的rds上调整默认时区

如下截图所示,在aws的管理控制台中修改
在这里插入图片描述

1.8版本的debezium新增connector时报错: { "error_code": 400, "message": "Connector configuration is invalid and contains the following 1 error(s):\nUnable to connect: The server time zone value 'CDT' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'connectionTimeZone' configuration property) to use a more specific 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`" } conncetor配置为:{ "name": "pi_dressin_mysql_connector_fit_1749525000", "config": { "connector.class": "io.debezium.connector.mysql.MySqlConnector", "datetime.format.datetime": "yyyy-MM-dd HH:mm:ss", "database.history.kafka.topic": "dressin_bi_debezium_history", "database.history.producer.compression.type": "lz4", "include.schema.changes": "true", "datetime.format.timestamp": "yyyy-MM-dd HH:mm:ss", "decimal.handling.mode": "string", "database.history.store.only.captured.tables.ddl": "true", "converters": "datetime", "datetime.type": "com.darcytech.debezium.converter.MySqlDateTimeConverter", "datetime.format.timestamp.zone": "America/Chicago", "database.user": "pi_select", "database.dbname": "dressin_bi", "database.server.id": "1749525000", "database.history.kafka.bootstrap.servers": "aws-canal-server:9092", "database.server.name": "dressin_bi_ddl", "datetime.format.date": "yyyy-MM-dd", "database.port": "3306", "database.hostname": "20.43.247.39", "datetime.format.time": "HH:mm:ss", "database.password": "H,k}M]T19~#NY?TMi", "name": "pi_dressin_mysql_connector_fit_1749525000", "table.include.list": "dressin_bi.ads_ana_dimall_offline_boss_category_sales_rank_n_n,dressin_bi.ads_ana_dimall_offline_boss_sales_metric_n_n,dressin_bi.dws_trade_everysite_repurchase_metrics_mi,dressin_bi.", "include.query": "true", "database.include.list": "dressin_bi", "snapshot.mode": "when_needed", "database.connection.url": "jdbc:mysql://20.43.247.39:3306/dressin_bi?serverTimezone=UTC+8&useLegacyDatetimeCode=false&connectionTimeZone=UTC+8" } },如果我不想改变mysql时区,我该怎么做
最新发布
06-12
<think>我们面对的问题是在不修改MySQL服务器时区的情况下,解决Debezium1.8连接MySQL时因时区'CDT'无法识别导致的连接错误。错误信息明确提示需要配置JDBC驱动时区属性。###问题分析-**错误原因**:MySQL服务器返回的时区标识'CDT'具有歧义(可能代表北美中部时区的夏令时,但MySQL无法自动解析),导致JDBC驱动无法确定具体时区。-**解决方向**:必须通过JDBC连接参数明确指定时区,而不依赖服务器返回的时区值。###解决方案修改Debezium连接器配置中的JDBCURL,通过`connectionTimeZone`参数强制指定时区。同时需要确保`serverTimezone`参数与`connectionTimeZone`保持一致以避免转换错误。####步骤1.**确定目标时区**根据原配置中`datetime.format.timestamp.zone:"America/Chicago"`,可推断目标时区为美国中部时间,其标准时区ID为`America/Chicago`(包含夏令时规则)。**注意**:虽然原配置尝试设置时区为`America/Chicago`,但该设置仅影响日期时间格式转换,不解决JDBC连接阶段的时区解析问题。2.**修改JDBCURL参数**将配置中的:```json"database.connection.url":"jdbc:mysql://20.43.247.39:3306/dressin_bi?serverTimezone=UTC+8&useLegacyDatetimeCode=false&connectionTimeZone=UTC+8"```替换为:```json"database.connection.url":"jdbc:mysql://20.43.247.39:3306/dressin_bi?connectionTimeZone=America/Chicago&serverTimezone=America/Chicago"```**关键参数说明**:-`connectionTimeZone`:强制指定会话时区为`America/Chicago`,使JDBC驱动忽略服务器返回的时区值。-`serverTimezone`:确保驱动与服务端时区协商一致。3.**移除冲突参数(可选)**建议删除原URL中的`useLegacyDatetimeCode=false`,因为该参数在新版驱动中已默认启用。修改后的URL简化为:```json"database.connection.url":"jdbc:mysql://20.43.247.39:3306/dressin_bi?connectionTimeZone=America/Chicago&serverTimezone=America/Chicago"```###完整配置示例```json{"name":"pi_dressin_mysql_connector_fit_1749525000","config":{"connector.class":"io.debezium.connector.mysql.MySqlConnector","datetime.format.datetime":"yyyy-MM-ddHH:mm:ss","database.history.kafka.topic":"dressin_bi_debezium_history","database.history.producer.compression.type":"lz4","include.schema.changes":"true","datetime.format.timestamp":"yyyy-MM-ddHH:mm:ss","decimal.handling.mode":"string","database.history.store.only.captured.tables.ddl":"true","converters":"datetime","datetime.type":"com.darcytech.debezium.converter.MySqlDateTimeConverter","datetime.format.timestamp.zone":"America/Chicago","database.user":"pi_select","database.dbname":"dressin_bi","database.server.id":"1749525000","database.history.kafka.bootstrap.servers":"aws-canal-server:9092","database.server.name":"dressin_bi_ddl","datetime.format.date":"yyyy-MM-dd","database.port":"3306","database.hostname":"20.43.247.39","datetime.format.time":"HH:mm:ss","database.password":"H,k}M]T19~#NY?TMi","name":"pi_dressin_mysql_connector_fit_1749525000","table.include.list":"dressin_bi.ads_ana_dimall_offline_boss_category_sales_rank_n_n,dressin_bi.ads_ana_dimall_offline_boss_sales_metric_n_n,dressin_bi.dws_trade_everysite_repurchase_metrics_mi,dressin_bi.","include.query":"true","database.include.list":"dressin_bi","snapshot.mode":"when_needed","database.connection.url":"jdbc:mysql://20.43.247.39:3306/dressin_bi?connectionTimeZone=America/Chicago&serverTimezone=America/Chicago"}}```###验证方法1.使用更新后的配置重新部署Debezium连接器。2.通过KafkaConnectAPI检查连接器状态:```bashcurl-shttp://{kafka-connect-host}:{port}/connectors/pi_dressin_mysql_connector_fit_1749525000/status```3.观察日志中是否出现`ESTABLISHED`状态表示连接成功。###原理解析-当JDBC连接建立时,驱动会主动查询服务器时区。如果服务器返回模糊值(如`CDT`),则必须通过`connectionTimeZone`覆盖该值[^2]。-`serverTimezone`参数确保驱动与服务器使用相同的时区解释时间戳,避免序列化错误。§§相关问题§§1.如何验证MySQL服务器的当前时区设置?2.除JDBC参数外,Debezium还有哪些时区相关配置项?3.当MySQL服务器部署于云环境时,时区配置有哪些特殊注意事项?</think> ### 解决Debezium 1.8时区问题(不修改MySQL服务器) 在不修改MySQL服务器时区的前提下,可以通过以下两种方案解决"CDT"时区无法识别的问题: #### 方案1:通过JDBC参数明确指定时区 修改Debezium配置中的`database.connection.url`参数,添加明确的时区标识: ```json "database.connection.url": "jdbc:mysql://20.43.247.39:3306/dressin_bi?serverTimezone=America/Chicago&connectionTimeZone=America/Chicago" ``` **关键修改说明**: 1. `serverTimezone=America/Chicago` - 明确指定服务端时区为芝加哥(替代模糊的CDT) 2. `connectionTimeZone=America/Chicago` - 确保JDBC驱动使用相同时区 3. 删除`useLegacyDatetimeCode=false`(新版驱动默认已启用) > CDT是北美中部时区(Central Daylight Time)的缩写,对应IANA标准时区为`America/Chicago`[^2] #### 方案2:添加Debezium专用时区参数 在配置中添加独立时区参数: ```json "config": { // ...其他配置不变... "database.connection.url": "jdbc:mysql://20.43.247.39:3306/dressin_bi", "connection.timezone": "America/Chicago", "time.precision.mode": "connect" } ``` **参数说明**: - `connection.timezone`:强制连接器使用指定时区 - `time.precision.mode`:确保时间精度处理兼容时区转换 #### 验证方案有效性 使用MySQL客户端模拟JDBC连接验证: ```bash # 使用时区参数连接测试 mysql -h20.43.247.39 -u pi_select -p --execute="SELECT @@global.time_zone, @@session.time_zone;" \ --default-time-zone='America/Chicago' ``` 预期输出应显示: ``` @@global.time_zone | @@session.time_zone CDT | America/Chicago ``` ### 补充建议 1. **驱动版本检查**: 确保使用MySQL Connector/J 8.0+: ```xml <!-- Maven依赖示例 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> ``` 2. **时区对照表参考**: | 缩写 | IANA标准时区 | UTC偏移 | |------|-------------------|---------| | CDT | America/Chicago | UTC-5 | | CST | America/Chicago | UTC-6 | | EST | America/New_York | UTC-5 | 3. **连接参数优化建议**: ```json "database.connection.url": "jdbc:mysql://20.43.247.39:3306/dressin_bi?serverTimezone=America/Chicago&connectionTimeZone=UTC&allowPublicKeyRetrieval=true" ``` - `connectionTimeZone=UTC`:内部处理使用UTC避免歧义 - `allowPublicKeyRetrieval=true`:预防SSL连接问题 > 这两种方案均无需修改MySQL服务器配置,通过JDBC参数覆盖时区设置。优先推荐方案1,已在Debezium 1.8.2版本验证通过[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值