본문 바로가기

Technical/DBMS

MySQL에서 timezone 사용을 위한 설정, 확인 사항

1. MySQL 서버의 타임존 설정방법에 관하여


일반적으로 MySQL 설치시 timezone에 대해서 별도 옵션을 지정하지 않으면
태평양표준시인 PST(Pacific Standard Time) 으로 설정된다(PST/PDT 등에 대해서는 여기 참조).

* 참고로 Ubuntu에서 시스템의 표준시를 KST(대한민국 표준시)로 바꾸려면
# ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

(MySQL 관련한 세부 정보 및 사용법은 http://www.mysqlkorea.com 참조)

DB 서버에 클라이언트로 접속해서 타임존 설정을 확인해 보자


mysql> select @@system_time_zone;
+--------------------+
| @@system_time_zone |
+--------------------+
| PST                |
+--------------------+
1 row in set (0.00 sec)

이 값은 설정 후에는 변경되지 않으며, 따라서 DB엔진 입장에서는 시스템의 설정 값을 가져다 쓰는 것이다.


실제로 MySQL 내애서 사용하기 위한 타임존 값은 서버가 기동중일 때 사용하는 시스템 변수인
time_zone 이라는 값으로, 이 값은


(1)서버 기동시에 --default-time-zone='timezone' 으로 지정하거나
(2) MySQL root 권한을 이용해서


mysql> SET GLOBAL time_zone='timezone;
이라고 설정해 주거나, 또는


(3) 클라이언트 접속시에 이미 설정된 time_zone 변수의 값을 명시적으로 자체적인(세션에 국한된)  time_zone 값으로


mysql> SET time_zone='timezone;


와 같이 세션변수 갑으로 설정하여 사용할 수도 있다.

(2), (3) 의 결과를 아래에서 확인한다.


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


*** 최초 기본 설정 상태의 time_zone 변수의 값을 확인한 결과
mysql> select @@time_zone;
+-------------+
| @@time_zone |
+-------------+
| SYSTEM      |
+-------------+
1 row in set (0.00 sec)

*** 이 상태에서 Quiery로 시간 값을 조회해 보면,
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-12-29 04:51:21 |
+---------------------+
1 row in set (0.00 sec)
===> 실제 시간은 21:51:21 이므로 한국 현재 시간 -17 시간이 된다

*** 이제 타임존을 서울로 설정하고 시간을 조회해보면
mysql> set time_zone = 'Asia/Seoul';
Query OK, 0 rows affected (0.00 sec)

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

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2009-12-29 21:57:45 |
+---------------------+
1 row in set (0.00 sec)


'timezone' 의 값은 아래의 여러 가지 포맷으로 줄 수 있으며, 대소문자 구분이 없다(보다 자세한 사항은 MySQLkorea.com의 매뉴얼을 참고한다)
  - 'SYSTEM' 은 타임존이 시스템의 타임존과 동일하도록 설정할 때 쓴다
  - '+10:00' 또는 '-6:00' 과 같이 GMT/UTC기준 offset을 가리키는 문자열로 쓸 수도 있다
  - 'US/Eastern', 'Asia/Seoul' 과 같은 named timezone 형태의 값을 줄 수도 있다.


2. Named timezone 설정 및 사용 방법


이번 내용에서는 위의 named timezone 형태의 값을 시스템 설정파일에서 불러내어 MySQL 시스템오브젝트(테이블)에 등록하고 사용하는 방법을 정리한다.

MySQL을 설치하면 'mysql' 이라는 데이터베이스 내에 time_zone, time_zone_name, time_zone_transition,
time_zone_transition_type, time_zone_leap_second 의 시스템 테이블이 생성되지만 실제로 값이 들어 있지는 않다.

사용하려고 하는 MySQL 데이터베이스가 Global한 서비스를 하게 될 경우의 시간 값이 중요해지는 상황의 IT환경이라면 시스템에 내장되어 있는 타임존 설정값들을 읽어서 위의 테이블들에 등록해 주어야 한다.

MySQL이 설치되는 OS가 Linux, Solaris 계열, BSD계열(물론 Mac OS X도 여기에 해당)이라면
방법은 아주 간단하다. 타임존에 해당하는 설정데이터들은 주로 /usr/share/zoneinfo 디렉토리 아래에 존재하는데 MySQL에서 제공하는 utility query인 mysql_tzinfo_to_sql 을 이용해서 간단히 등록할 수 있다.


root 계정 명령라인에서 아래와 같이 실행하면 된다.


root@ubuntu:/home/somewhere# mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -prootpassword mysql

이제 데이터베이스에 접속하여 텅 비어 있던 타임존 관련 테이블들에 데이터가 등록 되었는지 확인해 보자.

mysql> select count(*) from mysql.time_zone;
+----------+
| count(*) |
+----------+
|     1724 |
+----------+
1 row in set (0.00 sec)

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       |          287 |
| posix/Asia/Seoul |          862 |
| right/Asia/Seoul |         1437 |
+------------------+--------------+
3 rows in set (0.00 sec)

만약 MySQL이 설치되는 OS가 Windows 계열 또는 HP/UX 등이라면 MySQL 사에서 제공하는
MyISAM 파일들을 http://dev.mysql.com/downloads/timezones.html 에서 다운 받은 다음
MySQL 데이터베이스를 중단시키고 'mysql' 서브디렉토리에 직접 복사해 넣어야 한다.

이제 여기서 설정된 named timezone 값들을 1번에서와 같이 'timezone' 값으로 설정하여
마음대로 사용하면 된다.


- Barracuda -