Real MySQL | 설치와 설정 요약

Mec.D's Blog·2023년 4월 8일
0

버전 & 에디션 선택 가이드

MySQL 버전 선택 가이드

패치 버전이 15~20번 이상 릴리스된 버전을 골라야합니다.
ex) MySQL 8.0 버전이면 MySQL 8.0.15 이상

  • 그 이하의 버전에서는 치명적인 버그가 종종 남아있기 때문입니다.

엔터 프라이즈에서만 지원되는 기능/서비스 목록

  1. 스레드 풀
  2. Audit, TDE, Authentication
  3. Firewall, Monitor, Backup
  4. 기술 지원

MySQL 서버 설치 디렉토리

기본 디렉토리
/usr/local/mysql

디렉토리설명
binMySQL 서버와 클라이언트, 유틸리티용
data로그, 데이터 파일
inclueC/C++ 헤더 파일
lib라이브러리 파일
share다양한 지원 파일, 에러 메시지, 샘플 설정 파일




서버 시작/종료

관련 파일

파일명설명
/etc/my.cnfMySQL 실행에 필요한 3~4가지 기본 설정 포함
/var/log/mysqld.log에러 로그 파일
/tmp/mysql.sockMySQL 소켓 파일

MySQL 서버 시작 / 종료하기

  1. MySQL 설정 파일로 설치를 진행합니다.

  2. 터미널에서 mysqld --initialize-insecure 명령어를 실행합니다.

    mysqld --defaults-file=/etc/my.cnf --initialize-insecure
    • 초기 데이터 파일 생성
    • 트랜잭션 로그 (Redo.log) 생성
    • root 유저 생성 (비밀번호 X)
    • 생성된 관리자 계정의 비밀번호는 에러 로그 파일에 기록됩니다.
  3. systemctl 유틸리티로 MySQL 서버를 시작 / 종료 합니다.

    시작

    systemctl start mysqld

    종료

    systemctl stop mysqld
  4. mysqld_safe 스크립트로 서버를 시작 / 종료 할 수도 있습니다.

    my.cnf의 "[mysqld_safe]" 섹션 설정에 기반해 MySQL 서버를 시작합니다.

  5. MySQL 서버를 셧다운하고 싶다면 다음과 같이 입력합니다.

    mysql> SHUTDOWN;

트랜잭션 정상 커밋 시 서버 옵션 변경

클린 셧다운 (Clean shutdown)

MySQL 서버가 종료될 때 모든 커밋된 데이터를 파일에 적용한 뒤 종료하는 것을 말합니다.

mysql> SET GLOBAL innodb_fast_shutdown=0;
linux> systemctl stop mysqld.service
mysql> SET GLOBAL innodb_fast_shutdown=0;
mysql> SHUTDOWN;

MySQL 서버에 연결하는 3가지 방법

  1. Host가 localhost일 때

    • 항상 소켓 파일을 이용해 접속해야합니다.
    • IPC인 Unix domain socket을 써서 접속합니다. (TCP/IP X)
    mysql -uroot -p --host=localhost --socket=/tmp/mysql.sock
  2. 원격 호스트에 있는 MySQL 서버에 접속할 때

    • Host를 반드시 127.0.0.1로 지정해야합니다. (localhost X)
    • 이 경우 보통 Port 번호를 적어줍니다.
    • TCP/IP로 통신합니다.
    • 자기 서버를 가리키는 Loopback IP를 씁니다.
    mysql -uroot -p --host=127.0.0.1 --port=3306
  3. Host와 Port를 명시하지 않습니다.

    * 기본 값은 `--host=localhost` 이며, 소켓 파일을 사용합니다.
    * MySQL 서버 설정 파일에서 소켓 파일을 읽어옵니다.
    * 유닉스 소켓 파일은 MySQL 서버가 켜질 때 만들어집니다.
    
    ```bash
    mysql -uroot -p
    ```

원격 MySQL 연결 테스트

  1. Telnet 프로그램으로 확인하는 방법

    telnet 호스트 포트
  2. Netcat 프로그램으로 확인하는 방법

    nc 호스트 포트

⇒ 서버가 메시지를 출력한다면 네트워크 연결 상태는 정상입니다.



버전 업그레이드

인플레이스 업그레이드

장점

  • 업그레이드 시간을 크게 단축할 수 있습니다.

단점

  • 메이저 버전을 올릴 때는 순차적으로 업그레이드해야합니다.
    ex) 5.55.78.0 (5.7 버전을 건너뛸 수 없습니다.)
  • GA 버전이 아니면 다음 메이저 버전으로 업그레이드 할 수 없는 경우도 있습니다.

논리적 업그레이드

장점

  • 버전 간 제약 사항이 거의 없습니다.

단점

  • 업그레이드 시간이 매우 많이 걸릴 수 있습니다.



MySQL 5.7 → 8.0 업그레이드 시 주의 사항

주의 항목설명
사용자 인증 방식5.0 : Native Authentication
8.0 : Caching SHA-2 Authentication
인증 방식 유지 옵션 (--default-authentication-plugin=mysql_native_password)
호환성업그레이드 전 mysqlcheck로 호환성 체크를 진행하세요.
(손상된 FRM 파일, 데이터 타입 또는 함수의 호환 여부 확인)
외래키명 길이8.0부터는 외래키명 길이 제한이 64글자로 줄어듭니다.
긴 외래키명이 있는지 확인하고 수정하세요.
인덱스 힌트8.0부터는 인덱스 힌트가 성능 저하를 유발할 수 있으니 꼭 확인하세요.
Group by 정렬 옵션8.0부터는 GROUP BY절에 ASC, DESC 를 써도 정렬되지 않습니다.
파티션
테이블스페이스
8.0부터는 파티션의 테이블스페이스를 개별 스페이스에 저장해야 합니다.
공용 테이블스페이스에 저장할 수 없습니다.




