MySQL 8.0 Release Note

8.0.19 변경 사항 (2020-01-13 GA)

Estimated reading: 9 minutes 77 views

공식 문서: Changes in MySQL 8.0.19 (2020-01-13, General Availability)

계정 관리 관련 사항

MySQL에서는 이제 관리자들이 사용자 계정을 구성하여 잘못된 비밀번호로 인한 연속된 로그인 실패가 너무 많을 경우 계정이 일시적으로 잠기도록 설정할 수 있습니다. 실패 횟수와 잠금 시간은 CREATE USERALTER USER 문에서 FAILED_LOGIN_ATTEMPTSPASSWORD_LOCK_TIME 옵션을 사용하여 계정별로 구성할 수 있습니다. 자세한 내용은 비밀번호 관리를 참조하십시오. (버그 #27733694, 버그 #90169, WL #13515)

감사 로그 관련 사항

ANALYZE TABLE 문은 이제 read 감사 이벤트를 생성합니다. (버그 #29625461)

감사 로그 연결 이벤트에는 이제 클라이언트에서 전달한 모든 연결 속성이 포함됩니다. 연결 속성 로깅은 새로운 XML 로그 파일 형식과 JSON 형식에서는 지원되지만, 이전 XML 형식에서는 지원되지 않습니다. 자세한 내용은 감사 로그 파일 형식을 참조하십시오. (WL #11378)

컴파일 관련 사항

Microsoft Windows: Windows에서 명령줄 빌드를 위한 최소 CMake 버전이 이제 3.15입니다. (버그 #30332632, 버그 #96954)

구성 관련 사항

프로파일 가이드 최적화(PGO)를 GCC와 함께 실험할 수 있는 새로운 FPROFILE_GENERATEFPROFILE_USE CMake 옵션이 제공됩니다. 사용 방법에 대한 자세한 내용은 MySQL 소스 배포판의 cmake/fprofile.cmake를 참조하십시오. 이러한 옵션은 GCC 8과 9, 그리고 Clang과 함께 테스트되었습니다.
FPROFILE_USE를 활성화하면 WITH_LTO(링크 타임 최적화)도 활성화됩니다. (버그 #30089834, 버그 #96314, 버그 #30133324, 버그 #96410, 버그 #30164113, 버그 #96486)

Innodb_system_rows_read, Innodb_system_rows_inserted, Innodb_system_rows_deleted 상태 변수가 시스템에서 생성된 스키마에 속하는 InnoDB 테이블에 대한 행 작업을 계산하기 위해 추가되었습니다. 새로운 상태 변수는 기존의 Innodb_rows_read, Innodb_rows_inserted, Innodb_rows_deleted 상태 변수와 유사하며, 이는 사용자 생성 스키마와 시스템 생성 스키마에 속한 InnoDB 테이블에 대한 작업을 계산합니다.
새로운 상태 변수는 relay_log_info_repositorymaster_info_repository 변수가 TABLE로 설정된 복제 환경에서 유용하며, 이로 인해 슬레이브에서 slave_master_info, slave_replay_log_info, slave_worker_info 테이블에 대한 작업이 더 많이 발생합니다. 시스템 생성 스키마에 속한 테이블에 대한 작업을 새로운 상태 변수에서 제공하는 데이터를 사용하여 제외할 수 있습니다.
기여해주신 Facebook에 감사드립니다. (버그 #27724674, 버그 #90148)

사용 중단 및 제거 관련 사항

thread_pool 플러그인은 퍼포먼스 스키마 테이블의 정수 열 정의에 표시 폭을 사용했습니다. 이제 정수 열 표시 폭이 더 이상 사용되지 않기 때문에 오류 로그에 경고가 기록됩니다. (버그 #30597673)

정수 데이터 타입에 대한 표시 폭 지정은 MySQL 8.0.17에서 사용 중단되었으며, 이제 데이터 타입 정의가 포함된 문장은 다음 예외를 제외하고는 정수 타입에 대한 표시 폭을 더 이상 표시하지 않습니다:

  • 타입이 TINYINT(1)일 때. MySQL 커넥터는 TINYINT(1) 열이 BOOLEAN 열에서 유래했다고 가정하며, 이 예외는 커넥터가 이 가정을 계속 유지할 수 있도록 합니다.
  • 타입에 ZEROFILL 속성이 포함된 경우.

이 변경 사항은 테이블, 뷰, 저장 루틴에 적용되며, SHOW CREATEDESCRIBE 문과 INFORMATION_SCHEMA 테이블의 출력에 영향을 줍니다.
이전 MySQL 8.0 버전에서 생성된 객체에 대해서는 데이터 사전에 이미 저장된 정보가 변경되지 않기 때문에 DESCRIBE 문과 INFORMATION_SCHEMA 쿼리에 대한 출력은 영향을 받지 않습니다. 이 예외는 MySQL 5.7에서 8.0으로 업그레이드할 때는 적용되지 않으며, 모든 데이터 사전 정보가 다시 생성되기 때문에 데이터 타입 정의에 표시 폭이 포함되지 않습니다. (버그 #30556657, 버그 #97680, WL #13528)

hash_join 옵티마이저 스위치(optimizer_switch 시스템 변수 참조)를 설정해도 더 이상 아무런 효과가 없습니다. 이는 HASH_JOINNO_HASH_JOIN 옵티마이저 힌트에도 동일하게 적용됩니다. 옵티마이저 스위치와 힌트는 모두 사용 중단되었으며, 향후 MySQL 릴리스에서 제거될 예정입니다.
이 변경 사항은 SELECT DISTINCT ... WITH ROLLUP이 항상 모든 고유한 행을 반환하지 않던 문제를 수정합니다. (버그 #27549694, 버그 #30471809)

MySQL 5.7.14에서 X 프로토콜의 StmtExecute 요청을 위한 mysqlx 네임스페이스가 도입되면서 xplugin 네임스페이스가 대체되었습니다. 이후 MySQL 8.0.19에서 xplugin 네임스페이스가 제거되었습니다. 이 릴리스부터 xplugin 네임스페이스를 사용할 경우, 알 수 없는 네임스페이스에 대한 오류 메시지가 반환됩니다. 또한, X Plugin의 Mysqlx_stmt_execute_xplugin 상태 변수도 더 이상 사용되지 않습니다. (WL #13057)

MySQL 5.7.5에서 YEAR(2) 데이터 타입이 제거되었으며, 이제 YEARYEAR(4)만 연도 값을 지정할 수 있는 유효한 사양으로 남아 있습니다. YEARYEAR(4)는 의미적으로 동일하므로 표시 폭을 지정할 필요가 없으며, 따라서 YEAR(4)는 이제 사용 중단되었으며 향후 MySQL 버전에서 제거될 예정입니다. 데이터 타입 정의가 포함된 문장은 더 이상 YEAR에 대한 표시 폭을 표시하지 않습니다. 이 변경 사항은 테이블, 뷰, 저장 루틴에 적용되며, SHOW CREATEDESCRIBE 문과 INFORMATION_SCHEMA 테이블의 출력에 영향을 줍니다.
이전 MySQL 8.0 버전에서 생성된 객체에 대해서는 데이터 사전에 이미 저장된 정보가 변경되지 않기 때문에 DESCRIBE 문과 INFORMATION_SCHEMA 쿼리에 대한 출력은 영향을 받지 않습니다. 이 예외는 MySQL 5.7에서 8.0으로 업그레이드할 때는 적용되지 않으며, 모든 데이터 사전 정보가 다시 생성되기 때문에 데이터 타입 정의에 표시 폭이 포함되지 않습니다.
또한, YEAR의 (문서화되지 않은) UNSIGNED 속성도 사용 중단되었으며 향후 MySQL 버전에서 제거될 예정입니다. (WL #13537)

에러 처리

XA의 크래시 복구에 대한 오류 메시지가 수정되어, XA 크래시 복구 메시지와 비-XA 크래시 복구 메시지를 구분할 수 있도록 XA 컨텍스트를 나타냅니다. (버그 #30578290, 버그 #97743)

이전에는 LOCAL 기능이 비활성화된 상태에서 LOAD DATA LOCAL을 사용하려고 시도하면 다음과 같은 오류 메시지가 반환되었습니다: “The used command is not allowed with this MySQL version.” 이 메시지는 오류 조건이 MySQL 버전과 관련이 없기 때문에 오해를 불러일으켰습니다. 이제 서버는 ER_CLIENT_LOCAL_FILES_DISABLED 오류 코드와 다음 메시지를 반환합니다: “Loading local data is disabled; this must be enabled on both the client and server side.” (버그 #30375698, 버그 #29377985, 버그 #94396)

SQL 함수 및 연산자 관련 사항

이전에는 로드 가능한 함수가 문자열 인수나 반환 값의 캐릭터셋이나 정렬 규칙을 고려하지 않았습니다. 사실상 문자열 인수와 반환 값은 바이너리 문자열로 처리되었으며, 이는 단일 바이트 문자를 포함하는 문자열 인수만 안정적으로 처리될 수 있음을 의미했습니다.
로드 가능한 함수의 동작은 기본적으로 동일하지만, 이제 로드 가능한 함수를 작성할 때 문자열 인수의 캐릭터셋과 정렬 규칙을 결정하고 특정 캐릭터셋과 정렬 규칙을 가진 문자열을 반환할 수 있는 인터페이스가 확장되었습니다. 이러한 기능은 선택 사항이며, 로드 가능한 함수 작성자는 원하는 경우 이를 활용할 수 있습니다. 자세한 내용은 로드 가능한 함수 캐릭터셋 처리를 참조하십시오.
MySQL에서 배포되는 로드 가능한 함수 중, MySQL Enterprise 감사, MySQL Enterprise 방화벽, MySQL Enterprise 데이터 마스킹 및 익명화, MySQL 키링(범용 키링 함수만 해당), 그룹 복제와 관련된 기능이 새로운 기능을 활용하도록 수정되었습니다. 예를 들어, 암호화된 데이터를 반환하는 함수는 캐릭터 문자열이 아닌 바이너리 문자열을 반환하도록 설계되었기 때문에 이 수정은 해당 상황에만 적용됩니다.
로드 가능한 함수의 캐릭터셋 기능은 mysql_udf_metadata 컴포넌트 서비스를 사용하여 구현되었습니다. 이 서비스에 대한 자세한 내용은 MySQL 서버 Doxygen 문서에서 확인할 수 있으며, MySQL 키링 함수의 소스 코드는 커뮤니티 소스 배포판에서 제공되어 제3자 로드 가능한 함수 작성자가 캐릭터셋 인식을 수정하는 예시로 사용할 수 있습니다. (WL #12370)

INFORMATION_SCHEMA 관련 사항

INFORMATION_SCHEMA에는 역할 정보를 제공하는 여러 새로운 테이블이 추가되었습니다:

(WL #10895)

키링 관련 사항

MySQL 키링을 사용하여 민감한 데이터를 일반적으로 저장하기 위한 새로운 SECRET 키 타입이 제공됩니다. 키링은 SECRET 데이터를 저장 및 검색할 때 바이트 스트림으로 암호화 및 복호화합니다. SECRET 키 타입은 모든 키링 플러그인에서 지원됩니다. 자세한 내용은 지원되는 키링 키 타입 및 길이를 참조하십시오. (WL #12859)

로깅 관련 사항

이제 SIGUSR1 신호는 서버가 오류 로그, 일반 쿼리 로그 및 느린 쿼리 로그를 플러시하도록 합니다. SIGUSR1의 한 가지 용도는 서버에 연결하지 않고 로그 회전을 구현하는 것입니다(로그를 플러시하려면 RELOAD 권한이 있는 계정이 필요함). 서버의 SIGUSR1에 대한 응답은 SIGHUP에 대한 응답의 하위 집합이며, SIGUSR1은 쓰레드 및 호스트 캐시를 플러시하고 오류 로그에 상태 보고서를 작성하는 등의 SIGHUP 효과 없이 특정 로그만 플러시하는 더 “경량화된” 신호로 사용할 수 있습니다. 자세한 내용은 MySQL의 Unix 신호 처리를 참조하십시오. (WL #13689)

패키징 관련 사항

시스템 curl 라이브러리에 연결하지 않고 curl을 포함하는 바이너리 패키지가 이제 curl 7.66.0으로 업그레이드되었습니다. (버그 #30356844)

MySQL과 함께 번들된 zstd 라이브러리가 버전 1.3.3에서 1.4.3으로 업그레이드되었습니다. MySQL은 연결 압축을 지원하기 위해 zstd 라이브러리를 사용합니다. (버그 #30236685)

OpenSSL 공유 라이브러리가 포함된 패키지 유형의 경우, 해당 패키지에 MySQL 전용 라이브러리가 lib/private에 위치하고 이 라이브러리가 OpenSSL을 필요로 하는 경우 이제 해당 라이브러리도 lib/private에 포함됩니다. (버그 #29966296)

SQL 구문 관련 사항

중요 변경 사항: MySQL은 이제 SQL 표준에 따라 명시적 테이블 절 및 테이블 값 생성기를 지원합니다. 각각 TABLE 문과 VALUES 문으로 구현되었습니다. 간략한 설명은 다음과 같습니다:

  • TABLE table_name은 SELECT * FROM table_name과 동일하며, SELECT 문이 허용되는 곳 어디에서나 사용할 수 있습니다. 여기에는 조인, 유니온, INSERT ... SELECT 문, REPLACE 문, CREATE TABLE ... SELECT 문, 서브쿼리가 포함됩니다.
    TABLE에서는 ORDER BY를 사용할 수 있으며, 또한 선택적으로 OFFSET이 있는 LIMIT도 지원합니다. 이러한 절들은 SELECT 문에서와 동일하게 TABLE 문에서 작동합니다. 다음 두 문은 동일한 결과를 반환합니다
TABLE t ORDER BY c LIMIT 10 OFFSET 3;

SELECT * FROM t ORDER BY c LIMIT 10 OFFSET 3;
  • VALUESVALUES 키워드 뒤에 쉼표로 구분된 일련의 행 생성자(ROW())로 구성됩니다. 이는 INSERT 문 또는 REPLACE 문에 행 값을 SQL 표준 방식으로 제공하는 데 사용될 수 있습니다. 예를 들어, 다음 두 문은 동일합니다:
INSERT INTO t1 VALUES ROW(1,2,3), ROW(4,5,6), ROW(7,8,9);

INSERT INTO t1 VALUES (1,2,3), (4,5,6), (7,8,9);

또한 VALUES 테이블 값 생성자에서 테이블처럼 선택할 수 있으며, 이때 반드시 테이블 별칭을 제공해야 합니다. 열 별칭을 사용하여 개별 열을 선택할 수도 있습니다. 예를 들어:

mysql> SELECT a,c FROM (VALUES ROW(1,2,3), ROW(4,5,6)) AS t(a,b,c);
+---+---+
| a | c |
+---+---+
| 1 | 3 |
| 4 | 6 |
+---+---+

이러한 SELECT 문은 조인, 유니온, 서브쿼리 및 이와 유사한 다른 구문에서도 사용할 수 있습니다.

자세한 정보와 예시는 TABLE 문VALUES 문, 그리고 INSERT … SELECT 문, CREATE TABLE … SELECT 문, JOIN 절, UNION 절, 서브쿼리를 참조하십시오. (버그 #77639, WL #10358)

이전에는 재귀적 공통 테이블 표현식(CTE)의 재귀적 SELECT 부분에서 LIMIT을 사용할 수 없었습니다. 이제 LIMIT이 선택적 OFFSET 절과 함께 지원됩니다. 이러한 재귀적 CTE의 예는 다음과 같습니다:

WITH RECURSIVE cte AS  (
  SELECT CAST("x" AS CHAR(100)) AS a FROM DUAL
  UNION ALL
  SELECT CONCAT("x",cte.a) FROM cte
    WHERE LENGTH(cte.a) < 10
    LIMIT 3 OFFSET 2
)
SELECT * FROM cte;

이 문은 mysql 클라이언트에서 다음 출력을 생성합니다:

+-------+
| a     |
+-------+
| xxx   |
| xxxx  |
| xxxxx |
+-------+

이러한 방식으로 LIMIT을 지정하면 외부 SELECT에서 수행하는 것보다 CTE의 실행을 더 효율적으로 만들 수 있습니다. 요청된 행 수만 생성되기 때문입니다.
자세한 내용은 재귀적 공통 테이블 표현식을 참조하십시오. (버그 #92857, 버그 #28816906, WL #12534)

MySQL 8.0.16에서 CHECK 제약 조건이 구현될 때, ALTER TABLE은 표준 SQL에 대한 MySQL 확장으로 DROP CHECKALTER CHECK 구문을 지원했지만, 기존 제약 조건의 유형에 관계없이 수정할 수 있는 보다 일반적인 SQL 표준 DROP CONSTRAINTALTER CONSTRAINT 구문을 지원하지 않았습니다. 이제 이 구문이 지원되며, 제약 조건 유형은 제약 조건 이름에서 결정됩니다. (WL #12787)

MySQL은 이제 INSERT INTO ... ON DUPLICATE KEY UPDATE 문의 VALUESSET 절에서 삽입된 행 및 해당 열에 대해 별칭을 지원합니다. 다음과 같은 문을 고려하십시오:

INSERT INTO t
    VALUES (9,5), (7,7), (11,-1)
    ON DUPLICATE KEY UPDATE a = a + VALUES(a) - VALUES(b);

삽입된 행에 대해 new라는 별칭을 사용하면, 다음과 같이 문을 다시 작성할 수 있으며, ON DUPLICATE KEY UPDATE 절에서 행 별칭을 참조합니다:

INSERT INTO t
    VALUES (9,5), (7,7), (11,-1) AS new
    ON DUPLICATE KEY UPDATE a = a + new.a - new.b;

동일한 행 별칭을 사용하고, 삽입된 행의 열에 대해 mn이라는 열 별칭을 추가로 사용하면, 행 별칭을 생략하고 열 별칭만 사용할 수 있습니다:

INSERT INTO t
    VALUES (9,5), (7,7), (11,-1) AS new(m,n)
    ON DUPLICATE KEY UPDATE a = a + m - n;

행 별칭은 테이블 이름과 달라야 하며, 열 별칭은 서로 달라야 합니다.
자세한 내용과 예시는 INSERT … ON DUPLICATE KEY UPDATE 문을 참조하십시오. (WL #6312)

sys 스키마 관련 사항

sys 스키마 객체가 더 이상 사용 중단된 sys.format_bytes(), sys.format_time(), sys.ps_thread_id() 저장 함수를 호출하지 않도록 재구현되었습니다. 대신 MySQL 8.0.16에 도입된 내장 SQL 함수들을 호출하여 성능 스키마 데이터를 형식화하거나 검색합니다. (자세한 내용은 MySQL 8.0.16의 변경 사항을 참조하십시오)
.sys.format_bytes(), sys.format_time(), sys.ps_thread_id() 함수는 향후 MySQL 버전에서 제거될 예정이므로, 이를 사용하는 애플리케이션은 내장 함수를 사용하도록 조정해야 합니다. sys 함수와 내장 함수 간에 약간의 차이가 있음을 유의하십시오. 자세한 내용은 성능 스키마 함수를 참조하십시오. (WL #13439)

스레드 풀 관련 사항

기본적으로 스레드 풀 플러그인은 각 그룹에서 한 번에 최대 하나의 스레드만 실행되도록 보장하려고 합니다. 기본 알고리즘은 정지된 스레드를 고려하여 일시적으로 더 많은 활성 스레드를 허용할 수 있습니다. 이제 플러그인은 그룹당 활성 스레드 수를 제어할 수 있는 새로운 시스템 변수 thread_pool_max_active_query_threads를 구현합니다. 이 값이 0이면 기본 알고리즘이 적용되며, 0보다 큰 값이면 그룹당 활성 스레드 수에 제한을 둡니다. 자세한 내용은 스레드 풀 운영을 참조하십시오. (WL #12915)

X Plugin 관련 사항

X Plugin은 Debian에서 GCC 9로 컴파일할 수 없었습니다. 이 문제에 대한 해결책으로 --no-as-needed 링크 옵션이 추가되었습니다. (버그 #30445201)

X Protocol을 사용하여 TRIGGERS 정보 스키마 테이블을 쿼리할 때 오류가 반환되거나 일부 행이 반환되지 않을 수 있었습니다. (버그 #30318917)

기능 추가 및 변경 사항

그룹 복제: 복제 슬레이브로의 복제 연결 및 분산 복구를 위한 그룹 복제 연결이 이제 TLSv1.3 프로토콜에 대해 클라이언트 측 전체 구성 옵션을 지원합니다. TLSv1.3 지원이 가능하지만 이러한 구성 옵션이 없었던 MySQL 릴리스에서는, TLSv1.3이 이러한 연결 유형에 사용될 경우 클라이언트(복제 슬레이브 또는 분산 복구를 시작한 그룹 복제 멤버)를 구성할 수 없었습니다. 이로 인해 연결에서 서버(복제 마스터 또는 분산 복구의 기부자 역할을 하는 그룹 복제 기존 멤버)는 기본적으로 활성화된 TLSv1.3 암호 스위트 중 하나를 허용해야 했습니다. MySQL 8.0.19부터는 이러한 연결에 대해 원하는 암호 스위트를 선택하도록 구성할 수 있으며, 기본이 아닌 암호 스위트만 선택할 수도 있습니다.새로운 구성 옵션은 다음과 같습니다:

  • 그룹 복제 시스템 변수 group_replication_recovery_tls_versiongroup_replication_recovery_tls_ciphersuites. group_replication_recovery_tls_version은 분산 복구 연결에서 클라이언트 인스턴스(조인 멤버)에 대한 연결 암호화를 위한 허용된 TLS 프로토콜 목록을 지정합니다. group_replication_recovery_tls_ciphersuites는 TLSv1.3이 그 연결에 사용될 때 허용되는 암호 스위트 목록을 지정합니다.
  • CHANGE MASTER TO 명령의 MASTER_TLS_CIPHERSUITES 옵션을 사용하여 복제 슬레이브가 복제 마스터와의 연결에서 허용하는 TLSv1.3 암호 스위트 목록을 지정합니다. (CHANGE MASTER TO 명령에는 이미 연결에서 허용되는 TLS 프로토콜 버전을 지정하는 MASTER_TLS_VERSION 옵션이 있습니다.)

(버그 #29960735, WL #13392)

그룹 복제: 그룹 복제 플러그인은 SQL API 작업을 수행하기 위해 내부 세션을 사용하여 MySQL 서버와 상호작용합니다. 이전에는 이러한 세션이 max_connections 서버 시스템 변수로 지정된 클라이언트 연결 제한에 포함되었습니다. 서버가 이 제한에 도달한 상태에서 그룹 복제를 시작하거나 작업을 시도하면 작업이 실패하고 그룹 복제 또는 서버 자체가 중지될 수 있었습니다. MySQL 8.0.19부터 그룹 복제는 새로운 컴포넌트 서비스를 사용하여 내부 세션을 별도로 처리하므로, 이러한 세션은 max_connections 제한에 포함되지 않으며 서버가 이 제한에 도달해도 거부되지 않습니다. (버그 #29635001, WL #13378)

Microsoft Windows: 이전에는 mysql 명령줄 클라이언트의 system(\!) 명령이 Unix 시스템에서만 작동했습니다. 이제 이 명령이 Windows에서도 작동합니다. 예를 들어, system cls 또는 \! cls 명령을 사용하여 화면을 지울 수 있습니다. (버그 #11765690, 버그 #58680, WL #13391)

JSON: 하나 이상의 JSON 열이 포함된 테이블에 대해 CHECK 제약 조건을 지정하고 JSON_SCHEMA_VALID()를 사용하여 유효성 검사가 실패한 경우, MySQL은 이제 그러한 실패의 이유에 대한 자세한 정보를 제공합니다. 새로운 오류 코드 ER_JSON_SCHEMA_VALIDATION_ERROR_WITH_DETAILED_REPORT가 이 정보를 포함하며, 서버가 INSERT 문을 거부할 때 mysql 클라이언트에서 SHOW WARNINGS 명령을 실행하여 볼 수 있습니다.자세한 정보와 예시는 JSON_SCHEMA_VALID() 및 CHECK 제약 조건을 참조하십시오. 보다 일반적인 정보는 CHECK 제약 조건을 참조하십시오. (WL #13195)

Debian 패키지는 이제 mysqld 수동 실행을 더 잘 지원하는 일반적인 systemd 지원을 포함합니다. (버그 #29702050, 버그 #95163)

중복 키 오류 정보가 확장되어 키의 테이블 이름을 포함하게 되었습니다. 이전에는 중복 키 오류 정보에 키 값과 키 이름만 포함되었습니다. Facebook의 기여에 감사드립니다. (버그 #28686224, 버그 #925308, WL #12589)

mysql 클라이언트가 대화형 모드로 작동할 때, --binary-as-hex 옵션이 이제 기본적으로 활성화됩니다. 또한, status(또는 \s) 명령의 출력에 이 옵션이 암시적으로 또는 명시적으로 활성화되었을 때 다음과 같은 줄이 포함됩니다:

Binary data as: Hexadecimal 

16진수 표기법을 비활성화하려면 --skip-binary-as-hex를 사용하십시오. (버그 #24432545, WL #13038)

MySQL은 이제 시간대 오프셋이 있는 날짜 및 시간 리터럴을 지원합니다. 예를 들어, '2019-12-11 10:40:30-05:00', '2003-04-14 03:30:00+10:00', '2020-01-01 15:35:45+05:30'과 같은 형식이 가능합니다. 이러한 값이 TIMESTAMPDATETIME 열에 삽입될 때 오프셋은 저장되지 않으며, 값을 검색할 때 표시되지 않습니다.지원되는 시간대 오프셋 범위는 -13:59에서 +14:00까지입니다. 'CET' 또는 'America/Argentina/Buenos_Aires'와 같은 시간대 이름은 지원되지 않으며, 'SYSTEM'이라는 특수 값도 지원되지 않습니다. 이 문맥에서 시간 값이 10보다 작을 경우 선행 0이 필요하며, MySQL은 '-00:00' 오프셋을 유효하지 않은 것으로 간주합니다.시간대 오프셋이 있는 날짜 및 시간 리터럴은 준비된 문에서 파라미터 값으로도 사용할 수 있습니다.이 작업의 일환으로, time_zone 시스템 변수의 허용 범위도 -13:59에서 +14:00까지로 변경되었습니다.자세한 정보와 예시는 DATE, DATETIME, TIMESTAMP 타입MySQL 서버 시간대 지원을 참조하십시오. (버그 #83852, 버그 #25108148, WL #10828)

MySQL 8.0.19부터 X 프로토콜 연결을 통해 전송되는 메시지에 대한 압축이 지원됩니다. 서버와 클라이언트가 사용할 압축 알고리즘에 합의한 경우 연결이 압축될 수 있습니다. 기본적으로 X 프로토콜은 deflate, lz4, zstd 압축 알고리즘을 지원합니다. 새로운 시스템 변수 mysqlx_compression_algorithms를 설정하여 이러한 알고리즘 중 사용을 허용하는 것만 포함할 수 있습니다. X 프로토콜은 클라이언트가 압축을 요청하지 않으면 항상 압축되지 않은 연결을 허용합니다. X 프로토콜의 허용된 압축 알고리즘 목록은 MySQL 서버가 발표한 압축 알고리즘 목록과 독립적으로 작동하며, X 프로토콜은 MySQL 서버의 압축 설정을 대체하지 않습니다. 새로운 X 플러그인 상태 변수를 사용하여 X 프로토콜 메시지 압축의 효과를 모니터링할 수 있습니다. (WL #9252, WL #13442)

다중 스레드 슬레이브(즉, slave_parallel_workers 값을 0보다 크게 설정한 슬레이브)의 경우, slave_preserve_commit_order=1를 설정하면 트랜잭션이 슬레이브의 릴레이 로그에서 나타나는 순서대로 실행되고 커밋되어 슬레이브에서 마스터와 동일한 트랜잭션 기록이 유지됩니다. 이전에는 이 설정을 위해 슬레이브에서 바이너리 로깅 및 슬레이브 업데이트 로깅을 활성화해야 했으며, 이는 실행 비용 및 디스크 공간 요구 사항을 증가시켰습니다. 이제 slave_preserve_commit_order=1을 바이너리 로그와 슬레이브 업데이트 로깅이 없는 슬레이브에서도 설정할 수 있습니다. 이를 통해 커밋 순서를 유지하면서도 바이너리 로깅의 오버헤드를 피할 수 있습니다.트랜잭션 기반 및 비트랜잭션 스토리지 엔진이 비-XA 트랜잭션에 참여하고 해당 트랜잭션이 마스터에서 롤백된 경우, 슬레이브에서 커밋 순서를 유지하는 데 제한이 발생할 수 있습니다. 일반적으로 마스터에서 롤백된 비-XA 트랜잭션은 슬레이브로 복제되지 않지만, 이 특정 상황에서는 트랜잭션이 슬레이브로 복제될 수 있습니다. 다중 스레드 슬레이브에서 바이너리 로깅 없이 이 트랜잭션 롤백을 처리하지 않으면, 슬레이브에서 커밋 순서가 릴레이 로그의 트랜잭션 순서와 다를 수 있습니다. (WL #7846)

MySQL 8.0.18 릴리스에서는 복제 채널에 대해 PRIVILEGE_CHECKS_USER 계정을 지정할 수 있는 기능이 도입되었습니다(CHANGE MASTER TO 문 사용). 이는 복제된 트랜잭션이 적용될 때 MySQL이 권한 검사를 수행할 계정입니다. PRIVILEGE_CHECKS_USER 계정 사용은 권한 있는 작업 또는 원하지 않는 작업의 무단 사용으로부터 복제 채널을 보호하는 데 도움이 됩니다. 권한 검사가 적용된 복제 채널에서는 행 기반 바이너리 로깅을 사용하는 것이 강력히 권장됩니다.MySQL 8.0.19에서는 복제 채널에 대해 REQUIRE_ROW_FORMAT이라는 새 설정이 추가되어 해당 채널이 행 기반 복제 이벤트만 허용하도록 합니다. CHANGE MASTER TO 문을 사용하여 권한 검사로 보호된 복제 채널에 대해 행 기반 바이너리 로깅을 강제하거나, 보호되지 않은 채널의 보안을 강화할 수 있습니다. 행 기반 복제 이벤트만 허용함으로써, REQUIRE_ROW_FORMAT은 임시 테이블 생성 및 LOAD DATA INFILE 요청 실행과 같은 작업을 방지하여 알려진 공격 벡터로부터 복제 채널을 보호합니다. REQUIRE_ROW_FORMAT이 설정된 경우 복제 마스터에서는 반드시 행 기반 바이너리 로깅(binlog_format=ROW)을 사용해야 합니다.그룹 복제는 이미 행 기반 바이너리 로깅을 요구하므로, MySQL 8.0.19부터 그룹 복제 채널은 자동으로 REQUIRE_ROW_FORMAT이 설정되어 생성되며, 해당 옵션을 변경할 수 없습니다. 또한 업그레이드 시 모든 그룹 복제 채널에 이 설정이 적용됩니다.mysqlbinlog에는 새로운 --require-row-format 옵션이 추가되어, mysqlbinlog의 출력에 대해 행 기반 복제 이벤트를 강제합니다. 이 옵션을 사용하여 생성된 이벤트 스트림은 REQUIRE_ROW_FORMAT 옵션으로 보호된 복제 채널에서 허용됩니다. (WL #12968)

MySQL은 테이블스페이스 이름과 테이블 파티션의 파일 이름을 생성할 때 구분자 문자열을 사용합니다. 파티션 이름 앞에는 “#p#” 구분자 문자열이, 서브파티션 이름 앞에는 “#sp#” 구분자 문자열이 붙습니다. 예를 들면 다음과 같습니다:

schema_name.table_name#p#partition_name#sp#subpartition_name
table_name#p#partition_name#sp#subpartition_name.ibd

과거에는 대소문자 구분이 있는 파일 시스템(Linux 등)에서는 구분자 문자열이 대문자(#P# 및 #SP#)로 사용되었고, 대소문자 구분이 없는 파일 시스템(Windows 등)에서는 소문자(#p# 및 #sp#)로 사용되었습니다. 그러나 대소문자 구분이 있는 파일 시스템과 없는 파일 시스템 간 데이터 디렉터리를 마이그레이션할 때 발생하는 문제를 방지하기 위해 이제 모든 파일 시스템에서 구분자 문자열이 소문자로 사용됩니다. 더 이상 대문자 구분자 문자열은 사용되지 않습니다.
또한, 대소문자 구분 설정(lower_case_table_names 설정)에 관계없이 사용자가 지정한 대문자 또는 소문자 파티션 및 서브파티션 이름을 기반으로 생성된 파티션 테이블스페이스 이름과 파일 이름은 이제 소문자로 생성(내부적으로 저장)되어 대소문자 구분이 없도록 보장됩니다. 예를 들어, 파티션 이름이 PART_1로 생성된 경우 테이블스페이스 이름과 파일 이름은 소문자로 생성됩니다:

schema_name.table_name#p#part_1
table_name#p#part_1.ibd

업그레이드 중에는 MySQL이 다음 항목을 확인하고 필요할 경우 수정합니다:

  • 디스크 및 데이터 사전에서 소문자 구분자 및 파티션 이름을 보장하기 위한 파티션 파일 이름.
  • 이전 버그 수정으로 인해 발생한 관련 문제를 해결하기 위한 데이터 사전의 파티션 메타데이터.
  • 이전 버그 수정으로 인해 발생한 관련 문제를 해결하기 위한 InnoDB 통계 데이터.

테이블스페이스 가져오기 작업 중에는 디스크에서 파티션 테이블스페이스 파일 이름을 확인하고 필요할 경우 소문자 구분자 및 파티션 이름을 보장하도록 수정합니다. (WL #13352)
참고: 관련 내용은 다음을 참조하십시오: 버그 #26925260, 버그 #29823032, 버그 #30012621, 버그 #29426720, 버그 #30024653.

효율적인 히스토그램 통계를 생성하기 위해 InnoDB 데이터 샘플링에 대한 지원이 추가되었습니다. 스토리지 엔진이 자체 샘플링을 제공하지 않는 경우 MySQL이 사용하는 기본 샘플링 구현은 전체 테이블 스캔을 필요로 하며, 이는 큰 테이블에서 비용이 많이 듭니다. InnoDB 샘플링 구현은 전체 테이블 스캔을 피함으로써 샘플링 성능을 개선합니다. sampled_pages_readsampled_pages_skipped INNODB_METRICS 카운터를 사용하여 InnoDB 데이터 페이지 샘플링을 모니터링할 수 있습니다. 자세한 내용은 히스토그램 통계 분석을 참조하십시오. (WL #8777)

버그 수정

중요 변경 사항: 다음 문자열 함수들에 대한 캐릭터셋 해석이 변경되었습니다:

이전에는 이러한 함수들의 모든 인수에 대한 캐릭터셋 정보가 집계되어, 형식이 잘못된 결과를 초래할 수 있었습니다. 이는 LPAD() 함수에서도 문제가 발생하였는데, 이 함수는 입력과 출력이 모두 형식에 맞아야 한다고 가정합니다. 이제 나열된 세 가지 함수는 항상 str에서 사용하는 캐릭터셋을 사용하며, 실행 시 다른 모든 인수를 이 캐릭터셋으로 변환합니다. 변환이 실패하면 함수는 오류를 반환합니다. (버그 #30114420)
참조: 이 문제는 버그 #28197977의 회귀입니다.

중요 변경 사항: 서브쿼리 물질화는 더 이상 내부 및 외부 타입의 엄격한 일치를 요구하지 않습니다. 다음 조건 중 하나가 참일 때 다른 타입이 물질화될 수 있습니다:

  • 내부 타입이 숫자형일 때(외부 타입을 숫자로 캐스팅할 방법이 항상 있기 때문)
  • 내부 타입이 시간형일 때(외부 타입을 시간형으로 캐스팅할 방법이 항상 있기 때문)
  • 두 타입이 모두 문자열일 때

(버그 #13960580)

NDB Cluster: NDB 로깅 옵션의 일부 비밀번호 마스킹이 불완전했습니다. (버그 #97335, 버그 #30453137)

InnoDB: 특정 내부 데이터 구조의 초기화가 max_connections 설정에서 파생된 내부 변수에 의존했습니다. InnoDBSET PERSIST를 사용하여 시작 후 max_connections 설정이 수정되었을 때 내부 데이터 구조를 크기에 맞게 조정하지 못했습니다. (버그 #30628872)

InnoDB: GCC 9.2.0으로 MySQL을 컴파일할 때 os_file_get_parent_dir 경고가 발생했습니다. (버그 #30499288, 버그 #97466)

InnoDB: 널 참조를 사용하여 대형 객체(LOB) 값을 액세스하려고 할 때 어설션 실패가 발생했습니다. 이 문제를 방지하기 위해 LOB 참조가 널인지 확인하는 검사가 추가되었습니다. (버그 #30499064)

InnoDB: 데이터 디렉터리를 업그레이드한 후 어설션 실패가 발생했습니다. 준비된 XA 트랜잭션이 여전히 존재하여 undo 테이블스페이스 업그레이드를 방해했습니다. 준비된 트랜잭션 변경 내용을 포함하는 undo 테이블스페이스는 모든 준비된 XA 트랜잭션이 커밋되거나 롤백될 때까지 활성 상태를 유지해야 합니다.
준비된 XA 트랜잭션은 서버를 다시 시작한 후 명시적인 undo 테이블스페이스 잘라내기 작업을 완료하는 것을 방해하기도 했습니다. (버그 #30489497)

InnoDB: Linux에서 대문자 테이블 이름을 사용한 MySQL 5.7 인스턴스를 macOS에서 MySQL 8.0으로 업그레이드하려고 할 때 어설션 실패가 발생했습니다. MySQL 8.0의 파티션 파일 형식 변경으로 인해 데이터 디렉터리를 다른 플랫폼으로 마이그레이션할 수 없었으며, 업그레이드 시 lower_case_table_names 설정이 변경되어 업그레이드가 실패할 수 있었습니다. 이러한 상황에서 실패 대신 오류가 보고됩니다. (버그 #30450968, 버그 #30450979)

InnoDB: macOS에서 대문자 테이블 이름을 사용한 MySQL 5.7 인스턴스를 MySQL 8.0으로 업그레이드하려고 할 때 실패가 발생했습니다. 대문자 테이블 이름이 소문자로 표준화되지 않았습니다. 다음 오류가 보고되었습니다: 테이블이 InnoDB 사전에서 찾을 수 없음 및 SE 데이터 오류 수정 실패. (버그 #30450944)

InnoDB: Windows에서 대문자 파티션 테이블 이름을 사용한 MySQL 5.7 인스턴스를 MySQL 8.0으로 업그레이드하려고 할 때 실패가 발생했습니다. 테이블을 열 때 null 포인터가 반환되어 테이블을 닫을 때 세그멘테이션 오류가 발생했습니다. (버그 #30450918)

InnoDB: Windows에서 대문자 파티션 테이블 이름을 사용한 MySQL 5.7 인스턴스를 MySQL 8.0으로 업그레이드하려고 할 때 mysqld 예외가 발생했습니다. (버그 #30447790)

InnoDB: Windows에서 대문자 이름으로 정의된 일반 테이블스페이스를 포함한 MySQL 5.7 인스턴스를 MySQL 8.0으로 업그레이드하려고 할 때 실패가 발생했습니다. 다음 오류가 보고되었습니다: SE 데이터 수정 오류 및 DD 채우기 실패. (버그 #30446798)

InnoDB: LOB 관련 코드에서 로컬 미니 트랜잭션(mtrs)의 도입으로 인해 복구 중에 어설션 실패가 발생했습니다. (버그 #30417719)

InnoDB: Linux에서 대문자 파티션 테이블 이름을 사용한 MySQL 5.7 인스턴스를 Windows에서 MySQL 8.0으로 업그레이드하려고 할 때 실패가 발생했습니다. MySQL 8.0의 파티션 파일 형식 변경으로 인해 데이터 디렉터리를 다른 플랫폼으로 마이그레이션할 수 없었습니다. 이제 실패 대신 오류가 보고됩니다. (버그 #30411118)

InnoDB: 동일한 압축된 LOB 데이터를 반복적으로 업데이트할 경우 테이블스페이스 파일의 크기가 증가하는 문제가 있었습니다. (버그 #30353812)

InnoDB: temptable_max_ram 제한에 도달했을 때, TempTable 스토리지 엔진이 디스크 기반 스토리지로 전환하는 대신 잘못된 메모리 부족 오류를 보고하는 문제가 있었습니다. (버그 #30314972, 버그 #96893)

InnoDB: 암호화된 테이블을 가져오고 서버를 재시작한 후, 테이블에 액세스하려 할 때 다음 오류가 반환되었습니다: ERROR 3185 (HY000): 키링에서 마스터 키를 찾을 수 없습니다. 서버 로그에서 키링 플러그인이 성공적으로 로드 및 초기화되었는지 확인하십시오. 테이블스페이스 키가 대상 마스터 키로 암호화된 후 디스크에 기록되지 않았습니다. (버그 #30313734)

InnoDB: SQL 문을 구문 분석하고 외래 키 관련 DDL 검사를 수행하던 내부 InnoDB 함수 dict_create_foreign_constraints()가 제거되었습니다. 이 함수는 MySQL 8.0의 데이터 사전 도입과 외래 키 관련 DDL 검사의 SQL 레이어로의 이동으로 인해 불필요하게 되었습니다.
또한, dict_create_foreign_constraints() 함수의 제거는 다음 외래 키 문제를 해결했습니다:

  • 완전히 정규화된 참조 테이블 이름에 있는 점(“.”) 주위의 공백이 InnoDB 구문 분석기에 의해 허용되지 않았습니다.
  • 동일한 ALTER TABLE 문에서 외래 키 추가 및 파티셔닝 제거가 허용되지 않았습니다. InnoDB 구문 분석기는 새로운 테이블 버전이 더 이상 파티션되지 않았음을 감지하지 못했습니다.
  • 외래 키 제약 조건이 “AUX”라는 이름의 스키마 안의 테이블을 참조할 수 없었습니다. 참조된 테이블 이름을 구문 분석하는 함수는 AUX와 같은 특수 이름을 인식하지 못했습니다.
  • 외래 키 정의의 조건부 주석이 무시되었습니다.

또한, SQL 레이어에 ALTER TABLE 문 실행 초기 단계에서 동일한 이름의 외래 키를 여러 개 생성하려는 시도를 감지하는 검사가 추가되었습니다. (버그 #30287895, 버그 #22364336, 버그 #28486106, 버그 #28703793, 버그 #16904122, 버그 #92567, 버그 #11754659, 버그 #46293)

InnoDB: 공간 인덱스의 비리프 페이지를 병합하려고 할 때 두 레코드를 동일하다고 판단하는 비교 함수가 있었습니다. 이 함수는 예기치 않은 조건을 처리할 수 없었고, 그로 인해 긴 세마포어 대기와 결국 어설션 실패가 발생했습니다. (버그 #30287668)

InnoDB: 대형 객체(LOB) 페이지를 해제하는 데 필요한 로컬로 획득된 래치가, 동일한 페이지에 대해 후속 호출자가 래치를 획득하려 할 때 교착 상태를 유발할 수 있었습니다. 또한 롤백 관련 작업 중 압축 또는 비압축 LOB에 대해 취해진 래치가 래치 순서 문제로 인해 교착 상태를 유발할 수 있었습니다. (버그 #30258536)
참조: 이 문제는 버그 #29846292의 회귀 문제입니다.

InnoDB: 삭제 마크된 레코드를 사용 중인 업데이트 스레드와 압축된 LOB 페이지를 정리하는 정리 스레드 사이에 경쟁 조건이 발생하여 어설션 실패가 발생했습니다. (버그 #30197056)

InnoDB: 소스 및 대상 테이블이 다른 DATA DIRECTORY 절로 정의되어 있는 경우, 테이블스페이스 가져오기 작업이 스키마 불일치 오류를 충분히 설명하지 못한 채 실패했습니다. 또한 .cfg 파일이 없을 경우, 동일한 작업이 어설션 실패를 일으켰습니다. 데이터 디렉토리 불일치로 인해 가져오기 작업이 종료되기 전에 보다 자세한 오류 메시지가 이제 보고됩니다. (버그 #30190199, 버그 #30190227, 버그 #20644698, 버그 #76142)

InnoDB: LOB 값이 버퍼 풀보다 큰 경우 정리 작업이 실패했습니다. (버그 #30183982)

InnoDB: 외부 저장된 LOB 데이터를 인라인 스토리지로 이동시키는 업데이트 작업이 이전 LOB 데이터를 정리 가능으로 표시하지 못했습니다. (버그 #30178056, 버그 #96466)

InnoDB: ALTER TABLE ... IMPORT TABLESPACE 작업에서 사용되는 .cfg 메타데이터 파일에 인덱스 키 부분 정렬 순서 정보가 저장되지 않았습니다. 그 결과, 가져오기 작업에 관련된 테이블 중 하나가 DESC 인덱스 키 부분 정렬 순서로 정의되어 있고 다른 테이블이 정의되지 않은 경우, 레코드가 의도하지 않은 순서로 정렬될 수 있었습니다. 이 문제를 해결하기 위해 .cfg 파일 형식이 인덱스 키 부분 정렬 순서 정보를 포함하도록 업데이트되었습니다. (버그 #30128418)

InnoDB: 레코드를 수정하는 트리 구조가 필요한지 감지하는 btr_cur_will_modify_tree() 함수에서 사용된 기준이 불충분했습니다. (버그 #30113362)

InnoDB: 테이블의 수가 많은 인스턴스에서 시작 시 테이블스페이스 파일 스캔으로 인해 시작이 느렸습니다. 50,000개 이상의 테이블스페이스 파일이 있을 때만 다중 스레드 스캔이 시작되었으며, 공간 ID를 검색하기 위해 세 개의 테이블스페이스 페이지가 읽혔습니다. 시작 시간을 개선하기 위해 이제 테이블스페이스 파일 스캔에 추가 스레드가 할당되며, 공간 ID를 검색하기 위해 첫 번째 테이블스페이스 페이지만 읽힙니다. 공간 ID가 테이블스페이스의 첫 번째 페이지에서 발견되지 않으면 이전과 같이 세 페이지를 읽어 공간 ID를 결정합니다. (버그 #30108154, 버그 #96340)

InnoDB: 대소문자 구분이 없는 파일 시스템에서 시작이 실패하고 동일한 테이블스페이스 ID에 대해 여러 파일이 발견되었다는 오류가 발생했습니다. 파일 경로 비교가 대소문자 차이로 인해 innodb_data_home_dirdatadir 경로가 동일하다는 것을 인식하지 못했습니다. (버그 #30040815)

InnoDB: 리눅스에서 lower_case_table_names=1 설정을 사용한 MySQL 8.0.13 인스턴스를 MySQL 8.0.14 또는 MySQL 8.0.15로 업그레이드한 후, mysql.innodb_index_statsmysql.innodb_table_stats 지속적 옵티마이저 통계 테이블에 액세스할 때 스토리지 엔진 오류가 발생했습니다. 지속적 옵티마이저 통계 테이블에 중복 항목이 포함되었습니다. (버그 #30012621)
참조: 이 문제는 버그 #26925260의 회귀 문제입니다.

InnoDB: CREATE TABLESPACE가 테이블스페이스가 이미 존재한다는 오류와 함께 실패했습니다. 이 오류는 이전의 CREATE TABLESPACE 작업이 DDL 실패로 인해 롤백되지 않고 트랜잭션 커밋 전에 롤백이 비활성화된 데서 기인했습니다. 이제 트랜잭션이 성공적으로 커밋된 후 롤백이 비활성화됩니다. (버그 #29959193, 버그 #95994)

InnoDB: 가져온 테이블스페이스에 속한 변경된 페이지가 추적되지 않았습니다. (버그 #29917343)

InnoDB: MySQL 5.7에서 MySQL 8.0으로 업그레이드하는 동안 대소문자를 구분하지 않는 파일 시스템에서 전체 텍스트 검색 보조 테이블의 이름을 변경하는 작업이 테이블스페이스 이름 충돌로 인해 실패했습니다. (버그 #29906115)

InnoDB: 버퍼 풀보다 큰 LOB 값을 삽입하는 INSERT 작업의 롤백이 교착 상태를 유발했습니다. (버그 #29846292, 버그 #95572)

InnoDB: 코드 회귀 문제를 해결하기 위해 세션 임시 테이블에 대해 불필요한 묵시적 인덱스 잠금 전환을 금지했습니다. (버그 #29718243)

InnoDB: 삭제 마크된 레코드를 정리하는 동안 손상된 페이지에 커서가 위치할 때 테이블스페이스 가져오기 작업에서 어설션이 발생했습니다. 이제 손상된 페이지를 만날 때 어설션 대신 가져오기 작업이 종료되고 오류가 보고됩니다. (버그 #29454828, 버그 #94541)

InnoDB: 부분 롤백이 완료되기 전에 삭제 마크된 행이 외부 읽기 잠금을 획득할 수 있었습니다. 외부 읽기 잠금이 암시적 잠금을 명시적 잠금으로 변환하는 것을 방지하여 어설션 실패를 초래했습니다. (버그 #29195848)

InnoDB: 언두 테이블스페이스 잘림 작업이 진행 중인 상태에서 서버 종료가 발생한 후, 시작 시 더블라이트 페이지를 언두 테이블스페이스 페이지로 복구할 수 없다는 경고 메시지가 출력되었습니다. 이제 이러한 경고 메시지는 잘리는 언두 테이블스페이스에 대해 더 이상 출력되지 않습니다. (버그 #28590016)

InnoDB: 읽기 전용 모드(innodb_read_only=ON)에서 SHOW CREATE TABLE 출력에 외래 키 제약 조건 정보가 포함되지 않았습니다. (버그 #21966795, 버그 #78754)

파티셔닝: MySQL 8.0.16 이하 버전에서 서브파티션된 테이블이 있는 데이터베이스를 업그레이드한 후 ALTER TABLE ADD COLUMN을 실행하면 어설션 또는 오류가 발생했습니다. (버그 #30360695, 버그 #97054)

파티셔닝: MySQL 5.7에서 8.0으로 파티션된 테이블을 업그레이드하는 동안, 파티션 함수에서 접두사 키를 사용할 때 접두사 길이가 무시되고 전체 열 길이가 대신 고려되었습니다. 그 결과, 파티션 필드 길이가 너무 커서 테이블이 업그레이드되지 않을 수 있었습니다. (버그 #29941988, 버그 #95921)

파티셔닝: ALTER TABLE ... EXCHANGE PARTITION이 인덱스를 손상시킬 수 있었습니다. 이는 서버가 파티션된 테이블에서 인덱스가 생성되는 순서가 비파티션된 테이블과 동일하다고 가정한 것에서 비롯된 문제였습니다. 이로 인해 잘못된 인덱스 데이터가 교환되었습니다. (버그 #29706669)

복제: 슬레이브가 관련 테이블에서 마스터보다 더 많은 열을 가지고 있는 경우 복제 채널에 대한 권한 검사 중에 어설션이 발생했습니다. 이제 이 검사는 테이블 정의가 아닌 이벤트에 있는 열 수를 참조합니다. (버그 #30343310)

복제: mysql.slave_relay_log_info 테이블에 보관된 복제 연결 매개변수는 RESET SLAVE를 실행한 후 START SLAVE를 실행하기 전에 서버 충돌 또는 고의적인 재시작이 발생한 경우에도 유지됩니다. 이 작업은 복제 권한 검사를 위한 PRIVILEGE_CHECKS_USER 설정(8.0.18에 도입)과 REQUIRE_ROW_FORMAT 설정(8.0.19에 도입)에 적용됩니다. 서버에 relay_log_info_repository=FILE가 설정되어 있으면(기본값은 아님), 이 상황에서 복제 연결 매개변수가 보존되지 않습니다. (버그 #30311908)

복제: 복제 채널이 PRIVILEGE_CHECKS_USER 계정으로 보호된 경우, 이 계정은 ACL 권한이 없어야 합니다. 채널에 복제된 GRANT 문이 복제 적용기를 중지시킵니다. 이 상황에서 동작은 올바르지만 어설션이 발생했습니다. 이제 어설션이 제거되었습니다. (버그 #30273684)

복제: 다중 스레드 복제 슬레이브에 대해 slave_preserve_commit_order=1를 설정하면 해당 객체가 존재하지 않을 때 IF EXISTS 절이 있는 문장의 순서가 유지됩니다. 이전에는 이러한 업데이트가 릴레이 로그에서 앞선 트랜잭션보다 먼저 커밋되어 트랜잭션 순서에 차이가 발생할 수 있었습니다. (버그 #30262096)

복제: 복제 채널에 대한 권한 검사를 수행할 때 sql_require_primary_key 시스템 변수의 세션 값을 설정하는 데 필요한 권한이 확인되지 않았습니다. 이제 이 검사가 수행됩니다. (버그 #30254917)

복제: 실패한 복제 그룹 멤버가 소수 그룹에 다시 합류하려고 할 때 메모리 누수가 발생할 수 있었습니다. (버그 #30162547, 버그 #96471)

복제: 복제 그룹 멤버가 복제 그룹에 다시 합류할 때, group_replication_applier 채널의 릴레이 로그를 확인하여 그룹에서 이미 수신한 트랜잭션을 적용합니다. 그런 다음 합류하는 멤버는 기존 온라인 멤버로부터 상태 전송을 시작하며, 이 과정은 원격 클로닝 작업으로 시작될 수 있습니다. 이전에는 원격 클로닝 작업이 시작될 때 group_replication_applier 채널이 명시적으로 중지되지 않아, 동시에 기존 트랜잭션을 적용할 가능성이 있었습니다. 이제 원격 클로닝 작업을 요청하기 전에 group_replication_applier 채널이 중지되며, 이 채널은 도너의 바이너리 로그에서 상태 전송이 시작될 때 다시 시작됩니다. (버그 #30152028, 버그 #96447)

복제: STOP GROUP_REPLICATION이 멤버의 XCom 포트가 차단된 상태에서 실행되면 XCom 스레드가 중단되었고 종료가 완료되지 않았습니다. 이제 이 상황에서는 XCom이 종료됩니다. (버그 #30139794)

복제: 슬레이브 상태 로그 mysql.slave_relay_log_info(릴레이 로그 정보 로그)와 mysql.slave_worker_info(슬레이브 작업자 로그)는 로컬 또는 원격 클로닝 작업 중에 도너에서 수신자에게 복사됩니다. 슬레이브 상태 로그에는 클로닝 작업 후 복제를 올바르게 재개하기 위한 정보가 포함되어 있으며, 여기에는 릴레이 로그에서 복제를 다시 시작할 위치, PRIVILEGE_CHECKS_USER 계정 설정, 새로운 REQUIRE_ROW_FORMAT 설정 등이 포함됩니다. 릴레이 로그 자체는 도너에서 수신자로 복사되지 않으며, 해당 테이블에 보관된 정보만 복사됩니다. 서버에 relay_log_info_repository=FILE가 설정된 경우(기본값이 아니며, 사용 중단 예정), 슬레이브 상태 로그는 클로닝되지 않으며, TABLE로 설정된 경우에만 클로닝됩니다.
이 패치 이전에는 클로닝 작업을 통해 제공된 복제 슬레이브에서 다음과 같은 복제 관련 동작이 발생했습니다:

  • 기본 복제 채널이 슬레이브에서 유일한 채널일 때, 릴레이 로그 정보가 누락되어 초기화되지 않은 것으로 간주되었기 때문에 복제 채널을 시작할 수 없었습니다.
  • 도너에서 복제 채널에 적용된 PRIVILEGE_CHECKS_USER 계정 설정이 없었으며, 다시 지정해야 했습니다.
  • GTID 자동 포지셔닝을 사용하는 복제 채널은 자동으로 복제를 재개할 수 있었습니다.
  • 바이너리 로그 파일 포지션 기반 복제를 사용하는 복제 채널은 복제를 올바르게 재개하기 위해 MASTER_LOG_FILEMASTER_LOG_POS 옵션을 수동으로 다시 적용해야 했습니다. 이 옵션이 재적용되지 않은 경우, 서버 시작 시 자동으로 복제를 시작하도록 구성된 채널은 처음부터 복제를 시도했으며, 이로 인해 이미 클로닝 작업을 통해 슬레이브로 복사된 데이터를 복제하려고 시도하여 복제가 중단되고 슬레이브 데이터가 손상될 수 있었습니다.

이 변경 사항을 통해 이제 클로닝 작업을 통해 제공된 복제 슬레이브에서 다음과 같은 복제 관련 동작이 발생합니다:

  • 기본 복제 채널은 클로닝 작업 후 항상 시작될 수 있습니다.
  • 모든 채널이 도너의 PRIVILEGE_CHECKS_USER 계정 설정 및 REQUIRE_ROW_FORMAT 설정을 갖습니다.
  • GTID 자동 포지셔닝을 사용하는 복제 채널은 여전히 자동으로 복제를 재개할 수 있습니다. 그룹 복제 채널의 경우, 최적의 복제를 보장하기 위해 RESET MASTER의 내부 동등 명령이 사용됩니다.
  • 바이너리 로그 파일 포지션 기반 복제를 사용하는 복제 채널은 클로닝 후 올바른 MASTER_LOG_FILEMASTER_LOG_POS 옵션을 갖습니다. 릴레이 로그 자체는 클로닝되지 않으므로, 이 채널은 복제를 다시 시작하기 전에 클로닝된 릴레이 로그 정보를 사용하여 릴레이 로그 복구 프로세스를 수행하려고 시도합니다. 단일 스레드 슬레이브(slave_parallel_workers가 0으로 설정된 경우)는 다른 문제가 없는 한 릴레이 로그 복구가 성공적으로 완료되며, 복제를 올바르게 재개할 수 있습니다. 다중 스레드 슬레이브(slave_parallel_workers가 0보다 큰 경우)는 릴레이 로그 복구가 자동으로 완료되지 않을 수 있으며, 오류 메시지가 출력되지만 데이터는 손상되지 않습니다.

(버그 #29995256, 버그 #30510766)

복제: 다중 스레드 복제 슬레이브에서 relay_log_space_limit 시스템 변수가 슬레이브의 릴레이 로그 크기를 제한하도록 설정되었을 때, 코디네이터 스레드가 이 제한과 로그의 끝 위치와 관련된 잠금을 획득하면서 내부 교착 상태가 발생할 수 있었습니다. (버그 #29842426)

복제: 복제 슬레이브가 CHANGE MASTER TO 문을 사용하여 마스터 로그 파일 이름과 마스터 로그 위치를 지정하지 않고 설정된 경우, START SLAVE가 실행되기 전에 종료된 후, --relay-log-recovery 옵션을 설정하여 재시작되면 복제가 시작되지 않았습니다. 이 문제는 릴레이 로그에서 마스터 로그 파일 이름과 위치를 제공할 수 있는 로그 회전 이벤트가 없기 때문에 발생했습니다. 이 상황에서는 이제 슬레이브가 릴레이 로그 복구를 건너뛰고 경고를 기록한 다음 복제를 시작합니다. (버그 #28996606, 버그 #93397)

그룹 복제: 그룹 복제가 실행 중일 때, 그룹에 합류하는 멤버가 분산 복구 과정 중 오류가 발생하면(이 과정에서 합류하는 멤버가 기존 온라인 멤버로부터 상태 전송을 받음), 자동으로 새로운 도너로 전환되고 상태 전송이 재시도됩니다. 합류하는 멤버가 포기하기 전에 재시도하는 횟수는 group_replication_recovery_retry_count 시스템 변수로 설정됩니다. Performance Schema 테이블 replication_applier_status_by_worker에는 마지막 재시도의 원인이 된 오류가 표시됩니다. 이전에는 이 오류가 복제 적용기 스레드가 병렬로 구성된 경우에만 표시되었습니다. 이제 재시도 후 오류가 항상 볼 수 있도록 RESET SLAVE 작업이 수행되지 않습니다. (버그 #30517160, 버그 #30517172, 버그 #97540)

그룹 복제: 그룹 복제 멤버가 그룹을 떠날 때(STOP GROUP_REPLICATION 명령을 실행하거나 오류로 인해), 그룹 복제는 이제 그룹에 남아 있는 멤버들에게 불필요한 바이너리 로그 데이터를 전송하지 않도록 해당 멤버의 바이너리 로그 덤프 스레드를 중단합니다. (버그 #30315614)

그룹 복제: 클로닝 작업 후 그룹 복제를 시작하거나 RESET MASTER를 실행하거나 릴레이 로그에서 부분 트랜잭션을 제거한 후, 서버의 불필요한 상태를 초기화하기 위해 내부적으로 RESET SLAVE ALL이 사용되었습니다. 하지만 MySQL 8.0.18에서는 이로 인해 그룹 복제 채널에 지정된 PRIVILEGE_CHECKS_USER 계정이 제거되었습니다. 이제 이 문제를 해결하기 위해 RESET SLAVE가 대신 사용되며, 이는 계정을 제거하지 않습니다. (버그 #30262225)

그룹 복제: 그룹 복제가 단일-프라이머리 모드로 실행 중일 때 새로운 프라이머리 서버가 선출되면, 이제 해당 시점에 로그된 메시지에 새로 선출된 프라이머리 서버의 gtid_executed 세트와 복제 적용기에 의해 검색된 GTID 세트가 포함됩니다. (버그 #30049310)

그룹 복제: 그룹 복제 멤버가 예기치 않게 중지된 후 즉시 다시 시작되면(예: mysqld_safe로 시작된 경우), group_replication_start_on_boot=on이 설정된 경우 그룹에 자동으로 다시 합류하려고 시도합니다. 이전에는 멤버가 중단된 후 그룹에서 제외되기 전에 다시 합류를 시도하면, 멤버가 그룹에 다시 합류할 수 없었습니다. 이제 이 시나리오에서는 그룹 복제가 GCS(Group Communication System) 기능을 자동으로 사용하여 멤버가 5초 간격으로 최대 10번 재합류를 시도하도록 재시도합니다. 이 기능은 대부분의 경우에 충분한 시간이 주어져 멤버가 그룹에서 제외되기 전에 다시 합류할 수 있도록 합니다. 단, group_replication_member_expel_timeout 시스템 변수가 더 긴 대기 기간을 지정하도록 설정된 경우, 자동 재합류 시도가 실패할 수도 있습니다. (버그 #29801773)

macOS: macOS에서 MySQL을 -DWITH_SSL=system으로 구성할 때, mysql_config 출력에 내부 CMake 이름이 잘못 포함되어 있었던 문제가 수정되었습니다. (버그 #30541879, 버그 #97632)

macOS: macOS에서 Ninja를 사용한 빌드가 여러 번 심볼릭 링크를 생성하려고 시도하면서 오류로 실패할 수 있는 문제가 수정되었습니다. (버그 #30368985)

Microsoft Windows; JSON: Windows 플랫폼에서 테이블을 삭제한 후 다중 값 인덱스에 사용된 메모리가 해제되지 않았습니다. (버그 #30227756)

Microsoft Windows: Windows에서 -DWITH_SSL=system을 사용하여 OpenSSL 헤더를 찾을 수 없는 문제가 Strawberry Perl이 설치된 경우 발생했습니다. (버그 #30359287)

Microsoft Windows: Windows에서 시스템 OpenSSL 라이브러리로 이어지는 경로 이름에 공백이 포함된 경우 -DWITH_SSL=system 옵션이 작동하지 않았습니다. 이 문제가 해결되었으며, 이제 -DWITH_SSL=yes 옵션도 다른 플랫폼과 동일하게 -DWITH_SSL=system으로 처리됩니다. (버그 #30261942, 버그 #96739)

Microsoft Windows: MSVC 2019가 컴파일 오류에 대해 잘못된 소스 파일 이름을 생성하는 문제가 있었습니다. 이를 해결하기 위해 CMake 설정에서 해결책이 구현되었습니다. (버그 #30255096, 버그 #96720)

JSON: JSON 열에서 문자열 요소를 동일한 바이트 시퀀스를 포함하는 바이너리 문자열로 교체할 때, 해당 값이 변경되지 않는 문제가 있었습니다.
이 문제의 근본 원인은 MySQL 8.0.17에서 도입된 다중 값 인덱스 구현으로 인해 JSON 문자열과 JSON 불투명(opaque) 값 간의 비교 방식이 변경된 데 있었습니다. 이전에는 JSON 문자열과 JSON 불투명 값이 결코 동일하다고 간주되지 않았으나, 이 변경 이후 두 값의 바이너리 데이터가 일치하면 동일하다고 간주되었습니다.
이 변경 사항에 대한 분석 결과, 이러한 변경은 필요하지 않았으며, 새로운 동작이 기존의 JSON 값 비교에 대한 문서와 충돌한다는 점이 확인되었습니다. 이 문제는 원래 동작을 복원하여 수정되었습니다. (버그 #30348554)

JSON: JSON_TABLE() 함수를 사용하는 뷰가 JSON 경로 인수에 인코딩된 문자 집합을 유지하지 않는 문제가 있었습니다. 이로 인해 뷰가 정의된 문자 집합과 다른 문자 집합으로 평가될 때 잘못된 결과가 생성될 수 있었습니다. 이 문제는 JSON_TABLE()이 원래 문자 집합을 유지하도록 수정되었습니다. (버그 #30310265)

JSON: JSON 열에 기능성 인덱스를 추가하면 문자열을 비교하는 데 사용된 정렬 규칙이 변경되어 인덱스가 없는 경우와 비교할 때 동일한 쿼리에서 다른 결과를 반환하는 문제가 있었습니다. (버그 #29723353)

JSON: 저장 프로시저 실행 중 const로 평가된 JSON_TABLE() 함수의 첫 번째 인수가 준비 중에 const로 평가되지 않는 경우, 이후 해당 프로시저를 다시 실행할 때마다 빈 결과가 반환되는 문제가 있었습니다. (버그 #97097, 버그 #30382156)

JSON: 쿼리가 FORCE INDEX를 사용할 때, 테이블을 읽는 비용이 DBL_MAX로 평가되었습니다. 이 값은 2e308로 반올림되어 JSON 구문 분석기에서 처리할 수 없었습니다. 이제 이러한 경우 값이 1.5e308보다 클 때는 1e308로 반올림됩니다. (버그 #96751, 버그 #30226767)

MySQL 5.7에서 MySQL 8.0으로 업그레이드한 후 CLONE INSTANCE 작업이 ERROR 3862 (HY000): Clone Donor Error: 1016 : Can't open file: './undo001' 오류와 함께 실패하는 문제가 있었습니다. 이는 업그레이드 과정에서 메모리 내 undo 테이블스페이스가 고아 상태로 남아 있었기 때문입니다. 이 문제는 Satya Bodapati의 기여로 해결되었습니다. (버그 #30602218, 버그 #97784, 버그 #30239255, 버그 #96637)

MySQL 옵티마이저의 해시 조인 알고리즘은 중간 결과를 저장하기 위해 조인 버퍼를 사용합니다. 이 버퍼가 넘칠 경우 서버는 임시 파일로 해시 조인 연산 중 하나를 디스크에 기록하는 스필-투-디스크(spill-to-disk) 알고리즘을 사용하여 이를 처리합니다. 그러나 조인에 포함된 테이블 중 하나가 푸시드 조인(pushed join) 연산의 일부일 때, 모든 자식 결과 행이 현재 조인 평가에서 중첩 루프(nested-loop) 방식으로 읽히도록 요구되기 때문에 이 전략이 충돌할 수 있었습니다. 이로 인해 잘못된 쿼리 결과가 반환될 수 있었습니다. (버그 #30573733)

INFORMATION_SCHEMA.VIEWS 테이블에 대한 접근 권한이 잘못된 사용자에게도 허용되는 문제가 있었습니다. (버그 #30542333)

해시 조인 중 조회에 사용되는 해시 값을 생성할 때 서버가 PAD SPACE 속성을 고려하지 않는 문제가 있었습니다. 이로 인해 'foo''foo 'PAD SPACE 정렬 규칙을 사용할 때 일치하지 않는 문제가 발생했습니다. 이제 이 문제는 모든 문자열이 가장 긴 문자열의 길이에 맞게 패딩되도록 수정되었습니다. (버그 #30535541)

DECIMAL 열을 포함하는 대규모 결과 집합을 보조 엔진에서 검색할 때, 텍스트 프로토콜을 통해 값을 문자열로 변환하는 과정에서 성능 저하가 발생하는 문제가 있었습니다. 이 문제는 내부 변환 함수의 성능을 개선하여 최대 50%까지 성능이 향상되었습니다. (버그 #30528427)

여러 행을 처리하기 위해 FORMAT_PICO_TIME() 함수가 호출될 때, 한 행에서 NULL 인수가 발견되면 이후 모든 결과가 NULL로 설정되는 문제가 있었습니다. (버그 #30525561)

퍼포먼스 스키마 이벤트를 타이밍할 때, 타이머 시작 및 종료 값이 동일한 이벤트에 대해 events_*** 테이블에 보고된 이벤트 지속 시간이 NULL로 표시되는 문제가 있었습니다. (버그 #30525560)

괄호로 묶인 쿼리에 LIMIT 절을 추가하면 괄호 내에서 테이블을 잠그는 절이 무시되는 문제가 있었습니다. 예를 들어, 다음 쿼리는 테이블을 잠그지 않았습니다:

(SELECT ... FOR UPDATE) LIMIT ...;

LIMIT 절을 괄호로 묶인 쿼리 외부에 추가하면, 괄호 내부의 LIMIT 절을 덮어쓰는 것이 의도된 동작입니다. 그러나 외부 LIMIT 절이 괄호 안의 ORDER BY도 억제하는 문제가 있었습니다. 예를 들어, 다음 쿼리에서는 ORDER BY가 억제되었습니다:

(SELECT ... ORDER BY ... LIMIT a) LIMIT b;

이제 내부의 잠금 및 ORDER BY 절은 외부 LIMIT 절에 의해 억제되지 않습니다. (버그 #30521098, 버그 #30521803)

옵티마이저가 상수 테이블에 대한 조건을 조기에 추출할 때, 스토어드 함수와 같은 평가 비용이 높은 조건이 포함된 WHERE 절이 제외되는 문제가 있었습니다. 상수 테이블만 포함된 조건이 참으로 평가되면 전체 WHERE 절이 잘못 제거되었습니다. 이제 이러한 경우 WHERE 절을 제거하기 전에 평가 비용이 높은 조건에 대한 확인이 수행됩니다. (버그 #30520714)

DISTINCT를 사용하는 측면적 재료화 파생 테이블(lateral materialized derived table)이 외부 행마다 재료화되지 않는 문제가 있었습니다. (버그 #30515233)

EXPLAIN ANALYZEWITH RECURSIVE를 사용하는 공통 테이블 표현식(CTE)과 올바르게 작동하지 않는 문제가 있었습니다. (버그 #30509580)

GNU gold 로더가 일부 플랫폼에서 메모리 고갈을 일으킬 수 있었습니다. 이제 이 로더는 기본적으로 Intel 64비트 플랫폼에서만 사용됩니다. (버그 #30504760, 버그 #96698)

일부 Linux 플랫폼에서 libstdc++clock_gettime() 대신 시스템 호출을 사용함에 따라 EXPLAIN ANALYZE의 오버헤드가 높아지는 문제가 있었습니다. (버그 #30483025)

Solaris 11.4에서 LDAP 인증 플러그인을 빌드할 수 없었던 문제가 있었습니다. (버그 #30482553)

MEMBER OF() 연산자를 사용하는 쿼리가 항상 올바르게 처리되지 않는 문제가 있었습니다. (버그 #30477993)

Visual Studio에서 Boost 컴파일이 VC++ 2013 버그에 대한 Boost의 해결 방법으로 인해 실패하는 문제가 있었습니다. 이 버그는 이제 MySQL에서 수정되었습니다. (버그 #30474056, 버그 #97391)

대규모 정수 데이터를 포함한 결과 집합을 보조 엔진에서 검색할 때, 정수를 문자열로 변환하는 과정에서 병목이 발생할 수 있었습니다. 이 문제를 방지하기 위해 내부 변환 함수의 성능이 향상되었습니다. (버그 #30472888)

Docker 패키지에서 LDAP 인증 플러그인이 누락되었습니다. (버그 #30465247)

mysys/my_handler_errors.h 오류 메시지의 오타가 수정되었습니다. Nikolai Kostrigin에게 이 기여에 감사드립니다. (버그 #30462329, 버그 #97361)

innodb_force_recovery가 활성화된 상태에서 GTID 테이블을 업데이트하면 디버그 어설션 오류가 발생하는 문제가 있었습니다. (버그 #30449531, 버그 #97312)

MySQL이 Protobuf 3.10과 함께 컴파일되지 않는 문제가 있었습니다. (버그 #30428543, 버그 #97246)

시스템 시작 중에 버퍼링된 로그 라인이 손실될 수 있는 문제가 있었습니다. (버그 #30422941, 버그 #97225)

mysql.user 시스템 테이블의 이름을 변경하면 서버가 종료되는 문제가 있었습니다. (버그 #30418070)

호스트 이름 없이 지정된 역할을 취소하면 서버가 종료될 수 있는 문제가 있었습니다. (버그 #30416389)

세미조인(semi-join) 내에서 다른 테이블이 이 테이블에 종속된 경우, 세미조인 테이블을 분리할지 여부를 결정할 때 기본 테이블만 고려하고 중첩된 조인에 있는 테이블은 무시되는 문제가 있었습니다. (버그 #30406241)
참조: 버그 #12714094, 버그 #11752543, 버그 #43768도 참조하십시오.

Ubuntu 플랫폼의 AppArmor 프로필이 OpenSSL 구성을 읽을 수 없는 문제가 있었습니다. (버그 #30375723)

Fedora 30 패키지 중 일부에 결합 정보가 누락되어 기존 MySQL 설치를 업그레이드할 때 문제가 발생할 수 있었습니다. (버그 #30348549, 버그 #96969)

ALTER SCHEMA 문에서 기본 암호화만 변경할 때 스키마 기본 캐릭터셋과 정렬 순서가 시스템 기본값으로 재설정되는 문제가 있었습니다. (버그 #30344462, 버그 #96994)

AUTO_INCREMENTDEFAULT 값 표현식을 모두 사용하여 선언된 열(허용되지 않는 조합)이 있을 때 어설션이 발생하거나 서버가 종료될 수 있는 문제가 있었습니다. (버그 #30331053)

익명 사용자에 대한 SHOW GRANTS가 특정 조건에서 서버 종료를 유발할 수 있는 문제가 있었습니다. (버그 #30329114)

GREATEST()LEAST()가 시간 값을 항상 올바르게 처리하지 않는 문제가 있었습니다. (버그 #30326848)
참조: 이 문제는 버그 #25123839의 회귀 문제입니다.

파티션 객체의 서브파티션 목록이 직렬화되지 않아 직렬화된 데이터 사전 정보(SDI)에 포함되지 않는 문제가 있었습니다. 이를 해결하기 위해 서브파티션 데이터 사전 정보의 직렬화 및 역직렬화 지원이 추가되었습니다. 이 버그에 대한 패치에는 경미한 SDI 코드 리팩토링 및 형식 변경도 포함되며, 형식 변경으로 인해 SDI 버전 번호가 증가되었습니다. (버그 #30326020, 버그 #96943)

ANALYZE TABLE을 실행한 후 쿼리 최적화 추적(optimizer trace)이 동일한 쿼리에서 이전에 다른 쿼리를 실행한 후에 다르게 나타나는 문제가 있었습니다. (버그 #30321546)

innodb_buffer_pool_instancesSET PERSIST 또는 PERSIST_ONLY로 설정되었을 때 서버 시작 시 제대로 초기화되지 않는 문제가 있었습니다. (버그 #30318828)

낮은 max_allowed_packet 값이 설정되어 있으면 다음과 같은 오류가 발생했습니다: ERROR 1153 (08S01) at line 1: Got a packet bigger than 'max_allowed_packet' bytes. 이 오류 메시지는 클로닝 작업에 필요한 최소 max_allowed_packet 값을 나타내도록 수정되었습니다. (버그 #30315486, 버그 #96891)

서버 코드가 클라이언트에게 보내야 할 오류 코드를 잘못 처리하여 오류 로그에 기록되도록 했을 때 어설션이 발생할 수 있는 문제가 있었습니다. 이 문제는 클라이언트에게 적절한 오류 코드를 보내도록 수정되었습니다. (버그 #30312874)

뷰 정의의 본문에 조인과 다중 서브쿼리가 포함된 경우 CREATE VIEW가 항상 성공하지 않는 문제가 있었습니다. (버그 #30309982)
참조: 이 문제는 버그 #25466100의 회귀 문제입니다.

SLES 12 RPM 패키지의 종속성 정보가 잘못되어 MySQL 설치가 실패할 수 있는 문제가 있었습니다. (버그 #30308305)

해시 조인 청크 파일에서 GEOMETRY 데이터를 GEOMETRY 열로 복원할 때, 서버가 해당 데이터를 열에 복사하지 않고 임시 버퍼에 있는 데이터에 대한 포인터만 저장하였습니다. 따라서 버퍼가 재사용되면 GEOMETRY 열이 무작위 데이터를 가리키게 되었습니다. 이제 서버는 해시 조인을 실행할 때 임시 버퍼에서 이 데이터를 항상 GEOMETRY 열로 복사합니다. (버그 #30306279)

COPY 알고리즘을 사용하는 일부 ALTER TABLE 작업에서 표현식 기본값이 있는 열을 올바르게 처리하지 못한 문제가 있었습니다. (버그 #30302907, 버그 #96864)

CONV() 함수가 반환할 문자 수를 항상 제대로 처리하지 못하는 문제가 있었습니다. (버그 #30301543)

파서의 재귀 검사(recursion check)가 충분하지 않아 스택 오버플로가 발생할 수 있는 문제가 있었습니다. (버그 #30299881)

항상 false로 평가되는 조건을 가진 서브쿼리를 제거하는 작업이 해결 중에 이루어지기로 되어 있었지만, 테이블을 포함하지 않은 서브쿼리의 경우 서버가 이를 최적화하기 전에 실행해버려 이후 확인 작업이 실패하는 문제가 있었습니다. 이제 서버는 이러한 경우 서브쿼리가 이미 실행되었는지 여부를 확인합니다. (버그 #30273827)

디버그 빌드에서 유효하지 않은 표현식 기본값을 가진 열을 빈 임시 테이블에 추가하려고 시도할 때 어설션이 발생하는 문제가 있었습니다. (버그 #30271792)

iterator 트리의 생성 과정에서 비계층적 구조가 생성될 수 있는 문제가 있었습니다. 예를 들어, a LEFT JOIN b LEFT JOIN c에서 bc가 세미조인(semijoin)의 오른쪽에 있을 때 발생할 수 있었습니다. iterator 실행기는 이러한 경우 전체 쿼리 상단에 weedout을 추가하여 문제를 해결하지만, 이로 인해 행 ID와 상호작용하는 iterator는 해당 ID를 저장하고 복원할 수 있어야 합니다. 모든 해당 iterator에서 이를 수행하지 않아 잘못된 결과가 발생할 수 있었습니다. 이제 weedout이 추가될 때 이 정보가 iterator에게 즉시 전달되어 영향을 받는 iterator가 생성되기 전에 알 수 있게 됩니다. (버그 #30267889)

SQL 레이어와 데이터 사전에서 외래 키 처리 코드의 중복이 제거되었습니다. 이로 인해 오류 메시지가 더 명확하고 설명적으로 개선되었습니다. (버그 #30267236, 버그 #96765)

서버 시작 시 영구 변수를 잘못 처리하여 서버가 종료되는 문제가 있었습니다. (버그 #30263773)

일부 물질화된 세미조인(materialized semijoin)을 포함하는 쿼리에서 iterator 실행기를 사용할 때 조건이 물질화 단계 외부에서 평가되어 비효율적인 쿼리 계획을 사용하거나 잘못된 결과를 생성할 수 있는 문제가 있었습니다. (버그 #30250091)

CHECK 제약 조건에서 사용된 열을 변경하는 ALTER TABLE 문이 잘못된 오류 메시지를 반환할 수 있는 문제가 있었습니다. (버그 #30239721)

SELECT 문에서 잠금 절 다음에 사용된 “INTO `var_name“` 구문이 합법적이지만 파서에서 이를 거부하는 문제가 있었습니다. (버그 #30237291, 버그 #96677)

동일 세션에서 LOCK INSTANCE FOR BACKUP 문을 실행한 후 FLUSH TABLES WITH READ LOCK 문을 실행했을 때, 다른 세션에서 동일한 데이터베이스에 대한 ALTER DATABASE 문이 실행 중이면 교착 상태가 발생하는 문제가 있었습니다. (버그 #30226264)

느린 쿼리 로그가 클래식 클라이언트/서버 프로토콜을 사용하지 않는 연결에서 서버 종료를 유발할 수 있는 문제가 있었습니다. (버그 #30221187)

명시적으로 이름을 지정하지 않은 외래 키를 추가할 때, 준비된 문 또는 저장 프로그램에서 실행할 경우 불필요한 중복 외래 키 이름 오류가 발생하는 문제가 있었습니다. (버그 #30214965, 버그 #96611)
참조: 이 문제는 버그 #30171959의 회귀 문제입니다.

AUTO_INCREMENT 열이 있는 테이블에 여러 세션이 INSERT ... ON DUPLICATE KEY UPDATE 문을 동시에 실행할 때, AUTO_INCREMENT 값을 지정하지 않으면 삽입이 고유 인덱스 위반으로 실패할 수 있는 문제가 있었습니다. (버그 #30194841, 버그 #96578)

클라이언트 프로그램이 플러그인 라이브러리 외부에서 인증 플러그인을 로드할 수 있는 문제가 있었습니다. (버그 #30191834, 버그 #30644258)

테이블 스캔과 인덱스 조회 간 전환 시 AlternativeIterator가 핸들러를 재설정하지 않아 어설션 실패가 발생할 수 있는 문제가 있었습니다. (버그 #30191394)

open_files_limit 값을 크게 설정하거나 운영 체제의 rlimit이 RLIM_INF와 다르지만 큰 값으로 설정되었을 때 서버가 메모리 부족 문제를 일으킬 수 있었습니다. 이 수정 사항으로 서버는 open_files_limit 값을 부호 없는 정수의 최대값으로 제한하게 되었습니다. (버그 #30183865, 버그 #96525)

대소문자 구분이 있는 방식으로 지정된 INFORMATION_SCHEMA 테이블을 완전히 참조할 때 오류가 발생할 수 있는 문제가 있었습니다. (버그 #30158484)

실행 시간이 35일을 초과하는 느린 쿼리로 인해 mysql.slow_log 시스템 테이블이 손상되어 REPAIR TABLE 작업이 필요할 수 있는 문제가 있었습니다. (버그 #30113119, 버그 #96373)

MySQL이 NOTIFY_SOCKET 환경 변수를 사용하여 명명된 추상 네임스페이스 소켓에 시스템 알림 메시지를 전송하지 못하는 문제가 있었습니다. (버그 #30102279)

SET PERSIST_ONLY를 사용하여 부울 시스템 변수를 숫자 값으로 설정할 경우 서버가 재시작되지 않는 문제가 있었습니다. (버그 #30094645, 버그 #30298191, 버그 #96848)

이전 문제에 대한 수정으로 인해 두 개의 TABLE_LIST 생성자가 결합되는 문제가 발생했습니다. 이 중 하나는 임시 테이블을 나타내는 TABLE 객체에서 TABLE_LIST 객체를 생성하는 것이었으며, 이전에는 테이블 이름이 별칭과 동일하게 설정되었습니다. 그러나 이 동작이 테이블 객체에서 이름을 복사하도록 변경되었습니다. 임시 테이블의 경우 테이블 이름이 파일 경로이므로 MDL_key 이름 제한을 초과할 수 있어 어설션 실패가 발생할 수 있었습니다. 이 문제는 원래의 동작을 복원하도록 전용 생성자를 다시 도입하여 해결되었습니다. (버그 #30083125)
참조: 이 문제는 버그 #27482976의 회귀 문제입니다.

UNIX_TIMESTAMP() 오류가 발생한 후 저장 함수 내에서 후속 함수 호출 시 초 단위의 소수 자릿수가 잘못될 수 있는 문제가 있었습니다. (버그 #30034972, 버그 #96166)

공통 테이블 표현식(CTE)에 비결정적 표현식(예: RAND())이 포함되어 있고, 외부 쿼리에서 이 공통 테이블 표현식을 여러 번 참조할 경우, 일부 경우 병합되어 각 참조에 대해 다른 결과를 반환하는 문제가 있었습니다. 이제 이러한 경우에는 공통 테이블 표현식이 병합되지 않고 물질화됩니다. (버그 #30026353)

MySQL 8.0.16에서 8.0.17로 업그레이드한 후 lower_case_table_names=1 설정을 사용한 상태에서 파티션된 테이블의 테이블스페이스를 폐기할 때 심각한 오류가 발생할 수 있었습니다. 데이터 사전에 저장된 파티션 테이블스페이스 이름이 잘못되었으며, MySQL 8.0.17에서 준비된 메타데이터 잠금 키가 mysql.tablespaces 테이블에 저장된 키와 일치하지 않는 문제가 있었습니다. (버그 #30024653)

KILL QUERY가 의도된 쿼리가 아닌 그 다음 쿼리를 종료시킬 수 있는 문제가 있었습니다. (버그 #29969769)

lower_case_table_names=2를 사용할 때, 대문자로 된 테이블 이름을 SHOW TABLES에서 표시하지 못하는 문제가 있었습니다. (버그 #29957361)

잘못된 생성된 열 표현식이 있는 테이블을 업그레이드하려고 시도할 때 오류 메시지가 충분한 정보를 제공하지 못하는 문제가 있었습니다. 이제 오류 메시지에 생성된 열 이름과 생성된 열을 만들기 위해 사용된 표현식이 포함됩니다. (버그 #29941887, 버그 #95918)

해석할 수 없는 뷰를 표시하려고 시도할 때 서버가 오류를 반환하지 않고 종료될 수 있는 문제가 있었습니다. (버그 #29939279)

CREATE TABLE 문에서 잘못된 시간 리터럴을 처리할 때 서버가 종료될 수 있는 문제가 있었습니다. (버그 #29906966, 버그 #95794)

병렬 읽기 작업을 위해 스레드를 생성하려고 시도할 때 시스템 리소스가 일시적으로 부족한 경우 시스템 오류가 발생하는 문제가 있었습니다. (버그 #29874480)

mysql.global_grants 시스템 테이블에 예기치 않은 값을 기록하면 서버가 종료될 수 있는 문제가 있었습니다. (버그 #29873343)

INFORMATION_SCHEMA.EVENTS 테이블의 LAST_EXECUTED 값이 이벤트 시간대가 아닌 UTC로 잘못 보고되는 문제가 있었습니다. (버그 #29871530, 버그 #95649)

keyring_encrypted_file_password 값을 서버 시작 시 명령줄에서 설정했을 때, 시스템 유틸리티에 의해 비밀번호 값이 노출될 수 있는 문제가 있었습니다. (버그 #29848634)

MySQL 5.7에서 MySQL 8.0으로 업그레이드하는 동안 lower_case_table_names 설정을 변경하면 스키마나 테이블 이름의 대소문자 불일치로 인해 실패할 수 있는 문제가 있었습니다. lower_case_table_names=1인 경우, 업그레이드 프로세스가 모든 문자가 소문자인지 확인하도록 스키마 및 테이블 이름을 검사합니다. 대문자가 포함된 테이블 또는 스키마 이름이 발견되면 업그레이드가 오류와 함께 실패합니다. 관련 정보는 업그레이드를 위한 설치 준비를 참조하십시오. (버그 #29842749, 버그 #95559)

LOCK TABLES 문이 실행 중일 때 잠긴 테이블에 대한 메타데이터 변경 작업이 성능 스키마나 세션 변수에 대한 SHOW 쿼리가 opening_tables 상태에서 대기하도록 유발할 수 있는 문제가 있었습니다. (버그 #29836204, 버그 #92387)

A AND (B OR C [OR ...]) 형식의 WHERE 조건을 사용하는 SELECT 문에서 불가능한 범위가 발생할 경우, 서버가 예기치 않게 종료되는 문제가 있었습니다. (버그 #29770705)

JSON 형식의 감사 로깅(audit logging)에서 id 필드에 65535보다 큰 값이 포함될 수 있습니다. 이전에는 초당 65536개 이상의 쿼리가 실행되면 id 값이 허용되는 16비트를 초과하는 문제가 있었습니다. (버그 #29661920)

불완전한 연결 패킷이 클라이언트가 인증 플러그인 이름을 올바르게 초기화하지 못하도록 할 수 있는 문제가 있었습니다. (버그 #29630767)

파서에서 발생하는 메모리 부족 오류가 무시되어 서버가 종료될 수 있는 문제가 있었습니다. (버그 #29614521)

성능 스키마 파일 계측이 비활성화되었다가 다시 활성화되었을 때, Linux에서 어설션이 발생할 수 있는 문제가 있었습니다. (버그 #29607570)

CREATE TABLE 문에서 PRIMARY KEY로 정의된 열에 대해 표현식으로 제공된 기본값이 무시되는 문제가 있었습니다. (버그 #29596969, 버그 #94668)

MySQL 8.0.16에서 추가된 TABLE_ENCRYPTION_ADMIN 권한이 업그레이드 중에 시스템 정의 mysql.session 사용자에게 잘못 부여되었습니다. (버그 #29596053, 버그 #94888)

OpenSSL로 암호화된 연결에서 소켓 수준의 네트워크 I/O가 성능 스키마에 보고되지 않았습니다. 또한 서버가 IDLE 상태에 있을 때 수행된 네트워크 I/O도 성능 스키마에 보고되지 않았습니다. (버그 #29205129, 버그 #30535558, 버그 #97600)

세미조인 변환 또는 파생 테이블 병합으로 인해 외부 쿼리 블록으로 병합된 서브쿼리를 사용하는 쿼리에서, 서브쿼리 자체가 기본 쿼리 블록과 다른 집계 쿼리 블록을 포함하는 집계 함수를 포함할 경우, 첫 번째 실행에서 행이 반환되지 않거나 FLUSH TABLES 실행 후에만 올바른 결과를 반환하는 문제가 발생할 수 있었습니다. 병합 과정에서 사용된 테이블 정보 및 집계 함수의 집계 정보가 제대로 업데이트되지 않아 발생한 문제입니다. (버그 #28941154)

mandatory_roles 시스템 변수를 변경하면, 동시 실행 중인 세션에서 SHOW GRANTS 결과가 잘못될 수 있었습니다. (버그 #28699403)

keyring_aws 초기화 실패가 SSL 소켓 초기화 실패를 초래할 수 있는 문제가 있었습니다. (버그 #28591098)

특정 조건에서 read_only 또는 super_read_only 시스템 변수를 활성화해도 SUPER 권한이 없는 사용자가 동시 실행하는 DDL 문을 차단하지 못하는 문제가 있었습니다. (버그 #28438114, 버그 #91852)

현재 GROUP BY 계획이 개선되어 각 간격(gap) 속성이 동등성(equality) 술어의 분리된 조건을 가질 수 있습니다. 여전히 각 속성의 술어는 서로 논리곱 관계를 가져야 이 개선 사항의 이점을 누릴 수 있습니다.
기여해주신 Facebook에 감사드립니다. (버그 #28056998, 버그 #15947433, WL #13066)

일부 경우에 BIGINT 인수를 FLOOR() 또는 CEILING() 함수에 전달할 때 잘못된 유형으로 해석되는 문제가 있었습니다. (버그 #27125612)

mysqlpump가 잘못된 뷰를 포함하는 데이터베이스를 덤프하지 않고 종료하는 것이 설계된 동작이지만, 덤프할 데이터베이스에 속하지 않은 잘못된 뷰가 있는 경우에도 실패하는 문제가 있었습니다. (버그 #27096081)

이제 외래 키 정보가 InnoDB가 아닌 데이터 사전에서 검색됩니다. (버그 #25583288)

외래 키 정의를 /*!50101 ... */ 또는 /*! ... */와 같은 조건부 주석으로 래핑한 경우, InnoDB 테이블에 대한 CREATE TABLEALTER TABLE 문에서 외래 키 정의가 무시되는 문제가 있었습니다. (버그 #21919887, 버그 #78631)

--log-raw 옵션이 이제 log_raw 시스템 변수로 런타임에 사용할 수 있게 되었습니다. 이 시스템 변수는 시작 시 옵션 값으로 설정되며, 런타임에 비밀번호 마스킹 동작을 변경할 수 있도록 설정할 수 있습니다. (버그 #16636373, 버그 #68936)

EXPLAIN ANALYZESELECT 목록에서 서브쿼리를 실행하지 않아 시간 또는 비용 계산에 이를 반영하지 않는 문제가 있었습니다. (버그 #97296, 버그 #30444266)

외부 참조를 포함하는 내부 스칼라 서브쿼리가 오른쪽에 중첩된 여러 SELECT 표현식을 사용하는 경우, 단일 SELECT를 사용하는 것과 동일한 결과를 반환하지 않는 문제가 있었습니다. (버그 #97063, 버그 #30381092)

인덱스를 사용하는지 여부에 따라 물질화된 서브쿼리가 다른 결과를 반환할 수 있는 문제가 있었습니다. (버그 #96823, 버그 #30289052)

MAX_EXECUTION_TIME 힌트를 사용하여 지정된 시간을 초과해 쿼리가 종료되었을 때, 쿼리 단계에 따라 오류가 다르게 발생하는 문제가 있었습니다. 특히 쿼리가 파일 정렬(filesort) 중에 종료되었을 때, 쿼리는 항상 ER_QUERY_TIMEOUT으로 종료되어야 하지만 ER_FILSORT_ABORT 오류가 발생했습니다. 이로 인해 이러한 오류를 처리하기가 불필요하게 어려워졌습니다.
이 수정으로 인해 ER_FILSORT_ABORTER_FILESORT_TERMINATED 오류 코드가 제거되었습니다. (버그 #96537, 버그 #30186874)

member 또는 array라는 이름의 매개변수를 가진 저장 프로시저가 있고, 매개변수 이름에 따옴표를 사용하지 않고 정의된 경우, 이 데이터베이스를 MySQL 8.0.17 또는 8.0.18로 업그레이드할 수 없는 문제가 있었습니다. (버그 #96288, 버그 #30084237)
참조: 이 문제는 버그 #96350 및 버그 #30103640과 관련이 있습니다.

COALESCE() 또는 IFNULL() 함수에 BIGINT 열 값을 전달하면, 이 함수에서 반환되는 음수를 UNSIGNED로 캐스팅할 때 예상치 않게 0이 반환되는 문제가 있었습니다.
기여해주신 Oleksandr Peresypkin에게 감사드립니다. (버그 #95954, 버그 #29952066)

EXPLAIN 출력에서 인덱싱된 열에 대해 MAX()를 사용하는 쿼리가 Select tables optimized away로 표시되었으나, 동일한 열에서 MAX()가 사용자 정의 함수로 호출된 경우 Using index로 표시되었습니다. (버그 #94862, 버그 #29596977)

Leave a Comment



이 문서 공유

8.0.19 변경 사항 (2020-01-13 GA)

링크 복사

CONTENTS