MySQL 8.0 Release Note

8.0.29 변경 사항 (2022-04-26 GA)

Estimated reading: 7 minutes 71 views

공식 문서: Changes in MySQL 8.0.29 (2022-04-26, General Availability)

인증 관련 사항

FIDO 인증자 데이터의 최대 크기가 증가했습니다. (버그 #33655192)

캐릭터셋 지원

중요 사항: 서버는 다음과 같은 경우에 utf8 대신 utf8mb3를 사용합니다:

(버그 #33385252, 버그 #33395007)

서버는 이제 내장된 캐릭터셋에서 데이터 사전 테이블을 채울 때 캐릭터셋 이름의 별칭인 utf8 대신 utf8mb3를 사용합니다. 이는 MySQL 정보 스키마 테이블에 표시되는 캐릭터셋 및 관련 정보에 영향을 미칩니다. 다음은 해당 정보 스키마 테이블 목록입니다:

이 변경 사항은 SQL SHOW CHARACTER SET, SHOW COLLATION, SHOW CREATE DATABASE, 그리고 SHOW CREATE TABLE 문장의 출력에도 영향을 미칩니다. (버그 #30624990)

컴파일 관련 사항

InnoDB: 관련 문제 해결 후, C4100, C4127, C4245 및 C4389 MSVC++ 레벨 4 컴파일러 경고가 다시 활성화되었습니다. (버그 #33437498, 버그 #33571677)

GCC 11은 이제 EL7 또는 EL8에서 MySQL을 빌드하는 데 지원되는 컴파일러입니다. 이 컴파일러는 devtoolset-11(EL7) 또는 gcc-toolset-11(EL8) 패키지에서 제공됩니다. 또한, libmysqlclient C API 라이브러리를 기반으로 하는 타사 애플리케이션을 빌드할 때 GCC 11을 사용하는 것이 권장됩니다. (버그 #33730302)

서버는 Bison 3.8.1 이상 버전으로 컴파일할 수 없었습니다. (버그 #33488047)

사용 중단 및 제거 관련 사항

중요 변경 사항: 이전에는 MySQL에서 TIME, DATE, DATETIME, TIMESTAMP 리터럴에서 임의의 구분자와 그 개수를 허용했으며, DATETIMETIMESTAMP 리터럴의 날짜와 시간 값 사이에 임의의 공백 문자도 허용했습니다. 이 동작은 이제 사용 중단되었으며, 향후 MySQL 버전에서 제거될 예정입니다. 이번 릴리스에서는 비표준 또는 과도한 구분자나 공백 문자를 사용할 경우, 다음과 같은 형식의 경고가 발생합니다: rownum 행에서 valuepos 위치에 있는 날짜/시간 값의 구분자 ‘char‘는 불필요하며, 사용이 중단되었습니다. 표준 ‘replacementchar‘를 사용하는 것이 좋습니다.
리터럴 값에서 처음으로 발견된 비표준 구분자나 공백 문자에 대해서만 사용 중단 경고가 반환됩니다. 아래에 예시가 나와 있습니다:

mysql> SELECT DATE"2020/02/20";
+------------------+
| DATE"2020/02/20" |
+------------------+
| 2020-02-20       |
+------------------+
1 row in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Warning
   Code: 4095
Message: Delimiter '/' in position 4 in datetime value '2020/02/20' at row 1 is
deprecated. Prefer the standard '-'. 
1 row in set (0.00 sec)

이러한 경고는 strict 모드에서도 오류로 승격되지 않습니다.
자세한 정보 및 예시는 날짜 및 시간 컨텍스트에서 문자열 및 숫자 리터럴을 참조하십시오. (WL #13601)

복제: replica_parallel_type 시스템 변수가 사용 중단되었습니다. 이 변수를 읽거나 설정할 때 또는 my.cnf에서 동등한 옵션을 설정할 때 서버는 다음과 같은 사용 중단 경고를 발생시킵니다:

mysql> SELECT @@replica_parallel_type; SHOW WARNINGS\G
+-------------------------+
| @@replica_parallel_type |
+-------------------------+
| LOGICAL_CLOCK           |
+-------------------------+
1 row in set, 1 warning (0.00 sec)

*************************** 1. row ***************************
  Level: Warning
   Code: 1287
Message: '@@replica_parallel_type' is deprecated and will be removed in a future
release. 
1 row in set (0.00 sec)

이 변수 및 동등한 서버 옵션 --replica-parallel-type은 향후 MySQL 릴리스에서 제거될 예정입니다.

myisam_repair_threads 시스템 변수 및 myisamchk --parallel-recover 옵션이 사용 중단되었습니다. 둘 다 향후 MySQL 릴리스에서 지원이 제거될 예정입니다.
myisam_repair_threads의 기본값인 1 이외의 값을 사용할 경우 경고가 발생합니다. (WL #14937)

서버 시스템 변수 query_prealloc_sizetransaction_prealloc_size가 이제 사용 중단되었으며, 이를 설정해도 더 이상 MySQL 서버에 영향을 미치지 않습니다. 이러한 변수들은 향후 MySQL 릴리스에서 제거될 예정입니다.
자세한 내용은 문서의 설명(서버 시스템 변수)을 참조하십시오. (WL #13720)
참고: 관련 참조: 버그 #26940369.

mysqld--abort-slave-event-count--disconnect-slave-event-count 옵션이 사용 중단되었습니다. 이 옵션들은 테스트에 사용되었으며, 일반적인 프로덕션 환경에서는 필요하지 않습니다. 향후 MySQL 버전에서 제거될 예정입니다. (WL #14526)

SQL 함수 및 연산자 관련 사항

NULL 값을 비교하는 표현식을 기반으로 한 집계 함수가 NULL을 올바르게 무시하지 않았습니다. (버그 #33624777, 버그 #105762)

최적화 중 집계 함수가 평가될 때, WHERE 조건이 이미 평가된 것으로 간주되므로 제거할 수 있습니다. 제거 전에 옵티마이저는 WHERE 조건에 테이블과 독립적인 조건이 있는지 확인하기 위해 make_cond_for_table()을 호출합니다. 조건이 비싼 것으로 간주되면(예: 저장 프로시저를 사용하는 경우), 테이블과 독립적인 조건이 있다고 잘못 판단되었습니다. 이제 make_cond_for_table() 호출 시 비싼 조건을 제외하여 이 문제를 수정합니다.
또한, f() = 1과 같이 테이블을 사용하지 않는 함수 f()가 있는 조건처럼 평가하기에 비싼 상수 조건이 있을 경우, 잘못된 결과가 발생할 수 있었습니다. 대부분의 경우 조건이 실행 시 상수인 경우, WHERE 조건을 최적화할 때 평가되며, 너무 비싸다고 판단되면 이를 건너뜁니다. 이번 문제는 묵시적으로 그룹화된 쿼리를 최적화하는 동안 조건을 건너뛰면서 발생했습니다. 이를 방지하기 위해, 이제 집계 전에 이러한 조건을 평가합니다. (버그 #33305617)

DEFAULT() 함수에서 사용된 컬럼이 내부적으로 READ로 표시되지 않았습니다. (버그 #33142135)

옵티마이저 관련 사항

LOAD DATA를 사용하여 데이터를 로드할 때 테이블의 컬럼이 SET 문 안에서 사용된 서브쿼리의 WHERE 절에서 사용되면, 해당 컬럼이 unknown으로 보고되었습니다. (버그 #33714885)

인덱스 조회(eq_ref)를 수행하는 집계 쿼리가 경우에 따라 잘못된 결과를 반환할 수 있었습니다. 이는 실행 계획이 임시 테이블에서의 집계 대신 스트리밍 집계를 사용할 때 발생했습니다.
이 문제를 해결하기 위해 집계 노드 아래에서 eq_ref 캐싱을 비활성화했습니다. (버그 #33491183)
참고: 이 문제는 다음 버그의 회귀입니다: 버그 #100614, 버그 #31790217.

파생된 물질화된 테이블 조건 푸시다운 최적화가 이제 대부분의 UNION과 함께 사용할 수 있습니다. 즉, 외부 WHERE 조건이 물질화된 파생 테이블 또는 뷰의 쿼리 표현식의 각 쿼리 블록에 푸시다운될 수 있습니다.
예를 들어, 다음 SQL 문을 사용하여 테이블 t1t2, 그리고 이 두 테이블을 기반으로 한 뷰 v를 생성한다고 가정합니다:

CREATE TABLE t1 (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
  c1 INT, 
  KEY i1 (c1)
);

CREATE TABLE t2 (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
  c1 INT, 
  KEY i1 (c1)
);

CREATE OR REPLACE VIEW v AS
     SELECT id, c1 FROM t1
     UNION ALL
     SELECT id, c1 FROM t2;

이제 SELECT * FROM v WHERE c1 = 12 쿼리를 실행하면, c1 = 12 조건이 뷰 v의 두 쿼리 블록에 푸시다운되며, 이는 EXPLAIN 출력에서 다음과 같이 표시됩니다:

mysql> EXPLAIN FORMAT=TREE SELECT * FROM v WHERE c1 = 12\G
*************************** 1. row ***************************
EXPLAIN: -> Table scan on v  (cost=1.26..2.52 rows=2)
    -> Union materialize  (cost=2.16..3.42 rows=2)
        -> Covering index lookup on t1 using i1 (c1=12)  (cost=0.35 rows=1)
        -> Covering index lookup on t2 using i1 (c1=12)  (cost=0.35 rows=1)

1 row in set (0.00 sec)

이제 대부분의 UNION 쿼리에 대해 이 최적화를 사용할 수 있습니다. 예외 사항 및 추가 정보는 파생 조건 푸시다운 최적화를 참조하십시오. (버그 #24012, 버그 #36802, 버그 #106006, 버그 #11746156, 버그 #11748590, 버그 #13650627, 버그 #30587347, 버그 #33318096, 버그 #33738597, WL #13730)

Performance Schema 관련 사항

새로운 퍼포먼스 스키마 계측이 쿼리가 PRIMARY 엔진(InnoDB) 또는 SECONDARY 엔진(HeatWave)에서 처리되었는지 여부에 대한 정보를 수집합니다. 이 계측은 HeatWave가 포함된 MySQL Database Service에서 사용하도록 설계되었습니다.
두 개의 새로운 퍼포먼스 스키마 테이블 컬럼이 추가되었습니다:

또한, execution_engine 컬럼이 MySQL sys 스키마의 sys.processlistsys.x$processlist 뷰에도 추가되었습니다. (WL #14346)

보안 관련 사항

OpenSSL 라이브러리가 번들된 플랫폼의 경우, MySQL 서버에 연결된 OpenSSL 라이브러리가 버전 1.1.1l에서 1.1.1n으로 업데이트되었습니다. OpenSSL에서 수정된 문제에 대한 자세한 내용은 https://www.openssl.org/news/cl111.txthttp://www.openssl.org/news/vulnerabilities.html을 참조하십시오. (버그 #33840722, 버그 #33970835)

SQL 구문 관련 사항

이제 CREATE FUNCTION, CREATE PROCEDURE, CREATE TRIGGER 문에 IF NOT EXISTS 옵션이 지원됩니다.
CREATE FUNCTION이 저장 함수 생성을 위해 사용될 때와 CREATE PROCEDURE에서 이 옵션을 사용하면 동일한 이름을 가진 루틴이 이미 존재할 경우 오류가 발생하지 않도록 합니다. CREATE FUNCTION이 로드 가능한 함수를 생성하는 데 사용될 때, 해당 이름을 가진 로드 가능한 함수가 이미 존재할 경우에도 오류가 발생하지 않도록 합니다. CREATE TRIGGER에서 이 옵션은 동일한 테이블과 동일한 스키마에 동일한 이름을 가진 트리거가 이미 존재할 경우 오류가 발생하지 않도록 합니다. 이 기능은 스크립팅, 빠른 (재)배포, 복제 등 잠재적으로 반복적으로 사용되는 경우의 편리성을 향상시키기 위해 도입되었습니다.
이 개선 사항은 이미 IF NOT EXISTS를 지원하는 CREATE DATABASE, CREATE TABLE, CREATE USER, CREATE EVENT 문과의 구문 일관성을 높입니다. 또한, 이미 DROP PROCEDURE, DROP FUNCTION, DROP TRIGGER에서 지원되는 IF EXISTS 옵션을 보완합니다.
자세한 내용은 저장 객체함수 이름 해석을 참조하십시오. 또한 CREATE TABLE … SELECT 문 복제에 대한 정보도 참조하십시오. (버그 #15287, 버그 #11745440, WL #14722)
참고: 관련 참조: 버그 #33301931.

테스트 스위트 관련 사항

이제 Valgrind에서 --async-client 옵션과 함께 heap-use-after-free 오류를 줄이기 위해 널 포인터가 확인됩니다. (버그 #33702755)

XA 트랜잭션 관련 사항

그룹 복제: 그룹 복제는 일부 시나리오에서 다른 연결에서 준비된 XA 트랜잭션을 커밋할 수 없어서 문제가 발생했습니다. 이러한 문제를 해결하기 위해 MySQL은 이제 분리된 XA 트랜잭션을 지원합니다. 한 번 준비된 XA 트랜잭션은 더 이상 현재 세션과 연결되지 않으며, 이는 XA PREPARE를 실행하는 과정에서 이루어집니다. 준비된 XA 트랜잭션은 다른 연결에서 커밋되거나 롤백될 수 있으며, 현재 세션은 준비된 XA 트랜잭션이 완료되기를 기다리지 않고 새로운 XA 또는 로컬 트랜잭션을 시작할 수 있습니다.
이 기능은 이번 릴리스에서 도입된 xa_detach_on_prepare 시스템 변수를 OFF로 설정하여 비활성화할 수 있으며, 이 경우 기존 동작이 복원됩니다. 기본값은 ON이며, 특히 복제 환경에서 이 설정이 권장됩니다.
xa_detach_on_prepare = ON으로 분리된 XA 트랜잭션 지원이 활성화되면 XA 트랜잭션 내에서 임시 테이블을 사용할 수 없다는 점을 유의해야 합니다.
자세한 내용은 XA 트랜잭션 상태서버 인스턴스 구성을 참조하십시오. (버그 #100163, 버그 #31599926, WL #14700)

X Plugin 관련 사항

클래식 MySQL 프로토콜과 X 프로토콜 간의 Unix 소켓 잠금 파일 형식 차이로 인해 다른 프로토콜의 파일이 존재할 경우 서버를 시작할 수 없었습니다. 수동으로 파일을 제거할 수 없는 MySQL Database Service 인스턴스와 같은 환경을 위해, 이제 두 프로토콜이 동일한 형식의 파일을 사용합니다. (버그 #31468581)

기능 추가 및 변경 사항

비호환적 변경 사항: MySQL 서버는 이제 비밀 키나 비밀번호와 같은 민감한 데이터를 포함하는 시스템 변수 값을 안전하게 저장하고, 해당 값을 조회하는 것을 제한할 수 있는 기능을 지원합니다. 현재는 민감한 데이터가 포함된 시스템 변수가 없으나, 이 새로운 기능을 통해 향후 민감한 데이터가 포함된 시스템 변수를 안전하게 저장할 수 있게 되었습니다. 이 기능을 지원하려면 MySQL 서버 인스턴스에서 키링 컴포넌트를 활성화해야 하며, 키링 플러그인은 이 기능을 지원하지 않습니다.

중요
이 변경 사항의 일환으로, 키링 컴포넌트 파일은 이제 MySQL 서버 데이터 디렉터리를 초기화하기 전에 로드됩니다. 따라서 이러한 파일을 더 이상 MySQL 데이터 디렉터리에 보관할 수 없습니다.

시스템 변수 값이 저장된 운영 체제 파일에서는 민감한 시스템 변수의 이름과 값이 암호화된 형식으로 저장되며, 이를 해독하기 위한 파일 키도 생성됩니다. 생성된 파일 키는 키링에 저장된 마스터 키로 암호화됩니다. MySQL 8.0.29로 업그레이드한 후, SET PERSIST 또는 SET PERSIST ONLY 문이 처음 실행되기 전까지는 mysqld-auto.cnf 옵션 파일의 형식이 그대로 유지되며, 해당 시스템 변수가 민감하지 않더라도 이 시점부터 새로운 형식으로 변경됩니다. 새로운 형식을 사용하는 옵션 파일은 이전 버전의 MySQL 서버에서 읽을 수 없습니다.
새로운 시스템 변수 persist_sensitive_variables_in_plaintextSET PERSIST를 사용할 때 키링 컴포넌트 지원이 제공되지 않는 경우, 서버가 민감한 시스템 변수 값을 암호화되지 않은 형식으로 저장할 수 있는지 여부를 제어합니다. 기본 설정인 ON에서는 키링 컴포넌트 지원이 있으면 값을 암호화하여 저장하고, 없으면 경고와 함께 암호화되지 않은 값으로 저장합니다. 이 설정은 암호화된 시스템 변수 값을 해독할 수 없을 때 서버가 기본값을 사용하여 시작할 수 있도록 허용합니다. persist_sensitive_variables_in_plaintextOFF로 설정하면, 키링 컴포넌트 지원이 없을 때 민감한 시스템 변수 값을 저장할 수 없으며, 암호화된 시스템 변수 값을 해독할 수 없으면 서버가 시작되지 않습니다.
민감한 시스템 변수 값이 처리될 때도 보호됩니다. 민감한 시스템 변수에 대해 SET 문이 실행되면, 일반 로그 및 감사 로그에 기록되기 전에 쿼리에서 해당 값이 redacted로 대체됩니다. 새로운 권한 SENSITIVE_VARIABLES_OBSERVER는 보유자가 퍼포먼스 스키마 테이블인 global_variables, session_variables, variables_by_thread, persisted_variables에서 민감한 시스템 변수 값을 조회하고, SELECT 문을 통해 해당 값을 반환하며, 연결된 세션 트래커에서 변경 사항을 추적할 수 있도록 합니다. 이 권한이 없는 사용자는 해당 시스템 변수 값을 볼 수 없습니다. (WL #13469)

InnoDB: 코드 품질을 향상시키고 디버깅을 용이하게 하기 위해 InnoDB 소스에서 사용된 #defineconstexpr 지정자나 인라인 함수로 대체했습니다. (WL #14680)

InnoDB: 이제 InnoDBALTER TABLE ... DROP COLUMN 작업에서 ALGORITHM=INSTANT를 지원합니다.
ALGORITHM=INSTANT를 지원하는 작업은 데이터 사전의 메타데이터만 수정하며, 테이블 데이터는 영향을 받지 않으므로 작업이 즉시 완료됩니다. 명시적으로 지정되지 않으면 ALGORITHM=INSTANT를 지원하는 DDL 작업에 대해 기본적으로 사용됩니다.
MySQL 8.0.29 이전에는 즉시 추가된 컬럼이 테이블의 마지막 컬럼으로만 추가될 수 있었습니다. MySQL 8.0.29부터는 즉시 추가된 컬럼을 테이블의 어느 위치에도 추가할 수 있습니다.
즉시 추가되거나 삭제된 컬럼은 새로운 행 버전을 생성합니다. 최대 64개의 행 버전이 허용됩니다. 새로운 TOTAL_ROW_VERSIONS 컬럼이 INFORMATION_SCHEMA.INNODB_TABLES 테이블에 추가되어 행 버전 수를 추적할 수 있습니다.
ALGORITHM=INSTANT를 지원하는 DDL 작업에 대한 자세한 내용은 온라인 DDL 작업을 참조하십시오. (WL #13899)

복제: 서버에서 바이너리 로그 파일의 자동 삭제는 이번 릴리스에 도입된 binlog_expire_logs_auto_purge 시스템 변수를 사용하여 제어됩니다. 기본적으로 자동 삭제가 활성화되어 있습니다(binlog_expire_logs_auto_purgeON으로 설정). 이를 비활성화하려면 이 변수의 값을 OFF로 설정하면 됩니다.
자동 삭제 대기 간격은 binlog_expire_logs_secondsexpire_logs_days 시스템 변수로 제어됩니다. 이 두 시스템 변수를 0으로 설정하면, binlog_expire_logs_auto_purgeON으로 설정되어 있어도 자동 삭제가 중지됩니다. (WL #14930)

Microsoft Windows: Windows에서 jemalloc 지원이 추가되었으며, 공식 MySQL 바이너리에서 이를 사용할 수 있습니다. 새로운 WITH_WIN_JEMALLOC CMake 옵션은 jemalloc.dll이 포함된 디렉터리를 받아들이며, 이를 mysqld.exe 및/또는 mysqld-debug.exe와 동일한 디렉터리로 복사하여 메모리 관리 작업에 jemalloc을 활용합니다. jemalloc.dll이 없거나 필요한 함수를 내보내지 않으면 표준 메모리 함수가 사용됩니다. jemalloc이 사용되었는지 여부는 INFORMATION 수준 로그 메시지에 기록됩니다. (WL #14633)

새로운 clone_delay_after_data_drop 변수는 원격 복제 작업 시작 시 수신 MySQL 서버 인스턴스에서 기존 데이터를 제거한 직후 대기 시간을 지정할 수 있게 합니다. 이 대기 시간은 수신 호스트의 파일 시스템이 공간을 해제할 시간을 제공하기 위한 것입니다. 일부 파일 시스템은 백그라운드 프로세스에서 비동기적으로 공간을 해제합니다. 이러한 파일 시스템에서는 기존 데이터를 제거한 직후 데이터를 복제하면 공간 부족으로 인해 복제 작업이 실패할 수 있습니다. 최대 대기 시간은 3600초(1시간)입니다. 기본 설정은 0(대기 없음)입니다. (버그 #32826134, WL #14857)

group_replication_set_as_primary 함수는 지정된 그룹 멤버를 새로운 primary로 임명하고 선출 프로세스를 무시합니다. 이전에는 이 함수가 사용된 후에도 들어오는 트랜잭션을 포함한 기존 primary의 모든 활성 트랜잭션이 종료될 때까지 기다렸으며, 대기 시간에 상한선이 없었습니다.
이제 이 함수에는 실행 중인 트랜잭션에 대한 타임아웃을 설정할 수 있는 선택적 timeout 매개변수가 추가되었습니다. 타임아웃을 0초(즉시)에서 3600초(60분)까지 설정할 수 있습니다. 타임아웃이 만료되면 커밋 단계에 도달하지 않은 트랜잭션에 대해 클라이언트 세션이 연결이 끊어져 트랜잭션이 진행되지 않도록 합니다. 타임아웃을 설정하면 그 시점부터는 primary에서 새로운 트랜잭션이 시작되지 않도록 합니다. 명시적으로 정의된 트랜잭션(START TRANSACTION 또는 BEGIN 문 사용)은 데이터를 수정하지 않더라도 타임아웃, 연결 끊기 및 들어오는 트랜잭션 차단의 대상이 됩니다. 이 함수가 작동하는 동안 primary를 검사할 수 있도록, 일관성 규칙 하에서 허용된 쿼리에 나열된 데이터 수정이 없는 단일 문은 계속 진행됩니다. (WL #14585)

Key Management Interoperability Protocol(KMIP)을 사용하여 안전하게 통신하는 keyring_okv 키링 플러그인은 MySQL의 키링 서비스를 사용하여 Oracle Key Vault, Gemalto SafeNet KeySecure Appliance, Townsend Alliance Key Manager, Entrust KeyControl과 같은 KMIP 호환 백엔드 키링 스토리지 제품에 키링 데이터를 저장합니다. 이제 이 플러그인은 기본 서버가 사용할 수 없는 경우 백업 연결을 제공하는 여러 대의 대기 서버를 지정할 수 있게 되었습니다. 최대 64대의 대기 서버를 okvclient.ora 파일을 편집하여 서버의 IP 주소와 포트 번호를 쉼표로 구분된 목록으로 STANDBY_SERVER 변수 값에 지정할 수 있습니다. 플러그인은 대기 서버에 대해 20초 동안 연결을 시도하며, 연결이 이루어질 때까지 대기 서버를 반복하여 시도합니다. 따라서 대기 서버 목록을 짧고 정확하게 유지하고, 유효하지 않은 서버는 제거해야 합니다. 유효하지 않은 서버가 있으면 keyring_okv 플러그인의 연결 시간이 크게 영향을 받아 서버 시작 시간에 영향을 줄 수 있습니다. (WL #14363)

시스템 변수에 대한 접근 격리가 시스템 변수를 액세스하거나 업데이트하는 SQL 문을 구문 분석, 확인 및 실행하는 서버 코드에서 더욱 엄격하게 적용되었습니다. (WL #14529)

MySQL 서버는 이제 기본적으로 SSL 세션 재사용을 지원하며, 서버가 세션 캐시를 유지하여 클라이언트가 새로운 연결에 대해 세션 재사용을 요청할 수 있는 기간을 설정하는 타임아웃 설정을 지원합니다. 모든 MySQL 클라이언트 프로그램은 세션 재사용을 지원합니다. 서버 측 및 클라이언트 측 구성 정보는 SSL 세션 재사용을 참조하십시오.
또한, C 애플리케이션은 이제 C API 기능을 사용하여 암호화된 연결에 대해 세션 재사용을 활성화할 수 있습니다(자세한 내용은 SSL 세션 재사용을 참조하십시오). (WL #13075)

버그 수정

InnoDB: 즉시 추가된 컬럼이 있는 테이블의 undo 레코드를 삭제하려고 할 때 오류가 발생했습니다. (버그 #33924532)

InnoDB: 고우선 순위 트랜잭션이 중단되거나 대기 중에 타임아웃이 발생했을 때 대기를 중단할 수 없었으며, 이로 인해 교착 상태를 해결할 수 없었습니다. 이제 고우선 순위 트랜잭션이 중단되거나 대기 시간이 초과된 경우 대기를 중단할 수 있으며, 차단 중인 트랜잭션이 고우선 순위가 아닌 경우 고우선 순위 트랜잭션은 차단 중인 트랜잭션이 잠금을 해제할 때까지 대기합니다. (버그 #33856332)

InnoDB: Windows에서 사용된 AIO 동기화 큐가 제거되었습니다. 동기 파일 I/O 읽기-쓰기 함수(SyncFileIO::execute)가 파일을 처리하는 방식이 Linux에서와 같이 정상 I/O 및 오버랩된 I/O 모두에 대해 작동하도록 수정되었습니다. (버그 #33840645)

InnoDB: 즉시 추가된 컬럼이 있는 테이블의 모든 파티션을 자른 후에도 테이블 버전 메타데이터가 재설정되지 않았습니다. (버그 #33822729)

InnoDB: 세마포어 대기에 대한 경고를 출력하는 srv_error_monitor_thread() 함수가 긴 세마포어 대기를 제대로 처리하지 못했습니다. 이를 해결하기 위해 차단 호출이 더 적절한 위치로 이동되었습니다. 관련 모니터 스레드 코드가 단순화되고 개선되었으며, 여러 서버 스레드에 대한 종료 신호가 추가되었습니다.
이제 InnoDB에 의해 표준 모니터의 활성화 및 비활성화가 사용자 설정 가능한 innodb_status_output 변수와 독립적으로 수행됩니다. 이 변경 사항은 특정 시나리오에서 InnoDB에 의해 모니터가 활성화되었지만 이전 값으로 복원되지 않았던 문제를 해결합니다. Yuhui Wang에게 기여에 감사드립니다. (버그 #33789526, 버그 #93878)

InnoDB: Valgrind 테스트에서 InnoDB 소스의 rec_convert_dtuple_to_rec_old()에서 오프바이원(off-by-one) 오류가 확인되었습니다. (버그 #33784672)

InnoDB: InnoDB 소스의 mem_heap_alloc() 함수의 UNIV_DEBUG 변형이 Valgrind 오류 감지를 개선하도록 수정되었습니다. (버그 #33783709)

InnoDB: 빠른 종료 시 모든 활성 I/O 작업이 완료되기 전에 모든 파일을 닫았습니다. (버그 #33768584)

InnoDB: Clang 경고가 잘못된 위치에 배치된 @return 명령을 보고했습니다. (버그 #33734011)

InnoDB: 파티션 간 전환 시 새로운 레코드 잠금 배열(m_prebuilt->new_rec_locks[])의 값이 제대로 동기화되지 않아 예상대로 잠금이 해제되거나 해제되지 않아 단언 실패가 발생했습니다. (버그 #33724166)

InnoDB: 쓰기 요청이 완료될 때 더블 쓰기 버퍼를 업데이트하는 함수에서 경합 조건이 발생하여 긴 세마포어 대기 오류가 발생했습니다. (버그 #33712370)

InnoDB: 인덱싱된 컬럼에서 레코드를 변경할 때 항상 보조 인덱스에 새로운 레코드를 생성해야 한다고 잘못 가정하여 잠금 관련 단언 실패가 발생했습니다. 이 문제와 유사한 다른 경우를 해결하기 위해, 암시적 레코드 잠금을 명시적 레코드 잠금으로 변환하는 lock_rec_convert_impl_to_expl() 함수가 실제로 암시적 레코드 잠금이 있을 때만 사용되도록 변경되었습니다. (버그 #33657235)

InnoDB: InnoDB 소스의 여러 Doxygen 문제를 해결했습니다. (버그 #33603036)

InnoDB: 인덱스 인스턴스에 대한 누락된 널 포인터 확인으로 인해 오류가 발생했습니다. (버그 #33600109)

InnoDB: 증분 백업 후 서버를 시작할 때 페이지 추적이 사용할 수 없다는 오류가 발생했습니다. (버그 #33521528)

InnoDB: InnoDB 복구 중 단언 실패가 발생했습니다. 실패는 로컬 미니 트랜잭션에서 페이지가 해제된 후 자유 목록과 인덱스 목록이 재설정되기 전에 서버가 종료되었기 때문입니다. 해제된 페이지를 포함하는 자유 목록과 인덱스 목록이 복구 중에 순회되었습니다. (버그 #33454557)

InnoDB: 페이지 끝에 커서가 있을 때 오른쪽 형제 페이지에 튜플을 삽입하는 btr_insert_into_right_sibling() B-트리 함수가 잘못된 잠금 함수 호출로 인해 ACID 위반을 발생시켰습니다. (버그 #33405696)

InnoDB: COMPACT 또는 REDUNDANT 행 형식을 사용할 때 최대 행 크기를 초과하는 테이블을 생성할 수 있었으며, 결국 데이터를 삽입할 때 ‘행 크기가 너무 큼’ 오류가 발생할 수 있었습니다. BLOB 접두사가 CREATE TABLE 작업 중에 수행된 레코드 크기 확인에 포함되지 않았습니다. (버그 #33399379)

InnoDB: 마스터 암호화 키를 검색하는 함수(get_master_key())가 아직 초기화되지 않은 마스터 키 ID 뮤텍스(master_key_id_mutex)를 얻으려고 시도했습니다. (버그 #33067891)

InnoDB: 보조 인덱스 레코드에 잠금을 설정하는 데 사용되는 lock_sec_rec_read_check_and_lock 잠금 시스템 함수에서 불필요하고 비용이 많이 드는 확인이 제거되었습니다. (버그 #33059387)

InnoDB: TempTable 스토리지 엔진이 파일 가득 참 오류를 제대로 처리하지 못했습니다. (버그 #32929392)

InnoDB: ALTER TABLE ... ALGORITHM=COPY 작업 중 DDL 로그 오류가 처리되지 않아 이후 ALTER TABLE ... ALGORITHM=INPLACE 작업 중 실패가 발생했습니다. (버그 #32716838)

InnoDB: 테이블스페이스가 로드되지 않은 암호화된 테이블의 undo 레코드를 정리하는 중 실패가 발생했습니다. (버그 #32586721)

InnoDB: 스레드가 비동기 I/O 작업을 게시하고 종료되어 운영 체제 파일 작업 오류가 발생했습니다. (버그 #30567295)

InnoDB: 최대 정수 컬럼 값을 초과했을 때 잘못된 AUTO_INCREMENT 값이 생성되었습니다. 이 오류는 최대 컬럼 값을 고려하지 않았기 때문에 발생했습니다. 이 경우 이전 유효한 AUTO_INCREMENT 값이 반환되어야 하며, 중복 키 오류가 발생해야 합니다. (버그 #87926, 버그 #26906787)

InnoDB: 트랜잭션 잠금 우선 순위가 수정되어, 공유 잠금을 보유하고 있고 독점 잠금으로 업그레이드를 기다리는 트랜잭션이 동일한 행에 대해 독점 잠금을 기다리고 있는 다른 트랜잭션보다 우선권을 갖도록 수정되었습니다. 즉, 이미 공유 잠금을 보유한 트랜잭션이 먼저 독점 잠금을 받습니다. 동일한 행에 대해 공유 잠금을 보유한 다른 트랜잭션이 여전히 독점 잠금이 부여되는 것을 방지할 수 있습니다.
트랜잭션 잠금 시스템 소스의 lock_rec_find_set_bitlock_rec_has_expl 함수가 최적화되었습니다. (버그 #21356, 버그 #11745929)

파티셔닝: .ibd 파일이 누락된 파티션에 대해 MySQL 서버에 연결하는 작업이 실패할 수 있었습니다. (버그 #33459653)

파티셔닝: MySQL 8.0.17에서 모든 NOT INNOT EXISTS 서브쿼리를 안티조인으로 변환하도록 작업한 후, 이 변환에 의해 생성된 중첩 외부 조인의 내부 부분이 테이블 파티션을 제거하는 동안 고려되지 않았습니다. (버그 #33060953)

복제: group_replication_consistency=AFTER로 설정된 복제 그룹에서 새로운 primary가 선출되고 이전 primary가 다시 시작된 경우, 새로운 primary가 오류 메시지와 함께 그룹을 떠났습니다. 지연된 뷰 변경 및 트랜잭션 준비를 처리하여 이러한 상황을 방지했습니다. (버그 #33755920)

복제: 네트워크 공급자가 중지되는 동안 발생한 교착 상태로 인해 STOP GROUP_REPLICATION이 일부 그룹 멤버에서 무기한 대기할 수 있었습니다. (버그 #33044886)

그룹 복제: 그룹 복제가 자동 재참여 프로세스에서 재참여 중인 멤버만이 오류 상태에서 그룹에 진입할 수 있도록 허용되는 유일한 유형임을 너무 늦게 확인했습니다. 이제 이 문제가 수정되었습니다. (버그 #33615493)

그룹 복제: 그룹 구성 작업이 실행 중인 상황에서 멤버가 참여하는 동안 멤버 참여에 대한 경고 메시지가 로깅되었습니다. 이 메시지는 이제 적절한 상황에서만 로깅됩니다. (버그 #33378364)

그룹 복제: 그룹 복제는 로컬 XCom 인스턴스에 연결하는 데 문제가 있을 때 반환되는 운영 체제 오류를 이제 로깅하여 방화벽 차단과 같은 문제를 해결하기 쉽게 합니다. (버그 #33189767, 버그 #104523)

그룹 복제: 기본 선출이 중단되지 않도록 돕기 위해 그룹 복제는 선출 중에 그룹을 떠난 멤버로부터 확인을 기다리는 것을 중단합니다. 확인을 기다리던 모든 멤버가 그룹을 떠나면 그룹 복제는 기본 선출이 성공적으로 완료되었다고 선언합니다. 이전에는 기본 멤버가 떠난 경우 기본 변경이 발생하지 않았음에도 불구하고 기본 변경이 발생한 것으로 잘못 선언되었습니다. 이제 기본 멤버가 선출 중에 떠나면 그룹 복제는 기본 선출을 성공하지 못한 것으로 선언하고 기본 변경이 없음을 알립니다. (버그 #33059773)

Microsoft Windows: Windows에 WinFlexBison 지원이 추가되었습니다. (버그 #33788290)

EL6/EL7에서 mysql-community-server-debug 설치가 상용 패키지 설치에 의해 제거되지 않았습니다. (버그 #33956760)

cmake 빌드 시스템에서 복사한 공유 라이브러리를 사용하여 빌드할 때 ARM에서 EL7을 빌드할 수 없었습니다. 이제 getconf가 보고한 대로 --page-size가 설정됩니다. (버그 #33904267)

PROCESS 권한을 가진 익명 사용자가 processlist 테이블에서 행을 선택할 수 없었습니다. (버그 #33869388)

범위 옵티마이저가 세션 메모리 제한을 고려하지 않았습니다. (버그 #33869004)

서브쿼리를 정렬할 때 동일한 filesort 작업이 서로 다른 입력으로 여러 번 실행될 수 있으며, 이 경우 실행 간에 가장 긴 추가 열이 변경될 수 있지만 이 열의 버퍼가 필요할 때 다시 할당되지 않았습니다. 이제 이전에 할당된 버퍼가 충분히 크면 이를 재사용하고, 그렇지 않으면 새로 할당합니다. (버그 #33865094)

공통 테이블 표현식(CTE)이 물질화되어 여러 쿼리 블록에서 사용된 경우 잘못된 결과가 반환되었습니다. 첫 번째 쿼리 블록에서 CTE를 사용할 때 여러 가능한 키 정의가 존재하여 내부 함수 JOIN::finalize_derived_keys()가 사용된 키 정의를 위치 0으로 이동시켰고, CTE를 사용하는 두 번째 쿼리 블록이 첫 번째 쿼리 블록에서 선택된 키의 원래 위치를 차지한 인덱스를 조작했습니다. 이 문제는 MySQL 8.0.22에서 DML 문을 한 번만 준비하도록 변경한 작업의 의도하지 않은 부작용으로 발생했습니다.
자세한 내용은 WITH (Common Table Expressions)을 참조하십시오. (버그 #33856374)

저장 프로시저 및 저장 함수 실행 시 오류 처리가 개선되었습니다. (버그 #33851256)

뷰에서 선택한 트리거가 항상 예상한 결과를 반환하지 못했습니다. (버그 #33847722)

SET PERSIST 문을 사용하여 시스템 변수 설정을 기록한 직후 MySQL 인스턴스가 예기치 않게 중지되거나 재시작되면, mysqld-auto.cnf 구성 파일이 비워져 서버 재시작이 진행되지 못할 수 있었습니다. 이제 지속된 시스템 변수는 백업 파일에 작성되며, 쓰기가 성공한 것으로 확인된 후에만 해당 파일의 이름이 mysqld-auto.cnf로 변경되고, 원래의 mysqld-auto.cnf 파일은 그대로 유지됩니다. (버그 #33830493)

filesort가 정렬 키를 계산할 때 문자열 값의 길이를 제대로 확인하지 않았습니다. (버그 #33830073)
참고: 이 문제는 버그 #29739778의 회귀입니다.

mysql.firewall_membership 테이블에 GROUP_IDMEMBER_ID 컬럼으로 구성된 기본 키가 추가되었습니다. (버그 #33824544)

업데이트 가능한 뷰에서 WITH CHECK OPTION을 사용하는 경우 발생하던 rows matched 값 불일치 문제가 MySQL 8.0.20에서 수정되었습니다. 이 릴리스에서는 다중 테이블 UPDATE 문에서도 이 문제를 해결했습니다. (버그 #33815426)
참고: 버그 #30158954도 참조하십시오.

MySQL 서버에서 링크된 ProtoBuf 라이브러리가 3.19.4 버전으로 업데이트되었습니다. 새 버전에서 수정된 문제는 https://github.com/protocolbuffers/protobuf/releases에서 확인할 수 있습니다. (버그 #33813846)

utf32 컬럼에 유효하지 않은 문자를 삽입할 수 있었습니다. (버그 #33810558)

MySQL Enterprise Firewall 플러그인을 재설치하면 실패가 발생했습니다. 이는 플러그인이 완전히 초기화되기 전에 이전에 지속된 방화벽 시스템 변수를 업데이트하려고 시도했기 때문입니다. (버그 #33809478)

VARCHAR 또는 DECIMAL 조인 컬럼을 사용하는 해시 조인이 과도한 수의 행을 반환했습니다. 예를 들어, VARCHAR를 사용하는 경우는 다음과 같습니다:

# Create and populate table
CREATE TABLE t(a VARCHAR(10), b VARCHAR(10));
INSERT INTO t VALUES ('x', 'xx'), ('xx', 'x');

# No indexes, so uses a hash join
SELECT * FROM t AS t1, t AS t2 WHERE t1.a = t2.a AND t1.b = t2.b;

수정 전에는 위의 쿼리가 4개의 행을 반환했지만, 이제는 예상대로 2개의 행을 반환합니다. (버그 #33794977)

INFORMATION_SCHEMA.KEY_COLUMN_USAGE 테이블에 보이지 않는 키 컬럼이 나열되지 않았습니다. (버그 #33781534)

뷰에서 생성된 뷰에 액세스한 후 서버가 적절한 정리를 수행하지 않았습니다. (버그 #33777821)

WITH ROLLUP과 집계 함수가 포함된 윈도우 함수가 있는 그룹화된 쿼리에서, 윈도우의 정렬 절을 해결할 때 숨겨진 열로 불필요한 집계가 추가되었습니다. (버그 #33769911)

mask_ssn() 데이터 마스킹 함수가 유효한 비상수 값(데이터베이스 행에서 읽은 데이터)을 처리할 때 ‘문자열 인수 너비가 너무 큼’ 오류를 반환했습니다. 또한, 0길이 상수 및 비상수 값(빈 문자열)이나 너무 작은 상수 값에 대한 유효성 검사가 수행되지 않았습니다. 이러한 문제는 모든 데이터 마스킹 함수에서 문자열 입력의 길이 제한과 함께 해결되었습니다. (버그 #33759276)

ROLLUPORDER BY와 윈도우 함수와 함께 사용된 경우 일부 사례에서 제대로 처리되지 않았습니다. (버그 #33753245)

Doxygen 주석의 여러 문제를 수정했습니다. (버그 #33734001, 버그 #33734035, 버그 #33734062, 버그 #33734075, 버그 #33734104, 버그 #33734117, 버그 #33734129, 버그 #33734143, 버그 #33734155, 버그 #33734181, 버그 #33734188, 버그 #33734206)

구문 오류로 인해 구문을 분석할 수 없는 문은 더 이상 느린 쿼리 로그에 기록되지 않습니다. (버그 #33732907)

MySQL Enterprise Thread Pool의 초기 구성에 대한 메시지가 이제 정보 메시지가 아닌 시스템 메시지로 발행되어 기본 로깅 수준에서 볼 수 있습니다. (버그 #33729821)

세션 추적과 관련된 사전 잠금 최적화가 특정 시나리오에서 재귀 잠금을 초래했습니다. (버그 #33728209)

IN 서브쿼리가 포함된 UNION이 ORDER BY 절을 사용할 때 항상 제대로 처리되지 않았습니다. (버그 #33725507)

mysqlpump 클라이언트 유틸리티가 명령줄 옵션을 사용하여 암호 프롬프트를 요청할 때 예기치 않게 중지될 수 있었습니다. 이 과정에서 오류가 발생하면 클라이언트가 종료되기 전에 적절한 오류 메시지가 반환됩니다. (버그 #33688141)

SLES/openSUSE 및 커뮤니티 EL6 및 EL7 플랫폼에 대해 별도의 debuginfo RPM을 제공하는 표준 패키지 정책이 구현되었습니다. EL6 및 EL7의 상용 버전은 이제 Debug 대신 RelWithDebInfo 빌드 유형으로 빌드되어 크기가 크게 줄어듭니다. (버그 #33663811, 버그 #33684418, 버그 #33664929)

추적 로그를 활성화한 상태에서 mysqld를 실행할 수 없었습니다. (버그 #33653824)

FIDO 장치 등록을 위해 --fido-register-factor 옵션이 시작 시 사용되었을 때, mysql 클라이언트가 ALTER USER 문에서 잘못된 구문을 사용하여 실패를 초래할 수 있었습니다. 이제 이 문제가 수정되었습니다. (버그 #33650498)

SET 열 값에서 사용자 변수를 FIND_IN_SET()의 첫 번째 인수로 전달할 때, 동일한 방식으로 사용된 상수 값과 같은 결과를 생성하지 못했습니다.

예시: 다음과 같이 생성된 테이블 t1을 고려하십시오:

CREATE TABLE t1 (c1 SET('a', 'b', 'c', 'd'));

INSERT INTO t1 (c1) VALUES ('a, c, d'), ('c');

다음 쿼리의 출력에서 varstr에 표시된 값은 두 행 모두 동일해야 하지만 그렇지 않았습니다:

SET @a = 'c';

SELECT FIND_IN_SET(@a, c1) AS var, FIND_IN_SET('c', c1) AS str FROM t1;

이제 이러한 경우 상수 값이든 열 값이든 찾고자 하는 값의 위치를 반환하도록 수정했습니다. (버그 #33635637)

지원되는 인증 방법을 사용하는 SET PASSWORD 작업이 예상된 오류 대신 경고를 생성했습니다. (버그 #33635445)

MySQL 서버 시작 시 플러그인 디렉터리가 지정되지 않았고, 사용자가 FIDO 장치 등록을 시도하면 mysql 클라이언트가 예기치 않게 중지되었습니다. 이제 이 상황이 처리되어 적절한 오류가 보고됩니다. (버그 #33631144)

MySQL 8.0.27에서 수행된 변경으로 인해 필터 및 정렬을 포함하는 복합 액세스 경로에 대한 EXPLAIN 출력이 테이블 경로 내부에서 MATERIALIZE 액세스 경로로 이동했지만 INDEX_RANGE_SCAN을 복합 액세스 경로에 포함하지 않았습니다. 이로 인해 일부 경우 정의되지 않은 동작이 발생할 수 있었습니다. (버그 #33611545)
참고: 이 문제는 버그 #32788576의 회귀입니다.

퍼포먼스 스키마에서 DROP 권한을 취소할 수 없었습니다. (버그 #33578113)

내부 CreateIteratorFromAccessPath() 함수가 재귀를 사용하지 않도록 재작성되어 쿼리 실행 시 스택 사용량이 크게 줄어들 것으로 예상됩니다. (버그 #33569770)

챌린지-응답 오류가 발생했을 때 FIDO 장치 등록을 시도하는 동안 mysql 클라이언트가 예기치 않게 중지될 수 있었습니다. 이제 이 문제가 수정되었습니다. (버그 #33568944)

준비된 문이나 저장 함수로 실행된 INFORMATION_SCHEMA.FILES 또는 INFORMATION_SCHEMA.TABLES 쿼리가 오래된 데이터를 반환했습니다. 캐시된 데이터가 변경된 후에도 보고되었습니다. (버그 #33538106, 버그 #105450)

쿼리가 다음 조건을 모두 충족할 때 잘못된 결과가 반환되었습니다:

  • 결과 집합에 비결정 요소가 있는 컬럼이 포함되어 있음
  • 해당 컬럼이 테이블을 참조하지 않음
  • 암묵적 그룹화가 있음
  • 쿼리 계획이 임시 테이블에서 집계를 사용함. 이 임시 테이블은 비어 있음

빈 테이블 tc1 컬럼이 있을 때, INSERT INTO t SELECT MAX(t.c1), RAND(0) AS x FROM t 문이 이러한 쿼리의 예를 제공합니다. 동일한 테이블에 삽입하여 쿼리 계획이 임시 테이블에서 집계되도록 보장합니다. 임시 테이블은 c1 컬럼을 포함하고, 결과 행이 하나뿐일 경우 임시 테이블의 첫 번째 행에서 c1이 선택됩니다. 임시 테이블이 비어 있으면 첫 번째 행이 없기 때문에 c1은 0이 되어, 예를 들어 t(NULL, 0.155) 대신 (NULL, 0)이 삽입되었습니다.
이러한 컬럼은 임시 테이블에 저장하지 않도록 수정했습니다. (버그 #33535379)
참고: 버그 #32384355도 참조하십시오.

MySQL 8.0.27에서 암호 처리 방식이 변경된 이후, Ctrl + Cmysql 클라이언트가 중단되면, 중단 조치를 취하기 위해 사용자의 암호를 요구하는 프롬프트가 표시될 수 있었습니다. 이제 프롬프트에 응답하여 제공된 암호가 기록되어 새 연결이 중단 조치를 위해 설정될 때 자동으로 사용할 수 있습니다. (버그 #33514253)

내부 keyread 플래그는 전체 행이 아닌 인덱스 항목만 읽고 있음을 나타냅니다. 이 플래그가 초기화 중 인덱스 병합 스캔에 설정되었을 때, 인덱스 병합 스캔의 일부로 선택된 개별 범위 스캔을 초기화할 때 플래그가 재설정되어 행이 아닌 인덱스 항목을 읽고 있음을 나타냈습니다. 인덱스 항목을 읽는 동안 선택된 인덱스를 포함 인덱스로 설정하여 이 문제를 해결했습니다. (버그 #33499071)

제공자의 호스트에서 압축된 데이터 크기가 수신자의 호스트에서 사용 가능한 디스크 공간과 동일한 페이지 압축 테이블을 복제할 때 데이터 복사가 중단되었습니다. 수신자의 호스트에서 뚫린 구멍이 페이지 크기보다 작아서 디스크 단편화가 발생했고, 이로 인해 복제된 데이터를 위한 공간이 제한되었습니다. 수신자의 호스트에서 페이지 압축 테이블을 처리하는 프로세스가 수정되어 단편화를 줄이고 데이터 복사 속도가 개선되었습니다.
페이지 압축 테이블을 플러시할 때, 클론 플러그인은 이제 구멍 뚫기를 지원하는 파일 시스템에서 fsync 플러시 메서드를 사용합니다. (버그 #33482747)

상수가 된 서브쿼리가 해석 중에 평가될 수 있었습니다. (버그 #33438883)

EXPLAIN FORMAT=TREE 출력에서 일반적으로 행 수는 정수로만 작성됩니다. 결과가 0일 경우, 이것이 0.49인지 0.00001인지 확인하기 어려웠으므로, 이제 이러한 경우 소수 자릿수를 추가하여 하나의 유효 자릿수를 표시합니다. (버그 #33426283)

VALUES가 일부 인스턴스에서 사양대로 작동하지 않았습니다. (버그 #33414289)

디버그 빌드에서, MYSQL_TYPE_DOUBLE 유형의 사용자 변수 조합이 CAST() 또는 CONVERT()와 함께 사용될 때 단언 오류가 발생했습니다. (버그 #33406728)

여러 동등성을 설정할 때, 옵티마이저가 불필요한 외부 참조를 추가했습니다. (버그 #33394701)

MySQL 빌드의 최소 지원 Boost 라이브러리 버전이 이제 1.77.0으로 상향되었습니다. (버그 #33353637)
참고: 버그 #33052171도 참조하십시오.

Security_context 클래스에서 불필요한 initcheckout_access_maps 함수 코드가 제거되었습니다. (버그 #33339129, 버그 #104915)
sys 스키마 뷰 schema_unused_indexes가 올바르게 업데이트되지 않았습니다.
schema_unused_indexestable_io_waits_summary_by_index_usage에서 사용되지 않은 인덱스 정보를 검색하며, 테이블에 없는 행을 쿼리하는 데 인덱스가 사용된 경우 데이터를 반환하지 않습니다.

이 릴리스부터는 행이 발견되지 않더라도 schema_unused_indexes가 업데이트됩니다. (버그 #33302400)

공통 테이블 표현식(CTE)을 사용하는 일부 쿼리가 EXPLAIN에 의해 올바르게 처리되지 않았습니다. (버그 #33300271)

서버가 특정 복잡한 쿼리에 대해 인덱스 통계를 올바르게 얻지 못했습니다. (버그 #33270516)

특정 상황에서 TRUNCATE TABLE performance_schema.status_by_thread;를 실행할 때 경합 조건이 발생할 수 있었습니다.
이 수정에 기여한 Facebook에 감사드립니다. (버그 #33165726)

페이지 클리너 스레드가 큰 테이블에 대한 전체 텍스트 인덱스 생성 작업이 인덱스 페이지에 대한 독점 잠금을 보유하고 있는 동안 타임아웃되었습니다. (버그 #33101844)

InnoDB 테이블에서 보조 인덱스는 테이블의 기본 키를 포함하도록 확장됩니다. 즉, 기본 키의 모든 컬럼은 모든 보조 인덱스의 일부로 표시됩니다. 보조 인덱스가 고유하게 정의된 경우는 예외입니다. 서버가 기본 키 확장을 사용하지 않았습니다. 이로 인해 동적 범위 스캔을 위한 읽기 세트를 설정할 때 문제가 발생할 수 있었습니다. 이 문제는 고유한 보조 인덱스의 경우 기본 키 부분을 읽기 세트에 포함하도록 수정되었습니다. (버그 #33101025)
참고: 이 문제는 버그 #30417361의 회귀입니다.

존재하지 않는 테이블을 참조하는 기존 외래 키 제약 조건이 테이블이 생성되거나 이름이 변경된 후 연결 오류를 일으킬 수 있었습니다. (버그 #33054071)

INSERT 문을 실행하는 동안 빈 VALUES에 대한 값 목록을 생성할 때 숨겨진 요소가 추가되었고, 이로 인해 디버그 빌드에서 단언이 발생했습니다. 이 문제를 해결하기 위해 이제 VALUES 목록이 생성될 때 숨겨진 요소를 건너뜁니다.
자세한 내용은 INSERT … ON DUPLICATE KEY UPDATE 문을 참조하십시오. (버그 #32774799)

ORDER BYSELECT 목록 항목에 대한 별칭이 표현식의 일부였을 때 독립형 별칭과 동일한 방식으로 해결되지 않았습니다. 예를 들어 ORDER BY alias는 올바르게 해결되었지만, ORDER BY function(alias)는 해결되지 않았습니다. (버그 #32695670)

비어 있거나 존재하지 않는 키링 소스(예: keyring_file_data로 지정됨)에서 오프라인 키링 마이그레이션이 경고 없이 성공적으로 완료된 것으로 보였습니다. 이제 키링 마이그레이션 프로세스가 키를 가져올 때 오류를 확인합니다. 지정된 키링 소스에서 키가 발견되지 않으면 키링에 키가 없음을 나타내는 경고 메시지가 오류 로그에 기록됩니다. (버그 #32327411)

항상 참인 조건을 제거할 때, 뷰를 참조하는 서브쿼리가 제거되었지만, 쿼리 내에서 서브쿼리를 참조하고 있었습니다. (버그 #31946448)
참고: 버그 #31216115도 참조하십시오.

파생된 테이블이 포함된 다중 테이블 UPDATE 문과 함께 사용된 경우 EXPLAIN 문이 서버 종료를 초래할 수 있었습니다. (버그 #31884434)

--order-by-primary 옵션을 사용하여 두 개 이상의 테이블에서 mysqldump가 사용된 경우 메모리 누수가 발생했습니다. 이제 각 테이블의 행을 정렬하는 데 할당된 메모리는 각 테이블 이후에 해제되며, 한 번만 해제되지 않습니다. (버그 #30042589, 버그 #96178)

mysqld_safe 로그 메시지의 텍스트 오류가 수정되었습니다. 기여해 주신 China Mobile의 Bin Wang에게 감사드립니다. (버그 #106590, 버그 #33903639)

동등한 쿼리가 실행 경로가 약간 다르기 때문에 서로 다른 결과를 반환할 수 있었습니다. 예를 들어, Item::val_int_from_string()Item_string::val_int()은 동일한 알고리즘을 사용하여 문자열을 정수로 변환해야 합니다. (버그 #106517, 버그 #33881339)

CMake 규칙이 더 이상 사용되지 않는 PermissionsStartOnly systemd 옵션을 처리하도록 업데이트되었습니다. 대체 실행 파일 접두어는 systemd 231(July 2016)에서 추가되었으며, PermissionsStartOnly는 systemd 240(2018년 12월)에 사용되지 않게 되었습니다. 이제 가능할 경우 선호하는 실행 파일 접두어가 사용됩니다. (버그 #106468, 버그 #33862323)

파생된 물질화된 테이블에 대한 조건 푸시다운을 구현하기 위해 MySQL 8.0.22에서 작업을 수행한 후, 집계 함수가 포함된 암묵적으로 그룹화된 쿼리가 일부 경우 NULL 대신 빈 집합을 반환했습니다. (버그 #106414, 버그 #33838439)

DATE, TIME, DATETIME, 또는 TIMESTAMP를 바인딩 인수로 사용하여 'SELECT ?'와 같은 준비 및 실행된 쿼리가 잘못된 컬럼 유형을 반환할 수 있었습니다. 이제 이러한 쿼리가 각 동적 매개변수에 리터럴 값을 할당하도록 다시 준비하여 문제를 수정했습니다. (버그 #106352, 버그 #33813951)
참고: 이 문제는 버그 #32915973의 회귀입니다.

NULL-안전 비교(≪=>)가 트리거의 TIMESTAMP 컬럼에 대해 올바르게 평가되지 않았습니다. (버그 #106286, 버그 #33790919)
참고: 이 문제는 버그 #32942327의 회귀입니다.

해시 조인 버퍼에 DECIMAL 값을 기록할 때, 값이 먼저 정규화되었습니다. 이 정규화로 인해 값이 의도치 않게 변경되어 값이 잘못된 해시 버킷으로 들어가 잘못된 결과가 반환될 수 있었습니다.
문제는 정규화가 일부 값에서 가장 중요한 자릿수를 잃게 하는 방식으로 선행 0을 제거한 데 있었습니다. 이를 해결하기 위해 원하는 정밀도를 계산하고, 원래 값을 변경하는 대신 계산된 값을 전달하도록 수정했습니다. (버그 #106272, 버그 #33787914)

DATETIME 컬럼 a, b, c를 갖고, ac 컬럼이 NOT NULL로 생성된 쿼리에서 c NOT BETWEEN NULL AND COALESCE(a, b) 형식의 WHERE 조건이 있는 경우, 올바른 결과를 반환하지 않았습니다. 추가 조사 결과, 이러한 경우 BETWEEN의 두 번째 또는 세 번째 인수가 NULL일 때 비교 결과가 반전되어 FALSE에 대해 NULL, NULL에 대해 FALSE로 평가되는 것으로 나타났습니다. (버그 #106267, 버그 #33788832)

0(FALSE)과 NULL 간의 NULL-안전 비교가 TRUE를 반환할 수 있었습니다. 하지만 이 유형의 객체를 평가하는 구현은 절대 NULL을 반환할 수 없으며 항상 FALSE를 반환해야 합니다. (버그 #105773, 버그 #33630225)

QUICK_RANGE 생성자가 키 할당에 메인 스레드 메모리 루트를 사용했으며, 이로 인해 여러 쿼리가 쿼리 계획에 대한 범위 확인을 사용하는 경우 예상치 못한 높은 메모리 사용량이 발생했습니다. (버그 #105331, 버그 #33516707)
참고: 버그 #28805105, 버그 #28857990도 참조하십시오.

VARCHAR 컬럼에 대해 SELECT DISTINCT 쿼리를 실행하면, 열에 빈 문자열과 단일 공백 문자로 구성된 문자열이 포함된 경우 두 개의 고유 값이 반환되었습니다. 이는 utf8_bin 접두사와 PAD SPACE를 사용하는 경우 잘못된 동작이었습니다. 이러한 경우 고유 값을 선택할 때 후행 공백을 무시해야 했습니다.
TempTable 스토리지 엔진을 사용하여 생성된 임시 테이블에 대해 두 문자열은 서로 다른 값으로 해시되었으며, 이는 TempTable 해시 함수가 항상 길이가 0인 데이터를 0으로 해시했기 때문입니다. (이 경우 빈 문자열은 0으로 해시되었으며, 다른 문자열에서 공백 문자는 0이 아닌 해시 값을 생성하는 데 사용되었습니다.)
이제 TempTable 스토리지 엔진의 해시 함수에서 길이가 0인 데이터를 특별 처리하지 않도록 수정했습니다.
기여해 주신 Brian Yue에게 감사드립니다. (버그 #105316, 버그 #33506241)

다중 값 인덱스를 사용한 COUNT(*) 쿼리가 잘못된 행 수를 보고했습니다. (버그 #104898, 버그 #33334928)

main.ssl-big 테스트 프로그램이 Too many connections 오류로 실패했습니다.
이 수정에 기여한 Facebook에 감사드립니다. (버그 #104377, 버그 #33139204, 버그 #33165693)

MySQL이 지원하는 두 가지 유형의 히스토그램, 싱글톤 및 동일-높이 히스토그램은 이전에 각각 버킷 모음을 맵 및 세트에 저장했습니다. 이 릴리스에서는 두 가지 히스토그램 유형이 이제 버킷을 동적 배열에 저장하도록 변경되어 공간 오버헤드가 감소하고 이진 검색을 수행할 때 간접 비용이 줄어들어 선택성 추정 속도가 빨라졌습니다.
두 히스토그램 유형 모두 정렬된 순서로 버킷을 삽입하고, 정렬된 순서로 버킷을 JSON에 직렬화하기 때문에 동적 배열로 전환하는 데 추가 작업이 필요하지 않습니다. (버그 #104109, 버그 #33045204)

부호가 있는 변수와 부호가 없는 변수 간의 잘못된 변환으로 인해 SELECT ALL t1.c1,t2.c1 FROM t1,t2 WHERE t1.c1 > t2.c1 형식의 쿼리에서 잘못된 결과가 반환되었습니다. (버그 #102025, 버그 #32302724)

이번 릴리스부터 퍼포먼스 스키마가 콜레이션을 인식합니다. (버그 #98545, 버그 #30881109)

setup_actorsROLE 열에 32바이트보다 큰 데이터를 삽입하면 단언 오류가 발생할 수 있었습니다. 이번 릴리스에서는 ROLE 열이 CHAR(32)에서 CHAR(96)으로 증가했습니다. (버그 #74678, 버그 #19947842)

Leave a Comment



이 문서 공유

8.0.29 변경 사항 (2022-04-26 GA)

링크 복사

CONTENTS