> mysql -uroot -p --host=localhost --socket=/tmp/mysql.sock
> mysql -uroot -p --host=127.0.0.1 --port=3306
> mysql -uroot -p
MySQL 서버 업그레이드에는 크게 2가지 방법이 있다.
1번 방법을 ‘인플레이스 업그레이드, In-Place Upgrade’ 라고 하고,
2번 방법을 ‘논리적 업그레이드, Logical Upgrade’라고 한다.
1번 방법(인플레이스 업그레이드)은 여러 가지 제약 사항이 있지만 업그레이드 시간을 크게 단축시킬 수 있는 반면, 2번 방법(논리적 업그레이드)은 버전 간 제약 사항이 거의 없지만, 업그레이드 시간이 많이 소요될 수 있다.
우선 업그레이드에는 마이너 버전 업그레이드와 메이저 버전 업그레이드가 있다.
마이너 버전 업그레이드할 때에는 MySQL 서버 프로그램에만 재설치하면 된다.
하지만 메이저 버전 간 업그레이드는 크고 작은 데이터 파일의 변경이 필요하기 때문에, 반드시 직전 버전에서만 업그레이드가 허용된다. 예를 들어, MySQL 5.5 버전에서 MySQL 5.6 버전으로는 업그레이드가 가능하지만, MySQL 5.5 버전에서 MySQL 5.7로 건너뛰거나, MySQL 8.0으로 한번에 업그레이드 하는 것은 지원하지 않는다.
메이저 버전 업그레이드는 데이터 파일의 패치가 필요한데, MySQL 8.0 서버 프로그램은 직전 메이저 버전인 MySQL 5.7 버전에서 사용하던 데이터 파일과 로그 포맷을 인식하도록 구현되기 때문이다.
즉, 현재 MySQL 5.1 서버를 사용하고 있는데, MySQL 8.0으로 업그레이드해야 한다면 MySQL 5.1 버전에서 MySQL 5.5 버전으로 업그레이드 한 후, MySQL 5.6으로 업그레이드 한 후, 다시 MySQL 5.6버전에서 5.7버전으로 업그레이드를 하면, 드디어 여기서 MySQL 8.0으로 업그레이드를 진행할 수 있다.
이렇게 글로 보더라도 상당히 번잡하고 힘이 드는 업그레이드 과정이다.
만약 이렇게 여러 단계를 이상을 거쳐 한번에 업그레이드를 해야 한다면 mysqldump 프로그램으로 MySQL 서버에서 데이터를 백업받은 후 새로 구축된 MySQL 8.0 서버에 데이터를 적재하는 ‘논리적 업그레이드’ 즉, 위의 2번방법이 더 나은 방법일 수 있다.
두번째 제약사항은, 메이저 버전 업그레이드가 특정 마이너 버전에서만 가능한 경우이다.
MySQL 5.7.8 버전을 사용 중인데, MySQL 8.0 버전으로 바로 업그레이드할 수 없다. 이 경우라면, MySQL 5.7.8 버전이 GA(General Availability) 버전이 아니기 때문이다.
GA 버전은 Oracle에서 MySQL 서버의 안정된 버전이라는 것을 의미한다. 새로운 버전의 MySQL 서버를 선택할 때도 최소 GA 버전은 지나서 15~20번 이상의 마이너 버전을 선택하는 것이 좋다.
그리고 특정 경우에는, 이전 메이저 버전에서도 가장 최근의 마이너 버전에서만 인플레이스 업그레이드가 지원될 수도 있으니, 항상 메이저 버전 업그레이드를 할 때에는 MySQL 서버의 메뉴얼을 잘 읽고 선택을 해야할 것 같다.
MySQL 5.7 버전과 MySQL 8.0 버전의 기본적인 부분의 차이점과 MySQL 8.0 버전에서는 사용할 수 없는 기능들이 몇가지가 있다. 아래 내용을 통해서 변경을 해도 영향을 미치지 않는지 검토해볼 수 있다.
사용자 인증 방식 변경
MySQL 8.0과의 호환성 체크
외래키 이름의 길이
-- 외래키 이름의 길이 체크
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);
인덱스 힌트
SELECT *
FROM employees
FORCE INDEX (idx_last_name)
WHERE last_name = 'CHA';
SELECT *
FROM employees
USE INDEX (idx_first_name, idx_last_name)
WHERE first_name = 'HYUNSOO' AND last_name = 'CHA';
SELECT *
FROM employees
IGNORE INDEX (idx_last_name)
WHERE last_name = 'Smith';
GROUP BY에 사용된 정렬 옵션
SELECT field_name, COUNT(*)
FROM table_name
GROUP BY field_name ASC;
MySQL 8.x부터는 GROUP BY 절에서 정렬 옵션(ASC/DESC)을 직접 사용할 수 없다. 이는 MySQL이 SQL 표준을 준수하기 위해 이루어진 변경 사항이다. 대신, ORDER BY 절을 사용하여 그룹화된 결과를 정렬해야 한다.
-- MySQL 5.x 방식 (지원되지 않음)
SELECT field_name, COUNT(*)
FROM table_name
GROUP BY field_name ASC;
-- MySQL 8.x 방식 (올바른 방식)
SELECT field_name, COUNT(*)
FROM table_name
GROUP BY field_name
ORDER BY field_name ASC;
파티션을 위한 공용 테이블스페이스
MySQL 8.x에서는 파티션의 각 테이블스페이스를 공용 테이블스페이스에 저장할 수 없다. 그래서 파티션의 테이블스페이스가 공용 테이블스페이스에 저장된 것이 있는지 먼저 확인하고, 있다면 ALTER TABLE … REORGANIZE 명령어를 통해, 개별 테이블스페이스를 사용하도록 변경하면 된다.
테이블스페이스란, MySQL에서 데이터를 물리적으로 저장하는 단위를 말한다. MySQL은 데이터를 파일 시스템에 저장할 때, 각 테이블과 파티션을 특정 테이블스페이스에 저장할 수 있는데, 테이블스페이스는 크게 두 가지로 구분된다.
아래는 공용 테이블스페이스에 저장된 파티션이 있는지 체크하는 명령어이다.
SELECT DISTINCT NAME, SPACE, SPACE_TYPE
FROM information_schema, INNODB_SYS_TABLES
WHERE NAME LIKE '%#P#%' AND SPACE_TYPE NOT LIKE '%Single%';
MySQL 5.7에서 MySQL 8.0으로 업그레이드는 크게 두 가지 단계로 나뉜다.
MySQL 8.0.15 버전까지는 ‘데이터 딕셔너리 업그레이드’ 작업은 MySQL 서버(mysqld) 프로그램이 실행하였고, ‘서버 업그레이드’ 는 mysql_upgrade 프로그램이 실행했었다. 그렇기에 아래 과정 처럼 업그레이드를 진행했었다.
하지만, MySQL 8.0.16부터는 mysql_upgrade 유틸리티가 없어지고, MySQL 서버 프로그램(mysqld)이 시작되어, 모든 업그레이드를 ‘데이터 딕셔너리 업그레이드’ 와 ‘서버 업그레이드’ 를 순서대로 진행한다.