본문 바로가기
DataBase

[MySQL] MySQL 서버 이관시 대소문자 구분에 따른 주의점

by izen8 2013. 7. 25.
반응형

MySQL 서버 이관시 대소문자 구분에 따른 주의점

MySQL 서버는 리눅스와 윈도우에서 각각 대소문자 구분 정책이 다르다.
리눅스에서는 대소문자를 구분하고, 윈도우에서는 구분하지 않는다.
 
이것을 수동으로 바꿔주기 위해서는
 
show variables like 'lower_case_table_names%'
 
위의 쿼리로 현재 값이 어떤지 확인한 후 /etc/my.cnf 파일을 아래와 같이 수정하하고 DB 서버를 재 시작해주면 된다.
 
# ↓ 일반적으로 이 부분은 미리 작성되어있다.
[mysqld]
# ↓  이 부분을 추가해 주어야 한다.
lower_case_table_names=1
 
 
0 : 대소문자를 구분함(default)
1 :  대소문자를 구분안함(대문자로 쓴 쿼리도 소문자로 변경해서 날린다)
2 : 윈도우에서도 대소문자를 구분함
 
오늘 발생한 문제는 기존 서버는 윈도우, 새로 이관한 서버는 리눅스인 상태에서 대소문자 구분 정책 때문에 쿼리 문법이 잘못되었다는 에러가 발생한 것.애초에 테이블/컬럼 모두 소문자로 작성된 상태에서 하이버네이트가 생성해주는 쿼리가 자동으로 대문자로 생성이 되서 날라가기 때문에 생긴 문제였다. 즉, 아래 두개의 쿼리가 전혀 다른 쿼리로 인식이 된다.
 
SELECT * FROM CODE; --하이버네이트를 통해서 요청된 쿼리(ERROR)
SELECT * FROM code; --실제 정상적으로 작동하는 쿼리
 
결국 두 가지 해결책이 있었는데
1. 기존 스키마를 생성하는 SQL 스크립트가 모두 소문자로 작성이 되어있기 때문에 lower_case_table_names 값을 1로 설정한다. 이렇게 되면 아무리 대문자로 작성된 쿼리라도 모두 소문자로 변경을 한 후 DB에 요청된다.
2. 테이블명을 전부 대문자로 바꾼다. 이 방법은 하이버네이트에서 Criteria를 통해 생성되는 쿼리가 기본적으로 대문자이기 때문에 이 것을 기준으로 조치하는 방법인데, 이번 장애에 대해서 결과적으로는 이 방법을 사용했다.
 

 

반응형

댓글