본문 바로가기

MySQL & MariaDB

[Real MySQL 8.0] 02. 설치와 설정 & 03. 사용자 및 권한

글을 작성하기 전에

Real MySQL 8.0 (위키북스/ 백은빈,이성욱 지음)을 읽어보고 Real MySQL 8.0 + 기존의 알고 있던 내용을 나름대로 정리하고자 합니다. 본 서적에 대한 정리 외에도 MySQL의 특징을 개인적으로 학습한 오픈소스 DBMS인 PostgreSQL와 비교할만한 점을 추가하여 포스팅할 예정이니 잘못기입된 내용이 있다면 자유롭게 댓글 부탁드립니다.

 

Real MySQL 8.0 02장 설치와 설정

 

2.1 MySQL 서버 설치

OS 종류에 따라 매우 다양한 방법을 통해 설치 할 수 있으므로 해당 포스팅에서는 다루지 않음

작성자가 주로 사용했던 리눅스에서는 아래와 같은 방법등을 통하여 설치하였음  

 

- Tar 파일 압축 해제 방식( 바이너리 파일 압축 해제)

- 패키지로 설치 ( Yum / RPM)

- 소스 컴파일 설치

 

2.2 MySQL 서버의 시작과 종료

패키지를 통해 설치하게 되면 MySQL 서비스가 systemd에 등록되어 systemctl을 통한 제어를 통해 시작과 종료가 가능하다.

systemctl start mysqld
systemctl stop mysqld
systemctl status mysqld

그러나 1번을 통해 설치 진행했을 때 mysqld_safe나 mysqld을 통한 수동기동도 가능하다.

mysqld --defaults-file=/etc/my.cnf --initalize-insecure

(기동 시 설정파일이 작성되어 있는 my.cnf 파일 경로에 대해 유의필요)

 

2.3 MySQL 서버 업그레이드

MySQL을 업그레이드 하는 방법은 크게 두가지로 분류한다.

 

In-Place Upgrade

- MySQL 서버의 데이터 파일을 그대로 두고 업그레이드하는 방법 ( PostgreSQL에서의 pg_upgrade)

 

Logical Upgrade

- mysqldump 도구 등을 이용해 MySQL 서버의 데이터를 SQL 문장이나 텍스트 파일로 덤프한 후,새로 업그레이드된 버전의 mysql 서버에서 덤프된 데이터를 적재하는 방법 ( Dump & restore)

 

MySQL 메이저 업그레이드 시에는 5.6 -> 5.7 -> 8.0 한단계의 업그레이드만 가능하다고 한다. PostgreSQL에서는 2단계 이상의 메이저버전 업그레이드가 가능한 부분의 차이점이 있다(PostgreSQL은 메이저버전이 매년 릴리즈되는 차이점도 있다.)

 

MySQL 8.0  업그레이드 고려사항

 

- 사용자 인증 방식 변경

- MySQl 8.0과의 호환성 체크

- 외래키 이름의 길이

- 인덱스 힌트

- GROUP BY에 사용된 정렬 옵션

- 파티션을 위한 공용 테이블스페이스

 

2.4 서버 설정

MySQL 서버는 단 하나의 설정 파일을 사용한다. 유닉스 계열에서는 my.cnf라는 이름을 사용하고, 윈도우 계열에서는 my.ini라는 이름을 사용한다. MySQL서버는 지정된 여러 개의 디렉토리를 순차적으로 탐색하면서 처음 발견된 my.cnf를 사용한다. 패키지 설치 시에는 /etc/my.cnf를 우선적으로 탐색한다. 작성자가 운영하던 MySQL서버에서는 데이터파일의 파일시스템을 분리하였고 해당 파일시스템에 설정파일을 위치시켰다. 이 경우 실제 읽는 my.cnf의 위치를 혼동하지 않기 위해 불필요한 my.cnf를 삭제하는 방법도 고려해 볼 수 있다.(PostgreSQL에서의 $PGDATA/postgresql.conf 역할, PostgreSQL에서는 설정파일에서 변경가능 )

 

설정파일 구성

 

MySQL 설정 파일은 여러 개의 설정 그룹을 담을 수 있으며, 대체로 실행 프로그램 이름을 그룹명으로 사용한다. 예를 들어 mysqldump는 [mysqldump] 설정 그룹을 mysqld는 [mysqld] 설정 그룹을 참조한다. 

[mysqld]
socket = /usr/local/mysql/tmp/mysql.sock
port = 3306
 
[mysqldump]
default-character-set = utf8mb4
socket = /usr/local/mysql/tmp/mysql.sock
port = 3306

설정 파일의 각 그룹은 같은 파일을 공유하지만 서로 무관하게 적용

 

MySQL 시스템 변수의 특징

 

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

 

DB 운영시 어떤 변수가 글로벌 변수이고, 세션 변수인지에 대해 구분 할 수 있어야하며 해당 내용은 MySQL 서버 매뉴얼을 통해서 확인 가능하다. ( PostgreSQL에서는 pg_settings View를 통해 조회가능하다.)

 

시스템 변수 페이지 

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

 

해당 페이지에 기술된 시스템변수가 가지는 5가지 속성의 의미는 다음과 같다.

 

- Cmd-Line: MySQL 서버의 명령행 인자로 설정될 수 있는지 여부를 나타낸다.

- Option File: my.cnf(또는 my.ini) 설정 파일로 제어할 수 있는지 여부를 나타낸다.

- System Var: 시스템 변수인지 아닌지를 나타낸다.

 - Var Scope: 시스템 변수의 적용 범위를 나타낸다. (Session, Global, Both)

 - Dynamic: 시스템 변수가 동적인지 정적인지를 나타낸다.

 

Real MySQL 8.0 03장 사용자 및 권한

3.1 사용자 식별

MySQL은 사용자 계정뿐 아니라 사용자의 접속 지점(클라이언트가 실행된 호스트명이나, 도메인 또는 IP 주소)도 계정의 일부가 된다. 따라서 MySQL에서 계정을 언급할 때는 다음과 같이 항상 아이디와 호스트를 함께 명시해야한다.

( 권한이나 계정 정보에 대해 MySQL은 범위가 가장 작은 것을 항상 먼저 선택하므로 계정 생성시 주의해야한다.)

 

3.2 사용자 계정 관리

MySQL 서버에는 다음과 같이 내장된 계정들이 있는데 ‘root’@‘localhost’를 제외한 3개의 계정은 내부적으로 각기 다른 목적으로 사용되므로 삭제되지 않도록 주의하자.

 

 - ‘mysql.sys’@‘localhost’: 8.0부터 기본 내장된 sys 스키마의 객체(뷰, 함수, 프로시저)들의 DEFINER로 사용되는 계정이다.

 - ‘mysql.session’@‘localhost’: MySQL 플러그인이 서버로 접근할 때 사용되는 계정

 - ‘mysql.infoschema’@‘localhost’: information_schema에 정의된 뷰의 DEFINER로 사용되는 계정

 

3.5 역할(Role) 

MySQL 8.0 버전부터 권한을 묶어서 역할을 사용할 수 있게 됐다.  처음 역할을 생성하면 아무 권한이 존재하지 않지만 GRANT 명령으로 역할을 부여하면 된다. 서버 내부적으로 역할과 계정은 아무런 차이가 없어보이지만 Role 생성시 Account_locked 옵션이 체크된다.

(PostgreSQL에서는 9점대 버전에서 부터 도입되어 있으며, MySQL과 동일하게 User와 Role은 login 옵션 유무만 다름)

 

(그림 출처 및 참고 자료)

Real MySQL 8.0