DB/MySQL

[ Real MySQL 8.0. 1 ] 1주차 스터디 (1~3장)

yangheeb 2025. 3. 28. 21:34

위 포스트는 "Real MySQL 8.0 1" 책 Chapter 1~3장 내용을 정리한 글입니다.

 

Real MySQL 8.0 1권 : 알라딘

《Real MySQL》을 정제해서 꼭 필요한 내용으로 압축하고, MySQL 8.0의 GTID와 InnoDB 클러스터 기능들과 소프트웨어 업계 트렌드를 반영한 GIS 및 전문 검색 등의 확장 기능들을 추가로 수록했다.

www.aladin.co.kr

 

 

 

Chapter 01. 소개 

1.1 MySQL 소개


 

지금의 MySQL은 'MySQL 엔터프라이즈 에디션', 'MySQL 커뮤니티 에디션' 으로 2가지 정책을 지니고 있으며,

라이선스 유료 구매 여부, 소스코드 공개 여부에 따라 이 둘을 구분하고 있다.

  MySQL 엔터프라이즈 에디션 MySQL 커뮤니티 에디션
라이선스 유료 구매  O X
소스코드 공개  X O

 

MySQL 5.5 버전 이하에서는 두 에디션의 차이가 얼마나 자주 패치 버전이 릴리스되느냐 정도였다.

그러나 2011년 2월 MySQL 5.5 GA 버전부터는 엔터프라이즈 에디션의 소스코드가 공개되지 않고,

"커뮤니티 에디션"의 소스코드만 공개되었다.

 

 

1.2 왜 MySQL인가?


 

자신이 가장 잘 활용할 수 있는 DBMS가 가장 좋은 DBMS이지만, 

DBMS 선택할 때 아래의 순서대로 조건을 고려하여 사용하면 좋다.

  1. 안정성
  2. 성능과 기능
  3. 커뮤니티나 인지도

MySQL은 해당 조건들에 잘 부합하는 DBMS라고 할 수 있다.

 

 

 

 

 

Chapter 02. 설치와 설정 

2.1 MySQL 서버 설치

 

MySQL 서버는 아래와 같이 다양한 형태로 설치할 수 있다.

  1. Tar 또는 Zip으로 압축된 버전
  2. 리눅스 RPM 설치 버전 (윈도우 인스톨러 및 macOS 설치 패키지)
  3. 소스코드 빌드

필자는 2번 방법을 택하여 "윈도우 msi 인스톨러"를 설치하였다.

 

 

2.1.1 버전과 에디션(엔터프라이즈와 커뮤니티) 선택


 

최소 패치 버전이 15~20번 이상 릴리스된 버전을 선택하는 것이 안정된 서비스에 도움이 된다.

갓 출시된 메이저 버전을 선택을 하는 것은 치명적이거나 보완하는 데 많은 시간이 걸릴 만한 버그가 발생할 수 있기 때문에

MySQL 8.0 버전이라면 MySQL 8.0.15부터 8.0.20 사이의 버전부터 시작하는 것을 권장한다.

 

엔터프라이즈 에디션에서만 지원되는 기능은 다음과 같다.

  • Thread Pool
  • Enterprise Audit
  • Enterprise TDE
  • Enterprise Firewall
  • Enterprise Monitor
  • Enterprise Backup
  • MySQL 기술 지원

 

 

2.2 MySQL 서버의 시작과 종료

2.2.1 설정 파일 및 데이터 파일 준비


  • 윈도우 MSI 인스톨러를 통한 설치 완료
  • Windows + R → services.msc 입력하고 “서비스”에서 해당 속성 확인 가능

 

 

 

2.2.2 시작과 종료


 

Windows에서 MySQL을 MSI 인스톨러로 설치하면, MySQL은 Windows 서비스로 등록되며,

리눅스/유닉스 시스템과 달리 Windows에서 services.msc나 net start 명령으로 관리된다.

 

필자는 앞서 2.2.1에서 services.msc를 통해 서비스 상태를 확인하였다.

