MySQL 서버 업그레이드

공부하는 감자·2024년 4월 10일
0

MySQL

목록 보기
47/74
post-thumbnail

MySQL 서버 업그레이드

업그레이드 방식

MySQL 서버를 업그레이드하는 방법으로는 다음의 두 가지 방법이 있다.

  1. 인플레이스 업그레이드 (In-Place Upgrade)
    • MySQL 서버의 데이터 파일을 그대로 두고 업그레이드 하는 방법
    • 여러 가지 제약 사항이 있지만 업그레이드 시간을 크게 단축할 수 있다.
  2. 논리적 업그레이드 (Logical Upgrade)
    • mysqldump 도구 등을 이용해 MySQL 서버의 데이터를 SQL 문장이나 텍스트 파일로 덤프한 후, 새로 업그레이드된 버전의 MySQL 서버에서 덤프된 데이터를 적재하는 방법
    • 버전 간 제약 사항이 거의 없지만 업그레이드 시간이 매우 많이 소요될 수 있다.

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

💡 Semantic Versioning (SemVer)

버전 숫자를 “MAJOR.MINOR.PATCH”로 표현한다.
1. MAJOR : 기존 버전과 호환되지 않게 API가 바뀌면 올라간다.
2. MINOR : 기존 버전과 호환되면서 새로운 기능을 추가할 때 올라간다.
3. PATCH : 기존 버전과 호환되면서 버그를 수정했을 때 올라간다.

명세: Semantic Versioning 2.0.0
한국어 번역 명세:유의적 버전 2.0.0

마이너(패치) 버전 간 업그레이드

  • 동일 메이저 버전에서 마이너 버전 간 업그레이드는 대부분 데이터 파일의 변경 없이 진행된다.
  • 많은 경우 여러 버전을 건너뛰어서 업그레이드하는 것도 허용된다.
    • 예를 들어, MySQL 8.0.16 버전에서 MySQL 8.0.21 버전으로 업그레이드할 때는 MySQL 서버 프로그램만 재설치하면 된다.

메이저 버전 간 업그레이드

  • 메이저 버전 간 업그레이드는 데이터 파일의 패치가 필요하다.
  • 대부분 크고 작은 데이터 파일의 변경이 필요하기 때문에 반드시 직전 버전에서만 업그레이드가 허용된다.
    • 예를 들어, MySQL 5.5 버전에서 MySQL 5.6 버전으로는 업그레이드가 가능하지만 MySQL 5.7이나 MySQL 8.0으로 업그레이드는 지원하지 않는다.
    • MySQL 8.0 서버 프로그램은 직전 메이저 버전인 MySQL 5.7 버전에서 사용하던 데이터 파일과 로그 포맷만 인식하도록 구현되기 때문이다.
  • 상당히 번거로운 과정이므로, 두 단계 이상을 한 번에 업그레이드해야 한다면 ‘논리적 업그레이드’가 더 나은 방법일 수도 있다.

주의 사항

  • 메이저 버전 업그레이드가 특정 마이너 버전에서만 가능한 경우도 있다.
    • MySQL 5.7.8 버전은 GA(General Availability) 버전이 아니기 때문에 MySQL 8.0 버전으로 바로 업데이트할 수 없다.
    • GA 버전은 오라클에서 MySQL 서버의 안전성이 확인된 버전이라는 것을 의미한다.
    • 새로운 버전의 MySQL 서버를 선택할 때도 최소 GA 버전은 지나서 15~20번 이상의 마이너 버전을 선택하는 것이 좋다.
  • 항상 메이저 버전을 업그레이드 할 때는 MySQL 서버의 매뉴얼을 정독한 후 진행할 것을 권장한다.
    • 특정 경우에는 이전 메이저 버전에서도 가장 최근의 마이너 버전에서만 인플레이스 업그레이드가 지원될 수 있다.

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

MySQL 8.0 에서는 상당히 많은 기능들이 개선되거나 변경됐다.

