AWS DMS 작업을 사용하여 UTC가 아닌 표준 시간대로 MySQL 데이터베이스를 마이그레이션하려면 어떻게 해야 합니까?

4분 분량
0

UTC가 아닌 표준 시간대의 소스 및 대상 MySQL 인스턴스가 있습니다. AWS Database Migration Service(AWS DMS) 작업을 사용하여 데이터베이스를 마이그레이션하려고 합니다. 어떻게 해야 합니까?

간략한 설명

MySQL을 소스로 사용하는 경우, 소스 MySQL 인스턴스가 UTC가 아닌 표준 시간대를 사용한다면 타임스탬프 데이터가 제대로 마이그레이션되지 않습니다. 내부적으로 MySQL 타임스탬프 열은 UTC로 저장됩니다. 그러나 날짜를 선택할 경우, MySQL은 자동적으로 타임스탬프 열을 현재 세션의 시간대로 변환합니다. MySQL은 저장을 위해 현재 시간대의 TIMESTAMP 값을 UTC로 변환합니다. 그런 다음 MySQL은 검색을 위해 해당 값을 UTC에서 현재 시간대로 다시 변환합니다.

마찬가지로 타임스탬프에 날짜를 저장하면 MySQL은 TIMESTAMP 값을 현재 시간대의 UTC로 변환합니다. 그런 다음 검색을 위해 해당 값을 UTC에서 현재 표준 시간대로 다시 변환합니다.

AWS DMS를 사용할 때 소스 및 대상 MySQL 인스턴스가 UTC 이외의 시간대를 사용하는 경우 데이터가 일관되지 않을 수 있습니다. 예를 들어 미국/태평양에서 실행되는 소스 및 대상 MySQL 데이터베이스가 있는 경우 UTC 시간대가 아닙니다. 따라서 소스의 데이터가 캡처된 다음 대상에 UTC로 적용되므로 데이터의 일관성이 떨어집니다.

해결 방법

이 문제를 해결하려면 소스 엔드포인트 serverTimezone에서 추가 연결 속성/엔드포인트 설정을 사용합니다. 그런 다음 값을 MySQL 데이터베이스의 표준 시간대로 설정합니다.

serverTimezone=US/Pacific

소스 엔드포인트 ServerTimezone에 추가 연결 속성(ECA)이 있는 예와 ECA가 없는 예를 비교해 보십시오.

소스 엔드포인트에 ECA serverTimezone이 없는 경우

참고: ECA를 사용하지 않는 경우 소스 데이터베이스와 대상 데이터베이스 간에 데이터 불일치가 발생할 수 있습니다.

소스

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)

이제 AWS DMS 작업을 생성했으므로 데이터가 마이그레이션된 후 전체 로드 후에는 다음과 같이 표시됩니다.

대상

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 |    ===> This shows timestamp in UTC in target 
+----+---------------------+
1 row in set (0.25 sec)

이제 소스 데이터베이스에 삽입을 수행합니다.

소스

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)

대상

mysql> select * from test_tz;
+----+---------------------+
| id | t_date              |
+----+---------------------+    
| 10 | 2022-06-28 03:50:29 |
| 11 | 2022-06-28 04:10:13 |    ===> This shows timestamp in UTC in target 
+----+---------------------+
2 rows in set (0.25 sec)

소스 엔드포인트에 ECA serverTimezone=미국/태평양이 있는 경우

전체 로드 후 데이터:

소스

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

대상

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

변경 데이터 캡처(CDC) 중 데이터

소스

3 rows in set (0.25 sec)
+----+---------------------+
| 12 | 2022-06-28 04:12:06 |
| 11 | 2022-06-28 04:10:13 |
| 10 | 2022-06-28 03:50:29 |
+----+---------------------+
| id | t_date              |
+----+---------------------+
mysql> select * from test_tz;
mysql> 
mysql> 

Query OK, 1 row affected (0.38 sec)
mysql> insert into test_tz values (12, current_time());

대상

3 rows in set (0.25 sec)
+----+---------------------+
| 12 | 2022-06-28 04:12:06 |
| 11 | 2022-06-28 04:10:13 |
| 10 | 2022-06-28 03:50:29 |
+----+---------------------+
| id | t_date              |
+----+---------------------+
mysql> select * from test_tz;

따라서 ECA serverTimezone를 사용하면 소스 MySQL 인스턴스가 UTC가 아닌 표준 시간대를 사용하는 경우 타임스탬프 데이터를 마이그레이션하고 복제할 수 있습니다.


AWS 공식
AWS 공식업데이트됨 2년 전