时间戳列上的 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 documentation、initstmt=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 设置这两个值。
我当前的源数据库是非 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 documentation、initstmt=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 设置这两个值。