시스템 변수 (글로벌, 세션)
시스템 변수는 MySQL 서버의 설정과 동작을 제어하는 변수들이다.
MySQL 서버는 이러한 값이 설정된 파일 my.cnf(또는 my.ini)을 읽어 작동 방식, 메모리, 성능, 보안 등을 초기화한다.
시스템 변수 값을 확인하려면 다음과 같이 MySQL 서버에서 조회할 수 있다.
SHOW VARIABLES;
시스템 변수(설정) 값이 어떻게 MySQL 서버와 클라이언트에 영향을 미치는지 판단하기 위해선
다음과 같이 글로벌, 세션 변수를 구분할 수 있어야한다.
- GLOBAL 변수 : MySQL 서버에서 단 하나의 값을 가지며, 시스템에 영향을 미치는 변수이다.
- SESSION 변수 : 각 세션에만 적용되는 값으로 커넥션 단위로 값을 변경할 수 있다.
이제 시스템 변수에 대해 알아보자.
시스템 변수는 아래 공식문서에서 확인할 수 있다.
https://dev.mysql.com/doc/refman/8.4/en/server-system-variables.html
아래 이미지는 해당 공식문서를 바탕으로 가져온 이미지이고, 우선 각 항목들이 무엇을 의미하는지 한번 알아보자.
Command-Line Format
MySQL 서버 시작 시 명령줄에서 사용할 수 있는 파라미터 형식
대괄호([])는 선택적 파라미터임을 의미합하며 위 예시의 경우 OFF나 ON 값을 설정할 수 있다는 뜻
System Variable
MySQL 내부에서 사용되는 실제 시스템 변수 이름
Scope
Global이면 글로벌 변수, Session이면 세션 변수를 뜻함
모든 범위를 뜻하면 Global, Session으로 표시
Dynamic
서버 실행 중에도 이 변수의 값을 변경할 수 있음을 의미
서버를 재시작하지 않고도 설정을 변경할 수 있다는 것
이와 관련해서는 동적, 정적 변수라고 칭한다.
- 정적 변수 : MySQL 서버가 실행 중일 때는 변경할 수 없는 변수
- 동적 변수 : MySQL 서버가 실행 중인 상태에서도 값을 변경할 수 있는 변수
SET_VAR Hint Applies
SQL 문에서 SET_VAR 힌트를 사용하여 이 변수의 값을 일시적으로 변경할 수 없음을 나타냄
YES일 경우 다음과 같이 SQL을 작성해 설정을 적용했을 때의 결과를 확인할 수 있다.
-- sort_buffer_size를 10MB로 설정하여 해당 쿼리만 실행
SELECT /*+ SET_VAR(sort_buffer_size = 10485760) */ *
FROM member
ORDER BY id;
해당 쿼리 실행 동안만 시스템 변수가 설정되고 쿼리 종료 후 원래 값으로 복원된다.
즉, 다른 세션이나 쿼리에는 영향을 주지 않는다.
Type
변수의 타입을 의미
Default Value
기본 설정 값을 의미
시스템 변수 설정하기
다음과 같이 SET 명령어를 사용해 시스템 변수를 변경할 수 있다.
-- 세션 변수 설정
SET VARIABLES {Command-Line Format}
-- 글로벌 변수 설정
SET GLOBAL VARIABLES {Command-Line Format}
참고로, SET은 동적 변수에만 적용할 수 있는 것이다.
만약 정적 변수의 값을 변경하고 싶다면 my.cnf(또는 my.ini) 파일을 수정하거나 mysql을 서버 시작할 때 파라미터를 전달하자.
SET PERSIST
동적 변수를 SET으로만 설정을 변경하면 설정 파일은 변경되지 않아 영구히 적용되지 않는다.
영구히 저장하고 싶다면 SET PERSIST 명령을 사용할 수 있는데
SET PERSIST 명령으로 시스템 변수를 변경하면 변경된 값을 즉시 적용함과 동시에
별도의 설정 파일(mysqld-auto.cnf)에 변경 내용을 추가로 기록한다.
그리고 MySQL 서버가 다시 시작되면 기본 설정 파일 my.cnf(또는 my.ini)과 자동 생성된 mysqld-auto.cnf 파일을 같이 참조해 시스템 변수를 적용한다.
즉, 실행 중인 MySQL 서버의 시스템 변수를 변경함과 동시에 설정 파일에도 적용할 수 있다.
참고로, SET PERSIST 명령은 세션 변수에는 적용되지 않으며
SET PERSIST 명령으로 시스템 변수를 변경하면 MySQL 서버는 GLOBAL 변수로 인식하고 변경한다.
만약 현재 실행 중인 MySQL 서버에는 변경 내용을 적용하지 않고 다음 재시작을 위해 mysqld-auto.cnf 파일에만 변경 내용을 기록하고 싶다면 SET PERSIST_ONLY 명령을 사용하자.
참고자료
- Real MySQL 8.0
'◼ CS 기초 지식 > [데이터베이스]' 카테고리의 다른 글
MySQL의 Lock 종류와 동작 방식을 파헤쳐 보자 (0) | 2024.12.01 |
---|---|
[MySQL 8.0] 사용자(계정) 및 권한 정복하기 (0) | 2024.11.13 |
[DB] 파티셔닝과 샤딩? 쉽게 알아가보자 (1) | 2024.11.11 |
[Redis] 캐싱(caching) 설계 전략에 대해 알아보자 (+TTL 설정 주의점) (0) | 2024.11.10 |
[MySQL] DB 레플리케이션에 대해 알아보자. (8) | 2024.11.09 |