[Real MySQL 8.0 (1권)] 2장 - 설치와 설정
Real MySQL 8.0 1권 2장에서 다루는 내용을 요약합니다.
2장에서 던지는 질문
- 시스템 변수는 왜 스코프를 두 단계(글로벌/세션)로 나눴을까?
- 서버를 재시작하지 않고도 바꿀 수 있는 설정과 그렇지 않은 설정은 무엇이 다를까?
- 재발행이 잦은 설정은 어떻게 안전하게 영구화할 수 있을까?
이 장은 위 질문에 답하기 위해 MySQL 8.0의 변수 체계, 동적 적용 전략, SET PERSIST 계열 명령을 입체적으로 정리합니다.
시스템 변수 스코프
MySQL은 모든 시스템 변수를 글로벌(Global) 과 세션(Session) 으로 이중화한다. 대부분의 변수는 Both 범위를 갖고, 서버가 기억하고 있던 글로벌 값을 신규 커넥션의 세션 기본값으로 복제합니다.
글로벌 변수
- 서버 인스턴스 전체에 하나만 존재한다. InnoDB 버퍼 풀 크기, MyISAM 키 캐시 등이 대표적입니다.
my.cnf(또는my.ini)에서 초기화하거나SET GLOBAL로 런타임 조정합니다.- 값을 바꾸면 이후에 생성되는 세션의 기본값이 달라지지만, 이미 연결된 세션에는 즉시 적용되지 않습니다.
세션 변수
- 각 커넥션이 독립적으로 보유한다.
autocommit,sql_mode등이 대표적입니다. - 별도 변경이 없다면 연결 당시의 글로벌 값이 그대로 복제됩니다.
- 필요 시
SET [SESSION] variable = value;형태로 커넥션 단위 튜닝이 가능합니다.
1
2
3
4
5
-- 모든 커넥션에 기본 autocommit=0 제공
SET GLOBAL autocommit = 0;
-- 특정 커넥션만 자동 커밋 허용
SET SESSION autocommit = 1;
정적 변수 vs 동적 변수
시스템 변수가 서버 가동 중 변경 가능한지 여부에 따라 동적/정적을 나눕니다.
- 정적 변수: 서버 시작 시
my.cnf에서만 초기화됩니다. 예)innodb_log_file_size, 일부buffer_pool_instances. 값을 바꾸면 재시작이 필요합니다. - 동적 변수: 실행 중
SET GLOBAL/SESSION으로 바꿀 수 있습니다. 예)max_connections,sort_buffer_size. Both범위를 가진 변수라도 이미 존재하는 세션의 값은 유지됩니다. 즉, 세션 값 수정을 자동으로 강제하지 않는다는 점이 핵심입니다.
정적/동적 여부는 SHOW GLOBAL VARIABLES LIKE '...'; 결과의 dynamic 컬럼 또는 매뉴얼에서 확인합니다.
my.cnf 와 런타임 설정의 불일치
런타임에서 SET GLOBAL 로 값을 바꿔 놓고 my.cnf 를 그대로 두면, 재시작 후 my.cnf 값이 다시 적용됩니다. 특히 클러스터나 반복 배포 환경에서는 설정 파일이 진실의 단일 소스(single source of truth) 가 되어야 합니다. 따라서 다음과 같은 절차를 권장합니다.
- 테스트/점검 중이면
SET GLOBAL또는SET SESSION으로 일시적으로 값을 조정합니다. - 운영에 반영하기로 결정되면
SET PERSIST를 실행해mysqld-auto.cnf를 업데이트합니다. - 마지막으로
my.cnf에도 동일 값을 기록해 코드/구성 관리 시스템과 동기화합니다.
1
2
3
4
5
6
7
8
9
# /etc/mysql/my.cnf 예시
[mysqld]
max_connections = 300
innodb_buffer_pool_size = 4G
innodb_flush_log_at_trx_commit = 1
default_authentication_plugin = caching_sha2_password
# 이벤트 스케줄러 활성화
event_scheduler = ON
위처럼 주요 항목을 명시해 두면, 긴급 재시작 후에도 동일한 구성이 유지되고, 설정 관리 도구(Ansible, Chef 등)와 비교도 쉬워집니다.
SET PERSIST 계열 명령
왜 도입됐을까?
기존 방식에서는 SET GLOBAL 로 런타임 값을 변경한 뒤 사람이 직접 my.cnf 를 수정해야 재시작 후에도 값이 유지됐습니다. 이 과정이 반복되면 “실제 서버 설정”과 “설정 파일”이 엇갈려 재부팅 시 예상치 못한 롤백이 발생합니다. 이러한 갭을 줄이려고 MySQL 8.0은 SET PERSIST 를 도입했습니다. 명령을 실행하면 서버 루트에 있는 mysqld-auto.cnf 에 변경 내용이 기록돼 재시작 후에도 자동으로 반영됩니다.
| 명령 | 목적 | 특징 |
|---|---|---|
SET PERSIST variable = value; | 런타임 반영 + 파일 기록 | GLOBAL 범위만 지원, 세션에는 영향 없음 |
SET PERSIST_ONLY variable = value; | 파일만 갱신, 즉시 반영 안 함 | 정적 변수도 안전하게 예약 |
RESET PERSIST [IF EXISTS] variable; | 특정 항목 제거 | 옵션이 없으면 전체 초기화 |
1
2
3
4
5
6
7
8
-- 현재 인스턴스에도 즉시 적용
SET PERSIST max_connections = 200;
-- 재시작 후에만 반영하고 싶을 때
SET PERSIST_ONLY innodb_buffer_pool_size = 4G;
-- 잘못 기록된 항목 되돌리기
RESET PERSIST IF EXISTS max_connections;
운용 시나리오
- 동시 접속 급증 대응
SET GLOBAL로 즉시 값을 올리고 동일 값을SET PERSIST로 저장해 재시작 시 일관성 확보. - 장기 점검용 임시 변경
세션 범위(SET SESSION)로만 조정하면 다른 커넥션에 영향 없이 실험 가능. - 정적 변수 교체 준비
SET PERSIST_ONLY로 값을 예약해 두고 점검 창에 재시작 → 사람이 설정 파일을 직접 편집하는 수고를 줄임.
기억할 것
- 글로벌 값은 “템플릿”, 세션 값은 “실제 사용본”이다. 템플릿을 바꿔도 기존 사본은 그대로 남는다.
dynamic이라고 표시돼야 재시작 없는 변경이 가능하다.mysqld-auto.cnf는 수동 편집보다SET PERSIST/RESET PERSIST로만 관리해 일관성을 유지한다.- 영구 적용 =
SET PERSIST+my.cnf정리 라는 공식을 잊지 않는다. 런타임 변경과 설정 파일이 서로 다른 값을 가지면 재부팅 순간 구성이 되돌아가거나, 장애 시 원인 분석이 어려워진다.