그 중에서도 MySQL 5.7 버전과 8.0 버전의 기본적인 부분의 차이점과 MySQL 8.0에서는 사용할 수 없는 기능들이 몇 가지 있다.

그래서 반드시 MySQL 8.0으로 업그레이드하기 전에 아래 내용이 영향을 미치지 않는지 검토해 보는 것이 좋다.

  • 사용자 인증 방식 변경
    • MySQL 8.0 버전부터는 Caching SHA-2 Authentication 인증 방식이 기본 인증 방식으로 바뀌었다.
    • MySQL 5.7에 존재했던 사용자 계정은 여전히 Native Authentication 인증 방식을 사용한다.
    • MySQL 8.0 버전에서 별도의 옵션 없이 생성되는 사용자 계정은 Caching SHA-2 Authentication 인증 방식을 사용한다.
    • 만약 Native Authentication을 계속 사용하고자 한다면 MySQL 서버를 시작할 때 --default-authentication-plugin=mysql_native_password 파라미터를 활성화하면 된다.
  • MySQL 8.0 과의 호환성 체크
    • MySQL 8.0 업그레이드 전에 MySQL 5.7 버전에서 손상된 FRM 파일이나 호환되지 않는 데이터 타입 또는 함수가 있는지 mysqlcheck 유틸리티를 이용해 확인해 볼 것을 권장한다.

      ## mysqlcheck 유틸리티 실행 방법
      mysqlcheck -u root -p --all-databases --check-upgrade
  • 외래키 이름의 길이
    • MySQL 8.0에서는 외래키(Foreign Key)의 이름이 64글자로 제한된다.

    • 기존의 MySQL 서버에서 외래키 이름이 64글자 이상인 것이 있는지 확인하고 필요 시 변경해야 한다.

      -- 외래키 이름의 길이 체크
      SELECT TABLE_SCHEMA, TABLE_NAME
      FROM information_schema.TABLES
      WHERE TABLE_NAME IN
      	(SELECT LEFT(SUBSTR(ID,INSTR(ID,'/')+1),
      					INSTR(SUBSTR(ID,INSTR(ID,'/')+1),
      					'_ibfk_')-1)
      	FROM information_schema.INNODB_SYS_FOREIGN
      	WHERE LENGTH(SUBSTR(ID, INSTR(ID, '/')+1))>64);
  • 인덱스 힌트
    • MySQL 5.x에서는 성능 향상에 도움이 됐지만 MySQL 8.x에서는 오히려 성능 저하를 유발할 수도 있다.
    • MySQL 5.x에서 사용되던 인덱스 힌트가 있다면 MySQL 8.0에서 먼저 성능 테스트를 수행하도록 하자.
  • GROUP BY에 사용된 정렬 옵션
    • MySQL 5.x에서 GROUP BY 절의 칼럼 뒤에 ‘ASC’나 ‘DESC’를 사용하고 있다면 먼저 제거하거나 다른 방식으로 변경해야 한다.
  • 파티션을 위한 공용 테이블스페이스
    • MySQL 8.x에서는 파티션의 각 테이블스페이스를 공용 테이블스페이스에 저장할 수 없다.

    • 파티션의 테이블스페이스가 공용 테이블스페이스에 저장된 것이 있는지 먼저 확인하고, 있다면 ALTER TABLE ... REORGANIZE 명령을 실행해 개별 테이블스페이스를 사용하도록 변경해야 한다.

      -- 공용 테이블스페이스에 저장된 파티션이 있는지 체크
      SELECT DISTINCT NAME, SPACE, SPACE_TYPE
      FROM information_schema, INNODB_SYS_TABLES
      WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE '%Single%';

MySQL 8.0 업그레이드

업그레이드 단계

