테마
서버 설정과 시스템 변수
버퍼 크기·타임아웃처럼 MySQL 동작을 정하는 설정값을 시스템 변수(system variable)라 한다. 범위(글로벌·세션)와 변경(정적·동적)이라는 두 축, 그리고 값을 저장하는 my.cnf·PERSIST만 알면 된다.
두 축
글로벌(global) 값은 서버 전체에 적용되고, 새로 접속하는 커넥션이 물려받는 기본값이 된다. 세션(session) 값은 지금 내 커넥션에만 적용된다.
| 글로벌 | 세션 | |
|---|---|---|
| 의미 | 서버 전체·새 접속 기본값 | 내 커넥션 한정 |
| 조회 | @@GLOBAL.x | @@SESSION.x (@@x는 세션 우선) |
| 예 | max_connections | autocommit |
표의 max_connections는 최대 동시 접속 수다. autocommit은 문장 하나를 실행할 때마다 바로 확정할지 정하는 자동 커밋(autocommit) 스위치다.
정적(static) 변수는 서버를 재시작해야 바뀌고, 동적(dynamic) 변수는 실행 중에 SET으로 바로 바뀐다.
| 정적 | 동적 | |
|---|---|---|
| 변경 | 재시작 필요 | SET으로 즉시 |
| 예 | innodb_page_size | long_query_time |
innodb_page_size는 InnoDB 페이지(page) 크기를 정하는 변수로, MySQL이 처음 초기화될 때만 정할 수 있고 재시작으로도 바꿀 수 없다. long_query_time은 느린 쿼리로 기록할 기준 시간이다.
모든 변수가 두 범위를 다 갖지는 않는다. 세션 범위가 없는 변수를 세션 값으로 바꾸려 하면 에러가 난다. 반대로 세션 범위만 있어서 글로벌로 바꿀 수 없는 변수도 있다. SHOW VARIABLES는 세션 값을, SHOW GLOBAL VARIABLES는 글로벌 값을 보여 준다.
저장: my.cnf와 PERSIST
- my.cnf: MySQL이 시작할 때 읽는 설정 파일(옵션 파일, option file)이다. 리눅스에서는 보통
/etc/my.cnf나/etc/mysql/아래에 있다. 파일이라 재시작해도 남는다. 서버 설정은 서버 프로그램(mysqld)용인[mysqld]섹션에 적는다. - SET PERSIST: 글로벌 값을 즉시 바꾸고, 데이터 디렉터리(data directory)의 자동 옵션 파일
mysqld-auto.cnf에도 기록한다. 재시작 후 이 파일이 다시 적용된다. - SET PERSIST_ONLY: 실행 중 값은 건드리지 않고 다음 시작에 적용할 값만 기록한다. 시작할 때만 바꿀 수 있는 변수에 유용하다.
SET GLOBAL만 하면 재시작할 때 값이 날아간다. "바꿨는데 재시작하니 돌아왔다"의 원인이 이것이다.
sql
SET GLOBAL slow_query_log = ON; -- 지금만
SET PERSIST slow_query_log = ON; -- 재시작 후에도
RESET PERSIST slow_query_log; -- 저장값 제거(현재 값은 그대로)면접 포인트
- "GLOBAL과 SESSION의 차이?" → 서버 전체·새 접속 vs 내 커넥션.
- "재시작해도 남기려면?" → my.cnf 또는 SET PERSIST.
- "지금 값은 안 바꾸고 다음 시작부터라면?" → SET PERSIST_ONLY.
- "정적 변수의 예?" →
innodb_buffer_pool_instances·데이터 디렉터리(datadir). 페이지 크기(innodb_page_size)는 재시작으로도 못 바꾸고 초기화 때만 정한다. 버퍼 풀(buffer pool) 크기는 5.7부터 재시작 없이 동적 조정 가능.
