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.