또 CMD 또는 PowerShell에서 아래 명령어로 서비스 상태를 확인할 수 있다.

sc query mysql

 

 

반면 유닉스 계열 운영체제에서는 그렇게 되면 자동적으로 /usr/lib/sytemd/system/mysqld.service 파일이 생성되고,

systemctl 유틸리티를 이용해 MySQL을 기동하거나 종료하는 것이 가능하다.

 

본론에 앞서 systemctl 유틸리티가 무엇인지 살펴보았다.

리눅스 역시 ... 아무것도 모르지만 ... 점차 더 알아가도록 하겠다. 오늘은 여기까지만 ^_^

 

Linux에서 systemctl을 사용하여 서비스관리하기(feat. tomcat 부팅시 자동시작)

systemctl 이란?? systemctl은 서비스들을 관리할 수 있는 유틸리티다. 현재 관리하고 싶은 서비스들의 상태를 확인할 수 있으며, 시작, 중지 등 다양한 명령을 내릴 수 있다. 부팅시 서비스를 자동으

yoonnyoon.tistory.com

 

 

시작
systemctl start mysqld

 

 

시작된 서버 상태 확인
systemctl status mysqld

 

mysqld_safe 스크립트를 이용해서 서버 시작 및 종료에 관한 내용은 아래 블로그를 참고하여 학습하였다.

 

[Mysql 8.0] mysql 기동, 종료 Systemctl로 관리하자.

안녕하세요 닷닷입니다. 여러가지 많은 포스팅거리가 있지만, 조금은 간단하게 작성 할 수 있는 걸 오늘은 ...

blog.naver.com

 

종료
systemctl stop mysqld

 

 

 

 

 

2.2.3 서버 연결 테스트


 

원격 호스트에 있는 MySQL 서버에 접속
mysql -uroot -p --host=127.0.0.1 --port=3306

 

데이터베이스 목록 확인
SHOW DATABASES;

 

현재는 8개의 데이터베이스가 생성되어 있는 것을 확인할 수 있다.

 

 

 

 

 

2.4 서버 설정

서버 파일 경로 확인
C:\ProgramData\MySQL\MySQL Server 8.0

 

2.4.1 설정 파일의 구성


 

C:\ProgramData\MySQL\MySQL Server 8.0 경로에서 my.ini 파일 확인해보자.

[mysqld]  --> mysqld 프로그램은 설정 그룹의 이름이 [mysqld]인 영역 참조

# The next three options are mutually exclusive to SERVER_PORT below.
# skip-networking
# enable-named-pipe
# shared-memory

# shared-memory-base-name=MYSQL

# The Pipe the MySQL Server will use.
# socket=MYSQL

# The access control granted to clients on the named pipe created by the MySQL Server.
# named-pipe-full-access-group=

# The TCP/IP Port the MySQL Server will listen on
port=3306

# Path to installation directory. All paths are usually resolved relative to this.
# basedir="C:/Program Files/MySQL/MySQL Server 8.0/"

# Path to the database root
datadir=C:/ProgramData/MySQL/MySQL Server 8.0\Data

 

설정 파일이 MySQL 서버만을 위한 설정 파일이라면 [mysqld] 그룹만 명시해도 된다.

 

다만 MySQL 서버뿐 아니라 MySQL 클라이언트나 백업을 위한 mysql.dump 프로그램이 실행될 때도 이 설정 파일을 공용으로 사용하고 싶다면 [mysql] 또는 [mysqldump] 등의 그룹을 함께 설정해 둘 수 있다.

설정 파일의 각 그룹은 같은 파일을 공유하지만 서로 무관하게 적용된다는 의미이다.

 

 

 

2.4.2 MySQL 시스템 변수의 특징


 

시스템 변수 (System Variables)
  • MySQL 서버가 기동하면서 저장해 두는 값
  • 설정 파일의 내용을 읽어 메모리나 작동 방식을 초기화하고, 접속된 사용자를 제어하기 위해 값을 별로도 저장해 둔 것 
  • SHOW VARIABLES 또는 SHOW GLOBAL VARIABLES 명령으로 확인 가능

 

