[Real MySQL 8.0] 2.3 ~ 2.4.1 MySQL 서버 업그레이드와 설정

2023. 4. 18. 12:06도서


💡Real MySQL 8.0 도서 학습하기

2.3 MySQL 서버 업그레이드

MySQL 서버를 업그레이드 하는 방법은 두 가지가 존재.

  1. MySQL 서버의 데이터 파일을 그대로 두고 업그레이드 → 인플레이스 업그레이드
  2. mysqldump 도구 등을 이용해서 MySQL 서버의 데이터를 SQL 문장이나 텍스트 파일로 덤프한 후, 새로 업그레이드된 버전의 MySQL 서버에서 덤프된 데이터를 적재하는 방법 → 논리적 업그레이드

 

2.3.1 인플레이스 업그레이드 제약사항

인플레이스 업그레이드를 하는 경우에 속도가 빠르지만 제약사항이 존재함.

  • 일단 마이너 버전 간의 업그레이드는 그냥 인플레이스 업그레이드를 하면 됨. (8.0.16 → 8.0.21)
  • 하지만 메이저 버전 간의 업그레이드는 제약이 존재 (5.5 → 5.6)
    • 하나의 버전이 아니라 두개의 버전을 뛰어넘는 경우 (5.5 → 8.0) 먼저 5.6으로 바꾸고 5.7로 바꾸고 8.0으로 바꿀 수 있음 → 이전 버전에서 사용하던 데이터 파일과 로그 포맷만 인식하도록 구현되어있음.
    • 그래서 이런 경우엔 mysqldump 등을 이용해서 덤프하고 새로 업그레이된 버전의 서버에서 이를 적재하는 방법이 나음.
  • 그리고 메이저 버전 업그레이드가 특정 마이너 버전에서만 가능한 경우가 존재.
    • 예를 들면, 5.7.8 버전에서 8.0으로 바로 업그레이드 할 수 없는데 그 이유가 GA 버전이라서 안정성이 확인되지 않아 업그레이드 불가능 → 15.~ 20 버전처럼 GA 버전은 지난 마이너 버전을 선택하는 것이 좋음.

2.3.2 MySQL 8.0 업그레이드 시 고려 사항

  • 사용자 인증 방식 변경 : 기존엔 Native Authentication 인증 방식을 사용했지만 8.0에선 Caching SHA-2 Authentication 인증 방식을 사용함. → 서버 시작 시 —default-authentication-plugin=mysql_native_password 파라미터를 활성화하면 이전 인증 방식 이용 가능.
  • MySQL 8.0과 호환성 체크 : 이전 버전에서의 손상된 FRM 파일이나 호환되지 않는 데이터 타입 혹은 함수가 있는지 mysqlcheck 유틸리티를 통해 확인해볼 것을 권장.
  • 인덱스 힌트 : MySQL 8.0에서 오히려 성능이 떨어질 수 있음.
  • GROUP BY에 사용된 정렬 옵션 : 이는 제거하거나 다른 방식으로 변경.
  • 파티션을 위한 공용 테이블스페이스 : 파티션의 테이블스페이스가 공용 테이블스페이스에 저장된 것이 있는지 먼저 확인 후 있다면 ALTER TABLE … REORANIZE 명령을 실행해 개별 테이블스페이스 사용하도록 변경.
  • mysqlcheck -u root -p —all-databases —check-upgrade 을 하면 각 스키마에 대해서 위와 같이 upgrade 가능 여부를 출력.

2.3.3 MySQL 8.0 업그레이드

MySQL 8.0.16부터는 mysql_upgrade 유틸리티가 없어지고 ‘데이터 딕셔너리 업그레이드’와 ‘서버 업그레이드’를 순서대로 실행.

  1. MySQL 셧다운
  2. MySQL 5.7 프로그램 삭제
  3. MySQL 8.0 프로그램 설치
  4. MySQL 8.0 서버(mysqld) 시작 (MySQL 서버가 데이터 딕셔너리 업그레이드를 실행 후, 시스템 테이블 구조를 MYSQL 8.0에 맞게 변환)

2.4 서버 설정

일반적으로 MySQL 서버는 하나의 설정파일을 이용하고 리눅스 계열에서는 my.cnf, 윈도우 계열에서는 my.ini.

서버가 시작될 때 이 설정파일을 읽어오는데 경로가 고정되어 있지많아서 지정된 여러 개의 디렉터리를 순차적으로 탐색하면서 처음 발견된 설정파일을 사용하게 됨.

  • mysqld —verbose —help 명령어를 통해서 어느 위치에 설정파일이 있는지 확인 가능.
    • 이미 만약 서버가 실행중인데 mysqld 명령어를 통해서 다시 mysqld 프로그램을 시작한다거나 하지 않도록 주의해야함.
  • 그래서 mysql 클라이언트 프로그램으로 확인해보는 것이 좋음. mysql —help
    • 해당 명령어에서도 확인할 수 있음

