M2 Mac 환경 기준으로 작성되었으며, 도서와 다르게 docker container를 활용하였음.
MySQL 설치
version: '3.8'
services: mysql: image: mysql:8.0 container_name: real_mysql environment: MYSQL_ROOT_PASSWORD: 1234 # root password MYSQL_DATABASE: employees # database to create initially ports: - '3306:3306' # host:container port mapping volumes: - ./realmysql80:/docker-entrypoint-initdb.d # mount initialization SQL filesdocker-compose up -d # run mysql container in detached mode책에서 소개하고 있는 예제 파일 을 마운트
Note (linux 기준 시작과 종료)
리눅스 환경에 rpm을 통해 설치하였다면, usr/lib/systemd/system/mysqld.service 파일이 생성되고, systemctl 명령어로 시작과 종료를 할 수 있음.
systemctl start mysqld # start mysql servicesystemcctl status mysqld # check mysql service statussystemctl stop mysqld # stop mysql service원격으로 MySQL 서버를 shutdown 할 때는 다음과 같이 실행
mysql> SHUTDOWN;MySQL 서버에서는 실제 transaction 이 정상적으로 commit 되어도 데이터 파일에 내용이 기록되지 않고 로그 파일에만 기록되어 있을 수 있음. 이 후 MySQL 서버가 종료되고 다시 시작된 이후에도 계속 이 상태로 유지될 수도 있는데, 비정상적인 상황은 아니며, 일반적인 상황이지만, 종료될 때 모든 commit 된 내용을 데이터 파일에 기록하고 종료되게 하고 싶다면 옵션을 다음과 같이 변경하면 됨. (clean shutdown)
mysql> SET GLOBAL innodb_fast_shutdown = 0; # default is 1이 경우 MySQL 서버가 다시 가동할 때, 별도의 transaction 복구 작업이 필요하지 않게 되어 빠르게 시작할 수 있음.
MySQL 서버가 시작되거나 종료될 때 MySQL 서버 (InnoDB 스토리지 엔진)의 버퍼 풀 내용을 백업하고 복구하는 과정이 내부적으로 실행됨. 실제 버퍼 풀의 내용을 백업하는 것은 아니고, 버퍼 풀에 적재돼 있던 데이터 파일의 데이터 페이지에 대한 메타 정보를 백업하여 빠르게 완료되지만, 새로 시작될 때 데이터 파일을 모두 읽어서 적재해야 하므로 상당한 시간이 걸릴 수도 있음.
서버 접속
mysql -u root -p --host=localhost --socket=/tmp/mysql.sock # connect using socketmysql -u root -p --host=127.0.0.1 --port=3306 # connect using TCP/IPmysql -u root -p # if both socket and TCP/IP are available, socket is used by default (path in my.cnf)위와 같이 여러 방법으로 접속할 수 있음. 따로 옵션을 지정하지 않으면 socket 방식으로 접속하게 되지만, 원격 호스트에 있는 MySQL 서버에 접속할 때는 TCP/IP 방식을 사용해야 함.
MySQL 서버 업그레이드
MySQL 서버를 업그레이드할 때는 다음의 두가지 방법이 있음:
-
MySQL 서버의 데이터 파일을 그대로 두고 업그레이드 (In-Place Upgrade)
- 여러 제약 사항 존재 but 시간 단축
-
mysqldump 도구 등을 통해 데이터를 덤프한 후 새로 설치한 MySQL 서버에 덤프된 데이터를 적재 (Logical Upgrade)
- 제약 사항 없음 but 시간이 오래 걸릴 수 있음
Note (MySQL 서버 업그레이드 참고 사항)
In-Place Upgrade 제약 사항:
MySQL 서버의 메이저 버전이 바뀌는 업그레이드는 반드시 직전 버전에서만 가능 (예: 5.6 → 5.7 가능, 5.6 → 8.0 불가능). 그 이유는 메이저 버전 업그레이드의 경우 데이터 파일의 패치가 필요한데, 8.0의 경우 5.7의 데이터 파일과 로그 포맷만 인식하도록 구현되어 있기 때문. 그렇기에 Logical Upgrade 가 더 나은 선택일 수 있음.
또한 메이저 버전 업그레이드가 특정 마이너 버전에서만 가능한 경우도 있음. (예: 5.7.8 → 8.0 불가능) 매뉴얼 정독 필요.
MySQL 8.0 업그레이드 시 고려 사항:
- 사용자 인증 방식 변경: Caching SHA-2 Authentication 이 기본 인증 플러그인으로 변경됨. 기존 mysql_native_password 도 사용 가능하지만 옵션 없이 생성되는 계정은 모두 새 인증 방식이 적용됨.
- foreign key 이름 길이: 8.0 에서는 foreign key 이름의 최대 길이가 64자로 제한됨.
GROUP BY에 사용된 정렬 옵션: 5.x 에서 사용하던ASC또는DESC옵션을 제거하거나 다른 방식으로 변경해야 함.- 파티션을 위한 공용 테이블 스페이스: 8.0 에서는 파티션의 각 테이블 스페이스를 공용 테이블 스페이스에 저장할 수 없음.
서버 설정
MySQL 서버의 설정 파일은 보통 /etc/my.cnf 또는 /etc/mysql/my.cnf 에 위치함.
설정 파일이 여러개인 경우, 지정된 디렉토리를 순차적으로 탐색하며 처음 발견된 설정 파일을 사용함.
설정 파일 (my.cnf) 의 구성
하나의 my.cnf 파일에 여러 설정 그룹을 정의할 수 있으며 대체로 실행 프로그램 이름을 그룹 이름으로 사용함.
# my.cnf(example)[mysqld]skip-host-cacheskip-name-resolvedatadir=/var/lib/mysqlsocket=/var/run/mysqld/mysqld.socksecure-file-priv=/var/lib/mysql-filesuser=mysqlpid-file=/var/run/mysqld/mysqld.pid
[client]socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/MySQL 시스템 변수
MySQL 서버는 시작하면서 설정 파일의 내용을 읽어 메모리나 작동 방식을 초기화하고, 접속된 사용자를 제어하기 위해 이러한 값을 별도로 저장해둠.
mysql> SHOW VARIABLES; # show session system variablesmysql> SHOW GLOBAL VARIABLES; # show global system variables
시스템 변수는 적용 범위에 따라 글로벌 변수와 세션 변수로 나뉘는데, 일반적으로 세션 별로 적용되는 시스템 변수의 경우 글로벌 변수뿐만아니라 세션 변수에도 동시에 존재.
- 글로벌 변수: 하나의 MySQL 서버 인스턴스에서 전체적으로 영향을 미치는 시스템 변수.
- 세션 변수: MySQL 클라이언트가 서버에 접속할 때 기본으로 부여하는 옵션의 기본값을 제어하는데 사용됨. 클라이언트의 필요에 따라 개별 커넥션 단위로 다른 값으로 변경할 수 있는 것이 세션 변수. (기본값 = 글로벌 변수, 각 클라이언트가 가지는 값 = 세션 변수)
시스템 변수는 또한 기동 중인 상태에서 변경 가능한지에 따라 동적 변수와 정적 변수로 나뉨.
- 동적 변수: MySQL 서버가 기동된 상태에서
SET명령어로 변경할 수 있는 시스템 변수. - 정적 변수: MySQL 서버가 기동된 상태에서는 변경할 수 없고, 설정 파일을 수정한 후 MySQL 서버를 재기동해야 변경되는 시스템 변수.
Note (SET_PERSIST)
SET_PERSIST
SET 명령어로 변경한 동적 변수의 값은 my.cnf 파일에 반영되지 않으므로, MySQL 서버를 재기동하면 다시 설정 파일에 지정된 값으로 돌아감.
하지만 글로벌 변수의 경우 영구히 적용하기 위해SET PERSIST 명령어를 사용하여 자동으로 설정 파일로도 기록 할 수 있음. (이 때 my.cnf 파일이 아닌 별도의 파일 mysqld-auto.cnf에 기록됨) 이는 세션 변수에는 적용되지 않으며, 자동으로 글로벌 변수의 변경으로 인식하고 변경함.
mysql> SET GLOBAL max_connections = 2000; # change global variable temporarilySET_PERSIST_ONLY
mysql> SET PERSIST_ONLY max_connections = 2000; # change global variable permanently정적 변수의 경우 다음 재시작을 위해 mysqld-auto.cnf 파일에 기록 하고자 한다면 SET PERSIST_ONLY 명령어를 사용할 수 있음. 또한 정적 변수의 값을 영구적으로 변경할 때도 SET PERSIST_ONLY 명령어를 사용할 수 있음.
RESET_PERSIST
SET PERSIST 또는 SET PERSIST_ONLY 명령어로 설정된 값을 제거하고자 할 때는 RESET PERSIST 명령어를 사용함. 이 경우 mysqld-auto.cnf 파일에서 해당 설정이 제거됨. (직접 파일을 수정하는 것은 내용 상 오류를 야기할 가능성 존재)
mysql> RESET PERSIST max_connections; # remove the setting from mysqld-auto.cnf