설치와 설정

뚝딱이·2022년 12월 28일
0

Real MySQL 8.0 1

목록 보기
1/1

서버 설정

일반적으로 MySQL 서버는 단 하나의 설정 파일을 사용하는데 윈도우는 my.ini라는 이름을 사용한다. 서버는 시작될 때만 이 설정 파일을 참조하는데 이 파일의 경로가 고정돼 있는 것은 아니다. 지정된 여러개의 디렉터리를 순차적으로 탐색하면서 처음 발견된 my.cnf 파일을 사용한다.

직접 MySQL 을 컴파일해서 설치한 경우 이 디렉터리가 다르게 설정될 수 있으므로 mysqld --verbose --help를 통해 확인할 수 있다.

mysqld 프로그램은 MySQL 서버의 실행 프로그램으로 서비스용으로 사용되는 서버에서 이미 MySQL 서버가 실행중인데 다시 mysqld 프로그램을 시작하지 않도록 주의해야한다. 따라서 위처럼 mysqld를 사용하지말고 mysql --help를 사용하도록 하자.

위에서 언급했듯이 MySQL은 단 하나의 설정 파일만 사용하나 설정 파일이 위치한 디렉터리는 여러 곳일 수 있다. 그래서 만약 1번과 2번 디렉터리에 설정 파일을 만들었다면 MySQL 서버가 어느 디렉터리의 설정파일을 참조했는지 모르므로 mysql --help를 통해 디렉터리의 우선순위를 확인해야한다.

설정파일은 보통 1번이나 2번을 사용하는데 하나의 장비에 2개 이상의 서버를 실행하면 충돌할 수 있어 별도 디렉터리에 설정 파일을 준비하고 MySQL 시작 스크립트 내용을 변경해야한다. 하지만 이렇게 사용하는 곳은 흔치 않다.

설정 파일의 구성

설정 파일은 하나의 설정 파일에 여러 개의 설정 그룹을 담을 수 있고 대체로 실행 프로그램 이름을 그룹명으로 사용한다.

MySQL 시스템 변수의 특징

MySQL 서버는 기동하면서 설정 파일의 내용을 읽어 메모리나 작동 방식을 초기화하고, 접속된 사용자를 제어 하기 위해 이러한 값을 별도로 저장하는데 이러한 저장값을 시스템 변수라고 한다. SHOW VARIABLES나 SHOW GLOBAL VARIABLES를 통해 확인할 수 있다.

시스템 변수가 가지는 5가지 속성과 의미는 아래와 같다.

  • Cmd-Line : MySQL 서버의 명령행 인자로 설정될 수 있는지 여부 (Yes : 명령행 인자로 이 시스템 변수의 값 변경 가능)
  • Option file : MySQL의 설정파일(my.cnf 또는 my.ini)로 제어할 수 있는지 여부, 옵션 파일이나 설정 파일 또는 컨피규레이션 파일등은 전부 my.cnf(또는 my.ini) 파일을 지칭하는 것으로 같은 의미로 사용된다.
  • System Var : 시스템 변수인지 아닌지를 나타낸다. 변수명의 일관성이 없으므로 하이픈이나, 언더스코어의 구분에 주의해야한다.
  • Var Scope : 시스템 변수의 적용 범위를 나타낸다. Global(서버 전체)인지, Session(또는 커넥션으로 서버와 클라이언트 간의 커넥션)인지 구분한다. 세션과 글로벌 둘 다(Both, 일반적으로 세션별로 적용되는 시스템 변수의 경우) 적용되기도 한다.
  • Dynamic : 시스템 변수가 동적인지 정적인지 구분하는 변수이다.

글로벌 변수와 세션 변수

  • 글로벌 범위의 시스템 변수는 하나의 MySQL 서버 인스턴스에서 전체적으로 영향을 미치는 시스테 ㅁ변수를 의미하며, 주로 MySQL 서버 자체에 관련된 설정일 때가 많음 (EX. innodb_buffer_pool_size)
  • 세션 범위의 시스템 변수는 MySQL 클라이언트가 서버에 접속할 때 기본으로 부여하는 옵션의 기본값을 제어하는데 사용된다. 각 클라이언트가 처음에 접속하면 기본적으로 부여하는 기본값을 가지고 있는데, 이 값을 변경하지 않으면 유지 되지만, 클라이언트의 필요에 따라 개별 커넥션 단위로 다른 값으로 변경할 수 있는게 세션 변수다. 기본값은 글로벌 시스템 변수이며, 각 클라이언트가 가지는 값이 세션 시스템 변수다.
  • 세션 범위의 시스템 변수 가운데 MySQL 서버의 설정파일에 명시해 초기화할 수 있는 변수는 대부분 범위가 Both라고 명시돼있다. 이 시스템 변수는 서버가 기억만 하고 있다가 클라이언트와 커넥션이 생성되는 순간 해당 커넥션의 기본값으로 사용된다. 순수 세션 시스템 변수는 서버의 설정 파일에 초깃값을 명시할 수 없으며 커넥션이 만들어지는 순간 부터 해당 커넥션에서만 유효한 설정 변수를 의미한다.

