태그 보관물: MySQL

macOS 도커 데스크탑에서 MySQL 사용 시 Different lower_case_table_names 문제 해결 방법

macOS에서 도커 데스크탑 사용 시 성능이 떨어지는 가장 큰 원인은 디스크 I/O 이다.

이에 도커 데스크탑에서 개선된 파일 공유 방식으로 VirtioFS 선택이 가능하다.

Docker Desktop Choose file sharing implementation

그런데 만약 리눅스에서 가져온 MySQL data 파일들을 가지고 macOS에서 도커 컨테이너로 띄우는 경우 파일 공유 방식으로 VirtioFS 또는 gRPC FUSE 선택 시 MySQL 컨테이너 로그에는 다음과 같은 오류를 띄우며 실행이 안될 수 있다.

Different lower_case_table_names settings for server ('2') and data dictionary ('0')

먼저 MySQL의 lower_case_table_names 시스템 변수에 대해서 알아보면 다음과 같다.

  • 0 : 테이블 이름이 지정된 대로 저장되고 비교는 대/소문자를 구분합니다.
  • 1 : 테이블 이름이 디스크에 소문자로 저장되며 비교는 대소문자를 구분합니다.
  • 2 : 테이블 이름이 주어진 대로 저장됩니다. 그러나 소문자로 비교됩니다.

lower_case_table_names 설정은 대소문자를 구분하는 디스크 포맷인지 여부가 중요한데 macOS의 기본 디스크 포맷은 대소문자를 구분하지 않으므로 대소문자를 구분하는 lower_case_table_names = 0 설정으로 만들어진 MySQL 데이터 파일을 쓸 수 없다.

이 문제를 해결하는 방법중 하나는 MySQL data 파일을 그대로 사용하지 않고 mysqldump로 데이터를 내보낸 후 macOS의 MySQL 도커 컨테이너에서 복구하면 되는데 너무나 비효율적인 방법이다.

내가 추천하는 가장 편리한 방법은 대소문자 구분이 가능한 디스크 포맷으로 된 볼륨을 추가하는 것이다. macOS의 디스크 유틸리티에서 쉽게 볼륨을 추가할 수 있다. 이때 디스크 포맷 방식으로 APFS(대소문자 구분)을 선택하면 된다.

macOS Disk Utility Add a Volume

이렇게 새로 추가한 대소문자 구분 가능한 볼륨에 MySQL data 파일을 넣고 MySQL 도커 컨테이너를 실행하면 문제없이 실행된다.

앞으로 개발 프로젝트 파일은 대소문자 구분 가능한 볼륨에서 하거나 또는 대소문자 구분이 필요한 MySQL data 같은 파일만 넣어서 쓰기 편한 위치에 심볼릭 링크를 걸어서 사용하는 방식도 추천한다.