이 시스템 변수는 5가지 속성을 가진다. 

  • Cmd-line
    • 서버의 명령행 인자로 설정될 수 있는지 여부 
  • Option file
    • my.cnf(my.ini) 파일로 제어할 수 있는지 여부
  • System Var
    • 시스템 변수인지 여부
    • 네이밍은 하이픈 (-)로 구분되는 곳도 있고 언더스코어(_)로 구분되는 곳도 있음
    • MySQL 8.0부터는 모두 언더스코어로 구분 (명령행 옵션으로만 사용가능한 설정들은 하이픈으로 구분되어 있음)
  • Var Scope 
    • 시스템 변수의 적용 범위
    • GLOBAL: 전역 변수
    • SESSION : 세션 변수 (서버와 클라이언트 간의 커넥션)
    • BOTH : GLOBAL과 SESSION 모두 적용
  • Dynamic
    • 동적인지 정적인지 구분하는 변수

 

 

 

2.4.3 글로벌 변수와 세션 변수


 

MySQL의 시스템 변수는 적용 범위에 따라 "글로벌 변수"와 "세션 변수"로 나뉜다.

일반적으로 세션별로 적용되는 시스템 변수의 경우 글로벌 변수뿐만 아니라 세션 변수에도 동시에 존재하는데,

이러한 경우 MySQL 매뉴얼의 'Var Scope'에는 'Both'라고 표시된다.

 

글로벌 범위의 시스템 변수 (글로벌 변수)
  • 하나의 MySQL 서버 인스턴스에서 전체적으로 영향을 미치는 시스템 변수
  • 주로 MySQL 서버 자체에 관련된 설정일 때가 많음
  • ex ) InnoDB 버퍼 풀 크기(innodb_buffer_pool_size), MyISAM의 키 캐시 크기(key_buffer_size)

 

세션 범위의 시스템 변수 (세션 변수)
  • MySQL 클라이언트가 MySQL 서버에 접속할 때 기본으로 부여하는 옵션의 기본값(글로벌 시스템 변수)을 제어하는 데 사용
  • 클라이언트의 필요에 따라 개별 커넥션 단위로 다른 값으로 변경할 수 있는 것. 클라이언트가 가지는 값
  • ex ) autocommit를 ON/OFF

 

 

2.4.4 정적 변수와 동적 변수


 

MySQL의 시스템 변수는 MySQL 서버가 기동 중인 상태에서 변경 가능한지에 따라 "정적 변수"와 "동적 변수"로 나뉜다.

일반적으로 세션별로 적용되는 시스템 변수의 경우 글로벌 변수뿐만 아니라 세션 변수에도 동시에 존재하는데

 

 

 

2.4.5 SET PERSIST


 

SET PERSIST

 

 

 

SET PERSIST_ONLY

 

 

 

Chapter 03. 사용자 및 권한 

 

3.1 사용자 식별



1. MySQL에서 계정을 언급할 때는 다음과 같이 항상 아이디호스트를 함께 명시

'svc_id'@'127.0.0.1'

 

# 아이디와 IP 주소를 감싸는 역따옴표는 MySQL에서 식별자를 감싸는 따옴표 역할을 함. 홑따옴표(')로 바뀌어 사용되기도 함

# 다음의 사용자 계정은 항상 MySQL 서버가 기동 중인 로컬 호스트에서 svc_id라는 아이디로 접속할 때만 사용될 수 있는 계정

 

 

2. 사용자 계정이 여러 개 있을 경우, 권한이나 계정 정보에 대해 MySQL은 범위가장 작은 것을 항상 먼저 선택

'svc_id'@'127.0.0.1' (이 계정의 비밀번호는 123)
'svc_id'@'%' (이 계정의 비밀번호는 abc)  -> '%'문자는 모든 IP 또는 모든 호스트명을 의미

 

# %문자가 포함되지 않는 것이 범위가 가장 좁은 것 -> 위에 둘 중 'svc_id'@'127.0.0.1'을 택할 것

