MySQL Innovation Release Note

9.1.0 변경 사항 (2024-10-15 Innovation Release)

Estimated reading: 8 minutes 51 views

공식 문서: Changes in MySQL 9.1.0 (2024-10-15, Innovation Release)

Atomic DDL 관련 사항

이전에는 CREATE DATABASEDROP DATABASE 명령이 원자적이었으나 완전히 충돌 안전하지는 않았습니다. 이로 인해 다음과 같은 문제가 발생할 수 있었습니다:

  • CREATE DATABASE가 데이터베이스 디렉토리가 생성된 후 실제로 작업이 커밋되기 전에 실패할 경우, 데이터 사전에 데이터베이스가 존재하지 않는 것으로 기록되지만 파일 시스템에는 데이터베이스 디렉토리가 남아 있어 수동으로 정리해야 했습니다.
  • 파일 시스템 오류 또는 예기치 않은 종료로 인해 DROP DATABASE의 일환으로 데이터베이스 디렉토리를 제거하지 못하면, DROP DATABASE를 포함하는 트랜잭션이 항상 롤백되지 않아 수동으로 문제를 해결해야 했습니다.

이제 이러한 명령은 영향을 받는 데이터베이스의 모든 테이블이 원자적 데이터 정의 명령어를 지원하는 스토리지 엔진(예: InnoDB)을 사용하는 경우 완전히 원자적이고 충돌 안전합니다.
자세한 내용은 원자적 데이터 정의 명령어 지원을 참조하십시오. (WL #16232)

감사 로그 관련 사항

감사 로그가 이름이 알파벳이나 숫자로 시작하지 않는 사용자(예: '$foo')를 유효하지 않은 사용자로 처리했지만, MySQL 서버에서는 이러한 사용자를 생성할 수 있었습니다.
이 동일한 문제는 MySQL Enterprise Firewall에도 영향을 미쳤습니다. (버그 #36778917)

인증 관련 사항

Microsoft Windows: MySQL이 이제 Windows 11 이상에서 MySQL authentication_webauthn 플러그인을 사용하여 Windows Hello 인증을 지원합니다. 서버 플러그인은 MySQL Enterprise Edition에서만 사용할 수 있으며, 클라이언트 플러그인은 MySQL Enterprise Edition 및 MySQL Community Edition에서 사용할 수 있습니다.
이제 Windows OS 암호 키 저장소에 저장된 패스키를 생성하고 Windows Hello를 사용하여 인증할 수 있으며, 이전 MySQL 릴리스와 호환됩니다.
새로운 mysql 클라이언트 옵션 --plugin-authentication-webauthn-device=#를 사용하여 webauthn 클라이언트 플러그인의 디바이스 번호 플러그인 옵션을 설정할 수 있습니다. 이 옵션이 지정되지 않은 경우 기본값으로 첫 번째 디바이스(0)가 사용됩니다. 지정된 디바이스가 존재하지 않으면 클라이언트는 오류를 발생시킵니다. (예: 디바이스가 두 개만 있는데 세 번째 디바이스를 요청한 경우.) 필요한 것보다 더 많은 활성 디바이스를 확인하지는 않습니다.
이 기능은 Windows 암호 키 저장소에 저장된 키만 지원하며, 다른 가능한 백엔드는 Windows Hello와 함께 지원되지 않습니다.
Windows 암호 키 저장소에서 저장된 패스키를 삭제하려면 OS 도구를 사용해야 하며, mysql 클라이언트는 패스키를 삭제하는 방법을 제공하지 않습니다.
자세한 내용은 WebAuthn 플러그인 인증을 참조하십시오. (WL #16293)

MySQL Enterprise Edition에 대해 authentication_openid_connect 서버 측 인증 플러그인을 사용하여 OpenID Connect 지원이 추가되었습니다.
자세한 내용은 OpenID Connect 플러그인 인증을 참조하십시오. (WL #16269)

C API 관련 사항

비동기 인터페이스가 상태 정보를 저장하기 위해 안전하지 않은 정적 로컬 변수를 사용했습니다. (버그 #115703, 버그 #36891894)

컴파일 관련 사항

MySQL이 Fedora 41에서 컴파일되지 않았습니다. (버그 #37046924)

MySQL이 Ubuntu 24.10에서 컴파일되지 않았습니다. (버그 #37042308)

Oracle의 오픈 소스 지침에 맞춰 MySQL 소스에 CONTRIBUTING.mdSECURITY.md 파일이 추가되었습니다. (버그 #36998165)

CMAKE_MINIMUM_REQUIRED가 MySQL에 필요한 올바른 CMake 버전(3.14.6) 및 MySQL에서 사용하는 서드파티 라이브러리에 대한 CMake 정책에 맞게 조정되었습니다. (버그 #36978193)

시스템 curl 라이브러리에 링크하는 대신 curl을 포함하는 바이너리 패키지가 curl 8.9.1 버전을 사용하도록 업그레이드되었습니다. curl 8.9.1 버전에서 수정된 중요한 문제에 대한 자세한 내용은 https://curl.se/docs/security.html을 참조하십시오. (버그 #36967379, 버그 #36955197)

포함된 zlib 라이브러리가 버전 1.2.13에서 1.3.1로 업그레이드되었습니다. (버그 #36950863)

CMake 옵션 BUILD_SHARED_LIBSCMAKE_SKIP_INSTALL_ALL_DEPENDENCY가 이제 빌드의 최상위 수준에서 OFF로 설정됩니다. (버그 #36930664)

최신 CMake 패키지를 가져올 때 gRPC 및 Protobuf 라이브러리 빌드가 실패했습니다. 이 패키지들이 더 오래된 CMake 패키지와 새 CMake 패키지 모두에서 작동하도록 패키지 검색을 다시 작성하여 문제를 해결했습니다. (버그 #36905657)

포함된 libcurl 라이브러리가 8.9.0 버전으로 업그레이드되었습니다. (버그 #36886877)

포함된 lz4 라이브러리가 버전 1.10.0으로 업그레이드되었습니다. (버그 #36886747)

시스템 Tesseract OCR 라이브러리를 사용하여 빌드 및 링크하기 위한 CMake 코드가 추가되었습니다. (버그 #36872432)

맞춤형 CMake 함수 MY_TARGET_LINK_OPTIONS가 내장 함수 TARGET_LINK_OPTIONS로 대체되었습니다. (버그 #36850490)

CMake의 -DWITHOUT_SERVER 옵션이 Enterprise Linux 7에서 작동하지 않았습니다. (버그 #36824515)

Fedora 28 및 34 버전은 더 이상 지원되지 않으므로 MySQL 컴파일 시 해당 버전에 대한 검사를 중단했습니다. (버그 #36819263)

mold로 링크가 Enterprise Linux 9에서 작동하지 않았습니다. (버그 #36818902)
참조: 버그 #34099162도 참조하십시오.

DISABLE_PERFSCHEMA 빌드 옵션이 추가되었습니다. 이 옵션이 활성화되면 모든 DISABLE_PSI_* 옵션이 ON으로 설정됩니다. DISABLE_PERFSCHEMA의 기본값은 OFF입니다. (버그 #36778698)

MySQL에서 사용된 libfido 버전이 1.15.0으로 업그레이드되었습니다. (버그 #36752604)

RE2 정규 표현식 라이브러리가 이제 MySQL 소스에 포함되었습니다. (버그 #36729026)

포함된 opentelemetry-cpp 버전이 1.15.0으로 업그레이드되었습니다. (버그 #36708755)

MySQL 코드베이스에 사용된 clang-format 버전이 10에서 15로 업그레이드되었습니다. (버그 #36500268)

SQL_I_listnext 멤버 필드를 사용하여 다음 객체로의 포인터 필드를 추적하는데, 이는 기본 생성자로 생성된 목록 객체에서만 유효했습니다. 기본 할당 연산자는 멤버별 할당을 사용했는데, 이는 빈 목록에 적합하지 않았습니다.
이 문제는 맞춤형 이동 생성자 및 할당 연산자 함수(=)를 제공하여 수정되었습니다. 또한 save_and_clear() 구현도 할당 대신 std::move()를 사용하도록 변경되었습니다.
Xingyu Yang과 Tencent 팀에게 기여해 주신 것에 감사드립니다. (버그 #115712, 버그 #36891161)

포함된 TI-RPC 버전이 1.3.5로 업그레이드되었습니다. (버그 #115698, 버그 #36886602)

Protobuf 22 이상을 사용하여 MySQL을 빌드하는 것이 불가능했습니다.
Gordon Wang에게 기여해 주신 것에 감사드립니다. (버그 #115163, 버그 #36678092)

컴포넌트 관련 사항

그룹 복제: 그룹 복제 플로우 제어로 인해 처리 속도가 조절된 트랜잭션에 대한 통계를 제공하는 component_group_replication_flow_control_stats 컴포넌트가 이번 릴리스에서 MySQL Enterprise Edition의 일부로 구현되었습니다. 이 컴포넌트를 설치하려면 그룹 복제 플러그인이 먼저 설치되어 있어야 합니다(그룹 복제 인스턴스 구성 참조).
플로우 제어 처리 속도 조절 통계는 글로벌 상태 변수 Gr_flow_control_throttle_active_count, Gr_flow_control_throttle_count, Gr_flow_control_throttle_last_throttle_timestamp, Gr_flow_control_throttle_time_sum로 제공됩니다.
이 변수들은 performance_schema.global_statusSHOW GLOBAL STATUS의 출력에서 확인할 수 있으며, 값은 각 그룹 구성원에 대해 구체적입니다.
자세한 내용은 그룹 복제 플로우 제어 통계 컴포넌트를 참조하십시오. (WL #16239)

SHA3-224 알고리즘이 암호화 방식으로 SHA3-256이 지정되었을 때 사용되었습니다. (버그 #36980306)

헤더 파일 mysql/plugin.h가 일부 로깅 컴포넌트에 포함되었으나, 실제로는 어느 컴포넌트에서도 필요하지 않았습니다. (버그 #34772742)

이번 릴리스에 추가된 옵션 트래커 컴포넌트(component_option_tracker)는 MySQL 서버에 설치된 옵션(즉, 명명된 기능) 및 컴포넌트와 플러그인에 있는 옵션에 대한 정보를 제공하는 두 개의 테이블을 구현합니다.

  • 읽기 전용 테이블인 performance_schema.mysql_option은 서버에 설치된 모든 옵션에 대한 정보를 포함하며, 여기에는 옵션 이름, 컴포넌트 이름(또는 MySQL Server), 옵션이 현재 활성화되어 있는지 여부가 포함됩니다.
  • 읽기/쓰기 가능한 mysql_option.option_usage 테이블은 시스템에서 각 옵션의 사용 정보(예: JSON 형식)를 보여줍니다. 서버가 그룹 복제 클러스터의 일부인 경우, 해당 서버 ID와 클러스터 ID도 이 테이블에 표시됩니다.

각 옵션에 대해 mysql_option 테이블의 OPTION_NAME 열과 option_usage 테이블의 같은 이름을 가진 열의 값이 동일합니다. 이를 기준으로 두 테이블을 함께 조인하여 쿼리할 수 있습니다. 예시는 다음과 같습니다:

mysql> SELECT * FROM performance_schema.mysql_option o 
    -> JOIN mysql_option.option_usage u 
    -> ON o.OPTION_NAME=u.OPTION_NAME\G
*************************** 1. row ***************************
     OPTION_NAME: Enterprise AUDIT
  OPTION_ENABLED: TRUE
OPTION_CONTAINER: audit_log plugin
      CLUSTER_ID: 
       SERVER_ID: 
     OPTION_NAME: Enterprise AUDIT
      USAGE_DATA: {"used": true, "usedDate": "2024-10-16T09:14:41Z"}
*************************** 2. row ***************************
     OPTION_NAME: JavaScript Stored Program
  OPTION_ENABLED: TRUE
OPTION_CONTAINER: component:mle
      CLUSTER_ID: 
       SERVER_ID: 
     OPTION_NAME: JavaScript Stored Program
      USAGE_DATA: {"used": "false", "usedDate": "2024-10-15T13:40:03Z"}

여러 상태 변수들이 Option Tracker 컴포넌트에 의해 추가되었습니다. 자세한 내용은 Option Tracker 상태 변수를 참조하십시오. 이 컴포넌트는 또한 Option Tracker 사용 데이터와 작업할 수 있는 함수들을 제공하며, 해당 함수들은 Option Tracker 함수에 설명되어 있습니다. 이 함수들을 사용하려면 컴포넌트에 의해 구현된 OPTION_TRACKER_UPDATER 권한이 필요함을 알아두셔야 합니다.
Option Tracker 컴포넌트는 MySQL 상용 버전인 MySQL Enterprise Edition에 포함되어 제공됩니다.
앞서 설명된 Option Tracker 및 테이블에 대한 일반 정보는 Option Tracker 컴포넌트를 참조하십시오. Option Tracker를 지원하는 컴포넌트 및 플러그인 목록은 Option Tracker 지원 컴포넌트를 참조하시기 바랍니다. 또한 mysql_option 테이블을 참조하십시오. (WL #16217, WL #16403, WL #16503)

이번 릴리스에는 Amazon Web Services 키링 컴포넌트 (component_keyring_aws)가 도입되었습니다. 이 컴포넌트는 AWS 키링 플러그인 (keyring_aws)을 대체하며, keyring_aws는 현재 사용 중단 상태로 향후 MySQL 버전에서 제거될 예정입니다.
AWS 키링 컴포넌트에 대한 자세한 정보는 component_keyring_aws AWS 키링 컴포넌트 사용을 참조하십시오. 마이그레이션에 대한 도움은 AWS 키링 플러그인에서의 마이그레이션을 참조하십시오. MySQL 키링 컴포넌트와 키링 플러그인 비교에 대한 개요는 키링 컴포넌트 대 키링 플러그인을 참조하십시오. (WL #16348)

구성 관련 사항

Microsoft Windows: Windows에서 MySQL Configurator 되돌리기 버튼 기능이 항상 원래 값으로 되돌리지 않았습니다. (버그 #36702176)

Microsoft Windows: Windows에서 MySQL Configurator 데이터 디렉터리 파일 탐색 메커니즘이 ProgramData 폴더를 요구했으나, 이제 이 폴더 외부에서도 작동할 수 있습니다. (버그 #36702072)

Microsoft Windows: Windows에서 MySQL Configurator는 선택한 옵션이 변경되지 않았을 때 다음 버튼을 클릭해도 불필요한 백그라운드 작업을 수행하지 않습니다. (버그 #36395605)

Microsoft Windows: Windows에서 MySQL Configurator가 빈 비밀번호를 강력한 비밀번호로 잘못 설명했습니다. (버그 #35533726)

사용 중단 및 제거 관련 사항

NDB Cluster API: NDB Cluster 9.0에서 사용 중단된 Node.js 지원이 이번 릴리스에서 제거되었습니다. (WL #16246)

keyring_aws 플러그인은 이제 사용 중단되었으며, 향후 MySQL 버전에서 제거될 예정입니다. 이번 릴리스에서 도입된 AWS 키링 컴포넌트로 마이그레이션하는 것이 권장됩니다.
AWS 키링 컴포넌트에 대한 자세한 내용은 component_keyring_aws AWS 키링 컴포넌트 사용을 참조하십시오. 마이그레이션 방법에 대해서는 AWS 키링 플러그인에서의 마이그레이션을 참조하십시오. (WL #16348)

SQL 구문 관련 사항

DATABASE() 함수가 UNION 쿼리의 일부로 사용될 때 출력이 잘리는 문제가 있었습니다. (버그 #36871927)

일부 경우에 SUM() 함수가 동일한 값에 대해 DISTINCT와 함께 사용될 때 다른 결과를 반환했습니다. 예를 들어:

mysql> SELECT SUM(b'1100'), SUM(DISTINCT b'1100');
+--------------+-----------------------+
| sum(b'1100') | sum(DISTINCT b'1100') |
+--------------+-----------------------+
|           12 |                     9 |
+--------------+-----------------------+

이 문제는 DISTINCT가 사용될 때, 임시 테이블이 값을 저장하여 마지막에 고유한 값만 반환하기 위해 생성됩니다. 이 임시 테이블을 생성할 때 데이터 유형과 길이가 이미 결정된 것을 고려하지 않고 다시 계산했기 때문에 발생했습니다. 이제 결정된 데이터 유형과 길이를 사용하도록 수정되었습니다. (버그 #115476, 버그 #36796197)

JavaScript 프로그램

JavaScript 저장 프로그램은 항상 utf8mb4 캐릭터셋을 사용하지만, 이러한 저장 프로그램에 대해 INFORMATION_SCHEMA.ROUTINESCOLLATION_CONNECTION 열에 표시된 값은 latin1으로 나타났습니다. 이제는 항상 utf8mb4_0900_ai_ci(기본 utfmb4 정렬)로 설정됩니다. 이 설정은 사용자가 설정한 정렬을 덮어씁니다.
대부분의 경우, 이 변경은 열에 따라 비교가 결정되기 때문에 결과에 눈에 띄는 영향을 미치지 않습니다. 예외는 리터럴 값을 비교할 때 발생하며, 이 경우 COLLATION_CONNECTION이 사용됩니다. 예를 들어, 사용자가 이전에 collation_connectionlatin1_danish_ci로 설정한 경우, JavaScript 절차 내에서 실행된 SELECT 'å' < 'ø'의 결과가 사용자의 기대와 일치하지 않을 수 있습니다. 해결 방법으로는 정렬을 명시적으로 제공하는 것입니다: SELECT 'å' < 'ø' COLLATE utf8mb4_da_0900_ai_ci. (버그 #36925906)

준비된 문이 저장된 루틴 내에서 blob 값을 반환할 때, 준비된 문이 해제된 후 blob 값이 무효화되었습니다. (버그 #36902680)

Statement 핸들 인터페이스를 사용하는 저장 프로시저 내에서 DML 문에 사용자 변수를 사용하는 경우, 이러한 저장 프로시저를 실행한 후에 다른 문을 실행할 때 서버가 예기치 않게 종료되는 경우가 있었습니다. 이 문제를 해결하기 위해, Statement 핸들 인터페이스에서 하위 문을 실행한 후 사용자 변수와 그 값을 저장하는 메모리를 다시 초기화하도록 수정되었습니다. (버그 #36892945)

SqlResult는 반복자(iterators)를 지원하지 않았습니다.
이제 아래와 같은 방식으로 결과 집합을 반복할 수 있습니다:

let result = session.runSql("SELECT * FROM t")

for (let row of result) {
console.log(row.c1+row.c3);
}

(버그 #36835486)

다국어 엔진 컴포넌트(MLE)가 이제 Telemetry 메트릭을 전송합니다.
자세한 내용은 mysql.mle Metrics을 참조하십시오.
또한, JavaScript 저장 프로시저에서 실행된 SQL 쿼리는 Performance Schema 쿼리 다이제스트에서 관찰할 수 있으며, JavaScript 저장 프로시저에서 실행된 SQL 문은 이제 events_statements_history_long에서도 관찰할 수 있습니다. (버그 #36216014, WL #16354)

VECTOR 유형이 이제 JavaScript 저장 프로그램에서 완전히 지원됩니다. 벡터는 이제 입력 인수, 출력 인수, 준비된 문 bind() 매개변수 및 반환 값으로 사용할 수 있습니다.
자세한 내용은 JavaScript 저장 프로그램 데이터 유형 및 인수 처리를 참조하십시오. (WL #16405)

키링 관련 사항

AES ECB(보안에 취약)가 모든 MySQL 키링 관련 컴포넌트에서 제거되었습니다. (버그 #36749277)

MySQL Enterprise 관련 사항

복제: 이번 릴리스에서는 MySQL 복제 Applier Metrics 컴포넌트를 추가하여, 이전에 에러 로그에 기록되던 복제 관련 통계를 사용자에게 제공합니다. 이 컴포넌트는 MySQL 퍼포먼스 스키마에 두 개의 테이블을 추가하여 이러한 정보를 제공합니다. replication_applier_metrics은 특정 복제 채널에 대한 복제 applier 메트릭을 제공하며, replication_applier_progress_by_worker는 특정 워커에 대한 유사한 메트릭을 제공합니다.
이를 통해 복제 파이프라인 전반에서 통계를 수집하고, 이를 일관되게 제공하여 가시성을 향상시킵니다. 이 작업의 일환으로, 이전에 유용하지 않았던 일부 메트릭은 더 유용한 메트릭으로 대체되었습니다.
이 컴포넌트에 대한 자세한 내용은 Replication Applier Metrics Component를 참조하십시오. (WL #15620)
참고: 관련 사항은 버그 #32587480을 참조하십시오.

플러거블 인증

SET PERSIST authentication_ldap_simple_bind_root_pwd=password가 실제로 비밀번호를 저장하지 않았습니다. (버그 #35478833)

SQL 구문 관련 사항

SELECT test.dt.a FROM (SELECT 1 AS a) AS dt와 같은 쿼리는 유도된 테이블에서 열을 참조하기 위해 db_name.tbl_name.col_name 형식의 식별자 체인을 사용했으나, 이 동작은 SQL 표준을 위반합니다. 이러한 참조는 테이블 표현식에서도 허용되었으나, 이번 릴리스에서는 이러한 열 참조를 허용하지 않도록 변경되었습니다. (버그 #36704815)
참고: 관련 사항은 버그 #36542023을 참조하십시오.

이번 릴리스에서는 CREATE VIEW 문에서 사용할 수 있는 IF NOT EXISTS 절에 대한 지원이 추가되었습니다. IF NOT EXISTS는 다음과 같은 효과가 있습니다:

  • 명시된 뷰가 존재하지 않으면, IF NOT EXISTS 절이 사용되지 않은 것처럼 뷰가 정상적으로 생성됩니다.
  • 뷰가 이미 존재하는 경우, 해당 뷰 정의는 변경되지 않으며, 경고가 발생합니다. 예시는 다음과 같습니다:
mysql> CREATE VIEW v1 AS SELECT c1, c3 FROM t1;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE VIEW v1 AS SELECT c2 FROM t1;
ERROR 1050 (42S01): Table 'v1' already exists
mysql> CREATE VIEW IF NOT EXISTS v1 AS SELECT c2 FROM t1;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> SHOW WARNINGS;
+-------+------+---------------------------+
| Level | Code | Message                   |
+-------+------+---------------------------+
| Note  | 1050 | Table 'v1' already exists |
+-------+------+---------------------------+
1 row in set (0.00 sec)

mysql> SHOW CREATE VIEW v1\G
*************************** 1. row ***************************
                View: v1
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`vuser`@`localhost` SQL 
SECURITY DEFINER VIEW `v1` AS select `t1`.`c1` AS `c1`,`t1`.`c3` AS `c3` from `t1`
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

IF NOT EXISTSOR REPLACE와 호환되지 않으며, 이 두 절을 같은 CREATE VIEW 문에서 함께 사용할 수 없습니다. 이를 시도할 경우 구문 오류가 발생합니다.
자세한 내용은 CREATE VIEW Statement를 참조하십시오. (WL #14774)

스레드 풀 관련 사항

일부 동시 연결 시도가 올바르게 처리되지 않았습니다. (버그 #36625082)

트리거 관련 사항

성능: 이전에는 트리거가 하나 이상 있는 테이블의 경우, 테이블이 접근될 때마다 트리거가 완전히 파싱되고 메모리에 로드되었습니다. 이는 데이터 변경이 없는 상황에서도 많은 테이블과 복잡한 트리거가 포함된 경우 예기치 않은 높은 리소스 사용과 지나치게 긴 실행 시간을 초래했습니다. 이러한 문제는 읽기 전용 복제본에서도 불필요한 리소스 사용을 초래했습니다.
이 문제를 해결하기 위해 트리거의 파싱과 로딩을 두 가지 별개의 단계로 나누었습니다. 첫 번째 단계에서는 트리거 메타데이터만 읽으며, 이는 한 번 저장되어 동일한 트리거의 다른 인스턴스 간에 공유될 수 있습니다. 실제 트리거의 파싱 및 실행은 두 번째 단계에서 수행되며, 이는 테이블 데이터를 수정하는 작업에 대해서만 이루어집니다. 예를 들어, SELECT 문을 실행할 때는 트리거가 사용되지 않으므로 트리거를 파싱하고 캐시할 필요가 없어 자원을 절약할 수 있습니다.
이 향상된 기능을 구현하기 위해 테이블 캐시에서 트리거가 있는 테이블과 없는 테이블을 별도로 추적합니다. 모든 트리거가 완전히 로드된 상태의 열린 테이블 중에서 테이블 캐시에 유지되는 최대 개수는 이번 릴리스에서 추가된 서버 시스템 변수 table_open_cache_triggers 값에 의해 결정됩니다. 이 변수는 기존의 table_open_cache 시스템 변수와 유사하나, 이번 릴리스에서 새로 추가된 트리거가 완전히 로드된 테이블에 특정한 퇴출 메커니즘을 제어합니다. table_open_cache_triggers의 기본값은 최대값(524288)과 동일합니다. table_open_cache_triggers를 더 낮은 값으로 설정하면 트리거가 완전히 로드된 테이블에 특정한 퇴출 로직이 활성화됩니다. table_open_cache_triggers를 기본값으로 유지하면, 트리거가 있는지 여부에 따라 캐시에서 테이블이 퇴출되지 않으며 이는 이전 MySQL 버전과 동일한 동작입니다.
이번 릴리스에서 추가된 여러 서버 상태 변수는 트리거가 있는 테이블의 캐시 사용을 추적합니다. Table_open_cache_triggers_hits는 트리거가 있는 열린 테이블의 캐시 적중 횟수를 제공합니다. Table_open_cache_triggers_misses는 트리거가 있는 열린 테이블의 캐시 미스 횟수를 나타내며, Table_open_cache_triggers_overflows는 트리거가 있는 열린 테이블의 캐시 오버플로우 횟수를 제공합니다.
또한, 트리거 오류에 대한 정적 버퍼를 가변 크기 버퍼로 대체하여 필요에 따라 할당함으로써 메모리 사용도 개선했습니다.
이 작업의 일환으로, 데이터는 수정하지 않으나 데이터를 읽는 SHOW CREATE TRIGGER는 이제 서버가 트리거 본문을 파싱할 수 없는 경우에도 모든 트리거의 완전한 정의를 표시합니다.
자세한 내용은 앞서 언급한 서버 변수의 설명을 참조하십시오. 테이블 캐시에 대한 일반적인 정보는 MySQL이 테이블을 여닫는 방식을 참조하십시오.
Dmitry Lenev에게 기여에 감사드립니다. (버그 #44625, 버그 #86821, 버그 #11753220, 버그 #26366333, WL #16455)

Vector 데이터 타입

STRING_TO_VECTOR() 함수는 이제 VECTOR 인수의 문자열 표현에서 끝부분에 공백을 허용합니다. 파서는 이제 숫자 뒤, 대괄호 앞 또는 뒤, 또는 이러한 조합의 값에서 공백 문자를 잘라냅니다. 이전에는 지원되지 않았으나 이제 허용되는 값의 예시는 다음과 같습니다:

  • "[1 ,2]"
  • "[1,2 ]"
  • " [1,2]"
  • "[1,2] "

(버그 #37009633)

기능 추가 및 변경 사항

중요 변경 사항; InnoDB: innodb_log_writer_threads의 기본값은 논리 프로세서가 32개 미만인 시스템에서 이제 OFF로 설정됩니다. (WL #16396)

중요 변경 사항: OpenSSL 라이브러리가 번들로 제공되는 플랫폼에서 MySQL 서버에 연결된 OpenSSL 라이브러리는 이제 버전 3.0.15로 업데이트되었습니다. 자세한 내용은 OpenSSL 3.0 Series Release NotesOpenSSL Security Advisory [2024년 9월 3일]을 참조하십시오. (버그 #37021075)

성능; 복제: 이 릴리스에서는 이진 로그 트랜잭션 종속성을 추적하는 데 사용되는 데이터 구조가 Tree에서 ankerl::unordered_dense::map으로 변경되었습니다. 이로 인해 약 60% 적은 공간을 사용하게 되어 종속성 추적 성능이 향상될 수 있습니다. (버그 #37008442)

그룹 복제: 다음과 같은 경우에 새로운 INFO 수준의 로깅 메시지가 추가되었습니다:

  • 모든 노드에서 작업이 시작될 때
  • 작업 완료를 기다리는 동안 메시지 전송이 차단될 때
  • 메시지를 수신하고 내부 메시지 카운터가 감소할 때

(버그 #32929873)
참고: 관련 사항은 버그 #32762677을 참조하십시오.

출력의 일관성을 위해, lookup_condition에 대해 EXPLAIN FORMAT=JSON에서 explain_json_format_version=2를 사용할 때, 그리고 EXPLAIN FORMAT=TREE를 사용할 때 operation에 대해 조건에서 = 기호 앞뒤에 공백이 추가되었습니다. (버그 #36825515)

EXPLAIN FORMAT=TREE의 출력에는 이제 사용된 semijoin 전략에 대한 정보도 포함됩니다. (버그 #36773414)

이제 서버 시작 시 명령줄 또는 구성 파일을 통해 Telemetry meters를 활성화하거나 비활성화할 수 있습니다. 이를 위해 performance-schema-meter 매개변수를 사용할 수 있습니다.
자세한 내용은 Server Meters를 참조하십시오. (버그 #36698082)

MRR(다중 범위 읽기) 및 인덱스 범위 스캔 액세스 경로에서 MRR이 사용될 때, EXPLAIN FORMAT=JSON 출력에 "multi_range_read": true가 추가되었습니다. 또한, 인덱스 범위 스캔에서 MRR을 사용하는 경우, EXPLAIN FORMAT=TREE 출력의 operation 필드에 (Multi-Range Read)가 표시됩니다. (버그 #36614948)

mysql 클라이언트에 system 클라이언트 명령을 활성화하거나 비활성화할 수 있는 --system-command 옵션이 추가되었습니다.
기본적으로 이 옵션은 비활성화되어 있어 system 명령은 오류와 함께 거부됩니다. 이를 활성화하려면 --system-command=ON을 사용하십시오. (버그 #36377685, WL #16482)
참고: 관련 사항은 버그 #36248967을 참조하십시오.

이번 릴리스에서는 메모리 내에서 디스크로 임시 테이블을 변환하는 것을 추적하기 위한 두 가지 상태 변수를 구현했습니다:

(WL #16377)

TOTAL_ROW_VERSIONS의 최대값이 64에서 255로 변경되었습니다. 이 값은 INSTANT 알고리즘을 사용하여 ADD COLUMNDROP COLUMN 작업을 실행하면 증가합니다. (WL #16369)

MySQL의 OpenTelemetry 로깅을 통해 MySQL 서버에서 수집된 텔레메트리 로그를 OpenTelemetry 백엔드로 내보내어 분석할 수 있습니다. 이 기능은 다음과 같이 구현되었습니다:

  • Telemetry Logging Component: (MySQL Enterprise Edition 및 MySQL HeatWave에서만 지원) 서버에서 수집된 로그 이벤트를 OpenTelemetry의 OTLP 형식으로 내보내고, 정의된 엔드포인트로 로그를 전송합니다. 이 엔드포인트에서 수신하는 프로세스는 OpenTelemetry 수집기 또는 다른 OpenTelemetry 호환 백엔드일 수 있습니다. 여러 백엔드로 내보내려면 OpenTelemetry 수집기를 사용해야 합니다.
    설치 방법에 대한 자세한 내용은 Installing OpenTelemetry Support를 참조하십시오.
  • Telemetry Logging Interface: (MySQL Community Server, Enterprise Edition, 및 MySQL HeatWave) OpenTelemetry 로깅 컴포넌트를 직접 정의하고 통합할 수 있는 API입니다. 이 인터페이스를 통해 사용 가능한 로깅 계측을 발견하고 로거를 활성화하며, 레코드를 생성하고 관련된 추적 컨텍스트를 추출할 수 있습니다.
    이 인터페이스는 로깅을 제공하지 않습니다. 로깅을 사용하려면 MySQL Enterprise Edition, MySQL HeatWave를 사용하거나 자체 로깅 컴포넌트를 개발해야 합니다.
    인터페이스 및 샘플 컴포넌트 코드에 대한 정보는 MySQL Server Doxygen Documentation서버 텔레메트리 로그 서비스 섹션을 참조하세요.

(WL #15201, WL #15202)

이번 릴리스에서는 global_connection_memory_tracking이 활성화된 경우 쿼리의 메모리 사용량을 추적하기 위해 다음과 같은 서버 시스템 및 상태 변수를 추가했습니다. 아래 나열된 첫 번째 두 변수는 글로벌에 적용되며, 나머지 두 변수는 개별 사용자 연결에 적용됩니다:

이러한 변수는 프로덕션에 배포하기 전에 구성 테스트에 사용되며, connection_memory_limit를 초과할 경우 쿼리가 거부되지 않도록 설계되었습니다. (WL #16097)

버그 수정

성능; InnoDB: MySQL 8.0.28에서 인라인으로 정의된 InnoDB 내부 함수들이 MySQL 8.0.33에서 더 이상 인라인으로 정의되지 않은 것이 발견되었습니다. 이는 부분적으로 MySQL 8.0.30에서 InnoDB 적응형 해시 인덱스 개선과 함께 발생한 리팩토링 때문이었습니다. 이로 인해 InnoDB 테이블을 사용하는 조인 쿼리에 부정적인 영향이 있었습니다. (버그 #111538, 버그 #35531293)
참고: 이 문제는 버그 #81814, 버그 #16739204, 버그 #23584861의 회귀 문제입니다.

InnoDB: DEBUG_SYNC_C_IF_THD 매크로를 제거하고 DEBUG_SYNC로 대체했습니다. (버그 #36870544)

InnoDB: REDUNDANT 테이블 열이 INSTANT 알고리즘을 사용하여 NULL 기본값으로 변경된 후 업데이트가 불가능했고, MySQL이 예기치 않게 중단되었습니다. (버그 #36840107)

InnoDB: BLOB과 기타 데이터 유형이 혼합된 테이블에서 대량 로드 작업 중 오류 처리 기능이 개선되었습니다. 이전에는 오류 유형이 빈 문자열로 보고되었습니다. (버그 #36764710)

InnoDB: log_files_truncate를 사용하여 리두 로그 용량이 줄어들었을 때, 드물게 file.end_lsnlog_sys->write_lsn과 같아져 이후의 리두 로그 쓰기가 불가능해졌습니다. (버그 #36730830)

InnoDB: INSTANT 알고리즘을 사용하여 열이 삭제된 후 DELETE 또는 UPDATE 명령을 실행할 때 MySQL 서버가 예기치 않게 중단될 수 있었습니다. (버그 #36723117)

InnoDB: FTS 인덱스 최적화가 일부 경우, 바이트는 다르지만 콜레이션 순서에서 동일한 토큰과 제대로 작동하지 않았습니다. (버그 #36652127)

InnoDB: 로그 인덱스 크기 계산이 열 순서 변경을 이제 고려합니다. (버그 #36526369)
참고: 이 문제는 버그 #35183686의 회귀 문제입니다.

InnoDB: 컴파일 중 최적화되지 않도록 std::this_thread::sleep_for(std::chrono::seconds(0)) 대신 std::this_thread::yield()를 사용했습니다. (버그 #36522343)

InnoDB: MySQL 5.7에서 사용자 생성 FTS_DOC_ID 열을 기본 키로 사용하여 생성된 전체 텍스트 인덱스가 포함된 데이터베이스에서 업그레이드 과정이 예기치 않게 중단되었습니다.
이 수정에 기여한 Alibaba 팀의 Huaxiong Song에게 감사드립니다. (버그 #36496164)

InnoDB: 퍼포먼스 스키마 data_locksdata_lock_waits 테이블이 트랜잭션 또는 잠금 시스템에 대해 전역 뮤텍스를 독점적으로 사용하지 않고도 쿼리할 수 있도록 다시 설계되었습니다. 이제 잠금을 보유하는 해시 테이블의 버킷을 반복하여 처리 중인 샤드에 대해서만 래치를 수행하도록 되어 있으며, 이전에는 트랜잭션을 반복하여 처리했습니다. 이를 통해 속도와 메모리 측면에서 반복 로직의 복잡성이 개선되어 시스템의 나머지 부분에 대한 이러한 쿼리의 영향을 줄일 수 있습니다.
주의할 점은, 쿼리 결과가 버킷을 이동하는 동안 커밋, 시작 또는 다른 방식으로 소유한 잠금 집합이 변경된 경우 트랜잭션 잠금의 불완전한 목록을 표시할 수 있다는 것입니다. 이는 이전에는 개별 트랜잭션이 보유한 잠금의 일관된 스냅샷을 항상 보여주었던 동작과 다릅니다. 새 접근 방식은 대기 중인 잠금과 충돌하는 잠금을 단일 대기 큐의 일관된 보기로 제공하여 항상 동일한 버킷에 있기 때문에 이를 보여주는 반면, 이전 접근 방식은 다른 트랜잭션의 일부 잠금을 누락할 수 있었으며 충돌하는 경우에도 해당했습니다. 이전 접근 방식에서는 보고된 트랜잭션이 보유한 다른 모든 잠금을 항상 보여주었으나, 다른 트랜잭션의 잠금을 누락할 수 있었습니다. (버그 #36302624)

InnoDB: 벌크 로더에서 메모리 누수가 수정되었습니다. (버그 #35988311)

InnoDB: 너무 넓은 열에 인덱스가 있는 테이블(허용된 MySQL 5.7.35 이전 버전에서 생성된 테이블)의 인덱스를 사용한 테이블의 제자리 업그레이드가 테이블을 조용히 가져왔지만 접근할 수 없어 백업 생성에 방해가 되는 문제가 있었습니다. 이제 유효하지 않은 인덱스를 사용하는 모든 작업은 인덱스가 삭제될 때까지 ER_INDEX_CORRUPT와 함께 거부되며, 에러 로그에 ER_IB_INDEX_PART_TOO_LONG 오류도 보고됩니다. (버그 #35869747)
참고: 관련 버그 #34826861도 참조하세요.

InnoDB: 테이블이 생성될 때와 다른 sql_mode로 테이블이 가져와졌을 때 스키마 불일치가 발생할 수 있었습니다. 이제 테이블 스페이스가 가져와진 후에도 보조 인덱스 트리의 손상 여부가 확인됩니다. (버그 #35799038)

InnoDB: FTS 인덱스가 있는 테이블에서 해당 테이블 스페이스가 삭제되면 해당 FTS 테이블도 삭제됩니다. 이러한 테이블을 정리하는 작업을 수행할 때 코드에서 테이블 메타데이터에 FTS 인덱스가 있는 경우 FTS 테이블도 존재해야 한다고 잘못 가정했습니다. (버그 #35343458)

InnoDB: FusionIO에 대해 다른 섹터 크기를 지원하는지 확인할 때 임시 파일에 초기화되지 않은 버퍼가 쓰여졌습니다. 이 확인은 innodb_flush_methodO_DIRECT 또는 O_DIRECT_NO_FSYNC로 설정되었을 때 수행됩니다. (버그 #115229, 버그 #36705034)

InnoDB: 보조 인덱스가 포함된 테이블 재구축 작업은 MySQL 8.0.26에 비해 InnoDB 임시 파일에 대해 더 많은 파일 I/O를 요구하여 쿼리 성능이 저하되었습니다. (버그 #114465, 버그 #36444172)

InnoDB: 성능 스키마가 활성화된 경우 병렬 인덱스 빌더로 인덱스를 추가하는 작업이 Alter_stage 클래스의 문제로 인해 훨씬 느렸습니다. (버그 #113505, 버그 #36163502)

InnoDB: innodb.parallel_read_kill 관련 유닛 테스트를 최신 옵티마이저 변경 사항에 더 잘 맞도록 수정했으며, innodb.ddl_kill 유닛 테스트 및 관련 매크로 사용을 수정했습니다.
이 수정에 기여한 Percona 팀의 Dmitry Lenev에게 감사드립니다. (버그 #113002, 버그 #115416, 버그 #35992036, 버그 #36764973)
참고: 관련 사항은 버그 #112767을 참조하십시오.

파티셔닝: ALTER TABLE이 파티셔닝된 테이블에서 항상 제대로 작동하지 않았습니다. (버그 #36677952)

그룹 복제: 특정 조건에서 기본 호스트의 네트워크 비활성 상태가 짧은 기간 동안 발생한 후 모든 보조 인스턴스가 예기치 않게 종료되었습니다. (버그 #35642087)
참고: 관련 버그 #32673639, 버그 #34565855도 참조하세요.

그룹 복제: 스레드에 의해 보고된 메모리 집계가 다른 스레드에서 할당 해제된 memory/sql/Gtid_set::Interval_chunk의 전체를 반영하지 않아 그룹 복제 스레드 thread/group_rpl/THD_applier_module_receiver가 잘못 증가하는 자원 소비 문제를 일으켰습니다.
performance_schema.memory_summary_global_by_event_name로 보고된 전역 메모리는 이 문제의 영향을 받지 않았습니다. (버그 #34819861)

그룹 복제: xcom\network\xcom_network_provider_native_lib.cc에서 잠재적인 메모리 누수가 제거되었습니다. (버그 #115162, 버그 #36673883)

서버는 스레드 풀 및 감사 로그 플러그인을 동시에 실행할 때 항상 연결을 올바르게 처리하지 못했습니다. (버그 #37039422)

Debian 기반 시스템 패키지가 이제 WITH_ZLIB=system으로 빌드되며, 디버그 빌드를 위해 MYSQL_MAINTAINER_MODE를 비활성화합니다. (버그 #37038213)

상용 빌드에 포함된 Kerberos 라이브러리가 버전 1.21.3으로 업데이트되었습니다. 자세한 내용은 Kerberos 5 1.21.x 릴리스 노트를 참조하세요. (버그 #37034600)

서브쿼리가 SELECT 리스트에서 윈도우 함수를 사용하는 경우 EXISTS() 변환을 사용할 수 없습니다. 이는 해당 서브쿼리에서 항상 물질화(materialization) 변환을 사용하는 것을 의미하지만, IN, ALL, ANY, SOME 중 하나를 사용하는 경우에만 적용됩니다. 서브쿼리에 대해 강제 물질화 여부를 확인하는 IsForcedMaterialization() 함수는 WHERE 절에 윈도우 함수를 포함한 EXISTS 서브쿼리를 사용하는 IN 서브쿼리가 있는 경우 true를 반환하였습니다. 이는 가장 안쪽의 서브쿼리가 윈도우 함수를 포함할 경우 항상 물질화 전략을 반환하지만, IN 서브쿼리에는 이미 EXISTS 전략이 선택된 상태였기 때문입니다. 이로 인해 해당 서브쿼리가 물질화로 고려될 때 일부 검사가 실패했습니다.
이를 해결하기 위해 IsForcedMaterialization()에 수량화된 비교 조건을 위한 확인을 추가하여, 윈도우 함수를 사용하는 서브쿼리를 참조하지 않도록 수정했습니다. (버그 #37008930)

regexp::Regexp_facade::~Regexp_facade()에서 발생한 heap-use-after-free 경고를 제거했습니다. (버그 #36867806)

EXCEPTINTERSECT 조합이 Item::convert_charset()에서 오류를 일으켰습니다. (버그 #36838373)

테이블스페이스 덤프 중 mysqldump가 SQL 명령문을 제대로 이스케이프하지 않았으며, 이제 덤프에서 LOGFILE GROUP, TABLESPACE, ENGINE 식별자를 백틱으로 감싸도록 수정되었습니다. (버그 #36816986)

StoreLinkedImmutableStringFromTableBuffers()에서 불필요한 복사를 제거하여 해시 조인 성능이 5~10% 향상되었습니다. (버그 #36805260)

sql/sql_executor.cc의 이전 수정에서 const_item() 대신 const_for_execution()을 사용하여 잘못된 검사를 수정했습니다. (버그 #36804785)
참고: 이 문제는 버그 #34951115의 회귀 문제입니다.

OTLP 익스포터와 관련된 문제를 수정했습니다. (버그 #36792180, 버그 #36783070)

Last_query_cost 계산 시 옵티마이저가 모든 서브쿼리의 비용을 항상 고려하지 않았습니다. (버그 #36790906)

인덱스 범위 스캔을 IndexRangeScanIterator를 사용하여 실행할 때, 리팩토링 중 IndexRangeScanIterator::m_expected_rows에 사용된 데이터 타입이 double에서 boolean으로 변경된 결과로 인해 레코드 버퍼가 설정되지 않았습니다. 이 의도치 않은 변경은 원래대로 되돌려졌습니다.
또한, 인덱스 범위 스캔을 위한 레코드 버퍼가 활성화된 경우 복수 값 인덱스가 이 스캔을 포함하도록 사용될 때 문제가 발생했습니다. (이 문제는 인덱스 병합 스캔의 일부로 사용될 때만 발생하며, 인덱스 병합 스캔은 포함 인덱스 스캔을 강제합니다.) 문제의 원인은 Field_typed_array::key_cmp() 구현이 인덱싱된 표현식에 대한 생성된 열 값을 필요로 하지만, 복수 값 인덱스에서는 이 열이 제공되지 않기 때문에 저장 엔진이 포함 스캔을 위한 레코드 버퍼를 채울 때 종료 범위 조건을 안전하게 평가할 수 없다는 점입니다. 이를 해결하기 위해 이제 복수 값 인덱스가 포함된 인덱스 범위 스캔에 사용될 때는 레코드 버퍼를 비활성화하도록 했습니다. (버그 #36775910)
참고: 관련 버그 #36341532도 참조하세요.

특정 트리거와 저장 프로시저가 올바르게 처리되지 않았습니다. (버그 #36775910)

외부 테이블을 참조할 때 발생한 일부 오류가 올바르게 처리되지 않았습니다. (버그 #36758378)

GROUP BY 표현식과 WITH ROLLUP을 사용하는 경우, 윈도우 함수로 사용된 COUNT()NULL 대신 0을 반환했습니다. (버그 #36750571)

Debian에서 libmysqlclient.a의 스트리핑을 중지하여 LTO 빌드 호환성을 향상시켰습니다. (버그 #36737581)

내부 함수 my_convert_internal()이 때때로 예상된 값 대신 포인터를 반환했습니다. (버그 #36684463)
참고: 이 문제는 버그 #36479091의 회귀 문제입니다.

서버 구성 요소에서 메모리 문제를 제거했습니다. (버그 #36600205)

mysql 클라이언트의 메모리 누수를 수정했습니다. (버그 #36600203)

AES_ENCRYPT() 함수가 항상 유효한 결과를 반환하지 않았습니다. (버그 #36593265)

많은 행과 테이블을 포함한 조인이 올바르게 처리되지 않는 경우가 있었습니다. (버그 #36562979)

테이블 값 생성자를 준비하는 과정에서 ORDER BY 절에 포함된 표현식에 추가된 숨겨진 열의 수를 추적하지 않았습니다. 이는 이후 해결 과정에서 문제를 일으킬 수 있었고, 계획되지 않은 서버 종료로 이어질 가능성이 있었습니다.
이 문제는 다른 쿼리 블록과 동일하게 테이블 값 생성자에서 숨겨진 항목의 수를 계산하여 해결했습니다. (버그 #36560156)
참고: 이 문제는 버그 #35785452의 회귀 문제입니다.

동일한 트랜잭션에서 FULLTEXT 인덱스를 추가하면서 DROP INDEX를 실행할 경우, 때때로 계획되지 않은 서버 종료가 발생했습니다. (버그 #36559642)

업그레이드 중 FTS 인덱스 처리와 관련된 문제를 수정했습니다. (버그 #36526587)

옵티마이저 힌트의 일부 조합이 정상적으로 작동하지 않는 문제가 있었습니다. (버그 #36492114)

이전 문제의 수정을 적용한 후 GROUP BY의 일부로 포함된 const 항목이 선택 목록에 없는 경우 해당 항목이 필드 목록에 숨겨진 항목으로 추가되지 않았습니다. 그러나 이 항목이 ROLLUP 작업과 관련된 표현식을 임시 테이블로 생성하는 동안의 대체 항목으로 고려되지 않았습니다. 이 문제는 필드 목록에 없는 항목이 const 항목인지 확인하고, 그렇다면 동일한 항목을 대체 항목으로 사용하는 방식으로 해결했습니다. (버그 #36444257)
참고: 이 문제는 버그 #34951115의 회귀 문제입니다.

데이터 마스킹 함수 gen_rnd_pan()mask_ssn()에 대한 테스트 중 발견된 assertions를 제거했습니다. (버그 #36397869, 버그 #36398272)
참고: 관련 사항은 버그 #36398221을 참조하십시오.

조건 푸시다운에 관여하는 표현식에 외부 참조인 뷰 참조와 로컬 참조가 동시에 포함된 경우, 조건을 복제하는 동안 종속성 일관성 검사에 실패했습니다.
이를 해결하기 위해 아이템 트리 프리픽스 및 포스트픽스를 순회합니다. 프리픽스를 순회하는 동안 Item_ref 객체를 설정하여 참조 객체의 기본 열에 대한 종속성 및 컨텍스트 정보를 설정하고, 포스트픽스를 순회하면서 이 객체를 초기화합니다. (버그 #36368181)

일부 준비된 문이 올바르게 재준비되지 않았습니다. (버그 #36267792)
참고: 이 문제는 버그 #34929930의 회귀 문제입니다.

FTS 비교와 관련된 문제를 수정했습니다.
Alibaba의 Shaohua Wang 팀에게 감사를 전합니다. (버그 #36210202)

RelWithDebInfo 빌드는 더 이상 “-g1” 플래그로 컴파일되지 않으며, 이에 따라 사용 가능한 디버깅 정보와 생성된 파일 크기가 증가합니다. (버그 #36111629)
참고: 버그 #33664929도 참조하십시오.

서버가 --skip-grant-tables 옵션으로 실행될 때 발생할 수 있는 잠재적 오작동을 수정했습니다. (버그 #36043213)

문자열을 MYSQL_TIME 구조체로 변환할 때 날짜가 31일 이하인지 항상 확인하지 않았던 문제를 수정했습니다. (버그 #35884337, 버그 #36633426)

조인의 ON 조건에서 외부 쿼리 블록의 테이블 열을 참조하는 문제를 해결한 이전 수정에서 발생한 회귀 문제를 수정했습니다. (버그 #35854686)
참고: 이 문제는 버그 #96946, 버그 #30350696의 회귀 문제입니다.

외래 키를 사용하는 테이블을 생성하는 CREATE TABLE 명령문이 드물게 올바르게 처리되지 않았습니다. (버그 #35553557)

SHOW INDEX와 생성된 열과 관련된 문제를 수정했습니다. (버그 #35497623)

인덱스 병합 계획을 사용하는 쿼리를 테스트하는 동안 발견된 FEDERATED 스토리지 엔진의 메모리 누수를 제거했습니다. (버그 #35362984)

경우에 따라 준비된 문에서 테이블 DDL이 올바르게 처리되지 않았습니다. (버그 #35221658)

집계 함수의 결과를 루틴의 로컬 변수에 저장하는 저장 루틴을 호출하는 문이 sql/sql_lex.h에서 어설션을 발생시켰습니다. (버그 #35102083)

UNION에서 일부 경우에 포함된 SELECT 문 중 하나가 해당 SELECT에서 접근하지 않는 열을 ORDER BY 절에서 참조하는 것이 가능했습니다. (버그 #35058815)

동일한 테이블에서 전체 텍스트 인덱스와 innodb_optimize_fulltext_only가 활성화된 상태로 두 개의 동시 OPTIMIZE TABLE 문을 실행할 경우, 서버가 종료되는 문제가 발생했습니다. (버그 #34929814)

ON 절의 불가능한 조건을 포함하는 왼쪽 조인이 MySQL 5.7에서처럼 최적화되지 않아, 이후 버전에서는 불가능한 조건 없이 쿼리가 더 빠르게 실행되었습니다. 예로는 불가능한 조건이 포함된 SELECT * FROM t1 JOIN t2 ON t1.c1=t2.c1 AND 1=2 같은 쿼리가 있습니다. (버그 #34668756)

XML 함수 ExtractValue()가 악센트가 있는 문자가 포함된 인수를 올바르게 처리하지 못했습니다. (버그 #117778, 버그 #36236440)

NOT< ALL, > ANY 등과 같은 수량 비교와 함께 올바르게 작동했으나, NOT NOT는 올바르게 작동하지 않았습니다. (버그 #115962, 버그 #37004689)

storage/perfschema/table_host.h에 있는 잘못된 주석을 수정했습니다.
Sho Nakazono에게 감사를 표합니다. (버그 #115844, 버그 #36954266)

LATERAL 하위 쿼리를 포함하는 GROUP BY 쿼리가 잘못된 “중복 열” 오류를 발생시켰습니다. (버그 #115696, 버그 #36885503)

SLES 15 대상 플랫폼을 openSUSE 15.5에서 15.6으로 변경했습니다. 이로 인해 GCC 12 대신 GCC 13을 사용하고, 시스템의 OpenSSL 1.1.x 대신 OpenSSL 3.x로 빌드하게 되었습니다. (버그 #115535, 버그 #36934913)

EL8 및 EL9 빌드 사양 파일에 gcc-toolset-12를 추가하여 MySQL 8.0 mysql-community-libs-compat RPM을 빌드할 수 있게 했습니다.
Simon Mudd님께 감사드립니다. (버그 #115484, 버그 #36796229)

Debian 패키지 설명에 오타가 있었습니다.
Henning Pöttker님께 감사드립니다. (버그 #115363, 버그 #36749142)

MySQL 소스 코드 설명에 이진 결과 집합에 대한 설명에서 MYSQL_TYPE_JSON이 누락되었습니다.
Daniël van Eeden님께 감사드립니다. (버그 #115360, 버그 #36740656)

특정 복잡한 UNION 쿼리가 디버그 빌드에서 어설션을 발생시키고, 릴리스 빌드에서는 멈추는 현상이 있었습니다. (버그 #115346, 버그 #36739383)

SELECT CASE WHEN 1 THEN NOW() ELSE x.x END FROM (SELECT NULL) x(x)와 같은 쿼리가 어설션을 발생시켰습니다. 이는 생성된 열 설명이 유효하지 않은 소수 초 정밀도 31의 시간 유형을 사용했기 때문입니다. 이 잘못된 정밀도는 CASE 표현식의 하위 항목 중 하나가 소수 정밀도가 31인 NULL 표현식(정의되지 않은 정밀도)을 포함하는 유형 집계에서 발생했습니다.
이 문제는 NULL을 반환하는 표현식에서 유형을 집계하지 않도록 하여 수정되었습니다.
숫자 및 문자열 인수에서는 직접 시간 유형으로 집계할 수 없기 때문에 이 문제가 발생하지 않았습니다.
이 문제는 MySQL 8.0이나 MySQL 8.4 릴리스 바이너리에서는 발생하지 않았습니다. (버그 #115233, 버그 #36705061)

일반적으로 인덱스 범위 스캔을 사용하는 쿼리가 준비된 문으로 실행될 때 덜 효율적인 인덱스 조회를 사용했습니다. (버그 #115227, 버그 #36705030)

단일로 중첩된 파생 테이블이 잘못 병합되어 물질화되지 않았습니다. (버그 #115215, 버그 #36695371)

ROLLUP 쿼리가 요약 NULL을 고려하지 않았습니다. 다음 문을 참고하십시오:

CREATE TABLE t(a INT);

SELECT a, COUNT(*) FROM t GROUP BY a WITH ROLLUP;

SQL 표준에 따르면, SELECT 문은 결과 (0, NULL)을 생성하는 UNION 쿼리와 동일해야 합니다. 이는 비록 결과 집합이 비어 있더라도 ROLLUP은 모든 GROUP BY 표현식에 대해 NULL 항목이 포함된 단일 그룹 행과 집계 항목에 대한 총합을 제공해야 하기 때문입니다. 이 경우 COUNT(*)의 총합은 0이지만, MySQL은 대신 빈 집합을 반환했습니다.
이제 이러한 경우 그룹 행을 반환합니다. (버그 #114638, 버그 #36514339)

파생 테이블과 DISTINCTORDER BY를 사용할 때 때때로 잘못된 결과가 반환되었습니다. (버그 #114589, 버그 #36496160)

AT TIME ZONE 절을 포함한 CAST를 포함하는 CHECK 제약 조건이 있는 CREATE TABLE 문에서 Missing time zone function이라는 혼란스러운 오류가 발생했습니다. 이는 내부적으로 CHECK 제약 조건의 텍스트가 다시 생성되었고 이후 잘못 해석되었기 때문입니다.
올바른 CHECK 제약 조건 텍스트가 다른 CREATE TABLE 정의와 함께 데이터 사전에 저장되도록 하여 이 문제를 해결했습니다. (버그 #114404, 버그 #36423829)

prefer_ordering_index=off 설정 시 참조 키가 없는 쿼리는 정렬을 피할 수 있음에도 불구하고 전체 테이블을 스캔하고 정렬하는 것으로 되돌아갔습니다.
Daniel Nichter의 기여에 감사드립니다. (버그 #113699, 버그 #36213938)

HAVINGFROM 절에 하위 쿼리를 사용하는 하위 쿼리와의 조인이 sql/item.h에서 어설션을 발생시켰습니다.
이 문제는 하위 쿼리가 제거될 수 있는 조건의 일부로 결정된 후 HAVING 절을 포함한 스칼라 하위 쿼리를 제거할 때 발생했습니다. HAVING 절은 Item_sum_min이라는 집계 객체를 가리키며, 이는 Item::split_sum_func2()에 의해 추가된 Item_aggregate_ref를 통해 간접적으로 접근되었습니다. 하위 쿼리를 제거할 때, Item_aggregate_ref의 참조 카운트가 증가되지 않은 상태에서 감소되었습니다.
객체가 처음 생성될 때 참조 카운트를 증가시켜 이 문제를 해결했습니다. (버그 #112615, 버그 #35877063)
참고: 관련 문제는 버그 #111492, 버그 #35517962을 참조하십시오.

CASE (WHEN TRUE AND EXISTS (subquery))를 사용하는 쿼리가 CASE (EXISTS (subquery))를 사용할 때와 동일한 결과를 항상 반환하지 않았습니다. (버그 #112557, 버그 #35855294)
참고: 이 문제는 버그 #32644631, 버그 #32802301의 회귀 문제입니다.

파생 테이블을 통해 선택된 문자열 리터럴 값이 UNION 연산을 통해 다른 문자 세트를 가진 열과 일치할 때 때때로 ER_CANT_AGGREGATE_2COLLATIONS (불법 결합) 오류가 발생했습니다. (버그 #108627, 버그 #34646522)
참고: 관련 문제는 버그 #36812010, 버그 #36844420을 참조하십시오.

동일한 인덱스를 사용한 경우 같음(=) 비교보다 큼(>) 또는 작음(>) 비교를 사용할 때 다중 값 인덱스를 사용하는 쿼리가 훨씬 더 느리게 실행되었습니다. (버그 #104897, 버그 #33334911)

고부하 상태에서 인스턴스에서 SELECT * FROM sys.innodb_lock_waits; 명령을 실행하면 서버 성능에 영향을 미쳤습니다.
이 릴리스에서는 SELECT * FROM sys.innodb_lock_waits;가 모든 잠금을 두 번 스캔하는 대신 각 대기에 대해 2개의 잠금만 가져옵니다.
이 수정의 일부로 DATA_LOCKSDATA_LOCK_WAITS에 기본 키가 추가되었습니다. (버그 #100537, 버그 #31763497)

Leave a Comment



이 문서 공유

9.1.0 변경 사항 (2024-10-15 Innovation Release)

링크 복사

CONTENTS