[Docker] Mysql Timezone 변경
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가지 방법
- global time_zone을 SET하는 방법
- .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"