MySQL 변수의 특징
2024년 2월 11일 작성
Mysql 서버는 기동하면서 설정 파일의 내용을 읽어 메모리나 작동 방식을 초기화한다. 그리고 접속된 사용자를 제어하기 위해 이러한 값을 별도로 저장해둔다 -> check
MySQL 서버에서는 이렇게 저장된 값을 시스템 변수라고 한다. 각 시스템 변수는 SHOW VARIABLES
또는 SHOW GLOBAL VARIABLES
라는 커맨드로 확인할 수 있다.
해보니, 스크롤을 몇번 내릴 정도로 항목들이 엄청 많았다.
시스템 변수 설정 값이 어떻게 MySQL 서버와 클라이언트에 영향을 미치는지 판단(예측)하기 위해서는 각 변수가 글로벌 변수인지 세션변수인지 구분할 수 있어야한다. 해당 변수가 어떤 변수인지 확인하기 위해서는 MySQL 에서 정의한 시스템변수의 목록을 확인해볼 수 있다.
글로벌 변수와 세션 변수
MySQL의 시스템 변수는 적용 버위에 따라 글로벌과 세션으로 나뉘는 것이다. 일반적으로 세션별로 적용되는 변수의 경우 글로벌, 세션 변숭 동시에 존재한다. -> 이런 경우 레퍼런스의 Var Scope에 Both 라고 표기된다.
만약 스코프가 Session 이라고 명시된 시스템 변수는, 설정파일에서 초깃값을 명시할 수 없으며, 커넥션이 만들어지는 순간부터 해당 커넥션에서만 유효한 설정변수이다.
정적변수와 동적변수
MySQL 서버의 시스템 변수는 서버가 기동 중인 상태에서 변경할 수 있는지
에 따라 정적변수/동적변수로 구분된다.
MySQL 서버의 시스템 변수를 변경하는 경우는 다음으로 구분할 수 있다.
- 디스크에 저장돼있는 설정 파일을 변경하는 경우
- 이미 기동중인 MySQL 서버의 메모리에 있는 MySQL 서버의 시스템 변수를 변경하는 경우
전자의 경우 내용을 변경해도, 서버를 재시작하기 전에는 적용되지 않는다.
하지만 SHOW
명령으로 현재 변수값을 확인하거나 후자와 같이 SET
명령을 이용해 바꿀 수 있다.
변수명을 정확히 모르면 패턴검색을 하는 것도 가능하다.
하지만 이렇게 커맨드로 설정하는 경우 설정파일에는 적용되지 않기 때문에 현재 기동중인 MySQL 서버 인스턴스에만 유효하다.
오 그런데, MySQL 8.0부터는 SET PERSIST
명령을 이용해서 실행중인 서버의 시스템변수를 변경하면서 설정파일로도 기록할 수 있는 기능이 있다고 한다.
결론적으로 실행중인 서버에서 커맨드로도 설정파일까지 적용할 수 있다.
동적 글로벌 시스템 변수
일반적으로 글로벌 시스템변수는 기동중에 변경 후 바로 적용되는 것이 많지 않다. (적용은 설정파일에 쓰는 것과 별개) 하지만 실시간으로 적용할 수 있는 것도 있다.
my.cnf
설정 파일을 변경할 때 서버를 재시작하는 수고가 드는데, 만약 변경하고자 하는 변수가 동적변수라면 그럴 필요가 없어지는 것이다.
만약 변경하고자 하는 동적변수의 스코프가 Both(글로벌 & 세션) 일 때 이럴 때는 SET 커맨드로 값 변경 시 GLOBAL 을 명시하면, 세션은 적용되지 않는다고 한다. 당연히 GLOBAL 을 명시하지 않으면 세션에만 적용된다.
이 실습은 책에 나오지 않아서 기록.
SET PERSIST
MySQL 서버의 시스템변수는 동적 변수와 정적 변수로 구분된다고 했었다.
동적변수의 경우 SET GLOBAL
명령으로 변경하면 즉시 서버에 반영된다.
예를 들어 max_connection
시스템 변수는 동적 변수이기 때문에
만약 해당 서버의 최대 연결 가능 커넥션의 개수를 즉시 늘리기 위해서 다음 커맨드를 사용할 수 있다.
그런데, 이렇게 변경한 후 설정 파일에도 적용이 되길 기대한다면 문제가 될 수 있다. 응급 조치를 하다보면 이렇게 기동 중에 적용한 값을 미처 설정파일에 적용하지 못할 때가 있다.
이런 경우 서버가 재시동되면 이전 값으로(설정파일의 값)으로 돌아가게 되고, 다시 장애가 발생하게 된다.
이런 문제를 보완하기 위해 MySQL 8.0부터 SET PERSIST
명령이 생겼다고 한다.
SET PERSIST
명령으로 변경한 변수는my.cnf
가 아닌mysqld-auto.cnf
에 기록된다. 서버가 다시 시작될 때, 이 파일도 참조해서 시스템 변수를 적용하게 되는 것이다.
SET PERSIST_ONLY
만약 현제 세션에서는 변수를 변경하고 싶지 않다면 SET PERSIST_ONLY
를 사용하면 된다.
my.cnf
MySQL의 시스템 변수는 대략 570개 정도이며, 사용하는 플러그인이나 컴포넌트에 따라 더 늘어날 수도 있다고 한다. 이 책에서는 중요한 것만을 다루겠지만 변수마다 자세히 다룰 것이니 참고.