Database

[Real MySQL 8.0] mysql 설치와 설정

꼰딩 2023. 8. 28. 00:53

docker compose 를 제외한 모든 내용은 Real MySQL 8.0 Chpater 2 를 읽고 정리하였습니다.

 

공부용 docker compose

 

version: '3'

services:
  real-mysql:
    image: mysql:8.0
    ports:
      - '3311:3306'
    restart: always
    container_name: real-mysql
    # stdin_open과 tty를 true로 해야 컨테이너 안에서 터미널 실행이 가능하다.
    stdin_open: true
    tty: true
    environment:
      TZ: Asia/Seoul
      MYSQL_USER: user
      MYSQL_PASSWORD: user
      MYSQL_DATABASE: real-mysql
      MYSQL_ROOT_PASSWORD: root
      MYSQL_INITDB_CHARSET: utf8mb4
      MYSQL_INITDB_COLLATION: utf8mb4_unicode_ci
    volumes:
      - ./mysql:/var/lib/mysql:rw
    # 메모리에 쓰기 (테스트용)
    # tmpfs:
    #   - /var/lib/mysql:rw

 

client로는 dbeaver를 사용했습니다.

password는 root password인 root 입니다.

 

 

터미널을 통해 mysql에 접속하는 방법

mysql -uroot -p --host=localhost --port=3311
mysql -uroot -p --host=127.0.0.1 --port=3311
mysql -uroot -p

1,3 번째 방식은 호스트가 localhost가 되며 소켓파일(Unix domain socket)을 사용하게 되는데, 이것은 유닉스의 프로세스 간 통신 (IPC: Inter Process Communication)의 일종입니다.

소켓 파일의 위치는 mysql 서버의 설정 파일에서 읽어서 사용합니다. 소켓 파일은 한 번 삭제하면 db 서버를 재시작해야합니다.

2번째 방식은 자기 서버를 가리키는 루프백 IP 이지만 TCP/IP 통신을 사용합니다.

 

연결만 확인 1
연결만 확인2

 

서버 업데이트 방법 2가지

1. 데이터 파일은 그대로 두고 업데이트 -> In-Place Upgrade, 시간 단축

2. mysqldump 도구 등을 이용해 데이터를 덤프한 후 새로 업데이트된 mysql 에 덤프 데이터를 적재 (Logical Upgrade) 제약 사항이 거의 없음

 

마이너 버전 간 업데이트는 mysql 서버 프로그램만 재설치 하면 됩니다.

 

메이저 버전 간 업데이트는 반드시 직전 버전에서만 허용됩니다.

두 단계 이상을 한 번에 업데이트 해야될때는 2번 방법을 사용하는게 나을수도 있습니다.

 

그런데 메이저 버전 업데이트가 특정 마이너 버전에서만 가능한 경우도 있습니다.

GA(General Availability) 버전이 아닐 경우인데, GA 는 오라클에서 mysql 서버의 안정성이 확인된 버전이라는 것을 의미합니다.

그래서 새로운 버전의 mysql 을 선택할 때 최소 GA 버전은 지나서 15~20번 이상의 마이너 버전을 선택하는 것이 좋습니다.

 

my.cnf

 

mysql 서버는 my.cnf (맥), my.ini (윈도우) 라는 단 하나의 설정 파일을 사용합니다.

서버가 시작될때 이 설정 파일을 참조하는데, 경로가 고정되어있는 것이 아니여서 지정된 여러 개의 디렉토리를 순차적으로 탐색하면서 처음 발견한 my.cnf 를 사용합니다.

 

mysql --help

...
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
...

1. /etc/my.cnf

2. /etc/mysql/my.cnf

3. /usr/etc/my.cnf

4. ~/.my.cnf

순으로 파일을 찾고 있습니다.

1, 2, 4 경로는 어느 mysql에서나 동일하지만, 3 경로는 컴파일될때 mysql에 내장된 경로입니다.

 

시스템 변수

https://dev.mysql.com/doc/refman/8.0/en/server-system-variable-reference.html

cmd-line: 서버의 명령행 인자 설정 가능 여부 -> yes 면 명령행 인자로 이 시스템 변수의 값을 변경할 수 있습니다.

option file: my.cnf로 제어 가능 여부

system var: 시스템 변수인지 나타냄. 변수명 - 인지 _ 인지 구분

var scope: 시스템 변수의 적용 범위

dynamic: 시스템 변수 동적, 정적 구분

 

글로벌 변수

예) innodb_buffer_pool_size

세션 변수

예) autocommit

 

show global variables like '%max_connections%';

위의 명령어로 mysql 서버의 시스템 변수를 확인할 수 있습니다.

set 으로 값을 변경할 수도 있지만, 현재 기동중인 mysql 인스턴스에만 적용되며 my.cnf는 수정되지 않아 서버를 재시작하면 파일의 값으로 초기화됩니다. 8.0 버전부터는 set persist 명령으로 설정 파일에도 내용이 기록되는데, my.cnf 가 아니라 mysqld-auto.cnf 파일에 기록됩니다. 서버를 재시작하면 my.cnf 과 자동 생성된 mysqld-auto.cnf 파일을 같이 참조해서 시스템 변수를 적용합니다.

 

지금은 변경 내용을 적용하지 않고 mysqld-auto.cnf만 업데이트 하려면 set persist_only 명령어를 사용하면 됩니다.

정적인 변수는 실행중인 mysql 에서 적용할 수 없고, 재시작해야됩니다. 이런 정적 변수를 업데이트할때 set persist_only를 사용합니다.

 

상단의 docker-compose.yml 로 mysql을 실행했다면, mysqld-auto.cnf 는 docker-compose에서 마운트한 볼륨에서 찾을 수 있습니다. 생성되는 경로가 ./var/lib/mysql/mysqld-auto.cnf 이기때문입니다.

 

mysqld-auto.cnf에 추가한 시스템 변수를 삭제할때는 파일 내용을 직접 수정하기 보다는 명령어를 사용하는 것이 안전합니다.

## 특정 시스템 변수만 삭제
reset persist max_connections;
reset persist if exists max_connections;

## mysqld-auto.cnf의 모든 시스템 변수 삭제
reset persist;

책에는 시스템 변수의 개수가 570개라고 나와있는데, 아래 명령어로 개수를 확인해보니 654개로 확인됩니다.

select * from performance_schema.variables_info;

 

책에는 저자께서 참조하면 좋은 기본 설정 시스템 변수가 나와있는데, 몇가지만 적어봅니다.

[mysqld]
default-time-zone='+09:00'
character-set-server=utf8mb4
character-set-filesystem=utf8mb4
collation_server=utf8mb4_0900_ai_ci
skip-character-set-client-handshake

relay-log=/log/relay-bin/relay-bin
relay_log_info_repository=TABLE
relay_log_recovery=ON
relay_log_purge=ON

log-error=/log/mysql-err.log
log_error_verbosity=1

slow-query-log=1
long_query_time=1
log_slow_extra=1
log_slow_admin_statements=1
log_slow_slave_statements=1
log_slow_slave_statements=1
slow_query_log_file=/log/mysql-slow.log

binlog_expire_logs_seconds=259200
log-raw
log_timestamps=SYSTEM

[client]
socket=/tmp/mysql.sock