본문 바로가기
프로그래밍/데이터베이스

MySQL(MariaDB) 서버 타임존 설정하기

by pentode 2018. 7. 17.

Java에서 MySQL 서버에 연결하니 다음과 같은 에러가 발생하였습니다.


### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException:

  Failed to obtain JDBC Connection; nested exception is java.sql.SQLException:

  Cannot create PoolableConnectionFactory (The server time zone value xxxxx is unrecognized or represents more than one time zone.

  You must configure either the server or JDBC driver (via the serverTimezone configuration property)

  to use a more specifc time zone value if you want to utilize time zone support.)


현재 데이터베이스의 타임존을 확인해 봅니다.


SELECT @@global.time_zone, @@session.time_zone;




타임존이 SYSTEM으로 나옵니다. 별도로 지정이 되어 있지 않다는 뜻입니다. 타임존의 설정은 두 가지 방법으로 할 수 있습니다. 첫 번째는 JDBC URL 문자열에 타임존 정보를 옵션으로 추가할 수 있습니다. 두 번째는 서버에 기본 설정을 추가할 수 있습니다. 각각의 방법을 알아보겠습니다.


1. JDBC URL에 옵션 추가


<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">

<property name="driverClassName" value="com.mysql.jdbc.Driver"/>

<property name="url" value="jdbc:mysql://127.0.0.1:3306/blog_backupdb?serverTimezone=UTC" />

<property name="username" value="backupdbadm"/>

<property name="password" value="backupdbadm"/>

</bean>


URL에 ?serverTimezone=UTC 를 추가 했습니다. 추가후 에러없이 동작합니다. UTC(Coordinated Universal Time:세계 협정시)는 예전의 GMT(Greenwich Mean Time)가 표준화 된 것입니다.


우리나라의 표준시는 KST 입니다. UTC +9:00 인 값입니다. jdbc url의 옵션으로 KST 를 사용하면 에러가 발생합니다. ?serverTimezone=Asia/Seoul 을 사용할 수 있습니다.


이처럼 URL 에 옵션으로 타임존 값을 주면 에러가 발생하지는 않지만 시간은 서버의 시스템 시간 값으로 값이 나옵니다. 세션 타임존이 바껴서 시간이 바뀔줄 알았는데 아니더군요.



2. 데이터베이스 서버에 default-time-zone 설정하기


my.ini 파일에 [mysqld] 섹션에 default-time-zone을 추가합니다. 아래는 KST 로 지정한 것입니다.


[mysqld]

default-time-zone='+9:00'


default-time-zone='UTC' 형식으로 설정하면 에러가 발생합니다. MariaDB, MySQL 동일했습니다. UTC로 지정하기 위해서는 '+0:00' 또는 '-0:00' 으로 설정합니다. 그냥 '0:00' 으로 설정하면 안됩니다.


my.ini 파일에서 설정하여 시간을 조회하면 정확히 설정된 타임존의 시간이 나옵니다.

반응형