MySQL 서버 업그레이드
업그레이드 방식
MySQL 서버를 업그레이드하는 방법으로는 다음의 두 가지 방법이 있다.
- 인플레이스 업그레이드 (In-Place Upgrade)
- MySQL 서버의 데이터 파일을 그대로 두고 업그레이드 하는 방법
- 여러 가지 제약 사항이 있지만 업그레이드 시간을 크게 단축할 수 있다.
- 논리적 업그레이드 (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에서는 외래키(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으로 업그레이드는 크게 두 가지 단계로 나뉘어서 처리된다.
- 데이터 딕셔너리 업그레이드
- MySQL 5.7 버전까지는 데이터 딕셔너리 정보가 FRM 확장자를 가진 파일로 별도로 보관됐었다.
- MySQL 8.0 버전부터는 데이터 딕셔너리 정보가 트랜잭션이 지원되는 InnoDB 테이블로 저장되도록 개선됐다.
- 데이터 딕셔너리 업그레이드는 기존의 FRM 파일의 내용을 InnoDB 시스템 테이블로 저장한다.
- MySQL 8.0 버전부터는 딕셔너리 데이터 버전 간 호환성 관리를 위해 테이블이 생성될 때 사용된 MySQL 서버의 버전 정보도 함께 기록한다.
- 서버 업그레이드
- 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 이하 버전으로 업그레이드할 때는 다음 절차에 따라 업그레이드를 진행했다.
- MySQL 셧다운
- MySQL 5.7 프로그램 삭제
- MySQL 8.0 프로그램 설치
- MySQL 8.0 서버(mysqld) 시작 (MySQL 서버가 데이터 딕셔너리 업그레이드를 자동 실행)
- 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 서버 프로그램이 시작되면서 자동으로 필요한 작업을 수행하기 때문에 사용자 실수를 더 줄일 수 있게 됐다.
- 모든 업그레이드 작업을 다음과 같이 순서대로 실행한다.
- MySQL 셧다운
- MySQL 5.7 프로그램 삭제
- MySQL 8.0 프로그램 설치
- MySQL 8.0 서버(mysqld) 시작
--upgrade
옵션을 이용해 데이터 딕셔너리 업그레이드를 수행할지 여부를 제어할 수 있다.
-
--upgrade
옵션은 특수한 경우를 위한 옵션이므로 꼭 필요한 경우에 사용하자.
-
--upgrade
파라미터로 다음 4가지 값을 선택할 수 있다.
파라미터 값 | 데이터 딕셔너리 업그레이드 | 서버 업그레이드 |
---|
AUTO | 필요한 경우 실행 | 필요한 경우 실행 |
NONE | X | X |
MINIMAL | 필요한 경우 실행 | X |
FORCE | 필요한 경우 실행 | 항상 실행 |
-
--upgrade
파라미터 값이이 제공되지 않으면 기본적으로 AUTO
로 설정되며, 필요한 경우 두 가지 업그레이드를 모두 자동으로 실행한다.
-
FORCE
옵션은 MySQL 서버의 시스템 테이블 구조가 잘못 변경됐거나 손상된 경우에 사용하면 된다.
Reference
참고 서적
📔 Real MySQL 8.0