Mac에서 MySQL 설치 후 my.cnf를 찾을 수 없을 때
내가 왜 my.cnf를 찾게 된 걸까? 프로젝트를 Local에서 build하고 테스트를 하는데 아래와 같은 에러가 발생했다.
Caused by: java.sql.SQLSyntaxErrorException:
Expression #1 of ORDER BY clause is not in GROUP BY clause
and contains nonaggregated column 'sample.p1_0.id'
which is not functionally dependent on columns in GROUP BY clause;
this is incompatible with sql_mode=only_full_group_by
sql_mode=only_full_group_by에 의해 생긴 에러이다. 나에게도 해당되는지 확인해보자. 아래 쿼리를 수행하면 only_full_group_by가 있는 것이 확인된다. 이걸 제거해야 한다.
> select @@sql_mode;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
세션 단위가 아닌 영구적인 제거를 하고 싶다. 이와 관련한 자료를 쉽게 찾을 수 있지만 내가 적용할 수 있는 사례를 찾을 수 없었다. my.cnf를 찾아서 수정하는 작업이 필요한데 자료에서 나오는 위치에 my.cnf를 찾을 수 없었다. 또한 자료에는 Homebrew를 통해 MySQL을 설치한 케이스가 많았지만 난 직접 MySQL을 다운로드받고 설치한 케이스여서 도움을 받을 수 없었다. 그 와중에 시스템설정에서 Configuration File을 선택하는 부분을 볼 수 있었다. 여기서 힌트를 얻었다.
위에서 언급된 Base Directory에 my.cnf를 만들어보자. 왜 만드냐. 없으니깐. 그럼 왜 이 위치에 만들까? mysql.server 소스를 열어보면 아래와 같은 코드를 볼 수 있다.
extra_args=""
if test -r "$basedir/my.cnf"
then
extra_args="-e $basedir/my.cnf"
fi
my.cnf가 basedir에서 획득하는걸 볼 수 있다. 여기서 힌트를 얻어서 Base Directory에 my.cnf를 생성하고 아래의 코드를 삽입했다. only_full_group_by를 제외한 sql_mode값이다.
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
이제 시스템설정에서 my.cnf를 선택하자. 아래 이미지를 보면 path가 다르다는 것을 볼 수 있는데 이는 mysql이라는 위치가 실제 directory가 아니라 가상본(일종의 바로가기)이기 때문이다. 선택을 완료한 후 아래 Apply 버튼을 클릭하는 것을 잊지말자.
위 이미지의 Instances 탭을 선택하고 MySQL을 Stop한 후 Start하자. 일종의 재시작이다. 그리고 다시 처음의 테스트를 시도해보면 문제없이 동작하는 것을 볼 수 있다. 또한 위에서 언급한 쿼리를 다시 실행시키면 only_full_group_by가 제거된 것을 볼 수 있다.
> select @@sql_mode;
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
끄읏