Comment utiliser les tâches AWS DMS pour migrer une base de données MySQL dans un fuseau horaire autre qu’UTC ?

Lecture de 4 minute(s)
0

J'ai une instance MySQL source et cible qui se trouve dans un fuseau horaire non UTC. Je souhaite utiliser une tâche AWS Database Migration Service (AWS DMS) pour transférer des données vers Amazon Redshift.

Brève description

Si vos instances MySQL source et cible utilisent un fuseau horaire dans un format autre qu’UTC, vos données d'horodatage peuvent être incohérentes. En interne, MySQL stocke la colonne d'horodatage au format UTC. Cependant, MySQL convertit automatiquement la colonne d'horodatage en fonction du fuseau horaire de la session en cours lorsque vous sélectionnez une date.

Par exemple, vous avez une base de données MySQL source et cible qui s'exécute aux États-Unis et dans le Pacifique. Les données deviennent incohérentes lorsque la tâche DMS capture et applique les données au format UTC de la source à la cible.

Pour résoudre ce problème, utilisez le paramètre de point de terminaison ServerTimezone dans le point de terminaison source. Définissez la valeur sur le fuseau horaire de la base de données MySQL.

Exemple de paramètre de point de terminaison ServerTimezone :

ServerTimezone=US/Pacific

Résolution

Migration sans le paramètre ServerTimezone sur le point de terminaison source

L'exemple de base de données source suivant n'inclut pas le paramètre ServerTimezone dans le point de terminaison source :

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)

L'exemple suivant est la base de données source une fois que vous avez créé une tâche DMS, migré les données et que la tâche charge complètement les données :

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)

L'horodatage est en UTC.

Effectuez une insertion dans la base de données source :

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)

Exemple de cible :

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)

L'horodatage est toujours en UTC.

Migration avec le paramètre ServerTimezone sur le point de terminaison source

Les exemples suivants représentent une source et une cible entièrement chargées lorsque vous utilisez le paramètre ServerTimezone dans le point de terminaison source.

Source d'exemple :

mysql> select * from test_tz;
+----+---------------------+
| id | t_date              |
+----+---------------------+
| 10 | 2022-06-27 20:50:29 |
| 11 | 2022-06-27 21:10:13 |
+----+---------------------+

Exemple de cible :

mysql> select * from test_tz;
+----+---------------------+
| id | t_date              |
+----+---------------------+
| 10 | 2022-06-27 20:50:29 |
| 11 | 2022-06-27 21:10:13 |
+----+---------------------+

Données pendant le CDC

Utilisez le paramètre ServerTimezone lors de la capture des données de modification (CDC) lorsque vous répliquez des données d'horodatage pour une instance MySQL source qui utilise un fuseau horaire non UTC.

Source d'exemple :

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)

Exemple de cible :

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)

Informations connexes

Les types DATE, DATETIME et TIMESTAMP sur le site Web de MySQL

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un mois