정적 변수와 동적 변수

MySQL 서버의 시스템 변수는 서버가 기동 중인 상태에서 변경 가능한지에 따라 동적 변수와 정적 변수로 구분된다. 디스크에 저장돼 있는 설정 파일을 변경하는 경우와 이미 가동중인 서버의 메모리에 있는 서버의 시스템 변수를 변경하는 경우로 구분할 수 있다.

디스크에 저장된 설정 파일의 내용은 변경하더라도 서버가 재시작하기 전엔 적용되지 않는다. 하지만 set 명령을 이용해 값을 파꿀 수 있다.

하지만 SET 명령을 통해 변경되는 시스템 변숫값이 설정파일에 반영되는 것은 아니므로 현재 기동중인 인스턴스에서만 유효하다. 서버가 재시작되면 이SET으로 변경한 시스템 변수값이 설정파일의 값으로 초기화되기 때문에 설정을 영구히 적용하고 싶다면 설정파일을 변경해야한다.

8.0부터는 SET PERSIST를 통해 실행중인 서버의 시스템 변수를 변경하고, 동시에 자동으로 설정 파일로도 기옥된다. SHOW나 SET에서 GLOBAL을 사용하면 글로벌 시스템 변수의 목록과 내용을 읽고 변경할 수 있고, GLOBAL을 빼면 자동으로 세션변수를 조회하고 변경한다.

일반적으로 글로벌 시스템 변수는 서버 기동중 변경할 수 없는게 많다. 하지만 변경할 수 있는 것도 있다. 동적 변수라면 설정파일 변경후 재시작하지 않고, SET으로 간단히 변수값을 변경할 수 있다.

SET - > 설정 파일엔 변경내용 기록되지 않음
SET PERSIST -> 설정 파일말고 별도의 파일에 기록

Both인 경우 글로벌 시스템 변수의 값을 변경해도 이미 존재하는 커넥션의 세션 변숫값은 변경되지 않고 그대로 유지된다. 동적인 변수만 가능하다.

SET PERSIST

동적 변수는 서버에서 SET GLOBAL로 변경하면 즉시 서버에 반영된다. 하지만 이는 설정 파일에 저장되지 않아 따로 수정해야하는데, 실수로 잊어버릴 때가 있다. 이러면 재시작시에 변경 되지 않은 설정파일을 참조해 장애가 생긴다.

따라서 SET PERSIST를 사용해 시스템 변수를 변경하면 서버는 변경된 값을 즉시 적용하고 동시에 별도의 설정 파일(mysqld-auto.cnf)에 추가로 기록한다. 그러면 서버가 재시작할 때 설정 파일(my.cnf)와 위의 설정 파일(mysqld-auto.cnf)를 같이 참조해 시스템 변수를 적용한다.

SET PERSIST는 세션 변수에는 적용되지 않고 SET PERSIST로 변경하려고 하면 서버는 자동으로 GLOBAL시스템 변수의 변경으로 인식하고 변경한다.
현재 서버에는 변경내용을 적용하지 않고 재시작싯에 변경하고 싶다면 (mysqld-auto.cnf에만 저장) SET PERSIST_ONLY를 사용한다.

SET PERSIST_ONLY 명령은 정적인 변수의 값을 영구적으로 변경하고자 할 때 사용할 수 있다.
정적인 변수는 SET PERSIST를 통해 실행 중인 MySQL 서버에서 변경할 수 없으므로 mysqld-auto.cnf 파일에 기록해두고자 하면 SET PERSIST_ONLY 사용
그렇다면 정적인 변수에 그냥 SET PERSIST 씀ㄴ 안되나... . . . 아 에러남
SET PERSIST나 SET PERSIST_ONLY 사용하면 JSON 포맷의 mysqld-auto.cnf 파일 생성
mysqld-auto.cnf에는 변경된 시스템 변수의 이름과 설정값, 언제 누구에 의해 시스템 변수가 변경되었는지

SET PERSIST나 SET PERSIST_ONLY를 사용해서 변경한 시스템 변수의 내용을 삭제하고 싶을 때가 있다.
이럴 때 mysqld-auto.cnf를 직접 건드리다가 오류가 나면 서버가 실행되지 않을 수 있다.
따라서 RESET PERSIST를 사용하도록 하자.

my.cnf 파일

profile
백엔드 개발자 지망생

0개의 댓글