위에서 명령어를 치면 진짜 많은 내용들이 출력됨. 그리고 위에서 보면 어떤 순서로 my.ini, my.cnf 파일을 찾는지 볼 수 있음.

  1. C:/Windows/my.ini/
  2. C:/Windows/my.cnf/
  3. C:/my.ini/
  4. C:/my.cnf/
  5. C:/Program Files/MySQL/MySQL Server 8.0/my.ini/
  6. C:/Program Files/MySQL/MySQL Server 8.0/my.cnf/

실제 설정 파일은 하나만 사용하는데 설정 파일이 위치한 디렉터리는 여러 곳일 수 있고 먼저 탐색되는 설정 파일을 이용. → 혼란스럽고 어떤 파일을 참조해서 기동햇는지 알아내기가 쉽지 않아서 해당 예제의 명령을 통해서 우선순위를 확인하는 것이 좋음.

  1. /etc/my.cnf
  2. /etc/mysql/my.cnf
  3. /usr/etc/my.cnf
  4. ~/.my.cnf

리눅스 계열은 위와 같고 1, 2, 4 파일은 어느 MySQL이나 공통 검색 경로.

주로 1, 2번 경로에서 MySQL 서버용 설정 파일을 사용 → 하나의 장비에 2개 이상의 MySQL 서버(인스턴스) 실행 → 1,2번은 충돌 가능 → 공유된 디렉터리가 아닌 별도 디렉터리에 설정 파일 준비하고 MySQL 시작 스크립트의 내용을 변경하는 방법 사용 → But, 하나의 서버에 2개의 인스턴스를 이용하는 경우가 거의 없음.

2.4.1 설정 파일의 구성.

MySQL 설정 파일은 여러 개의 설정 그룹을 담을 수 있음. 대체로 실행 프로그램 이름을 그룹명으로 사용.

[mysqld_safe]
malloc_lib = /opt/lib/libtcmalloc_minimal.so

[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
  • mysqld_safe 프로그램은 mysqld_safe와 mysqld 섹션을 참조.
  • mysqld 프로그램은 설정 그룹의 이름이 mys션을 참조.

위 예제에선 간략한 MySQL 설정 파일 구성을 보여주고 MySQL 서버 만을 위한 설정이라면 사실 mysqld에 관해서만 명시해도 무방.

mysql 클라이언트나 백업을 위해서도 이 설정파일을 이용하고 싶다면 그룹으로 설정할 수 있음. 일반적으로 각 설정이 성격이 상이하기 때문에 예제처럼 중복되는 설정을 하는 경우는 드물지만 socket이나 port 같은 설정은 모든 프로그램에 공통으로 필요한 설정값이기에 각 설정 그룹에 여러번 설정된 것.

mysql 서버(mysqld)는 3306 포트를 사용하고 mysql 클라이언트(mysql) 프로그램은 3304번 포트를 이용해 MySQL 서버에 접속하려 할 것, 즉, 설정 파일의 각 그룹은 같은 파일을 공유하지만 서로 무관하게 적용됨.


마무리

솔직하게 크게 와닿는 파트는 아니고 '아 그렇구나. MySQL 서버를 업그레이드하거나 설정할 때 이런 부분을 조심하고 살펴봐야겠구나' 정도를 느꼈던 것 같음. 따라 쳐보니까 그래도 눈으로 보여지는 부분이 있어서 더 이해하는데 쉬웠음.

정리하면 MySQL 서버를 업그레이드할 때 업그레이드 하는 방법이 두 가지 있는데 인플레이스 업그레이드와 논리적 업그레이드가 존재하고 마이너 버전을 업그레이드하거나 메이저 버전에서도 한 단계만 업그레이드하면 인플레이스 업그레이드를 사용해도 되지만 메이저 버전을 두 단계이상 업그레이드 한다면 논리적 업그레이드 방식으로 하는게 좋음.

MySQL 서버를 설정할 때 설정파일 하나만을 이용하게 되는데 어떤 설정 파일의 우선 순위가 높을까를 보기 위해서 mysql --help를 통해서 어떤 우선순위를 가지는지를 확인하는 것이 좋음. 그리고 그 설정파일에서도 내부적으로 그룹을 이용해서 각 프로그램마다의 설정을 다르게 가져갈수도 있음.

 

Reference

http://www.yes24.com/Product/Goods/103415627