Eu tenho uma instância MySQL de origem e destino que está em um fuso horário diferente de UTC. Quero usar uma tarefa do AWS Database Migration Service (AWS DMS) para migrar o banco de dados.
Breve descrição
Se suas instâncias do MySQL de origem e destino usarem um fuso horário diferente do UTC, seus dados de registro de data e hora podem ser inconsistentes. Internamente, o MySQL armazena a coluna de carimbo de data e hora como UTC. No entanto, o MySQL converte automaticamente a coluna de carimbo de data e hora para o fuso horário da sessão atual quando você seleciona uma data.
Por exemplo, você tem um banco de dados MySQL de origem e destino executado nos EUA/Pacífico. Os dados se tornam inconsistentes quando a tarefa do DMS captura e aplica os dados como UTC na origem até o destino.
Para resolver esse problema, use a configuração do endpoint ServerTimezone no endpoint de origem. Defina o valor para o fuso horário do banco de dados MySQL.
Exemplo de configuração do endpoint ServerTimezone:
ServerTimezone=US/Pacific
Resolução
Migração sem a configuração ServerTimezone no endpoint de origem
O banco de dados de origem de exemplo a seguir não inclui a configuração ServerTimezone no endpoint de origem:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| US/Pacific | US/Pacific |
+--------------------+---------------------+
mysql> create table test_tz ( id int primary key,t_date timestamp);
Query OK, 0 rows affected (0.28 sec)
mysql> insert into test_tz values (10, now());
Query OK, 1 row affected (0.31 sec)
mysql> select * from test_tz;
+----+---------------------+
| id | t_date |
+----+---------------------+
| 10 | 2022-06-27 20:50:29 |
+----+---------------------+
1 row in set (0.25 sec)
O exemplo a seguir é o banco de dados de origem depois de criar uma tarefa DMS, migrar os dados e a tarefa carregar totalmente os dados:
mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| US/Pacific | US/Pacific |
+--------------------+---------------------+
1 row in set (0.30 sec)
mysql> select * from test_tz;
+----+---------------------+
| id | t_date |
+----+---------------------+
| 10 | 2022-06-28 03:50:29 |
+----+---------------------+
1 row in set (0.25 sec)
O carimbo de data e hora está em UTC.
Execute uma inserção no banco de dados de origem:
mysql> insert into test_tz values (11, now());Query OK, 1 row affected (0.38 sec)
mysql> select * from test_tz;
+----+---------------------+
| id | t_date |
+----+---------------------+
| 10 | 2022-06-27 20:50:29 |
| 11 | 2022-06-27 21:10:13 |
+----+---------------------+
2 rows in set (0.24 sec)
Destino de exemplo:
mysql> select * from test_tz;
+----+---------------------+
| id | t_date |
+----+---------------------+
| 10 | 2022-06-28 03:50:29 |
| 11 | 2022-06-28 04:10:13 |
+----+---------------------+
2 rows in set (0.25 sec)
O carimbo de data e hora ainda está em UTC.
Migração com a configuração ServerTimezone no endpoint de origem
Os exemplos a seguir são uma origem e um destino totalmente carregados quando você usa a configuração ServerTimezone no endpoint de origem.
Origem de exemplo:
mysql> select * from test_tz;
+----+---------------------+
| id | t_date |
+----+---------------------+
| 10 | 2022-06-27 20:50:29 |
| 11 | 2022-06-27 21:10:13 |
+----+---------------------+
Destino de exemplo:
mysql> select * from test_tz;
+----+---------------------+
| id | t_date |
+----+---------------------+
| 10 | 2022-06-27 20:50:29 |
| 11 | 2022-06-27 21:10:13 |
+----+---------------------+
Dados durante a CDC
Use a configuração ServerTimezone durante a captura de dados de alteração (CDC) ao replicar dados do carimbo de data e hora para uma instância MySQL de origem que está usando um fuso horário diferente de UTC.
Origem de exemplo:
mysql> insert into test_tz values (12, current_time());
Query OK, 1 row affected (0.38 sec)
mysql>
mysql>
mysql> select * from test_tz;
+----+---------------------+
| id | t_date |
+----+---------------------+
| 10 | 2022-06-27 20:50:29 |
| 11 | 2022-06-27 21:10:13 |
| 12 | 2022-06-27 21:12:06 |
+----+---------------------+
3 rows in set (0.25 sec)
Destino de exemplo:
mysql> select * from test_tz;
+----+---------------------+
| id | t_date |
+----+---------------------+
| 10 | 2022-06-27 20:50:29 |
| 11 | 2022-06-27 21:10:13 |
| 12 | 2022-06-27 21:12:06 |
+----+---------------------+
3 rows in set (0.25 sec)
Informações relacionadas
Os tipos DATE, DATETIME e TIMESTAMP no site do MySQL