시작하기 전
책에서는 Oracle 공식 홈페이지에서 DMG를 받아 설치하는 과정이 소개가 됩니다.
HomeBrew Package Manager를 이용하는 편이여서 기존 MySQL도 Brew를 통해 설치하다 보니 디렉토리가 너무 상이하여 다시 설치를 하게 됩니다.🥹
💀 또 다시 변경하여 Docker ubuntu container
에서 연습합니다.
해당 사이트에 들어가서 PC에 장착된 프로세서에 적절한 종류의 파일을 설치합니다.
MySQL Community Server 8 설치 파일 제공
https://dev.mysql.com/downloads/mysql/
...
사설 네트워크에서만 사용한다면 Use LegacyPassword Encryption 사용해도 좋습니다.
MySQL 기본 설정으로 서버 설치 시 로그 파일들은
/usr/local/mysql
하위에 생성이 됩니다.
서버가 설치된 디렉토리에는 절대 삭제하면 안 되는 디렉토리가 존재합니다.
initialize Database
를 클릭한 뒤 Server를 시작합니다.
Mysql의 설정을 잡을 my.cnf
를 Configuration File에 입력합니다.
기본세팅이 종료 되었습니다.
이제 해당 커맨드를 입력하면 mysql server에 접속합니다.
편의를 위해서 classPath에 등록하고 사용하는 것을 추천
1. cd /usr/local/mysql/bin
2. ./mysql -u root -p
MySQL 서버는 트랜잭션이 정상적으로 커밋돼도 변경된 내용이 기록되지 않고
리두 로그에만 기록돼 있을 수 있습니다.
MySQL서버가 종료될 때 모든 커밋의 내용을 데이터 파일에 기록하고 종료도 할 수 있습니다.
SET GLOBAL innodb_fast_shutdown = 0;
MySQL 서버가 시작되거나 종료될 때는 InnoDB 스토리지 엔진의 버퍼 풀 내용을 백업하고 복구하는 과정이 내부적으로 실행됩니다.
실제 버퍼 풀의 내용을 백업하는 것이 아니라 버퍼풀 데이터 파일의 페이지에 대한 메타 정보를 백업하기 때문에 매우 빠릅니다.
하지만 MySQL 서버가 새로 시작될 때는 디스크에서 데이터 파일을 모두 읽어서 적재해야 하므로 시간이 오래 걸립니다. 시간이 오래걸린다면
버퍼 풀의 내용을 복구하고 있는지 확인해보자
Redo Log란?
The redo log is a disk-based data structure used during crash recovery to correct data written by incomplete transactions.
https://dev.mysql.com/doc/refman/8.0/en/innodb-redo-log.html
서버 연결 테스트하기
host와 socket을 명시
mysql -u root -p --host=localhost --socket=/tmp/mysql.sock
host와 port를 명시
mysql -u root -p --host=127.0.0.1 --port=3306
아무것도 명시하지 않음
mysql -u root -p
MySQL서버에 접속할 때 127.0.0.1
과 localhost
는 차이가 존재합니다.
--host=127.0.0.1
을 사용하는 경우 MySQL Client는 항상 소켓 파일을 통해 접속합니다.
TCP/IP
를 통한 통신이 아니라 프로세스 간 통신으로 연결이 됩니다.
127.0.0.1
도 자신을 가리키는 루프백 IP
이기는 하지만 TCP/IP 통신
방식이 선택됩니다.
마지막으로 아무것도 명시하지 않는 경우 localhost
에 소켓 파일을 사용합니다.
소켓 파일의 위치는 서버 설정 파일에서 읽음
서버 설정
일반적으로 MySQL 서버는 단 하나의 설정 파일을 사용합니다.
my.cnf(윈도우는 my.ini) 파일을 서버가 실행될 때 참조하며
지정된 여러 개의 디렉토리를 순차적으로 참조하여 처음 발견된 설정 파일을 참조하게 됩니다.
[mysqld]
port = 3306
[mysql]
default-character-set = utf8mb4
socket = /usr/local/mysql/tmp/mysql.sock
port = 3304
[mysqld_safe]
malloc-lib = /opt/lib/libtcmalloc_minimal.so
[mysqldump]
default-character-set = utf8mb4
socket = /usr/local/mysql/tmp/mysql.sock
port = 3306
[]
괄호는 실행 프로그램 이름을 표현합니다.
예로 들어서 mysql
프로그램은 [mysql]
설정을 사용하고
mysqld_safe
는 [mysqld_safe]
설정을 사용합니다.
MySQL 시스템 변수
시스템 변수
:
MySQL 서버는 기동하면서 설정 파일의 내용을 읽어 메모리나 작동 방식을 초기화하며 접속된 사용자를 제어하기 위해 별도로 저장하며 이러한 값을 시스템 변수라고 합니다.
시스템 변수의 속성에는 Cmd-Line
, Option File
, System Var
, Var Scope
, Dynamic
이 존재합니다.
https://dev.mysql.com/doc/refman/8.0/en/server-system-variable-reference.html
변수의 종류
글로벌 변수, 세션 변수
MySQL 시스템 변수는 적용 범위에 따라 글로벌 변수, 세션 변수로 구분
글로벌 범위 시스템 변수
하나의 MySQL 서버 인스턴스에서 전체적으로 영향을 미치는 시스템 변수 서버 단하나에 존재하는 InnoDB 버퍼 풀, MyISAM 캐시크기 등이 대표적
세션 범위 시스템 변수
MySQL 클라이언트가 서버에 접속할 때 기본적으로 부여하는 옵션 기본값 제어하는데 사용, 클라이언트의 커넥션 단위로 다른 값을 변경할 수 있는 것이 세션 변수이며 기본값은 글로벌 시스템 변수입니다.
한번 연결된 커넥션의 세션 변수는 서버에서 강제로 변경할 수 없습니다.
정적 변수와 동적 변수
MySQL서버가 기동 중인 상태에서 변경 가능한지에 따라 동적 변수와 정적 변수로 구분
디스크의 설정 파일 : 변경을 하더라도 재시작 전에는 적용이 안됩니다.
메모리의 시스템 변수 : SET 명령어로 변경을 하면 변경이 반영됩니다.
하지만 메모리의 MySQL 서버의 시스템 변수를 변경하는 것(SET)이 디스크에 존재하는 디스크 설정 파일의 값을 변경하는 것이 아니기 때문에 서버를 재시작하면 다시 디스크의 설정 파일을 참조하게 됩니다.
일반적으로 글로벌 시스템 변수는 런타임때 동적으로 변경할 수 없는 것이 많지만
변경이 가능한 것도 존재합니다.
이러한 경우 SET을 사용하여 간단하게 변경이 가능합니다.
추가적으로 Var Scope가 `Both`인 경우 글로벌 시스템 변수의 값을 변경해도
이미 존재하는 커넥션 세션의 변수가 변경되지는 않음
SET PERSIST?
디스크의 설정 파일에도 동시에 반영이 가능 (세션 변수에는 적용 X)
자동으로 글로벌 시스템 변수의 변경으로 인식하며
현재 서버에 변경내용을 적용하지 않고 다음 재시작 이후에 적용하려면 SET PERSIST_ONLY
를 사용
저장 위치
변경한 내용을 디스크의 설정 파일에도 적용하려면 SET PERSIST를 적용(my.cnf
가 아닌mysqld-auto.cnf
에 저장)
SET PERSIST_ONLY?
정적인 변수의 값을 영구적으로 변경하고자 할 때도 사용이 가능합니다.
해당 섹션은 학습용이 아닌 나중에 추가적으로 서버를 운용할 때 참고하기 위해 작성하였습니다.
Optimizing MySQL Configuration
https://www.red-gate.com/simple-talk/databases/mysql/optimizing-my-cnf-for-mysql-performance/
Mysql My.cnf Optimization - Best Performance For 1000 + Sites Web Server
https://gist.github.com/kanibaspinar/839e10c17081923dc095a048a988df1c
System memory 확인
free -h
질문