MySQL 8.0으로의 인플레이스 주 버전 업그레이드 관련 알려진 문제

이 페이지에서는 MySQL용 Cloud SQL 5.7에서 MySQL용 Cloud SQL 8.0으로 주요 버전을 업그레이드할 때 발생할 수 있는 알려진 문제와 비호환성을 설명합니다.

메이저 버전 업그레이드에 대한 자세한 내용은 데이터베이스 메이저 버전 인플레이스 업그레이드오류 로그 보기를 참고하세요.

호환되지 않는 SQL 변경사항

이 섹션에는 사전 검사 유틸리티를 실행할 때와 업그레이드 중에 발생할 수 있는 Cloud SQL 5.7 및 Cloud SQL 8.0의 SQL 비호환성이 나열되어 있습니다.

예약된 키워드

다음은 오류 메시지의 예시입니다.

Warning: The following objects have names that conflict with new reserved
keywords. Ensure queries sent by your applications use `quotes` when referring
to them or they will result in errors.

GROUPS, LEAD, RANK와 같은 일부 키워드는 이제 MySQL 버전 8.0에서 예약어로 분류됩니다. 따라서 이전에 식별자로 사용된 일부 단어가 이제 불법으로 간주될 수 있습니다. 영향을 받는 문을 수정하려면 식별자 인용을 사용하거나 식별자 이름을 변경하세요.

전체 키워드 목록은 키워드 및 예약어를 참고하세요.

GROUP BY 절이 있는 ASC/DESC가 삭제됨

다음은 오류 메시지의 예시입니다.

[ERROR] [MY-013235] [Server] Error in parsing Routine db_name.routine_name during
upgrade. You may have an error in your SQL syntax; check the manual that
corresponding to your MySQL server version for the right syntax to use near
'some_text'

다음은 또 다른 오류 메시지 예시입니다.

[ERROR] [MY-013235] [Server] Unknown trigger has an error in its body: 'You have
an error in you SQL syntax;
[ERROR] [MY-010198] [Server] Error in parsing Triggers from trigger_name.TRG file.

이전에 GROUP BY 정렬을 사용한 쿼리는 이전 MySQL 버전과 다른 결과를 생성할 수 있습니다. 지정된 정렬 순서를 유지하려면 ORDER BY 절을 제공하세요.

저장 프로시저, 트리거 또는 이벤트 정의에 GROUP BY 절과 함께 ASC 또는 DESC를 사용하는 쿼리가 포함된 경우 해당 객체의 쿼리에는 ORDER BY 절이 필요합니다.

자세한 내용은 GROUP BY ASC 및 DESC의 문법 삭제를 참고하세요.

공간 데이터와 다른 유형이 키로 혼합됨

다음은 오류 메시지의 예시입니다.

[ERROR] [MY-013140] [Server] Incorrect prefix key; the used key part isn't a
string, the used length is longer than the key part, or the storage engine doesn't
support unique prefix keys
[ERROR] [MY-013140] [Server] Too many key parts specified; max 1 parts allowed

MySQL 버전 8.0 이상에서는 색인에 공간 데이터 유형과 기타 데이터 유형이 혼합될 수 없습니다. 키를 삭제하고 MySQL 버전 8.0 이상에서 지원되는 새 키를 만들어야 합니다. 자세한 내용은 공간 색인을 참고하세요. 공간 데이터 색인을 식별하려면 다음과 유사한 쿼리를 사용하세요.

  SELECT
      s.TABLE_SCHEMA,
      s.TABLE_NAME,
      s.INDEX_NAME,
      s.COLUMN_NAME,
      s.INDEX_TYPE,
      c.DATA_TYPE
  FROM
      information_schema.STATISTICS s
  JOIN
      information_schema.COLUMNS c ON s.TABLE_SCHEMA = c.TABLE_SCHEMA
      AND s.TABLE_NAME = c.TABLE_NAME
      AND s.COLUMN_NAME = c.COLUMN_NAME
  WHERE
      c.DATA_TYPE IN (
          'geometry',
          'point',
          'linestring',
          'polygon',
          'multipoint',
          'multilinestring',
          'multipolygon',
          'geometrycollection'
      )
      AND s.INDEX_TYPE = 'BTREE';

