首页 > 解决方案 > 时间戳列上的 AWS DMS time_zone 问题

问题描述

我当前的源数据库是非 UTC 时区(亚洲/加尔各答,UTC+5:30)。

我使用 AWS DMS 将某些表从 SourceDB 移动到 TargetDB,该 TargetDB 在参数组中设置为相同的非 UTC 时区(亚洲/加尔各答)。

当我创建并运行“迁移现有数据并复制正在进行的更改”时,数据被迁移但时间戳列是不同的值(实际上是 UTC)

table1 @ Source DB
----------------------------------------------------
id    user_id  purpose           in_time
1     24       Cleaning          2020-08-09 20:00:00
2     78       Cleaning          2020-08-09 21:30:00

table1 @ Target DB
----------------------------------------------------
id    user_id  purpose           in_time
1     24       Cleaning          2020-08-09 14:30:00
2     78       Cleaning          2020-08-09 16:00:00

现在,我停止 DMS 任务,然后再次恢复它。(这一步很重要,后面会跟描述的不一样)。

在此之后,当我更新第 1 行时,说源数据库复制上的目的列发生并且目标数据库上的 Asia/Calcutta time_zone 突然出现时间,但仅对于该ROW 1,时间上的ROW 2仍然是 UTC。

table1 @ Source DB
----------------------------------------------------
id    user_id  purpose           in_time
1     24       Survey            2020-08-09 20:00:00
2     78       Cleaning          2020-08-09 21:30:00

table1 @ Target DB
----------------------------------------------------
id    user_id  purpose           in_time
1     24       Survey            2020-08-09 20:00:00
2     78       Cleaning          2020-08-09 16:00:00

任何线索为什么它会这样,有没有办法解决这个问题?

PS我不是在寻找建议“您应该始终在您的数据库中使用UTC格式”的答案,因为这不是我的选择。

标签: amazon-web-servicesaws-dms

解决方案


好的,我终于能够解决这个问题。

答案在这个aws 文档中,但不是很明显。查看使用 MySQL 作为 AWS DMS 源时的额外连接属性

serverTimezone当您的源数据库是非 UTC 时区时,我们需要在定义端点时在额外连接属性中定义。

指定源 MySQL 数据库的时区。

示例:serverTimezone=US/Pacific;

注意:不要将时区括在单引号中。

另请注意,如果您的目标端点位于非 UTC 时区,则有类似的设置,请参阅此aws 文档initstmt=SET time_zone='US/Pacific'如果它是非 UTC 则设置目标数据库的 time_zone(请注意,time_zone 在此处使用单引号)。

指定目标 MySQL 兼容数据库的时区。

默认值:UTC

有效值:您要使用的时区的三个或四个字符的缩写。有效值是托管目标 MySQL 兼容数据库的操作系统的标准时区缩写。

示例:initstmt=SET time_zone=UTC

需要注意的一件非常重要的事情是,当您设置目标数据库 time_zone 时,接受的 time_zone 值根据操作系统,即 Linux。而不是数据库,即 MySql。

在我的情况下,使用了以下值:

  • 源数据库serverTimezone=Asia/Calcutta
  • 目标数据库initstmt=SET time_zone='Asia/Kolkata'

除了在数据库参数组中设置 time_zone 之外,您还需要根据数据库 time_zone 设置这两个值。


推荐阅读