본문 바로가기

DB/MySQL

MySQL 시간 -9:00 출력될때 설정 바꾸는 법

회사 다닐 적 mysql 때문에 고생 많이 했는데

(물론 dbms 자체 보단 sql 튜닝이 해결 방법이였지만,)

 

하나도 기록을 안했길래 기록해두려고 오랜만에 블로그 킴.

 

운영 시작하기 직전에

개발 화면에 고객 결제 시간이 이상하게 보이는걸 발견.

 

물론 랜덤 시간으로 돌릴 순 있지만

개발계 데이터도 실 데이터에서 패턴 적용할 몇 중요 데이터만 빼고는 그대로 

들고 들어오니까 결제 시간은 실 데이터랑 같은데

결제 시간이 다 새벽 시간대였다.

 

 

검색 해보니

MySQL은 타임존 설정을 해주어야 한다는 것.

UTC 시간대로 출력되고 있었던 것이다.

 

기존 타임존을 확인하려면 하단 쿼리로 기존 시스템 설정 타임존을 확인 할 수 있다.

select @@global.time_zone, @@system_time_zone, @@session.time_zone;

만약 출력했을 때 system, session이 이미 Asia/Seoul 이거나 +9:00 시간으로 되어 있으면

타임존 설정 문제가 아니므로 원인을 다른데서 찾아봐야 함.

 

 

기본 timezone 값은 UTC로 되어있다.

한국 시간대역으로 출력하려면 

1. mysql 설정파일에 cnf 파일에 추가 기재가 필요하다.

 

cnf 파일 위치는 대부분 왠만하면 etc 밑에 있음

etc/mysql/mysql.conf.d/mysqld.cnf

 

경로로 찾아보고 없으면 'cnf' 로 파일 찾기 해서 찾으면 된다.

 

파일 mysqld 부분 제일 밑에

default-time-zone="+09:00"

 

추가해주고 디비 재시작하면 한국 시간 반영됨!!

 

 

구글링 해보면 간혹 

SET Global time_zone ='Asia/Seoul';

이렇게 쿼리 날려서 해결하는 포스트도 있는데

이경우 서버 재기동하면 설정값 날라가므로 서버 재기동 시 마다 쿼리를 날려주어야 한 다는 점 유의.

 

 

+중요+

MySQL 날짜/시간 datatype 중

타임존에 영향을 받는 것은 Timestamp!

우리 시스템에서 기본 날짜 컬럼 타입을 죄다 Timestamp로 지정해뒀어서 timezone 영향을 받았던것!

문자형인 Datetime 데이터타입보다는

숫자형인 Timestamp 를 많이 표준으로 지정해두는 시스템이 많은 듯하다.

Datetime 형은 자동 입력도 안되는 단점이 있어서 더 그런듯!

추가로 자동 입력(수정) 되도록 timestamp 컬럼을 생성해주려면

ALTER TABLE {테이블명} add column {칼럼명} TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

 

이런 식으로 컬럼 설정해줄것!

여기서 default current_timestamp = not null now() 와 같은 의미고

update current_timestamp 도 수정시 now() 시간으로 자동 수정하라는 의미!