데이터베이스

[MySQL] mysql server timezone 한국으로 설정하기.

jwKim96 2018. 12. 31. 02:07
timezone이란?
한국은 표준시(대한민국 표준시 - KST)를 하나의 시간대(timezone)만 사용하지만 
미국처럼 영토가 넓은 국가들은 timezone이 여러개 있습니다. 또한 각 타임존 역시 2종류로 나누어 집니다.
(타임존의 약자에 S가 들어가면 겨울의 시간, D가 들어가면 서머타임이 적용될 때의 시간대 입니다.)

그리고 '그리니치 천문대'가 있는곳의 시간은 UTC 입니다.
그래서 예를들어 UTC-8 은 그리니치 천문대가 있는위치. 즉 세계협정시에서 8시간을 뺀 시간이라는 의미 입니다.
(하이픈이 아니라 마이너스 부호임)

KST는 UTC+9입니다.
그리고 미국 캘리포니아주의 LA는 겨울에는 태평양 표준시인 PST(UTC-8) 을 사용합니다.
하지만 섬머타임에는 PDT(UTC-7)을 사용합니다.
그래서 한국과의 시차를 비교해 본다면

  • 겨울 시간

한국-LA : ( UTC+9 ) - (UTC - 8) = 17시간

  • 여름 시간

한국-LA : ( UTC+9 ) - (UTC - 7) = 16시간

이렇게 여름, 겨울에 따라 시차에 변동이 생깁니다.
TimeZone에 관해 알아보았습니다.

Timezone 데이터가 MySQL 에 있는 경우

먼저 mysql shell (혹은 console 에서 mysql실행)

mysql> select @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)

time zone이 설정이 되어있지 않다면 아마 위 문장을 실행하면 다음과 같은 결과를 받을 것입니다.
그렇다면 먼저

SET GLOBAL time_zone='Asia/Seoul';

SET time_zone='Asia/Seoul';

위 두 문장을 실행해 보시면 됩니다.

mysql> select @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| Asia/Seoul         | Asia/Seoul          |
+--------------------+---------------------+
1 row in set (0.00 sec)

위와 같은 결과를 얻는다면 성공!

Timezone 데이터가 MySQL 에 없는 경우

아래 명령어를 실행했을때 다음과 같은 오류가 나온다면

set time_zone='Asia/Seoul';

ERROR 1298 (HY000): Unknown or incorrect time zone: 'Asia/Seoul'

아래 쿼리를 실행해보시고, 만약 결과가 나오지 않는다면 MySQL 에 Timezone 데이터가 없는 경우 입니다.

SELECT b.name, a.time_zone_id 
FROM mysql.time_zone a, mysql.time_zone_name b 
WHERE a.time_zone_id = b.time_zone_id AND b.name LIKE '%Seoul';

Empty set (0.00 sec)

MySQL 에 Timezone 데이터를 넣기 위해서는 아래방법을 따라해 주세요.

1. Timezone 데이터 다운로드

여기 접속합니다.

MySQl 이 설치된 OS 에 zoneinfo 가 있다면, 이 패키지들을 사용하지 마십시오.
(예: Linux, FreeBSD, Sun Solaris 등)
대신에 mysql_tzinfo_to_sql 유틸리티를 사용하면 mysql.time_zone 테이블 생성할 수 있습니다.
(그렇지 않으면 MySQL과 OS 의 다른 응용 프로그램 간에 날짜/시간 처리에 차이가 발생할 수 있습니다.)

윈도우 유저는 Non POSIX with leap seconds 받으시면 됩니다.(전 이거 받았습니다)

POSIX란?
POSIX(Portable Operating System Interface)

이식 가능 운영 체제 인터페이스라는 의미로, 서로 다른 UNIX OS의 공통 API를 정리하여
이식성이 높은 유닉스응용 프로그램을 개발하기 위한 목적으로 IEEE가 책정한 애플리케이션 인터페이스 규격.

다운로드 후 압축을 풀어줍니다.

2. MySQL 에 적용

약 47,000줄 정도되는 sql을 mysql 스키마에 실행한다.

use mysql;

source [저장한 sql 파일의 절대 경로]

쿼리가 모두 실행되었다면 다시한번 확인해봅니다.

MySQL> SELECT b.name, a.time_zone_id
FROM mysql.time_zone a, mysql.time_zone_name b
WHERE a.time_zone_id = b.time_zone_id AND b.name LIKE '%Seoul';

+------------+--------------+
| name       | time_zone_id |
+------------+--------------+
| Asia/Seoul |          308 |
+------------+--------------+

이런 결과를 얻었다면 성공.

마지막으로, my.ini파일의 제일 마지막줄에 아래의 문장을 추가해 줍니다.

default-time-zone=Asia/Seoul

그리고 mysql서버를 재시작 해준다.

그리고 mysql에서 다시

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| Asia/Seoul         | Asia/Seoul          |
+--------------------+---------------------+

위와 같은 결과를 얻는다면, 성공!