# IP가 명시된 계정 정보를 이용해 이 사용자를 인증하게 됨

 

 

 

 

3.2 사용자 계정 관리

3.2.1 시스템 계정과 일반 계정


 

"SYSTEM_USER  권한 유무" 에 따라 계정을 2가지로 구분할 수 있다.

 

시스템 계정 (root 계정)
  • MySQL 서버 내부적으로 실행되는 백그라운드 스레드와 무관
  • 사용자(데이터베이스 서버 관리자)를 위한 계정
  • 일반 계정을 관리(생성 삭제 및 변경)할 수 있음
일반 계정 (실습에서는 user 계정으로 진행)
  • 응용 프로그램이나 개발자를 위한 계정
  • 시스템 계정을 관리할 수 없음

 

3.2.2 계정 생성


mysql> CREATE USER 'user'@'%'
    -> IDENTIFIED WITH 'mysql_native_password' BY 'password'  -> 기본 인증 방식
    -> REQUIRE NONE
    -> PASSWORD EXPIRE INTERVAL 30 DAY
    -> ACCOUNT UNLOCK
    -> PASSWORD HISTORY DEFAULT
    -> PASSWORD REUSE INTERVAL DEFAULT
    -> PASSWORD REQUIRE CURRENT DEFAULT;
Query OK, 0 rows affected (0.03 sec)

 

위와 같이 입력을 한다면 SELECT 명령어를 통해 조회하였을 때 user 사용자가 생성된 것을 확인할 수 있다.

 

 

 

 

IDENTIFIED WITH
  • 사용자의 인증 방식비밀번호 설정
  • IDENTIFIED WITH 뒤에는 반드시 인증 방식(인증 플러그인의 이름) 명시
    • Native Pluggable Authentication
    • Caching SHA-2 Pluggable Authentication
    • PAM Pluggable Authentication
    • LDAP Pluggable Authentication
더보기
  • Native Pluggable Authentication
    :
  • Caching SHA-2 Pluggable Authentication
    :
  • PAM Pluggable Authentication
    :
  • LDAP Pluggable Authentication
    :

 

REQUIRE
  • MySQL 서버에 접속할 때 암호화된 SSL/TLS 채널 을 사용할지 여부를 설정
  • 별도 설정하지 않으면 비암호화 채널로 연결하게 됨
  • IDENTIFIED WITH에서 Caching SHA-2 Authentication 인증방식을 사용하면 암호화된 채널만으로 MySQL 서버에 접속할 수 있음
더보기

** SSL/TLS 채널

  • SSL과 TLS 모두 서버, 애플리케이션, 사용자 및 시스템 간의 데이터를 암호화하는 통신 프로토콜
  • 네트워크를 통해 연결된 두 당사자를 인증하므로 데이터를 안전하게 교환

 

PASSWORD EXPIRE
  • 비밀번호의 유효 기간을 설정하는 옵션 
    • PASSWORD EXPIRE
    • PASSWORD EXPIRE NEVER
    • PASSWORD EXPIRE DEFAULT
    • PASSWORD EXPIRE INTERVAL n DAY
더보기
    • PASSWORD EXPIRE
      :
    • PASSWORD EXPIRE NEVER
      :
    • PASSWORD EXPIRE DEFAULT
      :
    • PASSWORD EXPIRE INTERVAL n DAY
      :

 

PASSWORD HISTORY
  • 한 번 사용했던 비밀번호를 재사용하지 못하게 설정하는 옵션
PASSWORD REUSE INTERVAL
  •  
PASSWORD REQUIRE
  •  
ACCOUNT LOCK / UNLOCK
  •  

 

 

 

 

3.4 권한

3.4.1 시스템 계정과 일반 계정


 

MySQL 5.7에서는 정적 권한만 존재하지만, MySQL 8.0부터는 “정적 권한” + “동적 권한” 둘 다 존재한다.

** 정적 권한
- MySQL 서버의 소스 코드에 고정적으로 명시돼 있는 권한 (서버에 내장)
- 사용자의 역할(Role)이나 그룹(Group)에 따라 부여됨
** 동적 권한
- MySQL 서버가 시작되면서 동적으로 생성하는 권한 (런타임에 정의됨)
ex ) MySQL 서버의 컴포넌트나 플러그인이 설치되면 등록되는 권한

 

🌟 이때 , 사용자에게 권한을 부여할 때는 반드시 사용자를 먼저 생성하고 GRANT 명령으로 권한을 부여해야 한다.

 

 

 

이 권한은 "권한의 적용 범위"를 기준으로 "글로벌 권한"과 "객체 권한"으로 구분할 수 있다.

 

글로벌(Global) 권한
  • 데이터베이스나 테이블 이외의 객체에 적용되는 권한
  • GRANT 명령에서 특정 객체를 명시하지 말아야 함 → 명시는 객체 권한에서 한다 
  • ex ) 권한 범위 : 서버 관리, 파일 ..
GRANT SUPER ON *.* TO 'user'@'host';


# 특정 DB나 테이블에 부여될 수 없기 때문에 GRANT 명령의 ON절에는 항상 *.* 사용
# *.*은 모든 DB의 모든 오브젝트를 포함해서 MySQL 서버 전체를 의미 

 

객체 권한
  • 데이터베이스나 테이블을 제어하는 데 필요한 권한
  • GRANT 명령으로 권한을 부여할 때 반드시 특정 객체를 명시
  • ex ) 권한 범위 : 데이터베이스, 테이블, 인덱스, 스토어드 프로그램, 뷰, 칼럼 ..
GRANT privilege_list On db.table TO 'user'@'host';

 

 

cf ) ALL (ALL PRIVILEGES)

  • 글로벌로 ALL이 사용되면 글로벌 수준에서 가능한 모든 권한 부여
  • 특정 객체에 ALL 권한이 부여되면 해당 객체에 적용될 수 있는 모든 객체 권한 부여

 

DB 권한
GRANT EVENT ON *.* TO 'user'@'localhost';
GRANT EVENT ON employees.* TO 'user'@'localhost';


# DB 권한은 특정 DB에 대해서만 권한 부여 혹은 서버에 존재하는 모든 DB에 부여할 수 있음
# ON절에 *.* 또는 employees.*를 모두 사용 가능
# DB 내부에 존재하는 테이블, 스토어드 프로그램 모두 포함

 

 

사용 예시

1. 

 

 

2.

 

3. 

 

 

 

3.5 역할(Role)

3.5.1 시스템 계정과 일반 계정


 

1. CREATE ROLE 명령을 이용해 역할의 이름 정의

mysql> CREATE ROLE
    -> role_emp_read,
    -> role_emp_write;
Query OK, 0 rows affected (0.02 sec)

 

2. GRANT 명령을 통해 각 역할에 대해 실질적 권한 부여

mysql> GRANT SELECT ON employees.* TO role_emp_read;  # 읽기 권한만 
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT INSERT, UPDATE, DELETE ON employees.* TO role_emp_write;
Query OK, 0 rows affected (0.01 sec)

 

 

 

사용 예시

1. reader, writer 역할 계정 생성

mysql> CREATE USER reader@'127.0.0.1' IDENTIFIED BY 'qwerty';
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE USER writer@'127.0.0.1' IDENTIFIED BY 'qwerty';
Query OK, 0 rows affected (0.02 sec)

 

2. 권한 부여

GRANT role_emp_read TO reader@'127.0.0.1';
GRANT role_emp_write TO writer@'127.0.0.1';

 

3. reader 계정에 로그인 후 SET ROLE 명령을 실행해 역할 활성화

PS C:\Program Files\MySQL\MySQL Server 8.0> mysql -h 127.0.0.1 -u reader -p

mysql> SET ROLE 'role_emp_read';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT current_role();
+---------------------+
| current_role()      |
+---------------------+
| `role_emp_read`@`%` |
+---------------------+
1 row in set (0.00 sec)