Hello

MySQL 테이블명 대소문자 불일치 이슈 본문

DB

MySQL 테이블명 대소문자 불일치 이슈

nari0_0 2025. 4. 3. 16:09
728x90

1. 문제 발생

MySQL 5.x에서 MySQL 8.0으로 업그레이드한 후, 로컬 테스트 도중 쿼츠 스케줄러에서 에러가 발생했습니다.

org.quartz.JobPersistenceException: Couldn't acquire next trigger: Table 'aa.QRTZ_TRIGGERS' doesn't exist

에러 내용은 QRTZ_TRIGGERS 테이블이 aa  데이터베이스 에 존재하지 않는다는 뜻입니다.

2. 원인 분석

에러의 원인을 분석한 결과, 기존의 MySQL 5.x에서 사용하던 대문자 테이블 이름이 MySQL 8.x로 복제되면서 소문자 테이블 이름으로 변환되어 저장된 것을 확인했습니다. 또한, lower_case_table_names 옵션이 0으로 설정되어 있었기 때문에, MySQL은 대소문자를 구분하여 테이블 이름을 처리하고 있었습니다. 따라서, 애플리케이션에서 대문자로 참조한 테이블 이름과 실제 데이터베이스에 저장된 소문자 테이블 이름이 일치하지 않아 에러가 발생한 것입니다.

 

+) 로컬 테스트 환경과 QA 환경 차이

로컬 테스트 환경에서는 리눅스 DB 서버를 사용했기 때문에 lower_case_table_names=0 설정이 적용되어 대소문자를 구분했습니다. 이로 인해 애플리케이션에서 대문자로 테이블을 참조했을 때, 실제 DB에 소문자로 저장된 테이블을 찾지 못하는 문제가 발생한 것입니다.

 

반면, QA 환경에서는 윈도우 DB 서버를 사용하고 있었고, 기본적으로 lower_case_table_names=1로 설정되어 있었습니다. 이 설정 덕분에 테이블 이름이 소문자로 저장되었고, 애플리케이션에서 대소문자 구분 없이 테이블을 참조해도 문제가 발생하지 않았습니다.

 

MySQL 8.x로 업그레이드한 후, 복제 하는 과정에서 발생한 휴먼 에러로 인해 운영체제별 MySQL 설정 차이가 문제가 되어 로컬 환경에서는 문제가 발생했지만, QA 환경에서는 문제가 발생하지 않았습니다.

3. 해결 방법

  1. lower_case_table_names 값 변경
    lower_case_table_names는 MySQL에서 테이블 이름의 대소문자 구분 방식을 설정하는 옵션입니다. 해당 옵션을 통해 테이블 이름의 대소문자 구분을 제어할 수 있습니다.
    로컬 환경에서 문제를 해결하기 위해, lower_case_table_names 값을 1로 설정하면, 대소문자 구분 없이 테이블 이름을 처리할 수 있습니다.
    • 0 : 대소문자 구분                      (예: QRTZ_TRIGGERS != qrtz_triggers)
    • 1 : 대소문자 구분하지 않음       (예: QRTZ_TRIGGERS == qrtz_triggers)
  2. 테이블 이름 일관성 맞추기
    만약 lower_case_table_names 값을 변경할 수 없다면, 애플리케이션에서 사용하는 테이블 이름과 DB에서 저장된 테이블 이름을 일치시키는 작업이 필요합니다. 예를 들어, DB에 저장된 qrtz_triggers 테이블을 QRTZ_TRIGGERS로 변경하여 애플리케이션에서 대문자 테이블 이름을 사용하도록 할 수 있습니다.
 

+) MySQL의 lower_case_table_names 설정과 운영체제별 기본값 차이

lower_case_table_names은 운영체제에 따라 기본값이 다릅니다.

  • 0: 대소문자를 구분합니다. 운영체제가 대소문자를 구분하는 시스템에서 사용됩니다. Linux와 같은 시스템에서 사용됩니다.
  • 1: 대소문자를 구분하지 않습니다. 테이블 이름을 자동으로 소문자로 변환하고, 대소문자 구분 없이 처리합니다.  Windows, macOS에서 기본적으로 사용됩니다.
  • 2: 운영체제는 대소문자를 구분하지만, MySQL은 테이블 이름을 소문자로 저장합니다. 이는 macOS에서 사용되는 옵션입니다.

MySQL에서 lower_case_table_names 설정은 운영체제에 따라 기본값이 다르게 설정됩니다.

운영 체제 MySQL 기본 설정
Linux/Unix 0
Windows 1
macOS 1

 

 

 

728x90