MySQL

[MySQL] 타임존(Timezone) 설정과 변경 – 헷갈리지 말자!

Matae0712 2025. 5. 29. 13:26
반응형

✅ 운영 환경에서 흔히 겪는 타임존 이슈, 오늘은 MySQL 기준으로 정리해봅니다.
✅ 개발·운영 중 "시간이 이상해요!" 라는 문의가 들어왔다면 이 글이 도움이 될 거예요.


🔍 왜 타임존 설정이 중요한가요?

MySQL에서는 DATETIME이나 TIMESTAMP 컬럼을 사용할 때 서버의 타임존 설정에 따라 저장되거나 조회되는 시간이 달라질 수 있습니다.
예를 들어 한국(Asia/Seoul)에서 운영되는 서비스인데, DB 인스턴스가 UTC로 설정되어 있으면 시간이 9시간 밀려 보이게 되죠.


🧭 현재 설정된 타임존 확인하기

SELECT @@global.time_zone, @@session.time_zone;
  • global.time_zone: MySQL 서버 전체의 타임존 (재시작 전까지 고정)
  • session.time_zone: 현재 접속 세션에서의 타임존 (접속 시마다 초기화됨)

🔧 타임존 변경하는 방법

✅ 1. 세션 타임존 변경 (임시, 세션만)

SET time_zone = 'Asia/Seoul';

이 설정은 현재 접속 중인 세션에만 적용됩니다.
웹 애플리케이션에서 DB 연결할 때 설정하는 것도 이 방식이에요.


✅ 2. 글로벌 타임존 변경 (임시, 서버 재시작 시 초기화)

SET GLOBAL time_zone = 'Asia/Seoul';
 

서버 전체에 영향을 주지만, MySQL 재시작 시 원래대로 돌아옵니다.


✅ 3. my.cnf에 설정 (영구 적용)

Linux에서 MySQL 설정 파일을 수정해 영구 반영할 수 있습니다.

 
sudo vi /etc/my.cnf

[mysqld] default-time-zone='Asia/Seoul'
-- 수정 후 MySQL 재시작:


sudo systemctl restart mysqld

RDS에서는 직접 수정이 안 되므로 파라미터 그룹에서 설정해야 합니다. 아래 참고 👇


📦 [AWS RDS/Aurora]에서 타임존 설정 방법

  1. RDS 파라미터 그룹 생성 또는 편집
  2. time_zone 파라미터를 Asia/Seoul로 설정
  3. 인스턴스에 파라미터 그룹 적용
  4. DB 재시작 필요 (반드시 리부팅해야 적용됩니다)

🧱 타임존 이름 목록 불러오기

MySQL에서 일부 시스템은 time zone name을 인식하지 못할 수 있습니다. 그럴 땐 time zone 테이블을 로드해야 합니다.

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

이건 리눅스 서버에서 직접 MySQL을 운영할 때만 가능해요.
AWS RDS에서는 자동으로 포함돼 있어 따로 할 필요는 없습니다.


❗ 주의할 점

  • TIMESTAMP 타입은 MySQL에서 타임존을 자동으로 보정합니다.
    → 저장 시 UTC로 변환, 조회 시 다시 로컬 타임존으로 변환
  • 반면 DATETIME은 그냥 타임존 무관한 숫자입니다.
    → 애초에 어떤 타임존인지 구분이 안 되므로 앱/DB 간 명확한 규칙 필요!

🧩 정리하며

설정 위치지속성대상
SET time_zone 세션만 현재 연결된 클라이언트
SET GLOBAL time_zone 서버 재시작 시 초기화 전체 세션
my.cnf 설정 영구 적용 전체 인스턴스
RDS 파라미터 그룹 영구 적용 전체 인스턴스 (재시작 필요)
 

✅ 마무리 Tip

  • 앱에서 시간을 사용할 땐 UTC로 통일하고, 사용자 UI에서만 타임존 적용하는 것도 좋은 전략이에요.
  • MySQL 8.0 기준으로도 크게 다르지 않지만, 설정 적용 방식은 꼭 점검해 주세요.
반응형