跳至内容

如何使用 AWS DMS 任务迁移未使用 UTC 时区的 Amazon RDS for MySQL 数据库?

3 分钟阅读
0

我的源数据库和目标数据库均为未使用 UTC 时区的 Amazon Relational Database Service (Amazon RDS) for MySQL 数据库。我想使用 AWS Database Migration Service (AWS DMS) 任务迁移数据库。

简短描述

如果您的源或目标 RDS for MySQL 数据库实例未使用 UTC 时区,则在 AWS DMS 迁移后,您的时间戳数据可能会不一致。在内部,RDS for MySQL 将时间戳列存储为 UTC。当您选择日期时,MySQL 会自动将时间戳列转换为当前会话的时区。

例如,您有一个在澳大利亚/悉尼时区运行的源 RDS for MySQL 数据库,以及一个在 UTC 时区运行的目标 RDS for MySQL 数据库。当 AWS DMS 任务捕获源中的数据,并将数据以 UTC 格式应用于目标时,数据就会不一致。

要解决此问题,请为 AWS DMS 目标端点使用 Initstmt=SET time_zone='+00:00'; 额外连接属性 (ECA)。有关详细信息,请参阅步骤 6: 创建 AWS DMS 源和目标端点。

解决方法

**重要事项:**在迁移数据之前,您必须为 AWS DMS 任务运行 CREATE TABLE 命令。有关详细信息,请参阅 MySQL 网站上的 CREATE TABLE 语句。

CREATE TABLE 命令示例:

create table sample_schema.dms_tz_table (
id int not null,
info varchar(30),
ts timestamp null default null,
primary key (id)
) engine=innodb default charset=utf8mb4 collate=utf8mb4_0900_ai_ci;

在目标端点中不使用 Initstmt ECA 进行迁移

在以下示例中,源数据库位于澳大利亚/悉尼时区,目标数据库位于美洲/加拉加斯时区。此外,源数据库未在目标端点中包含 Initstmt ECA。

要检查源数据库和目标数据库参数,请运行以下查询:

SELECT @@global.time_zone, @@session.time_zone;

源数据库输出:

@@global.time_zone|@@session.time_zone|
------------------+-------------------+
Australia/Sydney  |Australia/Sydney   |

目标数据库输出:

@@global.time_zone|@@session.time_zone|
------------------+-------------------+
America/Caracas   |America/Caracas    |

要准备完全加载的数据,请运行以下命令:

insert into sample_schema.dms_tz_table(id, info, ts) values(1, 'FL', CURRENT_TIMESTAMP);
insert into sample_schema.dms_tz_table(id, info, ts) values(2, 'FL','2025-12-18 19:03:01');

以完全加载加更改数据捕获 (CDC) 模式运行 AWS DMS 任务。完全加载完成后,运行以下命令将 CDC 数据插入到源数据库中:

insert into sample_schema.dms_tz_table(id, info, ts) values(3, 'CDC', CURRENT_TIMESTAMP);
insert into sample_schema.dms_tz_table(id, info, ts) values(4, 'CDC', '2025-09-01 19:05:01');

要检查源数据库和目标数据库中的数据,请在源数据库和目标数据库中运行以下 SQL 查询:

select t.* from sample_schema.dms_tz_table t;

以下输出显示了源数据库和目标数据库中的数据:

|Source Australia/Sydney    |     Target America/Caracas|
|-------------------------------------------------------|
|id|info|                 ts|id|info|                 ts|
|--+----+-------------------+--+----+-------------------+
|1 |FL  |2025-12-19 02:12:47|1 |FL  |2025-12-18 15:12:47|
|2 |FL  |2025-12-18 19:03:01|2 |FL  |2025-12-18 08:03:01|
|3 |CDC |2025-12-19 02:17:40|3 |CDC |2025-12-18 11:17:40|
|4 |CDC |2025-09-01 19:05:01|4 |CDC |2025-09-01 05:05:01|

源数据库和目标数据库之间的时间戳数据不一致。

在目标端点中使用 Initstmt ECA 进行迁移

在以下示例中,源数据库位于澳大利亚/悉尼时区,目标数据库位于美洲/加拉加斯时区。源数据库在 AWS DMS 目标端点中包含 Initstmt=SET time_zone='+00:00'; ECA

要检查源数据库和目标数据库参数,请运行以下查询:

SELECT @@global.time_zone, @@session.time_zone;

源数据库输出:

@@global.time_zone|@@session.time_zone|
------------------+-------------------+
Australia/Sydney  |Australia/Sydney   |

目标数据库输出:

@@global.time_zone|@@session.time_zone|
------------------+-------------------+
America/Caracas   |America/Caracas    |

要准备完全加载的数据,请运行以下命令:

insert into sample_schema.dms_tz_table(id, info, ts) values(1, 'FL', CURRENT_TIMESTAMP);
insert into sample_schema.dms_tz_table(id, info, ts) values(2, 'FL','2025-09-01 19:03:01');

以完全加载加 CDC 模式运行 AWS DMS 任务。完全加载完成后,运行以下命令将 CDC 数据插入到源数据库中:

insert into sample_schema.dms_tz_table(id, info, ts) values(3, 'CDC', CURRENT_TIMESTAMP);
insert into sample_schema.dms_tz_table(id, info, ts) values(4, 'CDC', '2025-09-01 19:05:01');

要检查源数据库和目标数据库中的数据,请在源数据库和目标数据库中运行以下 SQL 查询:

select t.* from sample_schema.dms_tz_table t;

以下输出显示了源数据库和目标数据库中的数据:

|Source Australia/Sydney    |     Target America/Caracas|
|-------------------------------------------------------|
|id|info|                 ts|id|info|                 ts|
|--+----+-------------------+--+----+-------------------+
|1 |FL  |2025-09-03 00:44:31|1 |FL  |2025-09-02 10:44:31|
|2 |FL  |2025-09-01 19:03:01|2 |FL  |2025-09-01 05:03:01|
|3 |CDC |2025-09-03 00:48:15|3 |CDC |2025-09-02 10:48:15|
|4 |CDC |2025-09-01 19:05:01|4 |CDC |2025-09-01 05:05:01|

在目标端点中使用 Initstmt ECA 进行迁移,且目标数据库位于 UTC 时区

在以下示例中,源数据库位于澳大利亚/悉尼时区,目标数据库位于 UTC 时区。源数据库在 AWS DMS 目标端点中包含 Initstmt=SET time_zone='+00:00'; ECA。

要检查源数据库和目标数据库参数,请运行以下查询:

SELECT @@global.time_zone, @@session.time_zone;

源数据库输出:

@@global.time_zone|@@session.time_zone|
------------------+------------------+
Australia/Sydney  |Australia/Sydney  |

目标数据库输出:

@@global.time_zone|@@session.time_zone|
------------------+------------------+
UTC               |UTC               |

要准备完全加载的数据,请运行以下命令:

insert into sample_schema.dms_tz_table(id, info, ts) values(1, 'FL', CURRENT_TIMESTAMP);
insert into sample_schema.dms_tz_table(id, info, ts) values(2, 'FL','2025-09-01 19:03:01');

以完全加载加 CDC 模式运行 AWS DMS 任务。完全加载完成后,运行以下命令将 CDC 数据插入到源数据库中:

insert into sample_schema.dms_tz_table(id, info, ts) values(3, 'CDC', CURRENT_TIMESTAMP);
insert into sample_schema.dms_tz_table(id, info, ts) values(4, 'CDC', '2025-09-01 19:05:01');

要检查源数据库和目标数据库中的数据,请在源数据库和目标数据库中运行以下 SQL 查询:

select t.* from sample_schema.dms_tz_table t;

以下输出显示了源数据库和目标数据库中的数据:

|Source Australia/Sydney    |                 Target UTC|
|-------------------------------------------------------|
|id|info|                 ts|id|info|                 ts|
|--+----+-------------------+--+----+-------------------+
|1 |FL  |2025-09-03 01:02:09|1 |FL  |2025-09-02 15:02:09|
|2 |FL  |2025-09-01 19:03:01|2 |FL  |2025-09-01 09:03:01|
|3 |CDC |2025-09-03 01:03:37|3 |CDC |2025-09-02 15:03:37|
|4 |CDC |2025-09-01 19:05:01|4 |CDC |2025-09-01 09:05:01|

相关信息

使用 MySQL 兼容版数据库作为 AWS DMS 目标时的端点设置

AWS 官方已更新 8 个月前