잘못된 UTF8 문자

다음은 오류 메시지의 예시입니다.

[ERROR] [MY-010765] [Server] Error in Creating DD entry for %s.%s
[ERROR] [MY-013140] [Server] Invalid utf8 character string: invalid_string

표 정의에 잘못된 UTF8 문자가 포함되어 있으면 표 정의를 데이터 사전으로 변환하지 못할 수 있습니다. 이 문제를 해결하려면 잘못된 문자를 해당 UTF8 문자로 바꾸거나 완전히 삭제하세요.

잘못된 문자를 식별하고 해결하려면 다음과 유사한 쿼리를 사용하면 됩니다.

SHOW CREATE TABLE table_name;

ALTER TABLE table_name MODIFY COLUMN column_name data_type comment='';
// removing invalid utf8 character from comment

커밋되지 않은 XA 트랜잭션

다음은 오류 메시지의 예시입니다.

[ERROR] [MY-013527] [Server] Upgrade cannot proceed due to an existing prepared XA transactions

커밋되지 않은 XA 트랜잭션이 있으면 인플레이스 메이저 버전 업그레이드가 실패합니다. 이 문제를 해결하려면 업그레이드를 완료하기 전에 XA RECOVER 문을 실행하세요. 이 문은 커밋되지 않은 XA 트랜잭션을 확인합니다. 응답이 반환되면 XA COMMIT를 실행하여 XA 트랜잭션을 커밋하거나 XA ROLLBACK 문을 실행하여 XA 트랜잭션을 롤백합니다. 기존 XA 트랜잭션을 확인하려면 다음과 유사한 명령어를 실행하면 됩니다.

  mysql> XA RECOVER CONVERT xid;
  +----------+--------------+--------------+--------------------------
  | formatID | gtrid_length | bqual_length | data |
  +----------+--------------+--------------+--------------------------
  | 787611   | 9            | 9            | 0x787887111212345678812676152F12345678 |
  +----------+--------------+--------------+--------------------------
  1 row in set (0.00 sec)
  

이 예시에서는 gtridbqual 값이 16진수 형식으로 제공되지만 잘못 연결되어 있습니다. 이 문제를 해결하려면 다음 필드를 사용하여 이러한 값을 수동으로 구성해야 합니다.

  • gtrid = 0x787887111212345678
  • bqual = 0x812676152F12345678

이러한 XA 트랜잭션을 커밋하거나 롤백하려면 다음 명령어와 유사한 명령어를 사용하여 이 정보로부터 xid를 만들면 됩니다.

xid: gtrid [, bqual [, formatID ]]

mysql> XA ROLLBACK|COMMIT 0x787887111212345678,0x812676152F12345678,787611;

최대 키 길이 초과

다음은 오류 메시지의 예시입니다.

[ERROR] [MY-013140] [Server] Specified key was too long; max key length is [INTEGER] bytes

이 문제는 sql_mode 구성으로 인해 발생할 수 있습니다. MySQL 버전 5.7에서는 엄격 모드가 없으므로 접두사 또는 색인 길이에 제한이 있는 색인을 만들 수 있습니다.

하지만 MySQL 버전 8.0에서는 색인 길이에 더 엄격한 규칙을 적용하는 STRICT_ALL_TABLES 또는 STRICT_TRANS_TABLES와 같은 엄격한 모드가 도입되어 이 오류가 발생합니다.

이 문제를 해결하려면 오류 메시지에 표시된 최대 바이트 내로 색인 접두사 길이를 업데이트하세요. 기본 프로토콜인 UTFMB4를 사용하면 각 문자가 최대 4바이트를 차지할 수 있으므로 최대 바이트 수를 4로 나누어 최대 문자 수를 확인할 수 있습니다.

메타데이터 정보가 일치하지 않음

다음은 오류 메시지의 예시입니다.