MySQL 8.0 업그레이드

MySQL 5.78.0 버전 업그레이드는 총 2단계에 걸쳐 진행됩니다.


1단계 : 데이터 딕셔너리 업그레이드를 진행합니다.

5.7 에서는 FRM 확장자로 저장됐었는데
8.0 에서는 InnoDB 테이블에 저장되도록 변경돼 트랜잭션이 적용됩니다.


2단계: MySQL 서버 업그레이드로 마무리합니다.

시스템 데이터베이스와
(performance_schema, information_schema, mysql)
테이블 구조가 8.0 버전에 맞게 변경됩니다.


MySQL 8.0.15 이하 버전 업그레이드 절차

  1. MySQL SHUTDOWN 시키기

  2. MySQL 5.7 삭제 후 → 8.0 설치

  3. mysqld로 MySQL 8.0 서버 기동
    서버 실행 시 데이터 딕셔너리가 자동 업데이트됩니다.

  4. mysql_upgrade 유틸리티 실행
    테이블 구조가 8.0에 맞게 변경됩니다.

MySQL 8.0.16 이상 버전 업그레이드 절차

  1. MySQL SHUTDOWN 시키기

  2. MySQL 5.7 삭제 후 → 8.0 설치

  3. mysqld로 MySQL 8.0 서버 기동
    서버 실행 시 데이터 딕셔너리뿐만 아니라
    테이블 구조까지 자동으로 업데이트됩니다.


왜 이렇게 바뀐걸까요❓

유저들이 mysql_upgrade 유틸리티 실행을 자꾸 까먹어서 그냥 자동화했다고 합니다.



MySQL 설정 파일 (my.cnf)

Windows에서는 my.ini 파일로 설정합니다.


특징

  1. MySQL 서버를 시작할 때만 → 설정 파일을 참조합니다.
  2. 설치 방법에 따라 설정 파일을 읽어오는 경로가 달라집니다.

설정 파일 참조 경로

# 설정 파일 참조 경로 확인 명령어
mysqld --verbose --help

위 명령어를 실행하면
아래와 같이 설정 파일 참조 순서에 따라 참조 경로를 출력합니다.

# 출력
...
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
...
  • LTR (Left to Right) 방향으로 참조가 일어납니다.

  • 1, 2, 4번 경로는 고정적으로 동일합니다.

  • 3번째 경로 /usr/etc/my.cnf 는 컴파일될 때 결정되므로, 사용자마다 달라질 수 있습니다.

my.cnf 파일의 형식


주요 구성요소는 다음과 같습니다.
  • [설정 그룹]
  • key = value

위 요소들을 이용해
하나의 파일에 여러 개의 설정 그룹을 만들 수 있습니다.

[mysqld] # 설정 그룹
socket = /usr/local/mysql/tmp/mysql.sock
port = 3306

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

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

MySQL 시스템 변수

시스템 변수 확인 방법

SHOW GLOBAL VARIABLES;

시스템 변수 속성 목록표

속성명설명
Cmd-Line커맨드 라인으로 설정할 수 있는 옵션인지?
Option Filemy.cnf로 제어할 수 있는 옵션인지?
System Var시스템 변수인지?
Var Scope옵션의 영향 범위는 어디까지인지?
Global, Session, Both
Dynamic동적 시스템 변수인지?

변수 스코프 상세 설명

  1. 글로벌 변수

    한 대의 MySQL 서버 인스턴스 전체 범위에 영향을 미칩니다.

    • MySQL 서버 설정 관련 변수가 많습니다.
      ex) innodb_buffer_pool_size, key_buffer_size

  2. 세션 변수

    오직 현재 클라이언트의 커넥션에만 영향을 미칩니다.

    • MySQL 개별 클라이언트가 갖는 옵션 기본 값을 설정합니다.
      ex) autocommit = ON/OFF

    • 커넥션별로 값을 다르게 지정할 수 있습니다.

    • 한 번 연결된 커넥션의 세션 변수를 서버 측에서 강제로 변경할 수 없습니다.

  3. Both

    값 변경 시 범위를 명시해줘야 합니다.

    • Global인지 Session인지

정적 변수와 동적 변수 설명


MySQL 서버가 돌아가고 있을 때

수정 가능하면?    동적 변수
그렇지 않으면?    정적 변수 입니다.

  • my.cnf 변경은 서버를 재시작할 때까지 반영되지 않습니다.

  • MySQL 서버 메모리 상의 변수를 수정하면 즉각 반영됩니다.
    🚨 단, 서버의 현재 인스턴스에만 적용되고 재시작 시 변경 사항이 날아갑니다.

    변경사항을 반영하려면 SET PERSIST 명령을 이용해 my.cnf 파일에 기록해야합니다.

# 예시
SET GLOBAL max_sonnections=500; # 글로벌 시스템 변수 변경

SHOW GLOBAL VARIABLES LIKE '%max_connections%' # 변경된 값 조회

SET PERSIST max_connections=500; # 변경 사항을 my.cnf 파일에 반영
  • MB, GB 같은 단위 대신 SET 명령에 1024*1024 같은 수식을 사용할 수 있습니다.
profile
기술로 삶을 디자인하는 개발자 Mec.D 입니다

0개의 댓글