개발

[Docker] Mysql Timezone 변경

autocat 2022. 11. 3. 13:32

Mysql에서 NOW() 를 통해 현자날짜로 TIMESTAMP 필드에 넣어주는데, 날짜가 현재시간과 일치 하지 않아서 타임존을 변경하려고 한다. 별도의 설정이 없다면 기본적으로 UTC로 설정이 되어있어 9시간의 차이가 나는것을 확인할 수 있다.


Mysql CLI 진입

먼저 mysql 컨테이너의 ID값을 확인하고 CLI에 진입한다.

CLI 가 뭐지?
Command-Line Interface 로 터미널을 통해 사용자와 컴퓨터가 상호작용 하는 방식
ex) dos, commandPrompt, bash 로 대표되는 유닉스 Shell환경
terminal(MacOS), window terminal(Window)

container의 ID값을 확인한 뒤 exec -it 명령어를 사용하여 진입한다.
docker exec -it [containerID] /bin/bash

$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED        STATUS       PORTS                                                    NAMES
722958b7346d   mysql     "docker-entrypoint.s…"   9 months ago   Up 3 hours   33060/tcp, 0.0.0.0:43306->3306/tcp, :::43306->3306/tcp   omr-mysql
ab570522a52d   redis     "docker-entrypoint.s…"   9 months ago   Up 3 hours   0.0.0.0:46379->6379/tcp, :::46379->6379/tcp              omr-redis
$ docker exec -it 722958b7346d /bin/bash

cli로 접속했다면, mysql -u [ID] -p 명령어를 통해 비밀번호를 입력하고 서버로 접속한다.

# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 718
Server version: 8.0.27 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

현재 TimeZone 설정을 아래와 같이 확인할 수 있다.

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

 

TimeZone 변경의 2가지 방법

  1. global time_zone을 SET하는 방법
  2. .cnf 파일을 수정하는 방법

global time_zone을 변경하는 방법이 가장 간편하지만,세션 기준으로 변경이 되다보니 서버가 재기동되거나 다른세션으로 접속시 설정 공유가 되지 않는다. 두가지 방법을 다 소개하지만 2번방법을 사용하는것이 더 적절하다고 생각된다.

 

SET Global TimeZone

가장 간단한 방법이며 쿼리 한줄로 해결할 수 있다.

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

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

SET GLOBAL time_zone = 'Asia/SEoul' 명령어 한줄이면 바로 Timezone이 변경되는것을 확인할 수 있다.

 

.cnf 파일 수정

먼저 cnf파일의 위치를 찾아야 하므로 아래 명령어를 입력해 my.cnf 파일의 위치를 찾는다.

mysqld --verbose --help | grep -A 1 'Default options'
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

vi를 통해 cnf파일의 [mysqld] 에 한가지의 옵션을 더 추가해준다.

VI가 설치가 안되있는 경우가 있는데 이때는 apt-get update 로 패키징툴을 업데이트를 해주고
apt-get install vi 명령어를 통해 install 하면 된다.

default-time-zone='Asia/Seoul'
### 혹은 UTC +9시간을 해주거나..
default-time-zone='+09:00'

저장 후 재기동을 하고 확인하면 변경된것을 확인할수있다.

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

 

docker-compose yml

docker compose yml파일의 environment에 TZ을 추가하는것도 하나의 방법일 수 있다.

version: '2'

services:
  database:
    image: mysql
    container_name: omr-mysql
    ports:
      - "43306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${OMR_MYSQL_PASSWORD}
      TZ : Asia/Seoul #docker compose yml 자체에 TimeZone을 박아놓는것도 방법이다.
    command: [ '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci' ]
    volumes:
      - /Users/autocat/dev/Personal/docker-mysql
  redis:
    image: redis
    container_name: omr-redis
    ports:
      - "46379:6379"