[ERROR] [MY-012084] [InnoDB] Num of Indexes in InnoDB doesn't match with Indexes from server
[ERROR] [MY-012069] [InnoDB] table: TABLE_NAME has xx columns but InnoDB dictionary has yy columns

다음은 또 다른 오류 메시지 예시입니다.

[ERROR] [MY-010767] [Server] Error in fixing SE data for db_name.table_name

frm 파일과 InnoDB 사전 간에 메타데이터가 일치하지 않는 테이블을 업그레이드하려고 하면 업그레이드에 실패합니다. 이 경우 frm 파일이 손상되었을 수 있습니다. 이 문제를 해결하려면 업그레이드를 시도하기 전에 영향을 받는 테이블을 덤프하고 복원해야 합니다.

자세한 내용은 메타데이터가 일치하지 않는 테이블 업그레이드 시도를 참고하세요.

영향을 받은 테이블을 덤프하고 복원하려면 다음과 유사한 명령어를 실행하면 됩니다.

mysqldump --databases database_name --host=$host --user=$user --password=$password > database_dump.sql

mysql> source database_dump.sql;

외래 키 이름이 64자를 초과함

다음은 오류 메시지의 예시입니다.

[ERROR] [MY-012054] [InnoDB] Foreign key name:key_name is too long

이 오류는 테이블의 외래 키 제약 조건 이름이 64자를 초과할 수 없음을 나타냅니다. 제약 조건 이름이 너무 긴 테이블을 식별하려면 다음과 유사한 명령어를 사용하면 됩니다.

SELECT CONSTRAINT_NAME, TABLE_NAME
FROM information_schema.REFERENTIAL_CONSTRAINTS
WHERE CHAR_LENGTH(CONSTRAINT_NAME) > 64;

테이블에 64자를 초과하는 제약 조건 이름이 포함되어 있으면 ALTER TABLE 명령어를 사용하여 이 문자 제한 내에서 제약 조건 이름을 바꿉니다.

ALTER TABLE your_table RENAME CONSTRAINT your_long_constraint_name TO your_new_constraint_name;

테이블 이름의 대소문자가 일치하지 않음

다음은 오류 메시지의 예시입니다.

[ERROR] [MY-013521] [Server] Table name 'SCHEMA_NAME.TABLE_NAME' containing upper case characters is not allowed with lower_case_table_names = 1.

MySQL 버전 5.7의 인스턴스에 소문자 테이블 이름 (lower_case_table_names=1)이 필요한 경우 MySQL 버전 8.0으로 업그레이드하기 전에 모든 테이블 이름을 소문자로 변환해야 합니다.

또는 요구사항 (lower_case_table_names=0)을 사용 중지한 다음 인스턴스를 업그레이드할 수 있습니다. lower_case_table_names 필드의 값을 1에서 0로 변경하면 MySQL 버전 8.0에서 값을 다시 변경할 수 없습니다.

다른 엔진에 속하며 InnoDB에서 인식하는 테이블

다음은 오류 메시지의 예시입니다.

Error: Following tables are recognized by InnoDB engine while the SQL layer believes they belong to a different engine. Such situation may happen when one removed InnoDB files manually from the disk and creates a table with same name by using different engine.

InnoDB 엔진이 인식하지만 SQL 레이어가 인식하지 못하는 테이블이 데이터베이스에 있으면 업그레이드가 실패합니다.

InnoDB 스토리지 엔진을 사용하지 않는 데이터베이스의 모든 테이블을 찾습니다.

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db_name' AND ENGINE != 'InnoDB'

식별된 각 테이블에 대해 ALTER TABLE 명령어를 실행하여 스토리지 엔진을 InnoDB로 변경합니다.

ALTER TABLE db_name.table_name ENGINE='INNODB';

알 수 없는 스토리지 엔진 파티션

다음은 오류 메시지의 예시입니다.

[System] [MY-011012] [Server] Starting upgrade of data directory. [ERROR] [MY-013140] [Server] Unknown storage engine 'partition'

