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를 통해 생성되는 쿼리가 기본적으로 대문자이기 때문에 이 것을 기준으로 조치하는 방법인데, 이번 장애에 대해서 결과적으로는 이 방법을 사용했다.
'DataBase' 카테고리의 다른 글
SQL(Structured Query Language) 정의와 종류(DML, DDL, DCL, TCL) (0) | 2014.08.26 |
---|---|
DB Trigger 란? (0) | 2014.02.09 |
[Oracle, MySql, MS-Sql] 간단하게 테이블, 컬럼 정보를 조회하는 쿼리 정리 (0) | 2013.07.25 |
[MDB] MDB 클라이언트 작업이 너무 많습니다 - 오류 (0) | 2013.06.11 |
SQLite 와 C++ 연동방법 (0) | 2012.07.25 |
댓글