时间戳列上的 AWS DMS time_zone 问题

Issue with AWS DMS time_zone on timestamps column

我当前的源数据库是非 UTC 时区(Asia/Calcutta,UTC+5:30)。

我使用 AWS DMS 将某些表从 SourceDB 移动到在参数组中设置为相同非 UTC time_zone (Asia/Calcutta) 的 TargetDB。

当我创建并 运行“迁移现有数据并复制正在进行的更改”时,数据被迁移但时间戳列是不同的值(实际上它是 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

知道为什么会这样吗,有什么办法可以解决这个问题吗?

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

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

答案就在这个aws document中,但不是很明显。在使用 MySQL 作为 AWS DMS

的源时查看 额外的连接属性

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

Specifies the time zone for the source MySQL database.

Example: serverTimezone=US/Pacific;

Note: Do not enclose time zones in single quotes.

另请注意,如果您的目标端点处于 non-UTC 时区,则有类似的设置,请参阅此 aws documentationinitstmt=SET time_zone='US/Pacific' 以设置目标数据库的 time_zone如果是non-UTC(注意time_zone在这里用单引号)。

Specifies the time zone for the target MySQL-compatible database.

Default value: UTC

Valid values: A three- or four-character abbreviation for the time zone that you want to use. Valid values are the standard time zone abbreviations for the operating system hosting the target MySQL-compatible database.

Example: initstmt=SET time_zone=UTC

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

在我的案例中使用了以下值:

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

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