MySQL 버전 8.0에서는 InnoDBndbcluster 외의 엔진 파티션이 허용되지 않습니다. 파티션이 있고 엔진이 InnoDB가 아닌 테이블을 확인해야 합니다. 이러한 테이블을 식별하려면 다음 쿼리를 실행하세요.

SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';

쿼리에서 보고된 테이블은 InnoDB를 사용하도록 업데이트하거나 파티션을 나누지 않도록 구성해야 합니다. 테이블 스토리지 엔진을 InnoDB로 변경하려면 다음 문을 실행하세요.

ALTER TABLE db_name.table_name ENGINE = INNODB;

MVU 작업이 더 오래 실행됨

주 버전 업그레이드와 관련된 기본 작업은 두 가지입니다.

  • 사전 확인 작업: 3시간 이내에 완료되지 않으면 시간 제한 오류를 반환합니다.
  • 업그레이드 작업: 6시간 내에 완료되지 않으면 제한 시간 오류를 반환합니다.

인스턴스에서 예상보다 긴 시간 동안 MAJOR_VERSION_UPGRADE 작업이 진행 중인 경우 MySQL 오류 로그를 조사하여 메타데이터 업그레이드에서 차단되었는지 또는 일부 사전 검사 단계에서 멈췄는지 확인할 수 있습니다. 이 문제의 가장 일반적인 원인은 다음과 같습니다.

  • 테이블, 뷰 또는 색인이 매우 많음
  • CPU 또는 메모리와 같은 리소스 부족
  • 업그레이드 프로세스가 시작되도록 데이터베이스 종료를 차단하는 주요 트랜잭션 Google Cloud 콘솔을 사용하여 현재 프로세스를 확인할 수 있습니다.

시스템에 열려 있는 파일이 너무 많음

다음은 오류 메시지의 예시입니다.

[ERROR] [MY-012592] [InnoDB] Operating system error number 23 in a file operation
[ERROR] [MY-012596] [InnoDB] Error number 23 means 'Too many open files in system'

인스턴스에 테이블이 2백만 개 이상 포함되어 있으면 '시스템에 열린 파일이 너무 많음'을 나타내는 오류가 표시될 수 있습니다. 업그레이드하기 전에 테이블 수를 2백만 개 미만으로 줄여야 할 수도 있습니다.

메모리 부족 오류

MySQL 5.7에서 8.0으로 업그레이드할 때는 이전 메타데이터를 새 데이터 사전으로 변환하기 위해 추가 메모리가 필요합니다. 주 버전 업그레이드 중에 '메모리 부족' 오류가 표시되지 않도록 하려면 Cloud SQL에서 각 테이블에 대해 최소 100KB의 메모리를 사용하는 것이 좋습니다.

테이블 수를 찾으려면 다음 쿼리를 사용하세요.

SELECT table_schema AS 'Database Name', COUNT(*) AS 'Number of Tables' FROM information_schema.tables

이 문제를 해결하려면 업그레이드를 시작하기 전에 머신 유형을 변경하여 메모리를 일시적으로 늘리면 됩니다.

공유 코어 인스턴스 (예: db-f1-micro, db-g1-small, HA db-f1-micro, HA db-g1-small를 포함한 마이크로 또는 소형 코어)의 경우 업그레이드 작업 중에 전용 코어 인스턴스로 업그레이드하여 잠재적인 리소스 관련 문제를 방지하세요. 업그레이드 작업이 완료된 후 다운그레이드할 수 있습니다.

MySQL 종료 오류

다음은 오류 메시지의 예시입니다.

[ERROR] [MY-012526] [InnoDB] Upgrade after a crash is not supported.

Cloud SQL은 주 버전 업그레이드 전에 완전한 종료를 실행합니다. 워크로드가 많거나 트랜잭션이 오래 실행되는 인스턴스는 종료 프로세스가 길어질 수 있으며, 이로 인해 시간 초과가 발생하고 업그레이드가 실패할 수 있습니다. 업그레이드가 성공적으로 완료되도록 장기 실행 트랜잭션이 없는 트래픽이 적은 기간에 업그레이드를 계획하세요.

다음 단계