준호씨의 블로그

Jetbrains DataGrip - MySQL Timezone 접속문제 해결. Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually. 본문

개발이야기

Jetbrains DataGrip - MySQL Timezone 접속문제 해결. Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.

준호씨 2020. 3. 24. 21:25
반응형

 

DataGrip에서 MySQL 서버에 접속하려고 하니 "Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually."가 뜨면서 DB 접속이 안되었습니다.

물론 Advanced 탭에서 serverTimezone을 설정해 주면 되긴 합니다.

하지만 해당 DB에 접근하려는 모든 클라이언트에서 이러한 설정을 넣어 준다는 건 비효율적인 일입니다. 게다가 클라이언트에서 timezone을 잘못 설정해 줘서 더 큰 문제가 발생할지도 모를 일이고요. MySQL 서버의 Timezone을 제대로 설정해 주면 이런 문제들은 모두 해결됩니다.

일단 MySQL 서버의 Timezone이 어떻게 설정되어 있는지 확인해 봅니다.

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

별다른 설정을 안 해줘서 그런지 SYSTEM이라고 나옵니다. 다음 쿼리로도 확인할 수 있습니다.

mysql> show global variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | KST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)

아무튼 시스템 타임존을 사용하고 시스템 타임존은 KST라고 나오고 있습니다.

한국의 기본 타임존은 Asia/Seoul입니다. Asia/Seoul로 바꿔보겠습니다. 다음 명령어로 설정을 바꿀 수 있습니다.

SET GLOBAL time_zone='Asia/Seoul';
SET time_zone='Asia/Seoul';

엇. 그런데 에러가 발생합니다.

mysql> SET GLOBAL time_zone='Asia/Seoul';
ERROR 1298 (HY000): Unknown or incorrect time zone: 'Asia/Seoul'

Asia/Seoul 타임존을 모르겠다고 하네요. 그냥 timezone 을 숫자로 직접 입력해 주면 되긴 합니다.

SET GLOBAL time_zone='+09:00';
SET time_zone='+09:00';

하지만 Asia/Seoul로 설정하고 싶네요. 이럴 때는 mysql_tzinfo_to_sql 유틸 커맨드를 이용해서 타임존을 추가해 줄 수 있습니다.

$ mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -uroot mysql -p
Enter password:
Warning: Unable to load '/usr/share/zoneinfo//iso3166.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo//leapseconds' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo//tzdata.zi' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo//zone.tab' as time zone. Skipping it.
Warning: Unable to load '/usr/share/zoneinfo//zone1970.tab' as time zone. Skipping it.

타임존 파일이 아닌 파일들인 경우 Warning 메시지가 뜨는데 무시하면 됩니다. 자 이제 다시 DB에 접속해서 타임존을 Asia/Seoul로 설정해 보겠습니다.

mysql> SET GLOBAL time_zone='Asia/Seoul';
Query OK, 0 rows affected (0.00 sec)

mysql> SET time_zone='Asia/Seoul';
Query OK, 0 rows affected (0.00 sec)

이제 설정이 잘 되었네요.

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

mysql> show global variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | KST        |
| time_zone        | Asia/Seoul |
+------------------+------------+
2 rows in set (0.00 sec)

하지만 이 설정은 MySQL를 재시작하면 다시 초기화가 될 것입니다. /etc/my.cnf 파일을 수정해 줍니다. [mysqld]에 default-time-zone 설정을 추가해 줍니다.

[mysqld]
default-time-zone='Asia/Seoul'

Asia/Seoul 타임존을 설치해 주지 않았다면 숫자로 입력해도 됩니다.

[mysqld]
default-time-zone='+09:00'

이제 DataGrip에서 DB에 접속하려고 하면 "Go to 'Advanced' tab and set 'serverTimezone' property manually."오류가 뜨지 않고 잘 접속되는 것을 확인할 수 있습니다.

반응형
Comments