Post

[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) 가 되어야 합니다. 따라서 다음과 같은 절차를 권장합니다.

  1. 테스트/점검 중이면 SET GLOBAL 또는 SET SESSION 으로 일시적으로 값을 조정합니다.
  2. 운영에 반영하기로 결정되면 SET PERSIST 를 실행해 mysqld-auto.cnf 를 업데이트합니다.
  3. 마지막으로 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;

운용 시나리오

  1. 동시 접속 급증 대응
    SET GLOBAL 로 즉시 값을 올리고 동일 값을 SET PERSIST 로 저장해 재시작 시 일관성 확보.
  2. 장기 점검용 임시 변경
    세션 범위(SET SESSION)로만 조정하면 다른 커넥션에 영향 없이 실험 가능.
  3. 정적 변수 교체 준비
    SET PERSIST_ONLY 로 값을 예약해 두고 점검 창에 재시작 → 사람이 설정 파일을 직접 편집하는 수고를 줄임.

기억할 것

  • 글로벌 값은 “템플릿”, 세션 값은 “실제 사용본”이다. 템플릿을 바꿔도 기존 사본은 그대로 남는다.
  • dynamic 이라고 표시돼야 재시작 없는 변경이 가능하다.
  • mysqld-auto.cnf 는 수동 편집보다 SET PERSIST/RESET PERSIST 로만 관리해 일관성을 유지한다.
  • 영구 적용 = SET PERSIST + my.cnf 정리 라는 공식을 잊지 않는다. 런타임 변경과 설정 파일이 서로 다른 값을 가지면 재부팅 순간 구성이 되돌아가거나, 장애 시 원인 분석이 어려워진다.
This post is licensed under CC BY 4.0 by the author.