Tengo una instancia de MySQL de origen y destino que se encuentra en una zona horaria que no es UTC. Quiero usar una tarea de AWS Database Migration Service (AWS DMS) para migrar la base de datos.
Descripción corta
Si las instancias de MySQL de origen y destino utilizan una zona horaria distinta de la UTC, los datos de la marca de tiempo pueden ser incoherentes. Internamente, MySQL almacena la columna de marca de tiempo como UTC. Sin embargo, MySQL convierte automáticamente la columna de marca de tiempo en la zona horaria de la sesión actual al seleccionar una fecha.
Por ejemplo, tiene una base de datos MySQL de origen y destino que se ejecuta en EE. UU. y el Pacífico. Los datos se vuelven incoherentes cuando la tarea de DMS captura y aplica los datos como UTC del origen al destino.
Para resolver este problema, utilice la configuración de punto de enlace ServerTimezone en el punto de enlace de origen. Establezca el valor en la zona horaria de la base de datos MySQL.
Ejemplo de configuración de punto de enlace de ServerTimezone:
ServerTimezone=US/Pacific
Resolución
Migración sin la configuración ServerTimezone en el punto de enlace de origen
El siguiente ejemplo de base de datos de origen no incluye la configuración ServerTimezone en el punto de enlace de origen:
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)
El siguiente ejemplo es la base de datos de origen después de crear una tarea de DMS, migrar los datos y que la tarea los cargue por completo:
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)
La marca de tiempo está en UTC.
Realice una inserción en la base de datos de origen:
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)
Ejemplo de destino:
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)
La marca de tiempo sigue en UTC.
Migración con la configuración ServerTimezone en el punto de enlace de origen
Los siguientes ejemplos muestran un origen y un destino completamente cargados cuando se usa la configuración ServerTimezone en el punto de enlace de origen.
Ejemplo de origen:
mysql> select * from test_tz;
+----+---------------------+
| id | t_date |
+----+---------------------+
| 10 | 2022-06-27 20:50:29 |
| 11 | 2022-06-27 21:10:13 |
+----+---------------------+
Ejemplo de destino:
mysql> select * from test_tz;
+----+---------------------+
| id | t_date |
+----+---------------------+
| 10 | 2022-06-27 20:50:29 |
| 11 | 2022-06-27 21:10:13 |
+----+---------------------+
Datos durante los CDC
Use la configuración ServerTimezone durante la captura de datos de cambios (CDC) cuando replique los datos de marca de tiempo de una instancia de MySQL de origen que utilice una zona horaria que no sea UTC.
Ejemplo de origen:
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)
Ejemplo de destino:
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)
Información relacionada
Tipos DATE, DATETIME y TIMESTAMP del sitio web de MySQL