MySQL 8.0 Release Note

8.0.27 변경 사항 (2021-10-19 GA)

Estimated reading: 8 minutes 71 views

공식 문서: Changes in MySQL 8.0.27 (2021-10-19, General Availability)

감사 로그 관련 사항

CREATE USER 문에서 BY 'auth_string' 절이 감사 로그와 일반 쿼리 로그에 AS 'auth_string' 절로 기록되었습니다. (버그 #33184550)

인증 관련 사항

이전에는 MySQL 사용자 계정이 단일 인증 방법을 사용하여 서버에 인증되었습니다. 이제 MySQL은 다중 요소 인증(MFA)을 지원하며, 이를 통해 최대 세 가지 인증 방법을 사용하는 계정을 만들 수 있습니다. MFA 지원에는 다음과 같은 변경 사항이 포함됩니다:

  • CREATE USERALTER USER 구문이 확장되어 여러 인증 방법을 지정할 수 있게 되었습니다.
  • authentication_policy 시스템 변수를 통해 사용 가능한 인증 요소의 수와 각 요소에 대해 허용되는 인증 유형을 제어함으로써 MFA 정책을 설정할 수 있습니다. 이는 CREATE USERALTER USER 문에서 인증 관련 절의 사용에 제한을 가합니다.
  • 클라이언트 프로그램에는 여러 비밀번호를 지정하기 위한 새로운 --password1, --password2, --password3 명령줄 옵션이 추가되었습니다. C API를 사용하는 애플리케이션의 경우, 새로운 MYSQL_OPT_USER_PASSWORD 옵션을 통해 mysql_options4() C API 함수에서 동일한 기능을 사용할 수 있습니다.

또한, MySQL Enterprise Edition에서는 스마트 카드, 보안 키, 생체 인식 리더기와 같은 장치를 사용하여 MySQL 서버에 인증할 수 있게 되었습니다. 이 인증 방법은 Fast Identity Online (FIDO) 표준을 기반으로 하며, 서버 측의 authentication_fido 플러그인과 클라이언트 측의 authentication_fido_client 플러그인 쌍을 사용합니다. 서버 측 FIDO 인증 플러그인은 MySQL Enterprise Edition 배포판에만 포함됩니다.
다중 요소 인증은 기존 MySQL 인증 방법, 새로운 FIDO 인증 방법 또는 이 둘의 조합을 사용할 수 있습니다. 자세한 내용은 다중 요소 인증FIDO 플러그인 인증을 참조하십시오. (버그 #33159968, WL #14183)

인증 플러그인이 인증 문자열을 해시하지 않는 경우, BY 'auth_string' 절을 포함한 CREATE USER 문이 오류와 함께 실패했습니다. (버그 #33125289)

캐릭터셋 지원

정규 표현식 함수는 표현식 또는 패턴을 ICU 정규 표현식 엔진에 적합한 캐릭터셋으로 변환할 수 없을 때 오류를 보고합니다.
또한, 여러 기하학 함수에서 오류 검사가 개선되었습니다. (버그 #33290245)

gen_dictionary() 함수는 이제 인수의 캐릭터셋으로 latin1을 사용하며, 동일한 캐릭터셋을 반환합니다. (버그 #30389649)

동일한 문자열이 각각 ASCII(콜레이션 ascii_general_ci)와 UCS2(콜레이션 ucs2_general_ci) 캐릭터셋을 사용할 때 조인 조건에서 예상대로 일치하지 않았습니다. (버그 #104571, 버그 #33204161)
참고: 관련 버그로는 다음이 있습니다: 버그 #24847620, 버그 #30746908, 버그 #32244631, 버그 #32501472.

캐릭터셋 cs의 기본 콜레이션 c1과 다른 콜레이션 c2(즉, c1과 같지 않음)를 사용하는 경우, CREATE DATABASE d COLLATE c2 CHARACTER SET cs 문이 c2 대신 c1을 기본 콜레이션으로 설정하여 새 데이터베이스를 생성했습니다. (버그 #104504, 버그 #33183590)

컴파일 관련 사항

InnoDB: Windows에서 빌드 실패를 일으키는 Clang 문제에 대한 해결 방법이 구현되었습니다. (Bugzilla – Bug 51538). (버그 #33217633)

MySQL은 이제 C++17을 사용하여 컴파일할 수 있습니다. 다음 최소 버전 요구 사항이 컴파일러 지원에 적용됩니다:

  • GCC 7.1 또는 Clang 5 (Linux)
  • XCode 10 (macOS)
  • GCC 10 (Solaris)
  • Visual Studio 2019 업데이트 4 (Windows)

특히, Solaris에서는 이제 GCC만 지원되는 컴파일러입니다. 코드가 정리되어 Sun Studio, Oracle Studio, SunPro에 대한 적응 및 해결 방법이 제거되었습니다. (버그 #32907274, 버그 #103757, 버그 #32907475, 버그 #32992125, 버그 #32992242, 버그 #33004840, 버그 #33086882)

연결 관리 관련 사항

이전에는 서버가 만료된 비밀번호를 가진 계정의 클라이언트 연결을 처리하기 위해 샌드박스 모드를 제한했을 때 클라이언트가 SET 문을 사용할 수 있었습니다. 이제는 더 이상 허용되지 않습니다. 샌드박스 모드에 대한 자세한 내용은 만료된 비밀번호 처리를 참조하십시오. (버그 #16369085, WL #13214)

데이터 타입 관련 사항

YEAR 값이 항상 올바르게 해석되지 않았습니다. (버그 #33142669)
참고: 이 문제는 버그 #31994744의 회귀 문제입니다.

사용 중단 및 제거 관련 사항

중요 변경 사항: default_authentication_plugin 변수는 MySQL 8.0.27부터 사용 중단되었으며, 향후 MySQL 버전에서 지원이 제거될 예정입니다.
MySQL 8.0.27에서는 여전히 default_authentication_plugin 변수가 사용되지만, 새로운 다중 요소 인증 기능과 함께 도입된 authentication_policy 시스템 변수보다 낮은 우선순위로 사용됩니다. 자세한 내용은 기본 인증 플러그인을 참조하십시오. (버그 #27515356, WL #14138)

중요 변경 사항: BINARY 연산자는 이제 사용 중단되었으며, 향후 MySQL 릴리스에서 제거될 예정입니다. 이제 BINARY를 사용할 경우 경고가 발생합니다. 대신 CAST(... AS BINARY)를 사용하십시오. (WL #13619)

스토리지 엔진 관련 사항

BLACKHOLE 스토리지 엔진의 최대 키 길이가 1000바이트에서 3072바이트로 증가했습니다. 이 값은 InnoDB와 동일합니다. 이 기여는 Adam Cable에게 감사드립니다. (버그 #32788749, 버그 #103371)

방화벽 관련 사항

새로운 FIREWALL_EXEMPT 권한은 사용자를 방화벽 제한에서 제외합니다. 예를 들어, 방화벽을 구성하는 데이터베이스 관리자가 잘못된 구성으로 인해 관리자가 잠기거나 명령문을 실행할 수 없는 상황을 방지하는 데 유용합니다. 자세한 내용은 MySQL Enterprise Firewall을 참조하십시오. (WL #14517)

SQL 함수 및 연산자 관련 사항

SPACE() 함수가 특정 큰 값이나 부호 없는 값을 올바르게 처리하지 않았습니다. (버그 #33180446)

함수가 뷰 내에서 정의된 경우, 함수 인수가 항상 올바르게 평가되지 않았습니다. (버그 #33142010)
참고: 이 문제는 버그 #29904087의 회귀 문제입니다.

윈도우 표현식에서 비트 함수는 비트 마스크의 런타임 크기가 해결 시점의 크기를 초과하지 않도록 확인합니다. 이 규칙을 위반하는 여러 사례가 발견되었습니다:

  • ENCRYPT()가 결과의 최대 크기를 잘못 계산하는 경우가 있었습니다.
  • CONVERT(), CONCAT(), CONCAT_WS(), EXPORT_SET(), INSERT(), REPLACE(), 그리고 WEIGHT_STRING()가 이진 캐릭터셋에 대해 최대 결과 길이를 올바르게 계산하지 않았습니다.
  • REPLACE(str, from_str, to_str)를 해결하는 동안, str 내의 각 일치 항목에 대해 from_str 전체 길이가 대체된다고 가정했으나, from_str이 1자 길이일 수 있으므로 strto_str의 여러 복사본으로 대체될 수 있습니다.
  • COMPRESS()가 최대 결과 길이를 임의로 계산했습니다. 이제 zlib 라이브러리의 compressBound를 사용하여 이 문제를 해결했습니다.

(버그 #32922688, 버그 #33117410, 버그 #33275424)
참고: 관련 버그로는 다음이 있습니다: 버그 #33516898.

키링 관련 사항

keyring_hashicorp 플러그인의 구성 문제에 대한 진단 기능이 개선되었습니다. (버그 #32075854)

옵티마이저 관련 사항

EXPLAIN FORMAT=TREE는 이제 범위 옵티마이저에 의해 생성된 스캔에 대한 이전보다 더 정확한 정보를 표시합니다. 특히, 서브 이터레이터가 명확하게 표시되며 EXPLAIN ANALYZE와 함께 적절한 시간 측정이 이루어집니다. 인덱스 범위 스캔은 이제 실제로 스캔 중인 범위를 보여줍니다. 출력 설명도 이전보다 더 사용자 친화적으로 변경되었으며, 예를 들어 DISTINCT를 사용하는 쿼리에 표시되던 index_for_group_by는 이제 deduplication을 위한 인덱스 건너뛰기 스캔으로 대체되었습니다.
또한, 범위 교차 스캔에 대한 행 수 추정에서 발생하는 반올림 오류가 수정되었으며, 인덱스 범위 스캔에 대한 옵티마이저 추적이 이제 InnoDB 기본 키에서 사용된 암시적 키 부분을 올바르게 표시합니다. (버그 #33037007, 버그 #33062448)

EXISTS를 세미조인으로 변환할 때, 쿼리에 뷰 참조가 포함된 경우 쿼리가 올바르게 처리되지 않았습니다. (버그 #32813550)참고: 이 문제는 버그 #30671329의 회귀 문제입니다.

래터럴 파생 테이블의 경우, 캐시 무효화자 생성이 지연되었을 때 테이블 머티리얼라이제이션이 무효화자 없이 방출되어 실행 중 리머티리얼라이제이션이 발생하지 않으며 잘못된 결과가 생성되었습니다.
대기 중인 캐시 무효화자는 고려 중인 테이블 목록의 마지막 테이블보다 래터럴 테이블의 인덱스가 작은 경우에만 방출되었습니다. 대기 중인 무효화자의 테이블 인덱스가 조인 슬라이스의 마지막 테이블과 같을 때는 캐시 무효화자가 건너뛰어졌고, 머티리얼라이제이션이 무효화자 없이 방출되었습니다.
이제 대기 중인 무효화자의 테이블 인덱스가 현재 조인 슬라이스의 테이블 목록의 마지막 테이블보다 작거나 같은 경우, 대기 중인 캐시 무효화자를 생성하도록 수정했습니다. (버그 #32407774)

Performance Schema 관련 사항

모니터링 및 문제 해결을 돕기 위해, 이제 성능 스키마 계측이 사용되어 계측된 스레드 이름을 운영 체제에 내보낼 수 있습니다. 이를 통해 디버거 및 Unix의 ps 명령과 같은 스레드 이름을 표시하는 유틸리티에서 단순히 “mysqld”가 아닌, 개별적인 mysqld 스레드 이름을 표시할 수 있습니다. 이 기능은 Linux, macOS, Windows에서만 지원됩니다. 자세한 내용은 setup_instruments 테이블을 참조하십시오. (WL #14587)

플러거블 인증

Microsoft Windows: MySQL 8.0.26에서 Linux에서 실행되는 MySQL 서버 및 클라이언트 호스트를 위한 Kerberos 인증 방법이 도입되었으며, 이제 Windows에서도 클라이언트 측 지원이 가능합니다. 이를 통해 Windows에서 실행되는 MySQL 클라이언트 애플리케이션이 Kerberos를 사용하여 인증하는 Linux 서버 호스트의 MySQL 계정에 연결할 수 있습니다. 자세한 내용은 Kerberos 플러그인 인증을 참조하십시오. (WL #14605)

보안 관련

번들된 OpenSSL 라이브러리가 포함된 플랫폼에서 MySQL 서버에 연결된 OpenSSL 라이브러리가 버전 1.1.1l로 업데이트되었습니다. 새 OpenSSL 버전에서 수정된 문제는 https://www.openssl.org/news/cl111.txthttp://www.openssl.org/news/vulnerabilities.html에서 확인할 수 있습니다. (버그 #33273138, 버그 #33309871)

서버 관리

다음 시스템 변수의 세션 값을 설정하는 작업이 제한된 작업이 되었으며, 세션 사용자는 제한된 세션 변수를 설정할 수 있는 충분한 권한을 가져야 합니다:

제한된 세션 변수를 설정하는 데 필요한 권한에 대한 자세한 내용은 시스템 변수 권한을 참조하십시오. (WL #14695)

공간 데이터 지원

ST_SymDifference()ST_Intersection() 함수가 이제 지리적 공간 참조 시스템(SRS)의 기하 도형 인수를 허용합니다. 이전에는 ST_SymDifference()ST_Intersection() 함수가 Cartesian SRS에서만 기하 도형 인수를 지원했습니다. 자세한 내용은 공간 연산자 함수를 참조하십시오. (WL #10996, WL #14273)

추가 및 변경된 기능

중요 변경 사항; 그룹 복제: 시스템 변수 group_replication_components_stop_timeout는 그룹 복제의 각 모듈이 종료 중에 진행 중인 프로세스를 완료할 때까지 대기하는 시간을 지정합니다. 이 타임아웃은 STOP GROUP_REPLICATION 문이 실행된 후, 서버 재시작 또는 자동 재가입 중 자동으로 적용됩니다. 이 타임아웃은 그룹에서 멤버가 오류 상태로 제외되었거나 MySQL Enterprise Backup과 같은 프로세스가 멤버의 테이블에 전역 잠금을 가지고 있을 때 발생하는 정상적인 종료가 불가능한 상황을 해결하는 데 사용됩니다. 이러한 상황에서는 적용 스레드를 중지하거나 재가입을 위한 분산 복구 프로세스를 완료할 수 없습니다. STOP GROUP_REPLICATION 문은 상황이 해결되거나(예: 잠금 해제) 또는 타임아웃이 만료되어 모듈이 상태와 상관없이 종료될 때까지 완료되지 않습니다.
이전에는 타임아웃 값이 기본적으로 31536000초(365일)로 설정되어 이러한 상황에 도움이 되지 않았습니다. 새 기본 값은 300초로, 상황이 5분 이내에 해결되지 않으면 그룹 복제 모듈이 중지되어 멤버를 다시 시작하고 재가입할 수 있도록 합니다. (WL #14245)
참고: 관련 버그로는 다음이 있습니다: 버그 #31460690, 버그 #31648211, 버그 #32309647.

복제: 복제본 서버에서 GTID 기반 복제를 사용하는 경우, 복제 적용 스레드 및 수신 스레드는 여전히 바이너리 로그 파일 이름 및 파일 위치와 같은 파일 기반 복제의 대안에 의존합니다. CHANGE REPLICATION SOURCE TO 문의 새 옵션 GTID_ONLY는 복제 메타데이터 저장소에서 파일 이름 및 파일 위치의 지속성을 제거합니다. 이 설정이 적용된 복제 채널에서는 메모리 내에서 파일 위치가 계속 추적되며, 오류 메시지나 SHOW REPLICA STATUS와 같은 인터페이스에서 디버깅 목적으로 파일 위치를 확인할 수 있습니다(파일 위치가 오래된 경우 유효하지 않음으로 표시됨). 그러나 GTID 기반 복제가 실제로 필요하지 않은 상황에서는 파일 위치를 유지하고 확인하는 데 필요한 읽기 및 쓰기가 방지됩니다. 또한, GTID_ONLY 설정은 복제 메타데이터의 플러시 빈도를 줄입니다.
GTID_ONLY 옵션은 비동기 복제 채널에서는 기본적으로 비활성화되어 있지만, 그룹 복제 채널에서는 기본적으로 활성화되며, 비활성화할 수 없습니다. 복제 채널에 GTID_ONLY = 1을 설정하려면, 서버에서 GTID가 사용 중이어야 하고(gtid_mode = ON), 소스에서 행 기반 바이너리 로그가 사용 중이어야 합니다(문 기반 복제는 지원되지 않음). CHANGE REPLICATION SOURCE TO의 옵션 REQUIRE_ROW_FORMATSOURCE_AUTO_POSITION은 모두 복제 채널에 대해 1로 설정되어야 합니다. GTID_ONLY가 1로 설정된 경우, 복제본에서 replica_parallel_workers=1로 설정되어 있으면 다중 스레드 적용기가 됩니다. 이 다중 스레드 적용기는 복제 메타데이터 저장소 대신 저장된 위치를 사용하여 다시 적용해야 하는 트랜잭션의 시작점을 찾기 때문입니다.
이 문제와 관련된 기여를 제공한 Facebook에 감사드립니다. (버그 #94360, 버그 #29364334, WL #7491)

복제: 복제본 서버에서 이제 다중 스레드 기능이 기본적으로 활성화됩니다. 다중 스레드 적용기는 여러 개의 적용 스레드를 사용하여 트랜잭션을 병렬로 실행합니다. 이 동작은 소스와 복제본 간의 일시적인 차이를 초래할 수 있는 불필요한 복제 지연을 방지할 수 있습니다.다음 기본 서버 설정은 다중 스레드 동작을 생성하는 데 사용됩니다:

  • replica_parallel_workers=4. 이 설정은 다중 스레드를 활성화하며, 복제본에 네 개의 적용 스레드를 생성하고 이를 관리하는 조정자 스레드를 추가합니다. 여러 복제 채널을 사용하는 경우, 각 채널에 대해 이 수만큼의 스레드가 생성됩니다. 네 개의 적용 스레드는 기본적인 병렬 처리를 제공하며, 설정을 변경하여 최대 1024개의 적용 스레드를 지정할 수 있습니다.
  • replica_preserve_commit_order=1. 이 설정은 복제본에서 트랜잭션이 릴레이 로그에서 발생한 순서대로 외부에 적용되도록 보장하여, 복제본이 마스터가 있지 않았던 상태에 들어가는 일이 없도록 하고, 릴레이 로그에서 실행된 트랜잭션의 순서에 차이가 없도록 합니다.
  • replica_parallel_type=LOGICAL_CLOCK. 이 설정은 복제 소스 서버에서 동일한 바이너리 로그 그룹 커밋의 일부인 트랜잭션이 복제본에서 병렬로 적용되도록 지정합니다. replica_preserve_commit_order=1이 설정된 경우 이 설정이 필요합니다.

새 기본값을 무시하고 복제본 서버에서 다중 스레드를 비활성화하려면, replica_parallel_workers=0을 지정하십시오. 이 설정은 병렬 실행을 비활성화하고 복제본에 단일 적용 스레드만 제공하며 조정자 스레드는 생성되지 않습니다. 이 설정을 적용하면 replica_parallel_typereplica_preserve_commit_order 옵션은 더 이상 적용되지 않으며 무시됩니다. (WL #10475)

그룹 복제: MySQL 복제에 대한 비동기 연결 장애 조치 메커니즘을 통해 관리되는 복제 그룹의 일부인 복제본이 현재 수신자(그룹의 기본 노드)가 실패한 경우 송신자에 자동으로 다시 연결할 수 있습니다. 이 새로운 기능은 그룹 복제에서 단일 기본 모드로 구성된 그룹에서 작동하며, 그룹의 기본 노드가 SOURCE_CONNECTION_AUTO_FAILOVERON으로 설정된 복제 채널을 가지고 있는 경우에 적용됩니다. 기본적으로 이 기능은 그룹에서 자동으로 작동하지만, 새로운 멤버 액션 mysql_start_failover_channels_if_primary를 사용하여 group_replication_disable_member_action() 함수를 통해 비활성화할 수 있습니다. 이 기능은 일부 멤버가 일시적으로 사용할 수 없는 경우에도 송신자 그룹과 수신자 그룹이 서로 동기화 상태를 유지하도록 설계되었습니다. 또한 관리되는 그룹의 일부가 아닌 송신자와 여러 수신자 그룹을 동기화할 수 있습니다. 복제 그룹에 속하지 않은 복제본은 이 기능을 사용할 수 없습니다.
이 기능을 구성하려면 복제 채널 및 채널에 대한 복제 사용자 계정과 비밀번호가 복제 그룹 내의 모든 멤버 서버에 설정되어야 하며, 새로 가입한 멤버에도 동일하게 설정되어야 합니다. 이는 CHANGE REPLICATION SOURCE TO 문을 사용하여 수행할 수 있으며, MySQL의 클론 기능을 사용하여 새 서버가 프로비저닝된 경우 이 모든 작업이 자동으로 이루어집니다. 채널의 SOURCE_CONNECTION_AUTO_FAILOVER 설정은 기본 노드에서 그룹 멤버로 합류 시 방송되며, 변경될 경우에도 방송됩니다. 기본 노드가 오프라인 상태가 되거나 오류 상태로 전환되면, 새로 선택된 기본 노드는 이미 소스 목록과 채널 구성을 가지고 있어 소스와의 대체 비동기 복제 연결을 설정합니다.
관리자들이 비동기 연결 장애 조치 메커니즘과 관련된 모든 설정을 제거할 수 있도록 asynchronous_connection_failover_reset()이라는 새로운 함수도 제공됩니다. 이 함수는 더 이상 관리되는 그룹에서 사용되지 않는 서버를 정리하는 데 사용됩니다. (WL #14020)

그룹 복제: 그룹 복제(XCom, Paxos 변형)의 그룹 통신 엔진은 기본적으로 그룹의 모든 멤버를 리더로 사용합니다. 그룹 복제 통신 프로토콜 버전이 8.0.27 이상으로 설정된 경우, 그룹 통신 엔진은 이제 단일 기본 모드에서 합의를 주도하기 위해 단일 리더를 사용할 수 있습니다. 단일 합의 리더를 사용하는 방식은 단일 기본 모드에서 성능과 복원력을 향상시키며, 특히 그룹의 일부 보조 멤버가 현재 접근할 수 없는 경우에 유리합니다.
단일 합의 리더는 그룹의 기본 노드와 함께 배치되며, 새 기본 노드가 선출될 때 변경됩니다. 성능 스키마 테이블 replication_group_communication_information는 선호하는 합의 리더와 실제 합의 리더, 또는 모든 멤버가 리더로 사용될 경우 그 리더를 보여주며, 통신 프로토콜 버전과 쓰기 동시성을 보여줍니다.
이 새로운 동작을 활성화하려면 시스템 변수 group_replication_paxos_single_leaderON으로 설정하면 됩니다(기본값은 OFF입니다). 그룹 복제가 다중 기본 모드로 실행 중이거나, 이전 통신 프로토콜 버전을 사용하는 경우, 또는 group_replication_paxos_single_leaderOFF로 설정된 경우, 그룹 통신 엔진은 그룹의 모든 멤버를 리더로 사용하여 작동합니다.
복제 그룹의 멤버를 새 MySQL 서버 릴리스로 수동으로 업그레이드할 때, 그룹의 통신 프로토콜 버전은 자동으로 업그레이드되지 않습니다. 더 이상 이전 릴리스의 멤버를 지원할 필요가 없는 경우, group_replication_set_communication_protocol() 함수를 사용하여 그룹의 통신 프로토콜 버전을 새 MySQL 서버 버전으로 설정할 수 있습니다. MySQL InnoDB Cluster는 이 기능을 사용하여 생성된 복제 그룹의 통신 프로토콜 버전을 자동으로 관리합니다. (WL #9149)

그룹 복제: 이전 릴리스에서는 그룹 복제가 그룹 통신 연결 및 멤버 간의 분산 복구 연결을 보안하기 위해 자체 보안 프로토콜(예: TLS/SSL 및 수신 그룹 통신 시스템(GCS) 연결에 대한 허용 목록 사용)을 구현했습니다. 이제 복제 그룹은 그룹 복제 구현 대신 MySQL 서버의 자체 연결 보안을 사용할 수 있습니다. MySQL 프로토콜을 사용하면 그룹에 대한 접근 권한을 부여하거나 취소하는 데 표준 사용자 인증 방법을 사용할 수 있으며, 서버 프로토콜의 최신 기능을 항상 사용할 수 있습니다. 네트워크 네임스페이스는 MySQL 통신 스택을 사용할 때 그룹 복제에서 지원됩니다.
그룹 복제 구현 대신 MySQL 서버의 연결 보안 관리를 사용하려면 새 시스템 변수 group_replication_communication_stackMYSQL로 설정하십시오. 또한, 각 그룹 멤버에 대해 group_replication_local_address로 설정된 네트워크 주소는 MySQL 서버가 수신 중인 IP 주소 및 포트 중 하나로 변경해야 합니다. 네트워크 네임스페이스가 사용되는 경우, 이 네임스페이스는 group_replication_recovery 채널에서 CHANGE REPLICATION SOURCE TO 문을 사용하여 구성해야 합니다.
인증은 CHANGE REPLICATION SOURCE TO를 사용하여 설정된 그룹 복제가 분산 복구에 사용하는 기존 복제 사용자 계정을 통해 수행되며, 이 사용자에게 새 GROUP_REPLICATION_STREAM 권한이 부여되어야 합니다. 연결에 대한 TLS/SSL 구성은 그룹 복제가 분산 복구를 보안하기 위해 사용하는 기존 설정에서 가져오며, 그룹 통신에 대해 TLS/SSL을 활성화 또는 비활성화할지 지정하는 시스템 변수 group_replication_ssl_mode도 사용됩니다. 이러한 설정이 아직 설정되지 않은 경우 구성해야 하며, 모든 그룹 멤버에서 설정이 동일해야 통신 문제가 발생하지 않습니다.
이 작업의 일환으로 시스템 변수 performance_schema_max_cond_classes의 기본값이 100에서 150으로 증가했습니다.
자세한 내용은 그룹 복제에서 MySQL 통신 스택 요구 사항을 참조하십시오. (WL #9852)

include 또는 includedir 지시어를 옵션 파일에서 처리하는 동안 문제가 발생한 프로그램은 이제 오류 원인에 대한 더 많은 정보를 제공하는 오류 메시지를 출력합니다. (버그 #32798288, 버그 #103397)

시스템 변수 thread_stack의 기본값이 모든 지원 플랫폼에서 1048576으로 증가했습니다. (버그 #103912, 버그 #32965326)
참고: 관련 버그로는 다음이 있습니다: 버그 #32934187.

MySQL 서버 Docker 컨테이너를 시작할 때 서버 옵션 --default-time-zone을 사용하여 서버의 기본 시간대를 설정할 수 있습니다. 이전에는 이 옵션을 사용하면 컨테이너가 시작되지 않았습니다. (WL #14703)

온라인 DDL 작업에서는 일반적으로 스토리지가 병목이 됩니다. 이 문제를 해결하기 위해 CPU 활용도와 인덱스 빌딩이 개선되었습니다. 이제 인덱스를 순차적으로가 아니라 동시에 빌드할 수 있습니다. 또한 메모리 관리가 강화되어 사용자가 설정한 메모리 구성 제한을 준수하도록 개선되었습니다. 자세한 내용은 온라인 DDL 작업에 대한 병렬 스레드 구성을 참조하십시오.
새 변수 innodb_ddl_threads는 인덱스 생성의 정렬 및 빌드 단계에 대한 최대 병렬 스레드 수를 정의합니다.
새 변수 innodb_ddl_buffer_size는 DDL 작업에 대한 최대 버퍼 크기를 정의합니다. 기본 설정은 1048576바이트(약 1MB)입니다. 버퍼 크기 제한을 정의하여 보조 인덱스를 생성하거나 재구축하는 온라인 DDL 작업 중 발생할 수 있는 메모리 부족 오류를 방지합니다. 자세한 내용은 온라인 DDL 메모리 관리를 참조하십시오. (WL #14283)

이제 클론 플러그인은 복제 작업이 진행 중일 때 제공자 MySQL 서버 인스턴스에서 동시 DDL 작업을 허용합니다. 이전에는 클론 작업 중 백업 잠금이 걸려 제공자에서 동시 DDL이 차단되었습니다. 클론 작업 중 제공자에서 동시 DDL을 차단하는 이전 동작으로 되돌리려면 변수 clone_block_ddl를 활성화하십시오. 자세한 내용은 클론과 동시 DDL을 참조하십시오. (WL #9683)

세션 변수 internal_tmp_mem_storage_engine에 대한 세션 값을 설정하려면 이제 SESSION_VARIABLES_ADMIN 또는 SYSTEM_VARIABLES_ADMIN 권한이 필요합니다. (WL #14728)

버그 수정

호환되지 않는 변경 사항: 모든 SELECT 문에서 뷰에 대한 쿼리 다이제스트는 뷰 정의를 기준으로 했습니다. 그 결과, 서로 다른 쿼리가 동일한 다이제스트를 가지고 퍼포먼스 스키마 테이블 events_statements_summary_by_digest에 함께 집계되어 이 테이블의 통계가 개별적인 SELECT 문을 구별하는 데 사용할 수 없었습니다.
이제 뷰에서 실행되는 각 SELECT 문에 대한 쿼리 다이제스트는 뷰 정의가 아니라 해당 SELECT 문을 기준으로 합니다. 이를 통해 events_statements_summary_by_digest 테이블에서 개별 SELECT 문을 구별할 수 있게 됩니다. 그러나 쿼리 다이제스트를 사용하는 도구는 이 변경 사항을 고려하여 조정이 필요할 수 있습니다. 예를 들어, MySQL Enterprise Firewall과 쿼리 리라이트 플러그인은 쿼리 다이제스트에 의존하며, 뷰와 관련된 기존 규칙은 업데이트되어야 할 수 있습니다. (버그 #27540213, 버그 #89559, 버그 #31761802)

중요 변경 사항: EXPLAIN FORMAT=TREE는 이제 인덱스 스캔이 커버링 인덱스를 사용하는지 여부를 표시하여, 테이블/클러스터된 인덱스에서 다른 열을 조회할 필요가 없는 경우를 나타냅니다. 예를 들어, idx1이 커버링 인덱스일 경우, 이전 출력인 Index scan on t1 using idx1은 이제 Covering index scan on t1 using idx1로 표시됩니다. 이전에는 이 정보가 FORMAT=TRADITIONALFORMAT=JSON에만 표시되었습니다.
이 수정은 전체 텍스트 검색에 사용되는 용어도 개선하여 이 변경 사항과 일치시킵니다. 예를 들어, 이전 출력인 Indexed full text search on t1(커버링 인덱스 여부에 상관없이 동일한 출력)은 이제 커버링 인덱스가 없을 때는 Full-text index search on t1, 커버링 인덱스를 사용할 때는 Full-text covering index search on t1으로 표시됩니다. (버그 #32825235)

InnoDB: innodb_open_files 제한이 일시적으로 초과되었을 때 오류 로그에 과도한 수의 메모가 기록되었습니다. (버그 #33343690)

InnoDB: 제자리 DDL 작업이 모든 수정된 페이지를 플러시하지 못했습니다. (버그 #33290335, 버그 #33238133)

InnoDB: 병렬 스캔에서 서브 파티션된 InnoDB 테이블에서 HeatWave로 데이터를 로드할 때 잘못된 파티션 ID가 반환되었습니다. (버그 #33276021)

InnoDB: InnoDB 소스에서 사용되지 않는 os_event::event_iter 필드가 제거되어 os_event 구조에서 메모리 사용량이 줄었습니다.
기여해주신 Facebook에 감사드립니다. (버그 #33252468)

InnoDB: performance_schema.threads 테이블에 srv_purge_threadsrv_worker_thread 스레드가 중복되었습니다.
기여해주신 Kaige Ye에 감사드립니다. (버그 #33209066, 버그 #104575)

InnoDB: 활성 트랜잭션에서 사용 중인 언두 테이블 스페이스를 잘라낼 때 어설션 실패가 발생했습니다. 트랜잭션이 조기 완료된 것으로 잘못 표시되어 잘라내기 작업이 허용되었습니다. (버그 #33162828)

InnoDB: 기본 키를 수정하는 동시 DML 작업이 있는 파티션된 테이블에서 HeatWave로 데이터를 로드할 때 일부 레코드에 대해 잘못된 파티션 ID가 보고되었습니다. (버그 #33139692)

InnoDB: InnoDB 소스에 있는 MY_ATTRIBUTE((noreturn))MY_ATTRIBUTE((unused))의 인스턴스가 C++17의 [[noreturn]][[maybe_unused]] 속성으로 교체되었습니다. (버그 #33112971)

InnoDB: 각 버퍼 풀 블록에는 block->lock_hash_val 필드가 포함되어 있습니다. 이 값의 캐싱은 불필요한 버퍼 및 잠금 시스템 간의 결합과 불필요한 메모리 사용을 도입하므로 불필요한 것으로 판명되었습니다. (버그 #33072415)

InnoDB: BLOB 구성 요소가 있는 기본 키를 포함한 테이블을 스캔할 때 레코드 병합과 함께 수행된 쿼리가 어설션 실패를 발생시켰습니다. BLOB은 레코드 외부에 저장되므로 BLOB을 읽는 데 레코드 버퍼를 사용할 수 없습니다. 레코드 버퍼는 스캔된 테이블이 BLOB 기본 키를 포함하고 있음을 감지하지 못했으며, 이제 레코드 버퍼는 BLOB 구성 요소가 있는 기본 키가 있는 경우 행 순서대로 검색을 위해 요청되지 않습니다. (버그 #33067554)

InnoDB: 부모 테이블에서 행을 삭제하거나 업데이트할 때 자식 테이블에서 가상 열 값을 NULL로 설정하는 SET NULL 연쇄 작업이 시작되었습니다. 가상 열 값은 기본 열 값에서 파생되어야 했습니다.
기여해주신 Tencent의 Yin Peng에 감사드립니다. (버그 #33053297)

InnoDB: 디스크 용량에 가까운 시스템에서 MLOG_FILE_EXTEND를 적용하는 InnoDB 복구 작업이 실패할 수 있었습니다. (버그 #33002492)

InnoDB: 동일한 레코드에서 부여된 명시적 잠금이 충돌하여 어설션 실패가 발생했습니다. (버그 #33000142)

InnoDB: 퍼지 배치의 끝에서 LOB의 첫 번째 페이지를 해제하는 동안 어설션 실패가 발생했습니다. 이 실패는 잘못된 루트 페이지 번호로 인해 발생했습니다. (버그 #32958624)

InnoDB: 실패 보고 및 해결을 용이하게 하기 위해 InnoDB 소스의 ib::fatal() 함수가 호출자의 위치를 포함하도록 수정되었습니다. (버그 #32957311)

InnoDB: 클론 수신 서버에서 복구가 innodb_undo_007의 암호화 읽기 오류로 실패했습니다. 클론 작업의 페이지 복사 단계에서 생성된 암호화된 공간에 암호화 키가 기록되지 않았습니다. (버그 #32950216)

InnoDB: 불필요한 경고 메시지 생성을 방지하기 위해 InnoDB 소스의 fil_space_acquire() 함수가 가능한 경우 fil_space_acquire_silent() 함수로 교체되었습니다. 두 함수 모두 백그라운드 스레드에서 테이블 스페이스를 획득하는 데 사용됩니다. (버그 #32944543)

InnoDB: InnoDB CRC32 체크섬 알고리즘 구현이 이제 ARM 및 x86/x64 아키텍처에서 최적화되었습니다. (버그 #32887066)

InnoDB: 수천 개의 테이블이 있는 인스턴스에서 시작 시간이 길어지는 문제는 오류 로깅 서브시스템에 많은 트래픽이 발생했기 때문이었습니다. (버그 #32846656)

InnoDB: INFORMATION_SCHEMA.FILES 뷰에 임시 테이블 스페이스 파일의 현재 경로가 표시되지 않았으며, 표시된 파일 이름이 innodb_temp_data_file_path 변수에 정의된 이름과 다르게 나타났습니다. (버그 #32840635, 버그 #103553)

InnoDB: Windows에서 공유 쓰기 잠금 없이 파일을 열어 fil_shard 뮤텍스를 획득하려고 할 때, fil_shard 뮤텍스를 이미 획득한 다른 스레드가 동일한 파일에 액세스하려고 시도할 때 교착 상태가 발생했습니다. (버그 #32808809)

InnoDB: 다른 실행 중인 MySQL 서버 인스턴스와 동일한 InnoDB 데이터 파일을 사용하여 MySQL 서버 인스턴스를 시작하면 초기화에 실패했습니다. (버그 #32777654, 버그 #103338)

InnoDB: InnoDB 복구 프로세스는 복구 중인 데이터에 페이지 압축이 적용된 것을 인식하지 못해 리두 로그 적용 단계에서 테이블 스페이스 데이터 파일의 크기가 증가하여 디스크가 거의 가득 찬 시스템에서 복구가 실패할 수 있었습니다. (버그 #32771259)

InnoDB: 파일 세그먼트 목록을 순회하여 파일 세그먼트 inode에서 추적한 사용된 페이지 수와 비교하기 위해 사용된 페이지 수를 계산하는 어설션이 간헐적으로 실패했습니다. (버그 #31685095)

InnoDB: 온라인 DDL 작업 중 실패가 발생한 후 서버가 재시작되었을 때 트랜잭션이 롤백되지 않았습니다. 커밋되지 않은 트랜잭션에 대한 테이블 잠금을 다시 설정할 수 없었고 영향을 받은 테이블에 대한 데이터 사전 테이블 개체를 로드할 수 없었습니다.
기여해주신 Shaohua Wang에게 감사드립니다. (버그 #31131530, 버그 #99174)

InnoDB: 집계를 위한 임시 테이블을 사용하는 쿼리가 TempTable 스토리지 엔진에서 사용 가능한 메모리를 소진하여 테이블이 가득 찼다는 오류와 함께 업데이트 작업이 실패했습니다. (버그 #31117893, 버그 #99100)

복제: 복제 적용자(SQL) 스레드는 스토리지 엔진의 재시도 가능한 오류(예: 교착 상태 및 대기 시간 초과)를 key not found 오류로 덮어쓰고, 트랜잭션을 재시도하지 않고 복제를 중지시켰습니다. 이제 이러한 오류는 더 이상 덮어쓰지 않습니다. (버그 #33107663)

복제: Group Replication 분산 복구 프로세스가 조인 멤버를 기증자와 동기화할 때, replication_group_member_stats 테이블에 group_replication_applier 채널에서 대기 중인 트랜잭션 수(COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE 필드)가 업데이트되지 않았습니다. 이제 분산 복구 중 새 트랜잭션이 도착하는 동안 카운트가 추적되지만, 조인하는 사람이 분산 복구의 첫 번째 단계에서 수신된 트랜잭션을 인증할 때까지는 0으로 유지됩니다. (버그 #33067441)

복제: 다중 스레드 복제본(즉, replica_parallel_workers가 0보다 큰 값으로 설정된 복제본)의 경우, replica_parallel_workers가 1로 설정되면 replica_preserve_commit_order 설정이 무시됩니다. 하나의 적용자만 있을 경우 트랜잭션은 항상 복제본의 릴레이 로그에서와 동일한 순서로 실행되고 커밋되므로 커밋 순서를 유지하는 프로세스를 무시하면 성능 저하를 방지할 수 있습니다. (버그 #33048169)

복제: 채워지지 않은 시간대를 사용하여 MySQL 서버 인스턴스에서 복제를 시도할 때, 알 수 없는 시간대 값을 설정하는 문을 복제할 때 어설션이 발생했습니다. 이제 복제본이 이 상황을 올바르게 처리합니다. (버그 #32986721)

복제: 자동 포지셔닝에 필요한 GTID가 삭제된 경우 MySQL 복제가 발행한 오류 메시지가 잘못 할당되거나 특정 상황에서 섞여 나타날 수 있었습니다. (버그 #32965864)

복제: 그룹 멤버가 종료 직전 또는 종료 중일 때 기본으로 선출된 경우, 종료 프로세스가 그룹에서 서버를 나가게 하려는 기본 선거 프로세스가 그룹에서 탈퇴하도록 시도하면서 교착 상태에 빠졌습니다. 이 선거는 종료로 인해 실패했기 때문에 이제 멤버가 이미 그룹을 나가고 있을 경우 기본 선거 프로세스는 더 이상 조치를 취하지 않습니다. (버그 #32884709)

복제: Performance Schema 테이블 replication_asynchronous_connection_failover를 쿼리하는 동안 쿼리 프로세스 중 행이 삭제되면 오류가 반환될 수 있었습니다. 이 상황에서 행 수는 0으로 반환되며 쿼리를 다시 시도할 수 있습니다. (버그 #32701593)

복제: 일부 상황에서는 연결 압축을 사용하는 복제본이 소스 서버에 대한 끊어진 연결을 다시 설정할 수 없었습니다. 이제 이 문제가 수정되었습니다. (버그 #32494609)

그룹 복제: Group Replication 자동 재가입 절차 중 그룹 멤버는 상태를 RECOVERING으로 설정합니다. 그룹 멤버가 재가입하지 못하면 상태를 ERROR로 변경해야 하지만, 그 사이에 뷰 변경이 발생한 경우 상태가 RECOVERING으로 남아 있을 수 있었습니다. 이제 재가입 절차가 성공하지 않으면 뷰 변경이 진행 중이거나 멈췄는지와 상관없이 멤버 상태가 ERROR로 설정됩니다. (버그 #33276418)

그룹 복제: 인증 정보에 대한 가비지 수집이 Group Replication 그룹 통신 시스템(GCS) 스레드에서 백그라운드 스레드로 이동하여 가비지 수집이 진행 중일 때 메시지 송수신이 차단되지 않도록 했습니다. (버그 #33190276)

그룹 복제: group_replication_consistencyBEFORE_ON_PRIMARY_FAILOVER로 설정된 경우, 기본 장애 조치 시 새 기본 서버가 이전 기본 서버와 동일한 상태가 될 때까지 클라이언트 연결이 보류됩니다. 장애 조치 프로세스 중 새 기본 서버를 검사할 수 있도록 일부 모니터링 및 관리 문은 이 보류에서 면제됩니다.
이전에는 DO 문이 이 보류에서 일괄적으로 면제되었지만, 이제 테이블이나 로드 가능한 함수를 사용하지 않는 DO 문만 면제됩니다. 이는 SELECT와 동일합니다. (버그 #33130768)

그룹 복제: MySQL 서버가 Group Replication이 중지되거나 다시 시작되는 동안 Group Replication과 관련된 퍼포먼스 스키마 테이블에서 데이터를 읽는 것을 잘못 허용하였으며, 해당 데이터는 사용되지 말았어야 했습니다. 이제 서버는 Group Replication이 OFFLINE 상태이거나 초기화되지 않았는지 여부를 확인한 후 쿼리를 실행합니다. (버그 #33085494)

그룹 복제: group_replication_consistencyBEFORE_ON_PRIMARY_FAILOVER로 설정된 경우, 기본 장애 조치 시 새 기본 서버가 이전 기본 서버와 동일한 상태가 될 때까지 클라이언트 연결이 보류됩니다. 장애 조치 프로세스 중 새 기본 서버를 검사할 수 있도록 일부 모니터링 및 관리 문은 이 보류에서 면제됩니다. 이전에는 SHOW 문이 일괄적으로 면제되었으나, 이제 데이터에 의존하지 않고(상태 또는 구성에만 의존) 사용하는 SHOW 문만 면제됩니다. 면제된 SHOW 문 목록은 트랜잭션 일관성 보장 구성을 참조하십시오. (버그 #33082509)

그룹 복제: CREATE USER와 같은 Access Control List(ACL)를 참조하는 문이 Group Replication 그룹의 기본 서버에서 실행된 후 즉시 멤버가 그룹에 가입하려 할 때 교착 상태가 발생할 수 있었습니다. ACL 문이 잠긴 상태에서 분산 복구 프로세스가 ACL 캐시에 대한 읽기 잠금을 필요로 했습니다. 이 상황은 기본 서버를 사용할 수 없게 만들었고 새 멤버가 가입하는 것을 막을 수도 있었습니다. 이제 분산 복구 프로세스에는 더 이상 ACL 캐시 잠금이 필요하지 않지만, ACL 문이 커밋되고 뷰 변경이 완료된 후에만 잠금이 해제됩니다. MySQL 통신 스택을 사용하는 Group Replication에서 멤버 가입을 포함하여 ACL 캐시 잠금을 필요로 하는 모든 새 연결 또는 문은 이 잠금이 해제될 때까지 대기하거나 실패하여 다시 시도해야 합니다. (버그 #33025231)

그룹 복제: Group Replication 적용자 모듈을 실행하는 스레드가 중지되면 그룹이 제대로 작동하지 않으며 그룹 트랜잭션 및 메시지를 교환할 수 없습니다. 이전에는 이 상황에서 멤버가 ONLINE 상태로 남아 내부 오류를 무시했습니다. 이제 스레드가 중지되면 멤버 상태가 ERROR로 변경되고 group_replication_exit_state_action에 지정된 작업을 수행합니다. (버그 #32934479)

그룹 복제: MySQL 8.0.22 이후 릴리스에서는 복제 소스 서버가 서버 재시작 후 처음 사용될 때 MEMORY 테이블을 비우도록 복제본에 알리기 위해 TRUNCATE TABLE 문을 바이너리 로그에 기록합니다. 이전에는 문이 기록된 스레드가 글로벌 스레드 관리자에 등록되지 않아 Group Replication이 이를 인식할 수 없었습니다. 이제 이 문제가 수정되었습니다. (버그 #32355801)

JSON: MySQL 8.0.23에서 수행된 JSON 함수 오류 처리 개선에 추가적인 개선이 이루어졌습니다. (버그 #32864910)
참고: 버그 #31856260도 참조하십시오.

JSON: JSON_TABLE()은 열 이름이 대소문자만 다른 경우 중복된 열 이름을 허용했지만, MySQL에서 열 이름은 대소문자를 구분하지 않습니다.
이제 이 함수는 열 이름을 대소문자를 구분하지 않고 비교합니다. (버그 #102824, 버그 #32591074)

Ubuntu 21.10 패키지가 추가되었습니다. (버그 #33501583, 버그 #105274)

MySQL 클라이언트 라이브러리는 MySQL이 OpenSSL 1.0.1과 연결된 경우(EL6에서 빌드된 경우와 같이) 메모리 누수를 초래할 수 있었습니다. (버그 #33335046)

묵시적으로 그룹화된 쿼리는 값이 인덱스에서 쉽게 검색될 수 있는 경우 최적화 중에 집계를 계산합니다. NO PAD 정렬이 선언된 열을 참조하는 술어는 PAD SPACE 의미 체계를 사용하여 평가될 수 있으며, 잘못된 결과를 반환할 수 있습니다. MySQL 8.0은 기본 정렬(utf8mb4_0900_ai_ci)을 포함하여 NO PAD 의미 체계를 가진 많은 정렬을 추가했으며, 이는 더 이상 모든 비이진 정렬이 PAD SPACE 의미 체계를 가지고 있지 않음을 의미합니다.
이제 이러한 경우에 정렬의 패딩 속성을 명시적으로 확인하도록 수정되었습니다. (버그 #33282123)

전체 텍스트 인덱스가 정의되지 않은 테이블에서 실행된 MATCH() AGAINST() 절을 포함하는 일반 테이블 표현식이 포함된 쿼리에서 어설션 실패가 발생했습니다. (버그 #33264864)

여러 퍼포먼스 스키마 테이블에는 0(영) 기본 타임스탬프 값이 포함되어 있었으며, 이는 기본 sql_modeNO_ZERO_IN_DATENO_ZERO_DATE와 충돌했습니다.
예를 들어, 이러한 퍼포먼스 스키마 테이블을 기반으로 새 테이블을 생성하려고 하면 다음과 유사한 오류가 발생했습니다: ERROR 1067 (42000): Invalid default value for 'FIRST_SEEN'
기본 타임스탬프 값이 다음 테이블에서 제거되었습니다:

(버그 #33240123, 버그 #104643)

NOTIFY_SOCKET 환경 변수에 대한 쓰기가 실패하면 실패가 발생했습니다. 연관된 ER_SYSTEMD_NOTIFY_WRITE_FAILED 오류는 두 개의 매개변수를 포함하지만, 오류 로깅 루틴에는 하나의 매개변수만 전달되었습니다. (버그 #33239183)

--ssl-fips-mode 옵션을 설정할 때 잘못된 형식 캐스트 변수가 사용되었습니다. (버그 #33223230)

다음 스레드가 performance_schema.threads 테이블에 존재하지 않았습니다:

  • buf_resize_thread
  • fts_optimize_thread

기여해주신 Kaige Ye에게 감사드립니다.
기여해주신 Kaige Ye에게 감사드립니다. (버그 #33214130, 버그 #104582, 버그 #33214136, 버그 #104583)

내부 저장 함수에 대한 재귀 호출로 인해 예기치 않은 오류가 발생했습니다. (버그 #33198164)

내부 mysqld_list_fields() 함수가 JSON 테이블 함수를 평가하기 위해 생성된 임시 테이블을 제거하지 못했습니다. (버그 #33177686)

최소한의 TAR 패키지를 생성하는 코드가 패키지에 디버그 심볼을 추가하여 빌드 크기가 약 10배 커졌습니다. 이제 DEB/RPM 컴파일러 플래그는 디버그 심볼 빌드에 대해 기본적으로 켜져 있으며, 최소 크기의 릴리스 빌드를 위해 기본적으로 꺼져 있습니다. (버그 #33151629, 버그 #104402)

일부 다중 테이블 DELETE 문에서 메모리 누수가 발생하는 것이 발견되었습니다. (버그 #33151275)
참고: 버그 #18684036도 참조하십시오.

서버 내부 복사 함수의 반환 값이 예상대로 처리되지 않았습니다. (버그 #33142669)
참고: 이 문제는 버그 #31982292의 회귀 문제입니다.

빈 범위 프레임이 항상 올바르게 처리되지 않았습니다. (버그 #33142418)
참고: 이 문제는 버그 #90300, 버그 #27808099의 회귀 문제입니다.

가상 열과 동일한 이름을 가진 새 열을 추가하는 ALTER TABLE 문이 외래 키로 참조될 때, 디버그 빌드에서 오류가 발생할 수 있었습니다. 이제 가상 열 이름이 중복되면 이를 무시하고 기존의 실제 열 이름을 사용하여 조건을 확인합니다. (버그 #33114045)

오류가 없는 경우 저장 프로그램 명령어가 실행되도록 하는 어설션 조건이 루프 내 CASE 문에서는 제대로 작동하지 않았습니다. (버그 #33079184)

디버그 빌드에서 UPDATE HISTOGRAM 절을 사용하여 ANALYZE TABLE을 실행한 후 진단 영역을 성공적으로 지운 후에도 비성공 값을 호출자에게 반환할 수 있었습니다. (버그 #33079073)

mecab_charset 시스템 상태 변수는 이제 utf8이 아닌 utf8mb4로 보고됩니다. utf8은 더 이상 권장되지 않습니다. (버그 #33078623)

디버그 빌드에서 MySQL Enterprise Encryption UDF는 NULL을 반환할 때 nullable 플래그를 설정하지 않았습니다. (버그 #33077931)

플랜 잠금이 설정된 경우 범위 최적화기가 호출되는 문제가 발생했습니다. 범위 최적화기는 자체 호출할 수 있지만, 플랜 잠금에서는 재귀를 허용하지 않습니다. (버그 #33076462)
참고: 이 문제는 버그 #18684036의 회귀 문제입니다.

저장 루틴 내에서 CAST()DEFAULT()가 항상 올바르게 처리되지 않았습니다. (버그 #33075828)

문자열 함수가 평가 중 임시 문자열 버퍼를 사용할 때 예기치 않은 종료가 발생할 수 있었습니다. (버그 #33073951)

호스트 이름이 IP 주소로 확인되지 않았을 때 발생한 오류 메시지에 의미 있는 errno 값이 포함되지 않았습니다. 이제 메시지에서 (0) 대신 (-2)가 반환되어 EAI_NONAME을 나타냅니다. (버그 #33064143)

CREATE TABLE t SELECT 1과 같은 문이 실행되면, binlog_format의 값이 ROW로 설정되고 sql_mode가 ANSI 모드인 경우, 이로 인해 생성된 InnoDB 테이블이 바이너리 로그에 잘못 기록되었습니다. 그 결과, 해당 문에 대한 복제본의 실행이 오류를 발생시키며 실패했으며, mysqlbinlog 유틸리티를 해당 바이너리 로그에 적용할 때도 실패할 수 있었습니다.
원자적 CREATE...SELECTCREATE TABLESTART TRANSACTION이라는 새로운 절을 추가하여 구현되었습니다. 그러나, 이 절은 ANSI 모드가 활성화된 경우 추가되지 않았습니다. 이로 인해 트랜잭션 중간에 일반적으로 암시적으로 커밋되는 CREATE TABLE 문이 실행되었고, 트랜잭션에 GTID가 할당된 경우 GTID 모드에서 오류가 발생했습니다. 이 문제는 새로운 절에서 SQL 모드 의존성을 제거함으로써 해결되었습니다. (버그 #33064062, 버그 #104153)

잘못된 ISO8601 타임스탬프가 포함된 로그 파일이 잘못 처리되었습니다. (버그 #33060440)

문자열 변환 경고에서 이제 utf8 대신 utf8mb3이 참조됩니다. (버그 #33059330)

Unix 플랫폼에서 소스에서 MySQL을 빌드할 때 이제 Boost 아카이브 다운로드에 .tar.gz 파일 대신 .bz2 파일이 사용됩니다. (버그 #33052171)

Enterprise Linux 8(및 Fedora)의 디버그 정보 RPMS 패키지가 REPRODUCIBLE_BUILD를 fprofile.cmake에서 비활성화하여 수정되었습니다. (버그 #33037380)

롤업을 사용하는 쿼리에서 식이 그룹화 열을 가지므로 null 가능으로 설정될 때 해당 식 내 모든 식을 null 가능으로 설정하지 않았고 최상위 식에 대해서만 수행했습니다. 그 결과 롤업에 의해 생성된 NULL이 항상 제대로 전파되지 않았습니다. 이제 롤업을 사용하는 쿼리에서 그룹화 열을 가지는 모든 식을 null 가능으로 설정하도록 수정되었습니다. (버그 #33036184)

EXPLAIN 실행 중 다른 쿼리 블록으로 교차할 때, 이 노드는 실제 루트 노드가 아니라 루트로 계산되었습니다. (버그 #33030136)

내부 sql/join_optimizer/cost_model.cc에서 double에서 int64로의 정의되지 않은 변환이 수정되었습니다. (버그 #33024410)

내부 함수 find_in_group_list()ROLLUP 처리 중 항목을 제대로 일치시키지 못했습니다. 이제 GROUP BY 식에 캐스트를 추가하여 이 문제를 해결했습니다. (버그 #33022742, 버그 #33123934)
참고: 이 문제는 버그 #30969045의 회귀 문제입니다.

MySQL 클라이언트 라이브러리에서 메모리 할당 성공 여부를 확인하지 않아 클라이언트 종료로 이어질 수 있었습니다. (버그 #33019026)

준비된 문에서 호출된 감사 로그 함수가 오류를 일으켰습니다. (버그 #33016004)

열이 명시적이지 않은 열을 가지는 새로운 이름을 추가하여 기존 숨겨진 열과 충돌하지 않도록 보장하기 위해 !hidden! 접두사가 추가된 열 이름이 더 이상 생성되지 않습니다. 숨겨진 열의 새로운 이름은 다음과 같은 형태를 가지고 있으며, 이를 통해 지원하지 않는 환경에서 기능 인덱스를 사용할 수 있습니다:
!hidden!index_name!key_part_number!counter
생성된 이름의 counter 값은 해당 이름을 가진 열이 이미 테이블에 존재하지 않는 한 0입니다. 이 경우 값이 고유해질 때까지 값이 증가합니다. (버그 #32983024)

sql_help.cc에서 범위 최적화기에 대한 불필요한 하드코딩 종속성이 제거되었습니다. (버그 #32976042)

창 함수 실행 중 충분하지 않은 버퍼 공간 할당이 어설션을 발생시킬 수 있었습니다. (버그 #32975889)

해시 조인에서 테이블 목록을 찾을 때 ZERO_ROWS 반복자 아래에 숨겨진 테이블을 고려하지 않았습니다. 이로 인해 NULL 행 플래그가 제대로 설정되지 않았고, 그 결과 weedout이 해당 테이블에 대한 행 ID를 저장하려 할 때 문제가 발생했습니다. (버그 #32975168)

gen_dictionary(), gen_range(), 및 gen_rnd_pan() 데이터 마스킹 함수는 여러 번 짧은 시간 간격으로 실행될 경우 동일한 값을 생성할 수 있었습니다. (버그 #32970772)

공통 테이블 표현식을 해결하는 데 사용된 임시 테이블의 생성 및 삭제가 항상 올바르게 처리되지 않았습니다. (버그 #32962511)

mysql 클라이언트에 대해 -–binary-as-hex 옵션이 활성화된 경우, 빈 문자열이 이제 NULL 대신 0x로 출력됩니다. (버그 #32961656, 버그 #103906)

일반적으로 오류를 발견한 후 분석을 종료하고 나가지만, 중복 열 분석의 경우 열 목록 끝까지 계속 진행하여 진단 개체에 여러 오류 메시지를 추가할 수 있었습니다. (버그 #32960158)

스칼라 하위 쿼리가 여러 행을 반환했을 때, 발생한 오류가 항상 올바르게 처리되지 않았습니다. (버그 #32956779)

테이블에 생성된 열이 포함된 상태에서 서버 SQL 모드를 변경하면 오류 로그에 불필요한 메시지가 기록될 수 있었습니다. (버그 #32954466)

Windows에서 매니페스트 파일 읽기가 실패할 수 있었습니다. (버그 #32950322)

IN() 목록의 값을 평가할 때 오류가 발생했을 경우 평가가 즉시 중지되지 않아 어설션이 발생했습니다. 이제 이러한 경우 오류가 발생하면 즉시 평가를 중지하도록 수정되었습니다. (버그 #32942328)

두 개의 null이 될 수 없는 값을 문자열로 비교하는 동안 오류가 발생한 경우, 비교 결과가 비교 연산자 메타데이터에 따르면 null이 될 수 없는 값임에도 불구하고 NULL로 설정되었습니다. 오류는 사용자에게 올바르게 반환되었지만, 디버그 모드에서 이 불일치로 인해 어설션이 발생했습니다.
이 문제는 Arg_comparator가 null이 될 수 없는 소유자일 때 해당 소유자를 NULL로 설정하지 않도록 하여 해결되었습니다. (버그 #32942327)

업그레이드 작업 중 실행된 SQL 스크립트에서 참조된 설정되지 않은 변수가 실패를 일으켰습니다. (버그 #32939819)

filesort 작업에서 오류 전파가 제대로 처리되지 않아 어설션이 발생할 수 있었습니다. (버그 #32932969)

내부 WalkAndReplace() 함수에서 set_cmp_func()의 오류가 제대로 전파되지 않았습니다. (버그 #32918927, 버그 #33007298)
참고: 이 문제는 버그 #32548377의 회귀 문제입니다.

RESET REPLICA ALL 문이 채널 구성을 읽는 동안 사용되었을 때 교착 상태가 발생할 수 있었습니다. (버그 #32906709)

영구 변수 캐시에 액세스하는 동안 발생할 수 있는 잠재적인 경쟁 조건이 제거되었습니다. (버그 #32901419)

MySQL 옵티마이저가 수행하는 상수 전파가 일부 경우에 null이 될 수 없는 열에 대한 참조를 null이 될 수 있는 표현식으로 대체할 수 있었습니다. 이 경우, 대체된 열 참조의 상위 항목이 잘못된 null 가능성을 가질 수 있어, 나중에 실행 중에 null이 될 수 없는 항목이 예기치 않게 NULL을 반환할 때 어설션 실패로 이어질 수 있었습니다.
이제 nullable 식으로 대체될 때 nullable하지 않은 열 참조를 포함하는 상수 전파가 생략됩니다. (버그 #32895824)
참고: 이 문제는 버그 #32371039의 회귀 문제입니다.

쿼리에서 제공된 열 이름이 대소문자 세부사항에서 다르거나 식 별칭으로 제공된 경우에도 데이터 사전의 열 이름과 일치할 수 있었습니다. 쿼리 출력에는 데이터 사전에서의 열 이름(예: AAA) 대신 쿼리에서 제공된 열 이름(예: aaa)이 포함되었습니다. (버그 #32892045)

서버 SQL 모드가 엄격 모드(strict mode)가 아닌 경우, 특정 문자열 함수는 결과 버퍼가 너무 커서 결과를 저장할 수 없을 때 NULL을 반환하는데, 이로 인해 정렬이 잘못되는 등 일관성 없는 동작이 발생할 수 있었습니다. 또한, LAST_INSERT_ID()CAST(... AS CHAR) 함수가 일부 경우에 올바르게 nullability를 유지하지 못했습니다. (버그 #32864958)

ORDER BY, 윈도우 함수, 또는 뷰를 참조하는 쿼리에서 암시적으로 그룹화된 쿼리에서 추가된 숨겨진 항목들이 항상 올바르게 처리되지 않았습니다. (버그 #32863279, 버그 #33079592)

부정 표현에 대한 유형 해결(type resolution)이 정수에서 소수(decimal)로 변환할 때 올바른 정밀도를 설정하지 않았습니다. 이 문제는 인수의 정밀도를 할당하여 수정되었습니다. (버그 #32863037)
참고: 이 문제는 버그 #31348202의 회귀 문제입니다.

실패한 CREATE TABLE ... SELECT 문에서 오류 전파가 제대로 이루어지지 않아 롤백이 발생하지 않았습니다. (버그 #32855882)

서브쿼리에서 사용된 VALUES 구문이 여러 개의 ROW()를 포함한 경우 항상 올바르게 처리되지 않았습니다. (버그 #32851684)

대기 시간이 초과되었을 때 MySQL 서버가 클라이언트 프로그램에 보내는 오류 패킷(ER_CLIENT_INTERACTION_TIMEOUT)이 프로토콜 압축이 사용될 때 패킷 헤더의 시퀀스 번호가 0이 아닌 2로 잘못 사용되었습니다. (버그 #32835205, 버그 #103412)

여러 테이블에 대한 동시 삽입 작업이 전체 텍스트 인덱스 동기화 요청을 다수 발생시켜 메모리 부족 현상을 초래했습니다. (버그 #32831765, 버그 #103523)

이전 문제에 대한 수정 사항이 후속 작업으로 인해 불필요해졌고, 이는 윈도우 함수에서 사용된 표현식의 잘못된 결과를 초래했습니다. 따라서 해당 패치가 되돌려졌습니다. (버그 #32820802)
참고: 되돌려진 패치: 버그 #26389508.

준비된 문에서 NULLIF()의 결과 유형이 잘못 결정될 수 있었습니다. (버그 #32816305, 버그 #103458)

저장 프로시저 내에서 뷰를 생성 및 삭제할 때 항상 올바르게 처리되지 않았습니다. (버그 #32807430)

이전 문제의 수정 사항에는 소수(decimal) 표현의 정밀도 및 범위를 결정하는 방법에 대한 소규모 리팩토링이 포함되었습니다. 이후 TRUNCATE() 함수의 경우 정밀도가 0으로 설정될 수 있으며, 이는 유효하지 않다는 점이 밝혀졌습니다.
이 문제는 정밀도가 0일 때 1로 처리되도록 수정되었습니다. (버그 #32802251)
참고: 버그 #31348202도 참고바랍니다.

레거시 이유로 인해 table_path 내에 FilterSort를 포함하는 복합 액세스 경로를 가질 수 있습니다. 분석을 용이하게 하고 형식을 개선하기 위해, 이전에 EXPLAIN 출력에 나타났던 내용을 Materialize 액세스 경로 앞에 이동시켰습니다.
이 변경 사항 전후의 EXPLAIN 문 실행 예시는 다음과 같습니다:

# Table created as follows:
mysql> DROP TABLE IF EXISTS t1;
Query OK, 0 rows affected (0.02 sec)

mysql> CREATE TABLE t1 ( f1 INTEGER );
Query OK, 0 rows affected (0.03 sec)


# Previous to change:
mysql> EXPLAIN FORMAT=TREE
    ->   SELECT * FROM ( SELECT * FROM t1 LIMIT 2 OFFSET 1 ) AS alias1
    ->   WHERE f1 <= ANY ( SELECT f1 FROM t1 ) ORDER BY f1\G
*************************** 1. row ***************************
EXPLAIN: -> Sort: alias1.f1
-> Filter: <nop>((alias1.f1 <= (select #3)))  (cost=2.62 rows=2) [other sub-iterators not shown]
    -> Table scan on alias1  (cost=2.62 rows=2)
        -> Materialize  (cost=0.35..0.35 rows=0)
            -> Limit/Offset: 2/1 row(s)  (cost=0.35 rows=0)
                -> Table scan on t1  (cost=0.35 rows=1)

# Following change:
mysql> EXPLAIN FORMAT=TREE
    ->   SELECT * FROM ( SELECT * FROM t1 LIMIT 2 OFFSET 1 ) AS alias1
    ->   WHERE f1 <= ANY ( SELECT f1 FROM t1 ) ORDER BY f1\G
*************************** 1. row ***************************
EXPLAIN:
-> Sort: alias1.f1  (cost=0.35..0.35 rows=0)
    -> Filter: <nop>((alias1.f1 <= (select #3)))  (cost=2.62 rows=2)
        -> Table scan on alias1  (cost=2.62 rows=2)
            -> Materialize  (cost=0.35..0.35 rows=0)
                -> Limit/Offset: 2/1 row(s)  (cost=0.35 rows=0)
                    -> Table scan on t1  (cost=0.35 rows=1)
        -> Select #3 (subquery in condition; run only once)
            -> Aggregate: max(t1.f1)  (cost=0.45 rows=1)
                -> Table scan on t1  (cost=0.35 rows=1)

이 변경 후 table_path 내에서 합법적인 접근 경로는 TABLE_SCAN, REF, REF_OR_NULL, EQ_REF, 및 ALTERNATIVE만 허용됩니다. (버그 #32788576, 버그 #32915233)

상수 폴딩이 소수(decimal) 표현식을 평가할 때 오류를 항상 올바르게 처리하지 않았습니다. (버그 #32785804)

Query_block::prepare_values() 함수에서 호출 순서 불일치로 인해 setup_order()resolve_subquery() 이후 호출되었으며, 이로 인해 서브쿼리가 setup_order() 호출 이전에 외부 쿼리 블록으로 병합되었고, 이로 인해 데이터 구조가 일관성이 없고 오류가 발생했습니다.
이 문제는 setup_order()를 더 일찍 수행하고, 열이 발견되지 않으면 해결을 중단하도록 수정되었습니다. (버그 #32783943)
참고: 이 문제는 버그 #31387510의 회귀 문제입니다.

퍼포먼스 스키마 테이블 variables.info에서 시스템 변수 skip_slave_start가 전역 값이 유지된 경우 실제로는 지속된 변수 파일에서 로드되었음에도 불구하고 COMPILED로 잘못 나열되었습니다. 이제 PERSISTED로 표시됩니다. (버그 #32640588)

동시 MySQL 서버 로드에서 INFORMATION_SCHEMA.PROCESSLIST 뷰에 대한 SELECT 쿼리가 실패를 초래했습니다. (버그 #32625376)

쿼리가 임시 테이블을 사용하여 집계를 수행할 때, 그룹화 항목은 임시 테이블에서 고유 제약 조건으로 사용됩니다. 항목 값이 이미 존재하면 해당 행이 업데이트되고, 그렇지 않으면 새 행이 삽입됩니다. 항목에 결과 필드나 참조 항목이 있을 경우, 항목이 임시 테이블에 존재하는지 확인할 때 한 번, 삽입할 행을 구성할 때 다시 한 번 평가됩니다. 그룹화 항목이 비결정적인 경우, 존재 여부를 확인할 때 사용된 값과 삽입 시도 시 사용된 값이 달라서 기존에 테이블에 이미 있는 값으로 삽입이 거부될 수 있었습니다.
이 문제는 비결정적 항목의 해시를 고유 제약 조건으로 사용하여 한 번만 해시를 평가하도록 하여 해결되었습니다. (버그 #32552332)

테이블별 역할에 대한 권한 확인이 일부 상황에서 충분히 제한적이지 않았습니다. (버그 #32400788)

WHERE 절의 일부로 사용된 특정 비교 조건자(comparison predicates)가 함수 대신 문자열 리터럴을 사용할 경우 서로 다른 결과를 반환할 수 있었습니다. (버그 #32345941, 버그 #102151)

ENUM 또는 SET 유형의 열은 숫자 비교를 기반으로 정렬되지만, 윈도우 함수의 범위 프레임 지정에서 사용되는 표현식은 열의 결과 유형에 따라 설정됩니다. ENUMSET 유형의 결과 유형은 String으로 설정되므로, 윈도우 프레임 처리를 할 때 문제가 발생하여 행이 잘못된 위치에 배치될 수 있었습니다.
이 문제를 해결하기 위해 ENUMSET 유형을 위한 정수 캐시 항목을 구현하고, 이 유형이 범위 표현식에 사용될 때 정수 비교 함수가 사용되도록 수정했습니다. (버그 #32328576)

최적화되어 제거된 서브쿼리에 액세스하는 DML 문이 서버의 비정상 종료를 초래했습니다. (버그 #32244822)

열 이름이 대소문자 구분 없이 utf8_general_ci로 비교되며, 이는 테이블에서 실제로 사용된 정렬(collation)과 항상 동일한 비교 규칙을 따르지 않았습니다. 이전에는 테이블에 32개 이상의 열이 있을 때 이름 조회가 해시 테이블을 사용하여 수행되었고, 이는 정렬을 고려한 해싱을 사용하여 이름 조회와 중복 감지가 일관되지 않게 처리되었습니다. 이 문제는 해시를 제거하고, 열 이름 조회를 테이블의 열 수에 관계없이 동일한 방식으로 처리하여 해결했습니다. (버그 #32169656)

NULL 가능 열에 대해 인접 범위가 범위 최적화에 의해 동일한 값으로 반올림되었을 때 잘못된 결과가 반환되었습니다. (버그 #31870920)
참고: 버그 #98826, 버그 #30988735 관련.

SHOW GRANTS 명령의 인용 처리(quote handling)가 개선되었습니다. (버그 #31716706)

JSON_TABLE() 표현식을 옵티마이저 추적(optimizer trace)에 기록하려 할 때, 테이블 함수의 백업 임시 테이블이 생성되기 전에 시도되어 assertion 오류가 발생할 수 있었습니다. 이제 열 유형이 아직 사용 가능하지 않을 때 <column type not resolved yet> 메시지가 기록되도록 수정되었습니다. (버그 #31578783)

시스템 변수 mandatory_roles의 유효성 검사가 GRANT 'role' 명령에 대한 유효성 검사와 동기화되었습니다. (버그 #31218040)

keyring_hashicorp_update_config() 함수가 동시 실행에 안전하지 않았습니다. (버그 #31205028)

쿼리 리라이트 플러그인이 리라이트 규칙을 새로 고칠 때, 규칙 테이블에 삭제 표시만 되어 물리적으로 제거되지 않은 행이 있는 경우 실패했습니다.
이 문제는 쿼리 리라이트 플러그인이 삭제된 행을 무시하도록 하여 해결되었습니다. (버그 #22654105)

MySQL의 윈도우 함수 구현 중에 리팩토링이 이루어지면서 ORDER BY 절에서 집계 별칭을 참조할 수 있게 되었지만, 이러한 집계에 대한 직접 참조도 허용되었습니다. 이는 허용되지 않아야 하므로, 서버가 이러한 불법 참조를 명시적으로 확인하도록 수정되었습니다. (버그 #13633829, 버그 #30106081)

조건을 파생 테이블로 푸시할 때 뷰 참조가 항상 올바른 컨텍스트에서 해결되지 않았습니다. 또한 null 조건에 대한 검사가 올바르게 수행되지 않았습니다. (버그 #104574, 버그 #33209907, 버그 #33197276)

HAVING COUNT(DISTINCT ...)를 사용하는 일부 쿼리가 결과를 반환하지 않는 문제가 있었습니다. (버그 #104411, 버그 #33152269)
참고: 이 문제는 버그 #31790217의 회귀 문제입니다.

다중 값 인덱스가 다음과 같은 경우에 사용되지 않았습니다:

  • 뷰 내에서
  • 준비된 문에서
  • MEMBER OF()를 포함하는 WHERE 절에서 다른 조건자와 OR로 결합된 경우

또한, MySQL은 WHERE 절에서 MEMBER OF(), JSON_CONTAINS(), 또는 JSON_OVERLAPS() 함수가 포함된 조건자에 대해 impossible condition을 잘못 보고했습니다.
기여해주신 Yubao Liu에게 감사드립니다. (버그 #104325, 버그 #104700, 버그 #104721, 버그 #33123079, 버그 #33268466, 버그 #33275457)
참고: 이 문제는 버그 #30838807의 회귀 문제입니다.

사용자 정의 함수에서 REGEXP_INSTR() 함수를 호출할 때 NULL이 전달되면, 첫 번째 호출은 예상대로 NULL을 반환하지만 이후의 호출도 전달된 값에 관계없이 NULL을 반환하는 문제가 있었습니다. (버그 #104239, 버그 #33089668)

mbr_utils.cc에 정의된 일부 함수들이 특정 상황에서 힙 할당된 예외를 발생시켰습니다. 이러한 경우 예외 객체에 할당된 메모리가 해제되지 않아 예외가 발생할 때마다 소량의 메모리 누수가 발생했습니다.
이 문제는 해당 예외를 스택에 할당하도록 수정되었습니다. (버그 #104214, 버그 #33086286)

ROLLUP 쿼리의 결과에서 subquery_to_derived 최적화가 활성화된 경우 열 이름이 올바르게 표시되지 않았습니다. (버그 #104139, 버그 #33057397, 버그 #33104036)

삭제되었다가 재생성된 테이블을 대상으로 실행되는 EXISTS가 포함된 IF 문을 포함하는 저장 프로시저가 첫 번째 실행 후 올바르게 동작하지 않았습니다. (버그 #103607, 버그 #32855634)

동일한 범위를 여러 번 OR로 결합한 범위 쿼리(예: WHERE (a=1 AND b=2 AND c=3) OR (a=1 AND b=2 AND c=3))를 실행할 때, 옵티마이저가 일부 범위를 잃어버려 최적이 아닌 쿼리 계획이 선택되었습니다.
기여해주신 Facebook에 감사드립니다. (버그 #102634, 버그 #32523520)

느슨한 인덱스 스캔을 사용하여 그룹화 및 최소값을 찾는 옵션을 평가할 때, 쿼리가 하나의 그룹만 처리함에도 불구하고 비용 계산에 반영되지 않았습니다. 이로 인해 그룹화가 인덱스에서 행을 읽은 후 수행되어 불필요한 행을 추가로 검사하게 되었습니다.
이 문제는 그룹화 속성에 대한 동등 조건자를 확인하여 쿼리가 하나의 그룹만 생성하는지 확인하고, 이를 비용 계산에 반영하도록 하여 해결되었습니다. 이를 통해 해당 경우에 느슨한 인덱스 스캔을 선택하도록 수정되었습니다. (버그 #101838, 버그 #32266286)
참고: 버그 #18109609도 참고바랍니다.

정수 나눗셈을 해결할 때, 결과의 정밀도는 피제수로부터 가져옵니다. 제수가 소수(decimal)일 때 1보다 작을 수 있으며, 이로 인해 결과가 피제수보다 더 많은 자릿수를 사용할 수 있었습니다. 이 문제는 일부 경우에 정수 나눗셈의 결과가 소수나 부동 소수점일 때 잘못된 값을 초래했습니다. (버그 #100259, 버그 #31641064)

옵티마이저 추적에 주어진 테이블의 얼마나 많은 부분이 버퍼 풀에 버퍼링되어 있는지에 대한 메모리 내 추정치를 추가했습니다.
기여해주신 Øystein Grøvlen에게 감사드립니다. (버그 #99993, 버그 #31544522)

DML 문에 대한 EXPLAIN 출력에는 테이블 식별자가 포함되며, 일반적으로 SHOW WARNINGS 출력에서 데이터베이스 이름을 포함합니다. CREATE VIEW와 같은 일부 문에서는 데이터베이스 이름이 생략되어야 하며, 이는 캐시된 테이블 객체에서 alias_name_used 플래그를 true로 설정하여 강제됩니다. 그러나 캐시된 테이블이 CREATE VIEW 이후 재사용될 때 해당 플래그가 재설정되지 않았으며, 이로 인해 동일한 캐시된 테이블을 참조하는 EXPLAIN 문에서 경고에 데이터베이스 이름이 누락되었습니다.
이 문제는 테이블 초기화 중에 alias_name_used 플래그가 항상 적절한 값으로 설정되도록 하여 해결되었습니다.
기여해주신 Kaiwang Chen에게 감사드립니다. (버그 #98635, 버그 #30909064)

Leave a Comment



이 문서 공유

8.0.27 변경 사항 (2021-10-19 GA)

링크 복사

CONTENTS