본문 바로가기

Software Engineering/MySQL

[MySQL] 환경 설정 파일로 sql_mode 변경하기

실행 환경

  • Ubuntu 20.04
  • MySQL 8.0.3
  • bash

설정 파일 위치 확인

다음 명령을 실행하여 mysql이 설정 파일을 찾는 경로 우선순위를 확인한다.

# -A 1 옵션은 찾은 라인의 다음 줄 1개를 같이 출력하는 옵션
mysql --help | grep -A 1 "Default options"

 

아래와 같이 출력되면 순서대로 설정 파일이 적용된다. 가장 마지막에 읽은 설정이 최종적으로 적용된다.

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
  • /etc/my.cnf
  • /etc/mysql/my.cnf
  • ~/.my.cnf : 유저 홈 디렉토리의 설정이 가장 높은 우선 순위를 가짐

파일을 순서대로 찾아보면, 하나의 파일만 생성되어 있음을 알 수 있다. (사용자 환경에 따라 다를 수 있음)

$ ls /etc/my.cnf
ls: cannot access '/etc/my.cnf': No such file or directory
$ ls /etc/mysql/my.cnf
/etc/mysql/my.cnf
$ ls ~/.my.cnf
ls: cannot access '/home/username/.my.cnf': No such file or directory

 

이 경우는 /etc/mysql/my.cnf 파일을 수정한다. 해당 파일을 열어보면 아래와 같이 설정 파일을 추가하는 형식으로 되어 있다.

# 일반적으로 클라이언트 도구 설정을 포함
!includedir /etc/mysql/conf.d/

# 서버 설정을 포함
!includedir /etc/mysql/mysql.conf.d/

 

결론적으로 위 2개의 디렉토리 안에 있는 모든 .cnf 파일이 순서대로 적용 된다.

각 디렉토리에 위치한 파일은 이름 순서대로 적용되며, 이름 자체에 기능적 의미는 없다.

$ ls /etc/mysql/conf.d/
mysql.cnf  mysqldump.cnf
$ ls /etc/mysql/mysql.conf.d/
mysql.cnf  mysqld.cnf

 

mysqld.cnf 파일이 서버 설정 핵심파일이다. 이 파일의 내용을 수정하여 sql_model를 변경한다.

현재 설정 값 확인

mysqld.cnf 파일을 열어 [mysqld] 섹션에 sql_mode가 포함된 라인을 찾는다.

만약 없는 경우, 기본값을 사용하고 있을 수 있으니 cli 접속 후 현재 설정을 확인해야 한다.

mysql> select @@sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                            |
+-----------------------------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+

mysql> select @@global.sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                                     |
+-----------------------------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+

 

현재 설정 값을 복사하여 cnf 파일 편집 준비를 한다.

설정 파일 편집

/etc/mysql/mysql.conf.d/mysqld.cnf 파일을 열어 [mysqld] 섹션에서 sql_mode가 포함된 라인을 찾는다.

만약 없는 경우 현재 설정값을 포함하여 추가하면 된다.

이미 존재하는 경우 마지막에 콤마를 추가하고 ONLY_FULL_GROUP_BY 값을 추가한다.

[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY

 

mysql 서비스를 재시작 한다.

sudo systemctl restart mysql

 

다시 sql_mode를 조회하면 아래와 같이 옵션이 적용된 것을 확인할 수 있다.

mysql> select @@sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                            |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+

mysql> select @@global.sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                                     |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+