일반적으로 MySQL 서버는 단 하나의 설정 파일을 사용하는데 윈도우는 my.ini라는 이름을 사용한다. 서버는 시작될 때만 이 설정 파일을 참조하는데 이 파일의 경로가 고정돼 있는 것은 아니다. 지정된 여러개의 디렉터리를 순차적으로 탐색하면서 처음 발견된 my.cnf 파일을 사용한다.
직접 MySQL 을 컴파일해서 설치한 경우 이 디렉터리가 다르게 설정될 수 있으므로 mysqld --verbose --help를 통해 확인할 수 있다.
mysqld 프로그램은 MySQL 서버의 실행 프로그램으로 서비스용으로 사용되는 서버에서 이미 MySQL 서버가 실행중인데 다시 mysqld 프로그램을 시작하지 않도록 주의해야한다. 따라서 위처럼 mysqld를 사용하지말고 mysql --help를 사용하도록 하자.
위에서 언급했듯이 MySQL은 단 하나의 설정 파일만 사용하나 설정 파일이 위치한 디렉터리는 여러 곳일 수 있다. 그래서 만약 1번과 2번 디렉터리에 설정 파일을 만들었다면 MySQL 서버가 어느 디렉터리의 설정파일을 참조했는지 모르므로 mysql --help를 통해 디렉터리의 우선순위를 확인해야한다.
설정파일은 보통 1번이나 2번을 사용하는데 하나의 장비에 2개 이상의 서버를 실행하면 충돌할 수 있어 별도 디렉터리에 설정 파일을 준비하고 MySQL 시작 스크립트 내용을 변경해야한다. 하지만 이렇게 사용하는 곳은 흔치 않다.
설정 파일은 하나의 설정 파일에 여러 개의 설정 그룹을 담을 수 있고 대체로 실행 프로그램 이름을 그룹명으로 사용한다.
MySQL 서버는 기동하면서 설정 파일의 내용을 읽어 메모리나 작동 방식을 초기화하고, 접속된 사용자를 제어 하기 위해 이러한 값을 별도로 저장하는데 이러한 저장값을 시스템 변수라고 한다. SHOW VARIABLES나 SHOW GLOBAL VARIABLES를 통해 확인할 수 있다.
시스템 변수가 가지는 5가지 속성과 의미는 아래와 같다.
MySQL 서버의 시스템 변수는 서버가 기동 중인 상태에서 변경 가능한지에 따라 동적 변수와 정적 변수로 구분된다. 디스크에 저장돼 있는 설정 파일을 변경하는 경우와 이미 가동중인 서버의 메모리에 있는 서버의 시스템 변수를 변경하는 경우로 구분할 수 있다.
디스크에 저장된 설정 파일의 내용은 변경하더라도 서버가 재시작하기 전엔 적용되지 않는다. 하지만 set 명령을 이용해 값을 파꿀 수 있다.
하지만 SET 명령을 통해 변경되는 시스템 변숫값이 설정파일에 반영되는 것은 아니므로 현재 기동중인 인스턴스에서만 유효하다. 서버가 재시작되면 이SET으로 변경한 시스템 변수값이 설정파일의 값으로 초기화되기 때문에 설정을 영구히 적용하고 싶다면 설정파일을 변경해야한다.
8.0부터는 SET PERSIST를 통해 실행중인 서버의 시스템 변수를 변경하고, 동시에 자동으로 설정 파일로도 기옥된다. SHOW나 SET에서 GLOBAL을 사용하면 글로벌 시스템 변수의 목록과 내용을 읽고 변경할 수 있고, GLOBAL을 빼면 자동으로 세션변수를 조회하고 변경한다.
일반적으로 글로벌 시스템 변수는 서버 기동중 변경할 수 없는게 많다. 하지만 변경할 수 있는 것도 있다. 동적 변수라면 설정파일 변경후 재시작하지 않고, SET으로 간단히 변수값을 변경할 수 있다.
SET - > 설정 파일엔 변경내용 기록되지 않음
SET PERSIST -> 설정 파일말고 별도의 파일에 기록
Both인 경우 글로벌 시스템 변수의 값을 변경해도 이미 존재하는 커넥션의 세션 변숫값은 변경되지 않고 그대로 유지된다. 동적인 변수만 가능하다.
동적 변수는 서버에서 SET GLOBAL로 변경하면 즉시 서버에 반영된다. 하지만 이는 설정 파일에 저장되지 않아 따로 수정해야하는데, 실수로 잊어버릴 때가 있다. 이러면 재시작시에 변경 되지 않은 설정파일을 참조해 장애가 생긴다.
따라서 SET PERSIST를 사용해 시스템 변수를 변경하면 서버는 변경된 값을 즉시 적용하고 동시에 별도의 설정 파일(mysqld-auto.cnf)에 추가로 기록한다. 그러면 서버가 재시작할 때 설정 파일(my.cnf)와 위의 설정 파일(mysqld-auto.cnf)를 같이 참조해 시스템 변수를 적용한다.
SET PERSIST는 세션 변수에는 적용되지 않고 SET PERSIST로 변경하려고 하면 서버는 자동으로 GLOBAL시스템 변수의 변경으로 인식하고 변경한다.
현재 서버에는 변경내용을 적용하지 않고 재시작싯에 변경하고 싶다면 (mysqld-auto.cnf에만 저장) SET PERSIST_ONLY를 사용한다.
SET PERSIST_ONLY 명령은 정적인 변수의 값을 영구적으로 변경하고자 할 때 사용할 수 있다.
정적인 변수는 SET PERSIST를 통해 실행 중인 MySQL 서버에서 변경할 수 없으므로 mysqld-auto.cnf 파일에 기록해두고자 하면 SET PERSIST_ONLY 사용
그렇다면 정적인 변수에 그냥 SET PERSIST 씀ㄴ 안되나... . . . 아 에러남
SET PERSIST나 SET PERSIST_ONLY 사용하면 JSON 포맷의 mysqld-auto.cnf 파일 생성
mysqld-auto.cnf에는 변경된 시스템 변수의 이름과 설정값, 언제 누구에 의해 시스템 변수가 변경되었는지
SET PERSIST나 SET PERSIST_ONLY를 사용해서 변경한 시스템 변수의 내용을 삭제하고 싶을 때가 있다.
이럴 때 mysqld-auto.cnf를 직접 건드리다가 오류가 나면 서버가 실행되지 않을 수 있다.
따라서 RESET PERSIST를 사용하도록 하자.