Direkt zum Inhalt

Wie verwende ich AWS DMS-Aufgaben, um eine MySQL-Datenbank in einer Nicht-UTC-Zeitzone zu migrieren?

Lesedauer: 4 Minute
0

Ich habe eine Quell- und Ziel-MySQL-Instance, die sich in einer Nicht-UTC-Zeitzone befindet. Ich möchte eine AWS Database Migration Service (AWS DMS)-Aufgabe verwenden, um die Datenbank zu migrieren.

Kurzbeschreibung

Wenn die Quell- und Ziel-MySQL-Instances eine Nicht-UTC-Zeitzone verwenden, können deine Zeitstempeldaten inkonsistent sein. Intern speichert MySQL die Zeitstempelspalte als UTC. MySQL konvertiert die Zeitstempelspalte jedoch automatisch in die Zeitzone der aktuellen Sitzung, wenn du ein Datum auswählst.

Du hast beispielsweise eine Quell- und eine Ziel-MySQL-Datenbank, die in „USA Pacific“ ausgeführt werden. Die Daten werden inkonsistent, wenn die DMS-Aufgabe die Daten als UTC in der Quelle erfasst und auf das Ziel anwendet.

Verwende die ServerTimeZone-Endpunkteinstellung im Quellendpunkt, um dieses Problem zu beheben. Stelle den Wert auf die Zeitzone der MySQL-Datenbank ein.

Beispiel für eine ServerTimeZone-Endpunkteinstellung:

ServerTimezone=US/Pacific

Lösung

Migration ohne die ServerTimeZone-Einstellung im Quellendpunkt

Die folgende Beispielquelldatenbank enthält nicht die ServerTimeZone-Einstellung im Quellendpunkt:

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)

Das folgende Beispiel zeigt die Quelldatenbank, nachdem du eine DMS-Aufgabe erstellt, die Daten migriert hast und die Aufgabe die Daten vollständig lädt:

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)

Der Zeitstempel ist in UTC.

Führe eine Einfügung in die Quelldatenbank durch:

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)

Beispielziel:

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)

Der Zeitstempel ist immer noch in UTC.

Migration mit der ServerTimeZone-Einstellung im Quellendpunkt

Die folgenden Beispiele sind eine vollständig geladene Quelle und ein vollständig geladenes Ziel, wenn du die ServerTimeZone-Einstellung im Quellendpunkt verwendest.

Beispielquelle:

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

Beispielziel:

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

Daten während CDC

Verwende die ServerTimeZone-Einstellung während der Erfassung von Datenänderungen (Change Data Capture, CDC), wenn du Zeitstempeldaten für eine MySQL-Quell-Instance replizierst, die eine Nicht-UTC-Zeitzone verwendet.

Beispielquelle:

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)

Beispielziel:

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)

Ähnliche Informationen

The DATE, DATETIME, and TIMESTAMP types (Die Typen von DATUM, TAGESZEIT und ZEITSTEMPEL) auf der MySQL-Website

AWS OFFICIALAktualisiert vor einem Jahr