리눅스맨

MySQL에서 9시간 차이 나는 현상 해결

MySQL에서 9시간 차이 나는 현상 해결

클라우드 환경 GCP 예시

클라우드 환경(GCP 등)에서 MySQL을 사용하다 보면,

서버의 기본 시간대가 UTC(협정 세계시)로 설정되어 있어 한국 표준시(KST)보다 9시간이 뒤쳐져서 데이터가 저장·조회되는 경우가 종종 발생

이 글에서는 MySQL과 JavaScript에서 시간 차이를 다루는 방법을 정리

MySQL의 날짜/시간 자료형 정리

MySQL에는 크게 DATE, DATETIME, TIMESTAMP 자료형이 있습니다. 다음 표로 비교해보겠습니다.

자료형예시타임존 반영 여부특징
DATE2023-02-06없음연-월-일만 저장 (시·분·초 정보 없음)
DATETIME2023-02-06 11:00:00없음날짜와 시간을 함께 저장하되, DB서버 타임존이 직접 반영되지는 않음
TIMESTAMP2023-02-06 11:00:00있음 (UTC 기준으로 저장 후 변환)UTC 기준으로 저장되며, 조회 시 MySQL 서버의 타임존에 따라 시간차가 반영되어 표시됨
  • DATETIME은 “그냥 적힌 시각”을 저장하는 방식이므로, DB 자체에서 시간대 정보를 고려하지 않습니다.
    예: 2020-08-25 11:00:00 → MySQL에 어떤 타임존 설정이 되어 있어도 이 형식 그대로 저장·조회됨.
  • TIMESTAMP는 실제로는 UTC 기준으로 저장되지만, MySQL 서버의 타임존 설정에 따라 조회 시점에 시차를 보정하여 표시합니다.
    예: DB 서버 타임존이 Asia/Seoul (UTC+09:00)일 때, 2020-08-25 11:00:00로 입력 → 내부적으로 UTC로 보정되어 저장(다른 시간처럼 보일 수 있음) → 조회 시 KST로 보정되어 다시 11:00:00임을 이해할 수 있음.

MySQL에서 타임존 설정 바꾸기 (일시 적용)

3-1. 현재 타임존 확인

sql복사SELECT @@global.time_zone, @@session.time_zone, @@system_time_zone;
  • @@global.time_zone : MySQL 전체(Global)의 타임존
  • @@session.time_zone : 현재 연결된 세션(Session)의 타임존
  • @@system_time_zone : OS 시스템 레벨의 타임존

3-2. 타임존 변경 (일시 적용)

sql복사-- 글로벌 타임존 설정 (서버 전체)
SET GLOBAL time_zone = '+09:00';

-- 현재 세션 타임존 설정
SET time_zone = '+09:00';

이렇게 설정하면 즉시 타임존이 적용되지만, MySQL 서버를 재시작하면 다시 원래 설정으로 돌아갑니다.

확인

sql복사SELECT NOW();

위 명령으로 시간을 조회했을 때, 원하는 한국 시각(KST)이 나온다면 정상입니다.
만약 Asia/Seoul 을 직접 쓰고 싶다면 SET GLOBAL time_zone = 'Asia/Seoul'; 로 시도할 수도 있으나, OS나 MySQL 타임존 정보 설정이 제대로 되어 있지 않으면 에러가 날 수 있습니다. 그 경우 숫자 형태(+09:00)로 설정하는 방법이 확실합니다.

4. MySQL 설정 파일에서 타임존 변경 (영구 적용)

MySQL이 재시작될 때도 설정이 유지되려면 설정 파일을 수정해야 합니다.

  1. MySQL 설정 파일 열기 (우분투 예시)bash복사sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
  2. [mysqld] 섹션 아래에 다음 내용을 추가pgsql복사default-time-zone = "+09:00"
  3. MySQL 재시작bash복사sudo service mysql restart 혹은bash복사sudo systemctl restart mysql.service
  4. 재시작 후 다시 MySQL에 접속, 다음 명령어로 타임존이 제대로 반영됐는지 확인sql복사SELECT @@global.time_zone, @@session.time_zone;


게시됨

카테고리

작성자

태그: