개발

MySQL 데이터 이관시 테이블명 대소문자 구분

에드몽단테스 2017. 10. 25. 10:14

개발환경에서 운영환경으로 전환하기 위해 MySQL 데이터를 덤프받아 운영서버에 복원을 해야 했다.

서버에서 MySQL 명령어를 이용할 수도 있지만, 편리를 위해 윈도우에서 툴을 이용하기로 했다.

서버는 둘다 모두 리눅스(Centos.6.8)이다.


테이블과 데이터는 모두 이관되었고 뷰는 약간 문제가 있었지만, 직접 수정하여 완료하였다.

운영서버에서 테스트를 진행하는데 뭔가 이상하다.

테이블은 존재하는데 존재하지 않는다고 메세지가 뜨는 것이다.

원인은 테이블명의 대소문자 구분이었다.

리눅스에서는 대소문자를 가리지만, 윈도우에서 작업했기 때문에 대소문자를 크게 신경쓰지 않아서 생긴 문제가 아닐까 생각했다.


우선 MySQL의 테이블명을 수동으로 모두 대문자를 바꿨다. 처음에는 잘 되는 듯 했다. 하지만 중간에 다시 문제가 발생.

이번에는 쿼리에 테이블 명을 소문자로 표시가 되서 생긴 문제였다.

즉, DB의 테이블 명은 모두 대문자로 변경했지만, 쿼리에는 대소문자가 섞여 있는 것이었다.

쿼리를 모두 찾아 수정해야했지만, 중간에 테이블명의 대소문자를 구분하지 않는 옵션이 있다는 것을 알았다.


show variables like 'lower_case_table_names';


위 쿼리를 실행시켰을 때 1이 나오면 대소문자를 구분하지 않고 0이 나오면 대소문자를 구분한다.

물론 위 설명은 정확한 것이 아니다. 옵션에 2도 있으며 쉽게 설명한 것이다.



나는 0이었다. 위 이미지는 변경한 후 이미지이다.(현재는 1이다)

그래서 my.cnf에서 값을 변경하고 서버를 재기동했다.


[mysqld] 에 lower_case_table_names = 1을 넣어준다.


그리고 서버 재시작.


하지만 결과는 마찬가지였다.

설정을 1로 변경하여 추가했지만, 여전히 대소문자는 구분했다.


그런데 옵션 확인중에 저 옵션은 옵션이 설정된 이후에 추가된 데이터에 대해서만 적용된다고 했다. 설정을 했더라도 기존의 데이터는 여전히 대소문자를 구분한다는 것이다.

그래서 설정을 1로 변경한 상태에서 기존데이터는 모두 지우고 다시 데이터를 넣었다. 그랬더니 대소문자를 구분하지 않고 잘 되었다.


lower_case_table_names 값이 0이든 1이든 처음 시작할 때는 상관이 없다.

그런데 데이터 이관할 때는 대소문자의 영향을 받는다. 그래서 MySQL이관시에는 이관할 서버에 lower_case_table_names 값을 1로 설정한 후 데이터를 이관해야 이관시 소요되는 에너지의 낭비를 막을 수 있다.


반응형