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 통신을 사용합니다.
서버 업데이트 방법 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
'Database' 카테고리의 다른 글
[Real MySQL 8.0] 아키텍처 - MySQL 엔진 아키텍처 (0) | 2023.09.05 |
---|---|
[Real MySQL 8.0] 사용자 및 권한 (0) | 2023.09.01 |
[친절한 SQL 튜닝] NDV, 선택도 (Selectivity), 카디널리티 (Cardinality) (0) | 2023.08.16 |
MongoDB에서 bulkWrite updateOne upsert를 할 때 filter: _id 주의점 (0) | 2023.03.28 |