난중일기/Back

[Real MySQL 8.0] 1~3장

모집사 2024. 1. 25. 00:35
728x90
반응형

이전 회사에서는 MSSQL, 오라클(Tibero)만 사용하다가, MySQL을 사용하게 되어 공부를 시작하게 되었다.

ORM, FRM같은 도구들이 나와서 직접적으로 쿼리를 짜거나 DBMS에 대해서 몰라도 개발은 가능하지만, 처리 방식을 이해하고 있는 개발자가 더 경쟁력 있을 것이라고 생각되어 공부를 하게 되었다.

 

1. 소개

  • MySQL 8.0은 5.5~5.7 버전까지의 안정화, 성능 개선을 거쳐 상용 DBMS가 가지고 있는 기능이 장착되었다.
  • 다른 DBMS와 비교했을 때 MySQL의 경쟁력은 비용이다. 

 

2. 설치와 설정

  • MySQL 서버는 오픈 코어 방식(핵심 나용은 엔터프라이즈 에디션과 커뮤니티 에디션이 모두 동일하고, 특정 부가 기능들만 엔터프라이즈 에디션에 포함되는 방식)이다.
  • MySQL Percona : MySQL 커뮤니티 에디션을 가지고 부가적인 도구를 제공하는 배포판
  • MySQL 8.0 업그레이드 시 고려사항 : 사용자 인증 방식 변경, MySQL 8.0과의 호환성 체크(mysqlcheck 유틸리티를 통해 확인 가능), 외래키 이름 길이가 64자로 제한, 인덱스 관련 성능 테스트, GROUP BY에 사용된 정렬 옵션 확인, 파티션을 위한 공융 테이블 스페이스를 개별 테이블 스페이스 사용하도록 수정
  • 글로벌 변수와 세션 변수
    - 글로벌 변수 : 하나의 MySQL 서버 인스턴스에서 전체적으로 영향을 미치는 시스템 변수를 의미한다. eg. innodb_buffer_pool_size
    - 세션 변수 : MySQL 클라이언트가 MySQL 서버에 접속할 때 기본으로 부여하는 옵션의 기본값을 제어하는 데에 사용한다. eg. autocommit
  • MySQL 서버의 시스템 변수는 서버가 기동 중인 상태에서 변경 가능한지 여부에 따라 동적변수와 정적변수로 구분된다.
  • SET 명령을 통해 변경되는 시스템 변수는 설정파일에 반영되는 것이 아니기 때문에, 서버가 재기동 되면 해당 내용이 초기화된다. 이 때 사용할 수 있는 명령이 SET PERSIST이다.
  • SET PERSIST명령을 실행하면 서버가 재기동 되어도 해당 설정이 유지된다. 그러나 해당 명령어가 my.ini, my.cnf같은 파일에 저장되는 것은 아니고, mysqld-auto.cnf파일에 기록된다.
  • mysqld-auto.cnf 파일의 내용을 수정하고자 할 때는 파일을 직접적으로 고치는 것이 아니라, RESET PERSIST 명령을 사용하는 것이 안전하다.

 

3. 사용자 및 권한

  • MySQL의 사용자 계정은 단순히 사용자의 아이디뿐 아니라 해당 사용자가 어느 IP에서 접속하고 있는지도 확인한다.

3.1 사용자 식별

  • MySQL에서 계정을 언급할 때에는 항상 아이디와 호스트를 함께 명시해야 한다.
  • 만약 모든 IP에서 접속이 가능한 계정을 생성하고 싶다면 IP대신 % 문자를 넣는다.
'svc_id'@'127.0.0.1'
'svc_id'@'%'

 

3.2 사용자 계정 관리

  • MySQL 8.0부터 계정은 SYSTEM_USER 권한을 가지고 있느냐 아니냐에 따라 시스템 계정과 일반 계정으로 구분된다.
  • MySQL 8.0부터 계정의 생성은 CREATE USER 명령을 사용하고, 권한 부여는 GRANT 명령으로 구분해서 실행하도록 한다.
  • MySQL 8.0부터는 기본 인증이 Caching SHA-2 Authentication으로 바뀌었다. 그런데 이 방식은 5000번 이상의 암호 해시를 실행해야 해서 서버 CPU를 많이 소모하게 된다. 만약 MySQL 8.0에서 기존 5.7버전의 기본 인증 방식인 Native Authentication을 사용하고 싶다면 MySQL설정을 변경하거나 my.cnf 설정 파일에 설정을 추가하면 된다.
  • 비밀번호 관련 옵션들
    - PASSWORD EXPIRE : 비밀번호의 유효 기간을 설정하는 옵션
    - PASSWORD HISTORY : 한번 사용했던 비밀번호를 재사용하지 못하게 하는 옵션
    - PASSWORD REUSE INTERVAL : 한번 사용했던 비밀번호의 재사용 금지 기간을 설정하는 옵션
    - PASSWORD REQUIRE : 비밀번호가 만료되어 새로운 비밀번호로 변경할 때 현재 비밀번호를 필요로 할지 말지를 정하는 옵션

3.3 비밀번호 관리

  • MySQL 서버에서 비밀번호의 유효성 체크 규칙을 적용하려면 validate_password 컴포넌트를 이용해야 한다(설치 필요).
  • MySQL 5.7까지는 validate_password가 플러그인 형태로 제공되었지만, 8.0버전부터는 컴포넌트 형태로 제공된다.
mysql> INSTALL COMPONENT 'file://component_validate_password';
  • 비밀번호 정책은 아래 3가지중 선택이 가능하고, 기본값은 MEDIUM이다.
    - LOW : 비밀번호 길이만 검증
    - MEDIUM : 비밀번호 길이 검증, 숫자 + 대소문자 + 특수문자 배합을 검증
    - STRONG : MEDIUM 레벨의 검증을 모두 수행하고, 금칙어가 포함되었는지 여부까지 검증(금칙어는 validate_password.dictionary_file 시스템 변수에 설정된 사전 파일에 명시된 단어를 포함하고 있는지 검색한다.)
  • MySQL 8.0부터는 계정의 비밀번호로 2개의 값을 동시에 사용할 수 있는 기능을 추가했다.

3.4 권한

  • 데이터베이스나 테이블 이외의 객체에 적용되는 권한을 글로벌 권한이라고 하며, 데이터베이스나 테이블을 제어하는 데 필요한 권한을 객체 권한이라 한다.

3.5 역할

  • MySQL 8.0부터 권한을 묶어서 역할을 사용할 수 있게 되었다. 서버 내부적으로 역할은 계정과 똑같은 모습을 하고 있다.
  • 하나의 사용자 계정에 다른 사용자 계정이 가진 권한을 병합해서 권한 제어가 가능해졌다.
  • 계정과 역할이 내외부적으로 동일한 객체인데, CREATE USER, CREATE ROLE 명령을 굳이 구분한 이유는 데이터베이스 관리의 직무를 분리할 수 있도록 해서 보안을 강화하는 용도로 사용될 수 있게 하기 위해서다.
  • 계정의 기본 역할과 역할에 부여된 역할 관계 그래프를 보려면 아래 테이블을 참조한다.
    - mysql.default_roles : 계정별 기본 역할
    - mysql.role_edges : 역할에 부여된 역할 관계 그래프
728x90
반응형