MySQL 5.7에서 MySQL 8.0으로 업그레이드는 크게 두 가지 단계로 나뉘어서 처리된다.

  1. 데이터 딕셔너리 업그레이드
    • MySQL 5.7 버전까지는 데이터 딕셔너리 정보가 FRM 확장자를 가진 파일로 별도로 보관됐었다.
    • MySQL 8.0 버전부터는 데이터 딕셔너리 정보가 트랜잭션이 지원되는 InnoDB 테이블로 저장되도록 개선됐다.
    • 데이터 딕셔너리 업그레이드는 기존의 FRM 파일의 내용을 InnoDB 시스템 테이블로 저장한다.
    • MySQL 8.0 버전부터는 딕셔너리 데이터 버전 간 호환성 관리를 위해 테이블이 생성될 때 사용된 MySQL 서버의 버전 정보도 함께 기록한다.
  2. 서버 업그레이드
    • MySQL 서버의 시스템 데이터베이스의 테이블 구조를 MySQL 8.0 버전에 맞게 변경한다.
    • 시스템 데이터베이스: performance_schema와 informaion_schema, 그리고 mysql 데이터베이스

MySQL 8.0.15 이하 버전으로 업그레이드

  • MySQL 8.0.15 버전까지는 각 작업은 다음 프로그램이 실행했다.
    • ‘데이터 딕셔너리 업그레이드’ 작업: MySQL 서버(mysqld) 프로그램이 실행
    • ‘서버 업그레이드’ 작업: mysql_upgrade 프로그램이 실행
  • MySQL 5.7 버전에서 MySQL 8.0.15 이하 버전으로 업그레이드할 때는 다음 절차에 따라 업그레이드를 진행했다.
    1. MySQL 셧다운
    2. MySQL 5.7 프로그램 삭제
    3. MySQL 8.0 프로그램 설치
    4. MySQL 8.0 서버(mysqld) 시작 (MySQL 서버가 데이터 딕셔너리 업그레이드를 자동 실행)
    5. mysql_upgrade 프로그램 실행 (mysql_upgrade 프로그램이 시스템 테이블의 구조를 MySQL 8.0에 맞게 변경)

MySQL 8.0.16 버전부터 업그레이드

  • MySQL 8.0.16 부터는 mysql_upgrade 유틸리티가 없어지고, MySQL 서버 프로그램(mysqld)이 시작됐다.
    • MySQL 서버가 데이터 딕셔너리 업그레이드를 실행 후, 시스템 테이블의 구조를 MySQL 8.0에 맞게 변환
    • MySQL 서버가 업그레이드됐다면 MySQL 서버 프로그램이 시작되면서 자동으로 필요한 작업을 수행하기 때문에 사용자 실수를 더 줄일 수 있게 됐다.
  • 모든 업그레이드 작업을 다음과 같이 순서대로 실행한다.
    1. MySQL 셧다운
    2. MySQL 5.7 프로그램 삭제
    3. MySQL 8.0 프로그램 설치
    4. MySQL 8.0 서버(mysqld) 시작
  • --upgrade 옵션을 이용해 데이터 딕셔너리 업그레이드를 수행할지 여부를 제어할 수 있다.
    • --upgrade 옵션은 특수한 경우를 위한 옵션이므로 꼭 필요한 경우에 사용하자.

    • --upgrade 파라미터로 다음 4가지 값을 선택할 수 있다.

      파라미터 값데이터 딕셔너리 업그레이드서버 업그레이드
      AUTO필요한 경우 실행필요한 경우 실행
      NONEXX
      MINIMAL필요한 경우 실행X
      FORCE필요한 경우 실행항상 실행
    • --upgrade 파라미터 값이이 제공되지 않으면 기본적으로 AUTO 로 설정되며, 필요한 경우 두 가지 업그레이드를 모두 자동으로 실행한다.

    • FORCE 옵션은 MySQL 서버의 시스템 테이블 구조가 잘못 변경됐거나 손상된 경우에 사용하면 된다.

Reference

참고 서적

📔 Real MySQL 8.0

profile
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.

0개의 댓글