책너두 (Real MySQL 8.0 1권) 3일차 (~51p)

요약

  • 서버 설정 파일 (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 클라이언트 프로그램으로 확인해 보는게 좋다.
    • mysql --help
  • 위 명령어를 실행하면 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
      • my.cnf 로 제어할 수 있는지 여부
    • System Var
      • 시스템 변수인지 아닌지 나타냄.
      • 8.0 부터 시스템 변수에 언더스코어(’_’)로 통일해 나가고 있음.
      • 명령행 인자에서는 언더 스코어가 아닌 dash (’-’) 를 구분자로 사용
    • Var Scope
      • 시스템 변수의 적용 범위를 나타냄
        • global? session?
    • 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 서버를 제대로 사용하려면 시스템 변수에 대한 이해가 상당히 많이 필요함.

댓글

Designed by JB FACTORY