요약
- 서버 설정 파일 (my.cnf) 의 존재와 MySQL 서버 시작 시 해당 파일을 참조하는 디렉터리를 찾는 다는 사실을 알게됨
- 우선 순위에 따라 설정파일의 디렉터리를 찾는다.
- 설정 파일 내에서 그룹을 프로그램별로 나눈다는 사실을 알게 됨.
- MySQL 기동시 필요한 시스템 변수를 알게됨
- 시스템 변수를 정적, 동적 변수로 구분하여 언제 변수 값을 바꾸고 어떻게 바꾸는지 알게 됨.
- 각 시스템 변수에 대한 이해가 어느 정도는 있어야 MySQL 서버를 제대로 분석하고 트러블 슈팅하며 사용할 수 있다.
발췌
SET PERSIST 명령은 세션 변수에는 적용되지 않으며, SET PERSIST 명령으로 시스템 변수를 변경하면 MySQL 서버는 자동으로 GLOBAL 시스템 변수의 변경으로 인식하고 변경한다.
메모
서버 설정
- 일반적으로 MySQL 서버는 단 하나의 설정 파일을 사용함.
- 리눅스 포함 유닉스 계열 :
my.cnf
- 윈도우 계열 :
my.ini
- MySQL 서버 시작 시 위 설정 파일을 참조함.
- 설정 파일 경로가 고정돼 있지 않음.
- 여러개의 디렉터리를 순차적으로 탐색하면서 처음 발견된 my.cnf 파일을 사용함.
mysqld --verbose --help
옵션으로 my.cnf 파일이 어느 디렉터리에서 실행되는지 확인할 수 있다.
- mysqld 프로그램 사용 시, 이미 MySQL 서버가 실행 중일 경우 다시 시작시킬 수 있으므로 주의해야 함.
- 가능하면 mysql 클라이언트 프로그램으로 확인해 보는게 좋다.
- 위 명령어를 실행하면 my.cnf 파일을 어디에서 참조하는지 디렉터리가 여러개 뜰 수 있다.
- 1)
/etc/my.cnf
- 2)
/etc/mysql/my.cnf
- 3)
/usr/etc/my.cnf
- 4)
~/.my.cnf
- 실제로 MySQL 서버는 단 하나의 설정 파일 (my.cnf) 를 사용하지만, 설정 파일이 위치한 디렉터리는 여러곳일 수 있다.
- 1,2,4 는 어느 MySQL 에서나 동일하게 검색하는 경로임
- 3은 컴파일될 때 MySQL 프로그램에 내장된 경로임.
- → 1 ~ 4 순서로 MySQL 서버가 우선순위대로 my.cnf 의 디렉터리를 찾아 읽는다.
- 하나의 장비에 2개 이상의 MySQL 서버를 실행하는 경우에 설정 파일 충돌이 발생할 수 있음
- 별도 디렉터리에 설정 파일을 준비하고 MySQL 시작 스크립트의 내용을 변경하는 방법을 사용하면 된다.
- 하지만 하나의 서버에 2개 이상의 MySQL 서버를 실행하는 형태는 흔하지 않음.
설정 파일의 구성
- my.cnf 파일에 여러 개의 설정 그룹을 담을 수 있다.
- 대체로 실행 프로그램 이름을 그룹명으로 사용한다.
- ex) mysqldump 프로그램 → [mysqldump], mysqld 프로그램 → [mysqld]
[mysqld_safe]
malloc-lib = /opt/lib/libtcmalloc_minimal.so
[mysqld]
socket = /usr/local/mysql/tmp/mysql.sock
port = 3306
[mysql]
default-character-set = utf8mb4
socket = /usr/local/mysql/tmp/mysql.sock
port = 3304
[mysqldump]
default-character-set = utf8mb4
socket = /usr/local/mysql/tmp/mysql.sock
port = 3305
- MySQL 서버를 위한 설정 → [mysqld]
- MySQL 클라이언트 설정 → [mysql]
- 백업 설정 → [mysqldump]
- MySQL 서버 (mysqld) 프로그램은 3306 포트를 사용
- 클라이언트 (mysql) 프로그램은 3304 포트를 이용하여 서버에 접속함
MySQL 시스템 변수의 특징
- MySQL 서버 기동 시 설정파일을 읽어 메모리 작동 방식을 초기화 하거나 접속된 사용자를 제어하기 위한 값을 별도로 정장한다.
- 시스템 변수(System Variables) 라고 한다.
SHOW VARIABLES
or SHOW GLOBAL VARIABLES
명령으로 시스템 변수를 확인할 수 있다.
- 시스템 변수가 MySQL 서버와 클라이언트에 어떤 영향을 미치는지 판단하기 위해서는 각 변수가
글로벌 변수
인지 세션 변수
인지 구분해야함.
- 시스템 변수는 5가지 속성을 가진다.
- Cmd-Line
- MySQL 서버의 명령행 인자로 설정될 수 있는지 여부
- Option file
- System Var
- 시스템 변수인지 아닌지 나타냄.
- 8.0 부터 시스템 변수에 언더스코어(’_’)로 통일해 나가고 있음.
- 명령행 인자에서는 언더 스코어가 아닌 dash (’-’) 를 구분자로 사용
- Var Scope
- Dynamic
- 시스템 변수가 동적인지 정적인지 구분하는 변수
글로벌 변수와 세션 변수
- MySQL 시스템 변수를
글로벌 변수
와 세션 변수
로 나눌 수 있다.
- 글로벌 범위
- MySQL 서버 인스턴스에 전체적으로 영향을 미치는 시스템 변수
- 주로 MySQL 서버 자체에 관련된 설정일 때가 많음.
- ex) InnoDB 버퍼풀 크기 (
innodb_buffer_pool_size
) ← MySQL 서버에서 단 하나만 존재함, MyISAM 의 키 캐시 크기 (key_buffer_size
) 등이 대표적인 글로벌 영역 시스템 변수임.
- 세션 범위
- MySQL 클라이언트가 MySQL 서버에 접속할 때, 기본으로 부여하는 옵션의 기본값을 제어할 때 사용
- 클라이언트의 필요에 따라 개별 커넥션 단위로 다른 값으로 변경할 수 있는게 세션 변수 이다.
- ex) 클라이언트 별 자동 커밋 수행 여부 결정하는 변수 (
autocommit
)가 대표적인 세션 시스템 변수임.
- 한번 연결된 커넥션의 세션 변수는 서버에서 강제로 변경할 수 없음.
정적 변수와 동적 변수
- MySQL 서버가 기동 중인 상태에서 변경 가능한지에 따른 시스템 변수
- my.cnf 와 같이 디스크에 저장된 설정 파일의 변경을 통해 시스템 변수를 변경할 수 있다. → 정적 변수
- 혹은 이미 기동 중인 MySQL 서버의 메모리에 있는 시스템 변수를 변경할 수 있다. (set 명령어) → 동적 변수
- set 명령을 통해 변경되는 시스템 변수 값은 MySQL 설정 파일 (my.cnf) 파일이 변경 되는 것은 아니므로 현재 기동 중인 MySQL 인스턴스에서만 유효하다.
- 8.0 부터는
SET PERSIST
명령을 사용하면 실행 중인 MySQL 서버의 시스템 변수를 변경함과 동시에 설정 파일에도 자동으로 등록된다.
- 시스템 변수가 ‘Both’ 인 경우 글로벌 시스템 변수의 값을 변경 해도 이미 존재하는 커넥션의 세션 변숫값은 변경되지 않고 그대로 유지된다.
- 글로벌 변수는 변경되지만, 현재 커넥션의 세션 변수는 변경되지 않은 값을 그대로 유지하고 있는다.
SET PERSIST
- 동적 변수의 경우
SET GLOBAL
명령으로 변경 시, 즉시 MySQL 서버에 반영 됨.
- 이렇게 변경한 후, MySQL 서버의 설정 파일에도 이 내용을 적용해야 함.
- 깜빡할 수 있음..
- MySQL 서버 재 시작시 이전의 시스템 변수로 돌아가기 때문에 이전과 똑같은 장애가 발생할 수 있게 됨.
- 8.0 에서는 이러한 문제점을 보완하기 위한
SET PERSIST
명령을 도입함.
- SET PERSIST 명령을 사용하면 시스템 변수를 즉시 적용함과 동시에 설정 파일에 변경 내용을 추가로 기록해 둔다 (
mysqld-auto.cnf
에 기록됨). → 변경 내용을 수동으로 my.cnf 에 기록하지 않아도 자동으로 영구 변경 됨.
- 다시 MySQL 서버가 시작될 때 기본 설정파일 (my.cnf) 뿐만 아니라 자동 생성된 mysqld-auto.cnf 파일도 함께 참조하여 시스템 변수를 적용한다.
- SET PERSIST 명령은 세션 변수에 적용되지 않음. → MySQL 서버는 자동으로 GLOBAL 시스템 변수의 변경으로 인식함.
- 현재 실행중인 MySQL 서버에 변경 내용을 적용하지 않고 다음 재시작시에 변경 내용을 적용하려면
SET PERSIST_ONLY
명령을 사용한다.
- 위 명령으로 추가된 시스템 변수의 내용을 삭제해야할 수도 있음.
mysqld-auto.cnf
파일의 내용에 오류가 생기면 MySQL 서버 를 시작할 수 없으므로 삭제해야 함 → RESET PERSIST
명령을 사용하는 것이 안전함.
## 특정 시스템 변수만 삭제
mysqld> RESET PERSIST max_connections;
mysqld> RESET PERSIST IF EXISTS max_connections;
## mysqld-auto.cnf 파일의 모든 시스템 변수를 삭제
mysqld> RESET PERSIST;
my.cnf 파일
- 8.0 서버의 시스템 변수는 대략 570개 수준임.
- 플러그인, 컴포넌트에 따라 더 늘어날 수도 있음.
- MySQL 서버를 제대로 사용하려면 시스템 변수에 대한 이해가 상당히 많이 필요함.