카테고리 : MySQL/릴리스노트/8.0

MySQL 8.0.24 릴리스 노트

MySQL 8.0.24 Community Server 릴리스 노트를 한국어로 번역하고, DBA가 참고해야 할 핵심 내용을 함께 정리하였습니다.

저자: Oracle 작성: 2021.04.20 약 45분 26,604자

DBA를 위한 핵심 내용

MySQL 8.0.24는 keyring 컴포넌트 전환, Performance Schema 계측명 변경, Group Replication 운영성 개선, OpenSSL 1.1.1k 반영, 다수의 InnoDB·복제·Optimizer 정확성 수정이 포함된 실질적인 운영 영향 릴리스입니다. 외부 보안 맥락에서는 OpenSSL 1.1.1k가 여러 취약점 수정을 포함하므로 OpenSSL 변경 내역과 취약점 목록을 함께 확인할 필요가 있습니다. 이 버전에 대해 공개적으로 널리 확산된 단일 외부 회귀는 확인되지 않았지만, 변경 범위가 넓어 스테이징 검증 없이 바로 적용하기에는 부담이 있습니다. (OpenSSL 1.1.1 changes, OpenSSL vulnerabilities)

  1. component_keyring_file, component_keyring_encrypted_file, manifest 기반 로딩, ALTER INSTANCE RELOAD KEYRING, performance_schema.keyring_component_status가 도입되었습니다. TDE·암호화 백업·키 관리 정책을 쓰는 환경은 기존 --early-plugin-load 기반 절차와 마이그레이션 경로를 반드시 재검토해야 합니다.
  2. setup_instruments의 여러 instrument 이름이 변경되고 servers instrument가 제거되었습니다. 메모리·락·오류 계측명을 직접 수집하는 대시보드, exporter, 알람 룰은 이름 변경에 맞춰 수정해야 합니다.
  3. 바이너리 로그 트랜잭션 압축, GTID 집합 계산, 시작 시 binlog purge와 Previous_gtids, sql_slave_skip_counter, Group Replication allowlist 런타임 변경, group_replication_applier 채널 SQL thread 제어가 개선되었습니다. 장애 조치·분산 복구·압축 binlog 사용 환경에서는 업그레이드 가치가 큽니다.
  4. undo tablespace truncation, 임시 tablespace open file 계산, 온라인 DDL 암호화 상태 검사, innodb_log_writer_threads=OFF 로그 플러시 차단, TempTable 메모리 추적, ANALYZE TABLE로 인한 후속 쿼리 대기 등 실무형 문제가 수정되었습니다.
  5. 번들 OpenSSL 사용 플랫폼은 취약점 대응 효과가 있으며, Windows에서는 named_pipe_full_access_group 기본값이 빈 문자열로 바뀌어 기존 named pipe 접근 정책이 의도대로 동작하는지 점검해야 합니다.
  6. JSON 함수가 LEFT JOIN을 INNER JOIN처럼 바꾸는 문제, LIKE ... ESCAPE, ROLLUP, prepared statement, generated column, 다중 값 인덱스, view dump/restore, temporal 함수 메타데이터 등 다양한 결과 오류가 수정되었습니다. 애플리케이션 회귀 테스트는 단순 성능보다 결과값 동일성에 초점을 두는 것이 좋습니다.

Audit Log 관련 사항

  • MySQL Enterprise Audit는 이제 JSON 형식 로그 파일에 대해 Audit Log 파일 정리를 지원합니다. Space Management of Audit Log Files를 참조하십시오. (WL #14268)

컴파일 관련 사항

  • GCC 10은 이제 EL7 또는 EL8에서 MySQL을 빌드하기 위한 지원 컴파일러입니다. 이 컴파일러는 devtoolset-10(EL7) 또는 gcc-toolset-10(EL8) 패키지에서 사용할 수 있습니다. 또한 libmysqlclient C API 라이브러리를 기반으로 하는 타사 애플리케이션을 빌드할 때도 GCC 10을 사용하는 것이 권장됩니다. (Bug #32381003)

연결 관리 관련 사항

  • 이전에는 클라이언트가 wait_timeout 시스템 변수로 지정된 기간 내에 서버에 대한 연결을 사용하지 않았고 서버가 연결을 닫은 경우, 클라이언트는 그 이유에 대한 알림을 받지 못했습니다. 일반적으로 클라이언트에는 Lost connection to MySQL server during query (CR_SERVER_LOST) 또는 MySQL server has gone away (CR_SERVER_GONE_ERROR)가 표시되었습니다.

    이러한 경우 이제 서버는 연결을 닫기 전에 그 이유를 연결에 기록하며, 클라이언트는 더 많은 정보를 제공하는 오류 메시지인 The client was disconnected by the server because of inactivity. See wait_timeout and interactive_timeout for configuring this behavior. (ER_CLIENT_INTERACTION_TIMEOUT)를 수신합니다.

    이전 동작은 이전 서버에 대한 클라이언트 연결과 이전 클라이언트가 서버에 연결하는 경우에는 계속 적용됩니다. (WL #12999)

오류 처리

  • 클라이언트 연결 실패 메시지에 이제 포트 번호가 포함됩니다. 예: Can't connect to MySQL server on '127.0.0.1:63333'.. 기여해 주신 Daniël van Eeden에게 감사드립니다. (Bug #30787660, Bug #98311)

Keyring 관련 사항

  • MySQL Keyring은 이전에 서버 플러그인을 사용하여 키 저장소 기능을 구현했지만, 이제 다음 keyring 컴포넌트부터 MySQL 컴포넌트 인프라를 사용하도록 전환하고 있습니다:

    새 keyring 컴포넌트는 기존 keyring_filekeyring_encrypted_file 플러그인과 유사한 점이 있지만, 다르게 설정되고, 별도의 온디스크 스토리지 형식을 사용하며, 키 타입과 키 크기에 대한 제한이 더 적습니다.

    Keyring 컴포넌트는 시작 중 --early-plugin-load 서버 옵션을 사용하여 로드되지 않으며, 시스템 변수를 사용하여 시작 중 또는 런타임에 설정되지 않습니다:

    • 시작 중에 서버는 매니페스트 파일을 사용하여 로드할 keyring 컴포넌트를 결정하며, 로드된 컴포넌트는 초기화될 때 자체 설정 파일을 참조합니다. Keyring Component Installation을 참조하십시오.
    • 런타임에는 새 ALTER INSTANCE RELOAD KEYRING 문을 통해, 설치된 keyring 컴포넌트의 설정 파일이 변경된 후 해당 컴포넌트를 다시 설정할 수 있습니다. ALTER INSTANCE Statement을 참조하십시오.

    Keyring 컴포넌트가 설치된 경우, 새 Performance Schema keyring_component_status 테이블은 이에 대한 상태 정보를 제공합니다. The keyring_component_status Table을 참조하십시오.

    Key 마이그레이션 기능이 확장되었습니다. 이전에는 Key 마이그레이션이 한 keyring 플러그인에서 다른 keyring 플러그인으로만 발생했습니다. 새로운 --keyring-migration-to-component 서버 옵션은 keyring 플러그인에서 keyring 컴포넌트로의 Key 마이그레이션을 가능하게 하며, 이는 MySQL 설치를 keyring 플러그인에서 keyring 컴포넌트로 전환하는 것을 용이하게 합니다. 새로운 mysql_migrate_keyring 유틸리티는 한 keyring 컴포넌트에서 다른 keyring 컴포넌트로의 Key 마이그레이션을 가능하게 합니다. Migrating Keys Between Keyring Keystores를 참조하십시오. keyring 컴포넌트에서 keyring 플러그인으로 키를 마이그레이션하는 규정은 없습니다.

    기존 keyring 플러그인은 사용자에게 보이는 특성의 변경 없이 계속 사용할 수 있지만, 해당 구현은 컴포넌트 인프라를 사용하도록 개정되었습니다. 이는 플러그인 및 컴포넌트 서비스 API 사이의 브리지 역할을 하는 daemon_keyring_proxy_plugin이라는 내장 플러그인을 사용하여 용이하게 됩니다. The Keyring Proxy Bridge Plugin을 참조하십시오. (WL #13446)

Optimizer 관련 사항

  • MySQL 쿼리 Optimizer는 이제 optimizer_switch 변수의 subquery_to_derived 플래그가 활성화되어 있을 때마다 상관 스칼라 서브쿼리에 derived table 최적화를 적용할 수 있습니다. 이는 추가 그룹화를 적용한 다음 끌어올린 조건자에 대해 outer join을 수행하는 방식으로 이루어집니다. 예를 들어 SELECT * FROM t1 WHERE (SELECT a FROM t2 WHERE t2.a=t1.a) > 0 같은 쿼리는 SELECT t1.* FROM t1 LEFT OUTER JOIN (SELECT a, COUNT(*) AS ct FROM t2 GROUP BY a) AS derived ON t1.a = derived.a WHERE derived.a > 0로 다시 작성될 수 있습니다.

    서브쿼리에 이미 명시적 그룹화가 있는 경우, MySQL은 기존 그룹화 목록의 끝에 추가 그룹화를 더합니다.

    MySQL은 서브쿼리가 둘 이상의 로우를 반환하지 않는지 확인하기 위해 카디널리티 검사를 수행하며, 둘 이상의 로우를 반환하는 경우 ER_SUBQUERY_NO_1_ROW를 발생시킵니다. 이 검사는 다시 작성된 쿼리에서 끌어올린 조건자를 평가하기 전에, 모든 WHERE 또는 JOIN 절을 평가하는 과정의 일부로 수행됩니다.

    자세한 내용은 Correlated SubqueriesDerived Tables를 참조하십시오. (WL #13520)

패키징 관련 사항

  • 번들로 제공되는 libedit 라이브러리가 버전 20190324-3.1로 업그레이드되었습니다. (Bug #32433089)
  • 시스템 curl 라이브러리에 링크하는 대신 curl을 포함하는 바이너리 패키지가 curl 7.74.0을 사용하도록 업그레이드되었습니다.

Performance Schema 관련 사항

  • 호환되지 않는 변경: Performance Schema setup_instruments 테이블의 계측이 다음과 같이 개정되었습니다:

    • 데이터 딕셔너리 인프라 및 객체에 할당된 메모리를 반영하기 위한 새 메모리 계측기가 있습니다:

      memory/sql/dd::infrastructure
      memory/sql/dd::objects
      
    • 계측기 이름 지정의 균일성을 개선하기 위해 일부 계측기 이름이 변경되었습니다. 영향을 받는 계측기 이름은 C++ 네임스페이스와 같은 스타일로 키 접두사를 사용하여 그룹화됩니다. 예를 들어, 오류 관련 계측기는 error:: 접두사를 사용하고 파티션 관련 계측기는 Partition:: 접두사를 사용합니다. 다음 테이블은 영향을 받는 계측기를 표시합니다.

      이전 계측기 이름 새 계측기 이름
      debug_sync_control::debug_sync_action THD::debug_sync_action
      errmsgs errmsgs::server
      handler::errmsgs errmsgs::handler
      handlerton handlerton::objects
      log_error_loaded_services log_error::loaded_services
      log_error_stack log_error::stack
      LOG_name LOG::file_name
      MDL_context_backup_manager MDL_context::backup_manager
      Partition_admin Partition::admin
      Partition_share Partition::share
      partition_sort_buffer Partition::sort_buffer
      partition_syntax_buffer Partition::syntax_buffer
      Prepared_statement_map Prepared_statement::infrastructure
      prune_partitions::exec Partition::prune_exec
      Recovered_xa_transactions XA::recovered_transactions
      thd::main_mem_root THD::main_mem_root
      XID XA::transaction_contexts

      또한 servers 계측기는 servers_cache의 중복 항목이며 제거되었습니다.

      이전 계측기 이름 또는 제거된 계측기 이름을 사용하는 애플리케이션은 이 변경 사항을 반영하도록 조정해야 합니다.

    • 여러 계측기에 DOCUMENTATION 컬럼의 값이 부여되어(더 이상 NULL이 아님), 런타임 계측 문서 가용성이 개선되었습니다.

    (WL #14079)

Pluggable Authentication 관련 사항

  • 새로운 caching_sha2_password_digest_rounds 시스템 변수는 비밀번호 저장을 위해 caching_sha2_password 인증 플러그인이 사용하는 해시 라운드 수를 설정할 수 있게 합니다. (WL #14281)

보안 관련 사항

공간 데이터 지원

추가되거나 변경된 기능

  • InnoDB: AUTOEXTEND_SIZE 최대 설정값이 64M에서 4GB로 증가했습니다. MySQL 8.0.23에서 도입된 AUTOEXTEND_SIZE 옵션은 테이블스페이스가 가득 찼을 때 InnoDB가 테이블스페이스 크기를 확장하는 양을 정의합니다. 이 옵션은 CREATE TABLE, ALTER TABLE, CREATE TABLESPACE, ALTER TABLESPACE 문에서 지원됩니다. 자세한 내용은 Tablespace AUTOEXTEND_SIZE Configuration을 참조하십시오. (Bug #32438606)

  • Group Replication: 이제 Group Replication이 중지된 경우 group_replication_applier 채널에 대해 START REPLICA SQL_THREADSTOP REPLICA SQL_THREAD 문을 사용할 수 있습니다. 이를 통해 운영자는 그룹을 떠난 서버에서, 서버를 그룹에 다시 참여시킬 필요 없이, 아직 적용되지 않은 나머지 트랜잭션을 적용할 수 있습니다. (Bug #32027612, Bug #32414767)

  • Group Replication: 들어오는 Group Communication System 연결을 수락할 수 있는 호스트의 Group Replication 허용 목록을 이제 Group Replication이 계속 실행 중인 동안 업데이트할 수 있습니다. 따라서 Group Replication을 중지하고 다시 시작할 필요 없이 허용 목록으로 제어되는 그룹에 새 멤버를 추가할 수 있습니다. 허용 목록은 각 그룹 멤버의 group_replication_ip_allowlist 시스템 변수로 지정됩니다. (WL #14563)

  • Microsoft Windows: Windows에서 MSVC를 사용할 때 mysql-test-run.pl 스크립트가 호출하는 모든 테스트를 실행하는 데 필요한 시간을 줄이기 위해 /RTC1 컴파일러 플래그가 디버그 컴파일러 플래그에서 제거되었습니다. 처음에 이 컴파일러 플래그는 CMake 프로그램과 함께 도입되었으며(디버그 빌드의 경우 기본값), 함수 호출 주변의 스택 손상 및 런타임 시 초기화되지 않은 변수 사용을 테스트하기 위한 코드를 생성했습니다. /RTC1 컴파일러 플래그 제거로 인해 버그 발견 능력이 손실될 것으로 예상되지는 않습니다. 스택 손상과 같은 메모리 오류는 Address Sanitizer (ASAN) 테스트에서 발견될 가능성이 더 높으며, 초기화되지 않은 변수 사용은 컴파일러 경고로 감지됩니다. (Bug #32525732)

  • Microsoft Windows: named_pipe_full_access_group 시스템 변수의 기본값이 이제 빈 문자열('')이 되어 named pipe 연결이 안전해졌습니다. 이전에는 '*everyone*'이 기본값이었습니다. 유효한 Windows 로컬 그룹 이름으로 대체할 수 있습니다. (WL #12671)

  • clone_donor_timeout_after_network_failure Clone 플러그인 변수는 네트워크 실패 후 수신자가 다시 연결하고 클론 작업을 다시 시작할 수 있도록 도너가 허용하는 시간을 정의합니다. 이전에는 타임아웃이 5분으로 고정되어 있었습니다. 이제 네트워크 문제가 해결될 시간을 더 제공하기 위해 타임아웃을 최대 30분까지 연장할 수 있습니다.

    기여해 주신 Daniël van Eeden에게 감사드립니다. (Bug #32335434, Bug #102103)

  • 클라이언트 애플리케이션 및 테스트 스위트 플러그인은 이제 캐릭터셋 이름을 쓸 때 utf8이 아니라 utf8mb3를 보고합니다. (Bug #32164079, Bug #32164125)

  • --skip-slave-start 명령줄 매개변수는 복제본 서버가 재시작될 때 복제 I/O 스레드와 복제 SQL 스레드가 시작되지 않도록 하는 데 사용됩니다. 그러나 명령줄 또는 my.cnf 옵션 파일에서 이 매개변수를 사용하려면 서버 호스트에 대한 로그인 접근 권한이 필요할 수 있습니다. 이제 MySQL Server의 권한 구조를 사용하여 이 기능에 접근할 수 있도록 skip_slave_start 시스템 변수가 제공되므로, 데이터베이스 관리자는 운영 체제에 대한 권한 있는 접근이 필요하지 않습니다. 새 전역 시스템 변수는 읽기 전용이며 SET PERSIST_ONLY 문을 사용하여 설정할 수 있습니다. 시스템 변수이므로 해당 값은 MySQL 클라이언트에서 쿼리할 수도 있고 MySQL API에서 사용할 수도 있습니다. --skip-slave-start 명령줄 매개변수는 대안으로 계속 사용할 수 있으며, 이 매개변수는 새 전역 시스템 변수를 설정합니다. (WL #14450)

수정된 버그

  • 중요 사항: CREATE TABLE 문에서 utf8mb3 콜레이션이 지정되면, SHOW CREATE TABLE, DEFAULT CHARSET, 캐릭터셋 이름을 포함하는 시스템 변수 값, 그리고 바이너리 로그가 모두 이후에 해당 캐릭터셋을 utf8mb4의 동의어가 되고 있는 utf8로 표시했습니다. 이제 이러한 경우에는 대신 utf8mb3가 표시되며, CREATE TABLE은 'collation_name' is a collation of the deprecated character set UTF8MB3. Please consider using UTF8MB4 with an appropriate collation instead. 경고를 발생시킵니다. (Bug #27225287, Bug #32085357, Bug #32122844)

    참조: 다음도 참조하십시오: Bug #30624990.

  • InnoDB: buf_page_create() 함수에서 마주친 오래된 페이지가 해제된 후 다시 초기화되지 않은 상태로 디스크에서 다시 읽혔습니다. (Bug #32622548)

  • InnoDB: InnoDB 소스 코드의 버퍼 풀 페이지 및 버퍼 풀 블록 데이터 구조에 있는 C++ enum 타입 값이 MySQL 8.0.23에서 int에서 uint8_t로 변경되어, 메시지와 INFORMATION_SCHEMA 테이블을 포함한 여러 출력에서 데이터가 정수 대신 ascii 문자로 출력되었습니다.

    INNODB_BUFFER_PAGE_LRU 테이블을 채우는 함수가 IO_FIX 필드의 IO_PIN 상태를 출력하지 않았습니다. (Bug #32575469)

  • InnoDB: 하나의 인덱스 트리 영속 커서 위치를 다른 커서로 복사하는 btr_pcur_t::copy_stored_position 함수가 불필요한 free 및 malloc 호출을 수행했습니다. (Bug #32574835)

  • InnoDB: 테이블의 잠금을 확인하는 함수가 배타적 lock system(lock_sys) 래치를 획득하려고 시도하여 긴 세마포어 대기가 발생했습니다. (Bug #32545030)

  • InnoDB: 임시 테이블스페이스를 열린 파일로 계산하여 innodb_open_files 제한을 초과했으며, 이로 인해 다른 파일을 열 수 없었습니다. 이제 열린 파일을 계산할 때 임시 테이블스페이스는 무시됩니다. (Bug #32541241)

  • InnoDB: buf_flush_ready_for_flush() 함수가 페이지가 dirty 상태인지 또는 I/O fixed 상태인지 먼저 확인하지 않고 오래된 페이지를 플러시 준비 완료로 식별하여 어설션 실패가 발생했습니다. (Bug #32530147)

  • InnoDB: 생성 컬럼을 수정한 트랜잭션의 롤백에서 어설션 실패가 발생했습니다. 이 실패는 외부에 저장된 컬럼이 차지한 공간을 해제하려고 시도할 때 발생했습니다. 외부에 저장된 컬럼을 포함하는 update vector가 생성 컬럼을 고려하지 않았습니다. (Bug #32529561)

  • InnoDB: innodb_validate_tablespace_paths를 비활성화한 상태로 서버를 시작할 때, 시작 프로세스의 초기 단계에서 일시적으로 비활성으로 설정되는 사용자가 생성한 undo 테이블스페이스가 다시 활성화되지 않았습니다. (Bug #32493885)

  • InnoDB: 테이블스페이스 파일에 공간을 할당할 때 InnoDBfallocate()를 사용하게 하는 innodb_extend_and_initialize를 비활성화하면, insert 중심 워크로드에서 성능 회귀가 발생했습니다. (Bug #32437020)

  • InnoDB: 불필요한 전체 flush list 스캔이 제거되어 세션 임시 테이블스페이스가 생성되는 속도가 향상되었습니다. 이전에는 버퍼 풀의 크기와 dirty page 수에 따라 세션 임시 테이블스페이스 생성에 오랜 시간이 걸릴 수 있었으며, 이는 쓰기 트랜잭션 성능에 영향을 주었습니다. (Bug #32423860)

  • InnoDB: 지정된 page type이 유효한지 확인하는 함수가 undo 테이블스페이스에 대해 유효하지만 정의되지 않은 page type을 테스트할 때 assertion을 발생시켰습니다. (Bug #32366301)

  • InnoDB: Sharded read-write lock 함수 instrumentation이 개선되었습니다. (Bug #32333168)

  • InnoDB: Windows에서 COMPRESSION 옵션을 사용하여 테이블을 생성할 때, InnoDB는 동일한 시스템 호출이 설정한 punch hole 지원 플래그를 확인하기 전에 시스템 호출의 오류 상태를 확인하지 못했으며, 이로 인해 초기화되지 않은 플래그를 읽었습니다. (Bug #32322645)

  • InnoDB: MySQL 5.6에서 생성된 지오메트리 컬럼은 MySQL 5.7에서 도입된 지오메트리 타입 변경으로 인해 MySQL 5.7에서 MySQL 8.0으로 업그레이드한 후 서버를 재시작할 때 실패를 발생시켰습니다. (Bug #32299738)

  • InnoDB: 복구 중에 여러 레코드 그룹 미니 트랜잭션의 로그 레코드가 두 번 파싱되었습니다. 이제 두 번째 패스를 피하기 위해 첫 번째 파싱 작업의 로그 레코드가 저장되며, 이로 인해 복구 성능이 향상됩니다.

    기여해 주신 Zhai Weixiang에게 감사드립니다. (Bug #32293797, Bug #102010)

  • InnoDB: 디버그 빌드에서 보조 인덱스에 대한 끝 범위 조건 검사가 어설션 실패를 발생시켰으며, Valgrind 테스트에서는 초기화되지 않은 값을 읽는 가상 컬럼의 보조 인덱스에 대한 끝 범위 조건 검사를 발견했습니다. (Bug #32291506)

  • InnoDB: innodb_log_writer_threads 변수가 비활성화된 상태에서, 한 스레드의 광범위한 로그 쓰기가 다른 스레드의 로그 플러시 기회를 차단할 수 있었습니다. (Bug #32255538)

  • InnoDB: SHOW ENGINE INNODB STATUS 데드락 정보에서, 단일 rw-lock 리더 스레드가 공유 래치를 보유한 경우 리더 스레드 ID가 출력되지 않았습니다. (Bug #32252477)

  • InnoDB: 동일한 테이블에서 SHOW CREATE TABLEALTER TABLE 작업을 동시에 실행하면 어설션 실패가 발생했습니다. SHOW CREATE TABLE 스레드가 ALTER TABLE 작업으로 인해 오래된 상태가 된 테이블스페이스 객체를 참조했습니다. (Bug #32235621)

  • InnoDB: MySQL 5.7에서 샤딩된 rw_lock_stats 카운터가 도입되면서 CPU 캐시 효율성에 회귀가 발생했습니다. MySQL 5.7에서 이 문제를 해결하기 위해 샤딩 방식이 변경되었습니다. 최적의 성능을 위해 MySQL 8.0에서는 rw_lock_stats 카운터가 제거되었습니다. (Bug #32225367)

  • InnoDB: Windows에서 병렬 읽기 스레드 수가 머신 코어 수를 초과하는 동시 SELECT COUNT(*) 쿼리로 인해 정지가 발생했습니다. (Bug #32224707, Bug #101789)

  • InnoDB: 버퍼 풀 페이지가 stale 상태인지 여부를 나타내는 IS_STALE 컬럼이 INFORMATION_SCHEMA.INNODB_BUFFER_PAGE 테이블에 추가되었습니다. (Bug #32194434)

  • InnoDB: 디버그 빌드에서 redo 로그 코드의 log_free_check() 함수는 dirty 페이지의 latch를 보유하는 동안 로그에 사용 가능한 공간이 있는지 보장하며, 이제 현재 스레드가 연 mini-transaction 목록을 사용하여 잠재적 제약 조건 위반을 검색합니다. (Bug #32189367)

  • InnoDB: 64k InnoDB 페이지 크기와 초기 undo 테이블스페이스 크기보다 작은 innodb_max_undo_log_size 설정을 사용하는 시스템에서 느린 종료 중에, 두 undo 테이블스페이스가 무한 루프에서 truncate되었습니다. 이제 undo 테이블스페이스 truncate는 초기 undo 테이블스페이스 크기와 innodb_max_undo_log_size 설정보다 큰 undo 테이블스페이스로 제한됩니다.

    undo 테이블스페이스에 대한 다음 redo rollback segment를 검색하는 함수는 비활성 테이블스페이스가 발견될 때 undo 로그가 두 활성 undo 테이블스페이스 간에 균등하게 분할되도록 수정되었습니다. (Bug #32173457)

  • InnoDB: undo_001 undo 테이블스페이스가 잘리는 중 예기치 않은 중단이 발생한 후 업그레이드 모드에서 서버를 시작하면 실패가 발생했습니다. 업그레이드 처리가 완료되고 종료가 시작되었을 때, undo 잘라내기가 필요한지 확인하는 함수가 undo_001 undo 테이블스페이스를 찾을 수 없었습니다. 이 문제를 해결하기 위해, 업그레이드 모드에서 서버를 시작할 때는 더 이상 undo 테이블스페이스 잘라내기가 수행되지 않습니다. (Bug #32127912)

  • InnoDB: 인덱싱된 가상 컬럼과 인덱싱된 외래 키 제약 조건 컬럼이 있는 자식 테이블에서 cascading 업데이트를 시작한 부모 테이블의 delete 작업이 가상 컬럼 손상을 유발했습니다. (Bug #32124113)

  • InnoDB: 오래된 딕셔너리 인덱스를 가리킬 수 있는 이전 m_share 객체에 접근하지 않도록, 테이블 공유 인스턴스(m_share 객체)와 딕셔너리 테이블 인스턴스의 열기 및 닫기 순서가 수정되었습니다.

    기여해 주신 Yuxiang Jiang에게 감사드립니다. (Bug #31899685)

  • InnoDB: 서버 초기화 실패 후 서버가 성공적으로 재시작된 다음 TRUNCATE TABLE 작업을 실행할 때 debug assertion 실패가 발생했습니다. (Bug #31763837)

  • InnoDB: 빠른 종료(innodb_fast_shutdown=0)에서 assertion failure가 발생했습니다. assertion 코드는 purge 작업을 중지하기 전에 트랜잭션 목록(mysql_trx_list)의 트랜잭션을 검사합니다. 이 검사는 GTID persister 백그라운드 스레드를 종료하기 전에 발생했으며, 해당 스레드는 여전히 트랜잭션 목록에 트랜잭션을 삽입하고 있었습니다. (Bug #31693627)

  • InnoDB: Undo 테이블스페이스 잘라내기 오류 처리가 개선되었으며, Windows 전용 InnoDB 파일 삭제 절차가 POSIX와 더 호환되도록 변경되었습니다. (Bug #31684783)

  • InnoDB: 온라인 DDL 로우 로그를 읽을 때 수행된 불필요한 암호화 상태 검사로 인해 온라인 ALTER TABLE 작업이 Incorrect key file for table 오류와 함께 실패했습니다. (Bug #31529221, Bug #99938)

  • InnoDB: 4K InnoDB 페이지 크기로 서버를 초기화하면 “key too long” 오류가 오류 로그에 기록되었습니다. (Bug #31496943, Bug #99892)

  • InnoDB: 예약된 이름으로 생성된 테이블이 실패를 발생시켰습니다. (Bug #31382599)

  • InnoDB: 가상 컬럼에 인덱스를 생성하면 유효하지 않은 debug assertion failure가 발생했습니다. (Bug #31279528, Bug #99421, Bug #27168185)

  • InnoDB: 디버그 모드에서 buf_pool_validate_instance() 함수는 buf_page_io_complete() 함수에서 동일한 필드를 수정하던 스레드와 적절히 동기화하지 않고 buf_page_t::io_fix 필드에 접근하여 assertion failure가 발생했습니다. 이 문제를 수정한 것에 더해, buf_page_get_io_fix_unlocked() 함수는 특정 값에 대해 buf_page_t::io_fix 필드를 테스트하는 여러 특정 함수로 대체되었습니다. 일련의 다른 소규모 관련 코드 변경도 구현되었습니다. (Bug #31027553)

  • InnoDB: TempTable 메모리 할당자는 지정된 세션에 대해 서로 다른 쿼리가 공유하는 메모리 블록을 할당할 때 RAM 사용량을 추적하지 않았으며, 이로 인해 temptable_max_ram 제한을 준수하지 않을 수 있었습니다. (Bug #29890126)

  • Partitioning: 일부 경우에 잘못된 PARTITION 절이 ALTER TABLE 문에서 올바르게 처리되지 않았습니다. (Bug #32235085)

  • Replication: row-based replication이 사용 중일 때(binlog_format=ROW), 복제본에만 존재하는 저장 generated column이 로우의 다른 필드가 삽입되거나 업데이트될 때 업데이트되지 않았습니다. 이제 이러한 컬럼은 로우 이미지가 언팩될 때 평가되며, 적용되기 전에 해당 값이 로우 이미지에서 업데이트됩니다. (Bug #32292413, Bug #101978)

  • Replication: 로우 이벤트에 압축할 수 없는 데이터를 포함하는 BLOB 컬럼이 포함되어 있고 로우 이벤트의 압축된 크기가 압축되지 않은 크기보다 큰 경우, 바이너리 로그 트랜잭션 압축을 계속할 수 없었습니다. 이제 함수가 추가적인 압축 후 바이트를 올바르게 처리합니다. (Bug #32174715, Bug #101611)

  • Replication: 보존 기간이 만료되어 시작 시 이전 바이너리 로그 파일이 모두 제거된 경우, 새 바이너리 로그 파일에 빈 Previous_gtids 이벤트가 포함되었으며, 이로 인해 복제에서 오류가 발생할 수 있었습니다. 이제 초기화 순서가 변경되어 이전 GTID 집합이 시작 시 생성되는 새 바이너리 로그 파일에 기록된 후에만 이전 바이너리 로그 파일이 제거됩니다. (Bug #32134875, Bug #101533)

  • Replication: MySQL Server가 세트에 있는 GTID 수를 계산할 때 반환 값이 래핑되어 잘못된 결과를 반환할 수 있었습니다. 이로 인해 원격 복제 작업이 더 효율적이었을 상황에서 Group Replication 분산 복구를 위해 바이너리 로그의 상태 전송을 사용하도록 잘못된 결정을 내릴 수 있었습니다. 이제 로직이 수정되었습니다. (Bug #32086209)

  • Replication: 보관 기간이 만료되어 시작 시 바이너리 로그 파일이 제거된 경우, 손실된 GTID와 관련하여 디버그 빌드에서 어설션이 발생했습니다. (Bug #32008512, Bug #101137)

  • Replication: 복제본이 지정된 수의 트랜잭션을 건너뛰도록 하는 데 사용되는 sql_slave_skip_counter 시스템 변수는 바이너리 로그 트랜잭션 압축(binlog_transaction_compression 시스템 변수를 사용하여 활성화됨)을 사용하여 압축된 트랜잭션 페이로드를 무시했습니다. 압축되지 않은 트랜잭션 페이로드의 이벤트만 전체 건너뛴 수에 계산되었습니다. (Bug #31973055)

  • Replication: 서로 다른 클라이언트가 시스템 변수를 업데이트하고 읽는 동안 바이너리 로그 파일이 로테이트되면 데드락이 발생할 수 있었습니다. (Bug #31774422)

  • Replication: 복제본의 SQL 스레드에 대한 SHOW PROCESSLIST 문의 출력이, 복제본이 실제로는 따라잡은 상태였을 때도 마지막 쿼리가 현재 적용 중인 것으로 표시되는 경우가 있었습니다. (Bug #30521198, Bug #97560)

  • Group Replication: 한 클라이언트가 STOP GROUP_REPLICATION 문을 사용하여 그룹 멤버를 중지하는 동안, 다른 클라이언트가 Group Replication에 대한 Performance Schema 통계를 쿼리하면 경합 조건이 발생할 수 있었습니다. 이제 Group Replication은 STOP GROUP_REPLICATION 문과 Performance Schema 쿼리가 동시에 실행되지 않도록 방지합니다. (Bug #32100147)

  • Microsoft Windows: 32개를 초과하는 논리 프로세서가 있는 Windows 시스템에서 MySQL Server(64비트)를 실행하고 리소스 그룹의 VCPU 속성을 30보다 크게 설정하면, 스레드 affinity를 설정하는 데 사용되는 CPU 마스크 값이 잘못 생성되었습니다. 이러한 조건에서 MSVC 컴파일러는 thread_attrs_api_win.cc 파일에서 32비트 시프트가 64비트로 암시적으로 변환되었다는 경고를 보고했습니다. 이 변환으로 인해 32개를 초과하는 논리 프로세서가 있는 시스템에서 CPU 마스크 계산이 잘못되었습니다. 이 수정 사항은 시프트의 인자 11LL로 교체하여 CPU 마스크를 계산할 때 64비트 시프트가 사용되도록 합니다. (Bug #32079726)

  • JSON: IF() 함수는 첫 번째 인자에서 오류가 발생했을 때 디버그 빌드에서 때때로 assertion에 도달했습니다. 이는 함수의 반환 타입이 JSON이라는 추가 조건이 있는 유사한 상황에서도 발생할 수 있었습니다. (Bug #32231393, Bug #32231620)

  • JSON: 여러 JSON 함수가 오류를 올바르게 전파하지 않았으며, 이로 인해 디버그 빌드에서 assertion 실패가 발생할 수 있었습니다. (Bug #32047630)

  • JSON: 트리거 내부의 JSON_TABLE()가 서로 다른 세션에서 재사용될 때 때때로 잘못 처리되었습니다. JSON_TABLE() 및 해당 임시 테이블이 현재 세션의 컨텍스트에서 처리되도록 보장하여 수정했습니다. (Bug #31644193)

  • JSON: 컬럼을 타입이 지정된 배열로 캐스트하는 표현식에 정의된 다중 값 인덱스가 쿼리 속도를 높이는 데 사용되지 않았습니다. 이는 서버가 표현식을 동등한 인덱스된 생성 컬럼으로 대체할 때, 컬럼에 대한 참조를 동등한 생성 컬럼에 대한 참조로 교체하려고 시도하지 않았기 때문입니다. 다중 값 인덱스의 경우, 해당 컬럼을 타입이 지정된 배열로 캐스트하는 표현식에 대한 다중 값 인덱스를 뒷받침하는 생성 컬럼에 대한 참조로 컬럼 참조를 교체하는 것이 타당합니다.

    이 수정은 컬럼 참조가 다중 값 인덱스를 사용할 수 있는 컨텍스트에 나타날 때, 즉 MEMBER OF(), JSON_CONTAINS() 또는 JSON_OVERLAPS()의 인수로 사용될 때 컬럼 참조의 대체를 허용함으로써, 서버가 함수 표현식과 조건식만 인덱스된 생성 컬럼으로 대체하려고 시도한다는 제한을 해제합니다. 컬럼 참조가 배열이 아닌 컨텍스트에서 사용되는 경우에는 이 제한이 계속 적용됩니다. (Bug #30838807)

  • JSON: JSON_SEARCH() 함수는 모든 검색 문자열 및 경로 값을 실제 인코딩과 관계없이 utf8mb4 문자열로 해석했으며, 이로 인해 잘못된 결과가 발생할 수 있었습니다. (Bug #102443, Bug #32443143)

  • JSON: 일부 경우에 left join에서 사용될 때, 일부 MySQL JSON 함수가 optimizer로 하여금 해당 조인을 inner join으로 변환하게 했으며, inner join이 원래의 left join과 동등하지 않은 경우에도 그렇게 했습니다. 이는 해당 함수들이 인수 중 하나가 NULL이더라도 NULL이 아닌 값을 반환하고, optimizer는 NULL 입력에 대해 해당 함수들이 NULL을 반환할 것으로 예상했기 때문입니다.

    이 문제의 영향을 받은 함수에는 JSON_ARRAY(), JSON_OBJECT(), JSON_ARRAY_APPEND(), JSON_ARRAY_INSERT(), JSON_INSERT(), JSON_REPLACE(), 및 JSON_SET()이 포함되었습니다. 이러한 함수에 대한 자세한 내용은 JSON Functions를 참조하십시오. (Bug #101861, Bug #32248705)

  • generic Linux용 Community 패키지는 필요한 LDAP/SASL/Kerberos 의존성과 함께 빌드되지 않았으며, 관련 필수 라이브러리를 번들로 포함하지 않았습니다. (Bug #32619858)

  • 함수 BIT_AND(), BIT_OR(), BIT_XOR(), 및 JSON_ARRAYAGG()가 항상 적절한 오류 처리를 제공하지는 않았습니다. (Bug #32594813)

  • INUNION과 함께 잘못 사용된 경우 서버가 항상 적절한 오류 메시지를 제공하지는 않았습니다. (Bug #32593846)

  • DECIMAL에서 부호 있는 정수 타입으로 캐스팅할 때 결과의 자릿수가 Item_typecast_signed의 메타데이터가 나타낸 자릿수보다 많으면 assertion에 도달할 수 있었습니다. 이는 정수로 변환될 때 decimal 값이 반올림되고, 9.9를 10으로 올림하는 경우와 같이 반올림으로 인해 decimal 값의 정수부였던 부분의 자릿수가 증가할 수 있다는 점을 Item_typecast_signed가 고려하지 않았기 때문에 발생했습니다.

    이 문제는 캐스팅 결과에 대한 최소 최대 길이를 계산하려고 했던 로직을 제거하고, 대신 부모 클래스 Item_int_func에서 설정한 기본값을 사용하도록 하여 수정되었습니다. 해당 기본값은 64비트 정수의 최대 너비이며, 입력값과 관계없이 안전해야 합니다. (Bug #32591589)

    참조: 이 문제는 다음 버그의 회귀입니다: Bug #32371039.

  • invisible 컬럼에 my_row_id라는 이름이 허용되지 않았습니다. 이 제한이 해제되었습니다. (Bug #32586231)

  • 동시 연결이 많은 시스템에서 grant 문 실행이 메타데이터 락을 기다리느라 지나치게 오래 걸릴 수 있었으며, 이로 인해 서버가 응답하지 않게 될 수 있었습니다. (Bug #32483597)

  • Windows 바이너리와 라이브러리가 제대로 서명되지 않았습니다. (Bug #32458533)

  • INFORMATION_SCHEMA 테이블에 대한 권한 검사가 lower_case_table_names 값을 고려하지 못할 수 있었습니다. (Bug #32448364)

  • ESCAPE가 상수 값을 참조하지 않는 LIKE... ESCAPE가 prepared statement 내에서 올바르게 처리되지 않았습니다. (Bug #32446728)

  • MySQL은 전통적으로 LIKE에 대한 ESCAPE 절의 빈 값(즉, ESCAPE '')을 “이스케이프 문자가 없음”으로 해석했습니다. LIKE의 처음 두 인수 중 하나가 멀티바이트 캐릭터셋을 사용하는 문자열인 경우 문제가 발생할 수 있었는데, 이러한 경우 빈 값이 백슬래시(\)를 이스케이프 문자로 사용해야 함을 의미하는 것으로 해석되어 예상된 동작이 깨졌기 때문입니다.

    이 수정으로 인해 LIKE는 캐릭터셋과 관계없이 ESCAPE ''를 이스케이프 문자가 없음을 의미하는 것으로 해석하여 이전의 예상된 동작을 복원합니다.

    또한 지정된 이스케이프 문자를 대상 캐릭터셋으로 변환할 수 없는 경우 이제 오류가 발생합니다. 이는 이러한 경우 백슬래시를 이스케이프 문자로 사용하는 것으로 조용히 폴백하던 원래 동작을 대체합니다. (Bug #32446508)

  • Windows 패키지는 OpenSSL 취약점의 영향을 받았습니다. (Bug #32431519)

  • 윈도우 함수 또는 서브쿼리를 포함하는 로드 가능한 함수 인수는 예기치 않은 결과를 생성할 수 있었습니다. (Bug #32424455)

  • 저장 프로시저 내 커서에 사용되는 임시 테이블을 부적절하게 처리하면 예기치 않은 서버 동작이 발생할 수 있었습니다. (Bug #32416811)

  • 소스에서 TRUE 심볼을 사용하면 일부 플랫폼에서 빌드 실패가 발생했습니다. 이는 true로 대체되었습니다. (Bug #32406197, Bug #102308)

  • 사용자가 INFORMATION_SCHEMA.VIEWS 테이블에서 뷰 정의를 볼 수 있는지 확인하는 데 사용되는 권한 검사가 올바르게 동작하지 않았습니다. (Bug #32405811)

  • 재귀 공통 테이블 표현식의 경우, 인메모리 임시 테이블을 온디스크로 변환해야 하는 상황이 되면 어설션이 발생할 수 있었습니다. (Bug #32404597)

  • 사용자가 생성한 함수를 사용하는 prepared statement는 해당 함수가 인수를 받지 않을 때 올바르게 처리되지 않았습니다. (Bug #32404542)

  • clone 플러그인 설치 실패로 인해 이후 설치 시도가 실패할 수 있었습니다. (Bug #32402158, Bug #102240)

  • 시간 컬럼 타입과 함께 사용되는 일부 내부 함수가 YEAR 값에 대한 적절한 처리를 제공하지 않았습니다. (Bug #32395335)

  • 내부 상수 MAX_FLOAT_STR_LENGTH = 12 및 MAX_DOUBLE_STR_LENGTH = 22는 각각 FLOATDOUBLE 값을 나타내는 문자열의 최대 길이를 나타냅니다. 과학적 표기법을 사용할지 여부를 결정하기 위해 변환 루틴 my_gcvt에서 사용한 휴리스틱은 때때로 이보다 더 긴 문자열을 생성했습니다.

    이러한 긴 문자열은 실제 길이가 예상 최대값을 초과할 수 있었기 때문에 일부 문자열 변환 루틴에 문제를 일으켰습니다. 문자열 컨텍스트에서 FLOAT 또는 DOUBLE을 가져올 때마다 원하는 길이를 my_gcvt에 명시적으로 알려 주도록 하여 이 문제를 수정했습니다. (Bug #32385934)

  • 트리거 내에서 인수 없이 RAND()를 사용하면 예기치 않은 서버 동작이 발생할 수 있었습니다. (Bug #32372805)

  • prepared statement 또는 저장 프로시저에서 Item_cache 객체가 사용될 때, 이전 실행에서 사용된 Field 객체를 가리킬 수 있었습니다. 프로시저의 수명 동안 지속되는 Item_field로 캐시된 필드 멤버를 대체하여 이 문제를 해결했습니다. (Bug #32367019)

  • 원격 클로닝 작업 후 수신자 MySQL 서버 인스턴스에서 누락된 테이블스페이스 오류가 보고되었습니다. 도너 인스턴스에서 innodb_validate_tablespace_paths 변수가 비활성화되어 관련 테이블스페이스 객체가 로드되지 않았기 때문에 테이블스페이스가 클론되지 않았습니다. 이제 클로닝 작업 전에 모든 테이블스페이스 객체가 로드되었는지 확인하는 검사가 수행됩니다. (Bug #32354908, Bug #102137)

  • 많은 수의 EXISTS 서브쿼리를 포함하는 일부 쿼리 블록이 항상 올바르게 처리되지는 않았습니다. (Bug #32343143)

  • SHOW CREATE TABLE 문이 실패하면 mysqlpump가 예기치 않게 종료될 수 있었습니다. (Bug #32340208)

  • 장시간 실행되는 원격 클로닝 작업이 donor MySQL Server 인스턴스의 낮은 wait_timeout 설정으로 인해 실패했습니다. donor 스레드는 Clone 프로토콜 명령을 수신 대기할 때 MySQL Server wait_timeout 설정을 사용합니다. 낮은 wait_timeout 설정이 있는 donor 인스턴스에서 타임아웃 실패를 방지하기 위해, Clone idle timeout은 이제 기본 wait_timeout 설정인 28800초(8시간)로 설정됩니다. Clone 네트워크 읽기 및 쓰기 타임아웃 값도 증가했습니다. (Bug #32340112, Bug #102097)

  • 서버에서 실행 중인 복제 스레드는 Performance Schema threads 테이블에는 표시되었지만, variables_by_thread 또는 status_by_thread 테이블에는 나타나지 않았습니다. 이제 세 테이블 모두에 표시됩니다. 기여해 주신 Facebook에 감사드립니다. (Bug #32335496, Bug #102115)

  • 쿼리 문자열이 다시 작성되기 전에 표시되었습니다. (Bug #32335263, Bug #32628376)

  • libedit 라이브러리를 사용하여 컴파일된 빌드에서, mysql 클라이언트를 --default-character-set=utf8 옵션과 함께 호출하면 libedit가 멀티바이트 문자 입력을 거부했습니다. (Bug #32329078, Bug #32583436, Bug #102806)

  • Windows에서 큰 결과 집합으로 인해 mysql 클라이언트가 예기치 않게 종료될 수 있었습니다. (Bug #32316323, Bug #102051)

  • 반복 실행을 위해 쿼리 표현식을 준비할 때 준비 중 오류가 발생하면 assertion이 발생할 수 있었습니다. (Bug #32291841)

  • 함수형 인덱스 생성에서 컬럼 이름을 대소문자를 구분하지 않는 것으로 처리하지 않았습니다. (Bug #32287186, Bug #101994)

  • 문 실행 중 트리거에 바인딩된 임시 테이블로 인해 예기치 않은 서버 종료가 발생할 수 있었습니다. (Bug #32267749, Bug #32288089, Bug #32299045)

  • 10진수 값이 포함된 계산에서 NULL 및 오류 처리가 개선되었습니다. (Bug #32258228, Bug #32497850)

  • 스키마가 읽기 전용으로 변경될 때 해당 스키마의 테이블에 대해 열린 핸들러가 있으면 어설션이 발생했습니다. (Bug #32248313)

  • 일부 경우 Performance Schema replication_group_members 테이블에서 선택하면 Error 1267 Illegal mix of collations...가 발생했습니다. 이는 컬럼 값과 시스템 변수 간 비교 처리에서 MySQL 8.0.22의 변경 때문이었습니다. (Bug #32244631)

    참조: 다음도 참조하십시오: Bug #32501472, Bug #32579184.

  • MySQL은 정수 값을 반환하는 여러 시간 함수에 대해 잘못된 메타데이터를 생성했습니다. 이러한 함수에는 TO_DAYS(), PERIOD_DIFF(), PERIOD_ADD(), TO_SECONDS(), DAYOFMONTH(), DAYOFYEAR(), HOUR(), MINUTE() 등이 포함되었습니다. (Bug #32239578)

  • 보이지 않는 컬럼만 검색하는 natural join의 테이블 서브쿼리가 올바르게 처리되지 않았습니다. (Bug #32235285)

  • 디버그 빌드의 경우 ALTER TABLE을 사용하여 컬럼이 TRUEDEFAULT 값을 갖도록 설정하면 assertion이 발생했습니다. (Bug #32235058)

  • 인덱스 조건 푸시다운을 사용하여 스토리지 엔진으로 푸시다운된 조건을 평가하는 동안 오류가 발생했을 때, 스토리지 엔진이 때때로 해당 오류를 무시하고 성공을 나타내는 오류 코드를 반환했으며, 이로 인해 나중에 어설션 실패가 발생할 수 있었습니다.

    이제 이러한 경우 실행기가 오류가 발생했음을 감지하도록 보장하고, 그 시점에서 실행을 중지합니다. (Bug #32234773)

  • 바이너리 로깅이 비활성화된 디버그 빌드에서, 유효하지 않은 DEFAULT 값을 사용하는 ALTER TABLE... MODIFY COLUMN이 어설션을 발생시켰습니다. (Bug #32234194)

  • 집계 함수 준비에서, 해당 함수가 상수 스칼라 서브쿼리를 인수로 받고 그 스칼라 서브쿼리가 오류를 발생시킨 경우 디버그 빌드에서 때때로 어설션에 도달했습니다. (Bug #32231698)

  • 디버그 빌드에서, 집계 컨텍스트에서 평가된 NULLIF()에 대한 부적절한 캐릭터셋 처리로 인해 어설션이 발생했습니다. (Bug #32231557)

  • 지원되지 않는 KEY_BLOCK_SIZE 값을 사용하는 CREATE TABLE 문이 어설션을 발생시켰습니다. (Bug #32227101)

  • 매우 많은 수의 테이블이 있는 MySQL 인스턴스를 업그레이드하면 과도한 양의 메모리가 소비되었습니다. 업그레이드 가능성을 위해 데이터 딕셔너리 엔터티를 분석하도록 할당된 메모리는 모든 엔터티가 처리될 때까지 해제되지 않았습니다. (Bug #32226180, Bug #101818)

  • 동일한 테이블에서 장시간 실행되는 쿼리와 동시에 테이블에서 실행된 ANALYZE TABLE로 인해 해당 테이블의 후속 쿼리가 장시간 실행되는 쿼리가 완료될 때까지 기다리게 되었습니다. 이제 ANALYZE TABLE에 의해 유발된 이 대기가 제거되어, 후속 쿼리가 대기 없이 실행될 수 있습니다. (Bug #32224917)

  • ESCAPE 절이 있는 LIKE 표현식을 사용하는 명령문이 항상 올바르게 처리되지는 않았습니다. (Bug #32213959)

  • ARM 플랫폼에서 빌드 프로세스 중 사용되는 유틸리티에서 어설션이 발생할 수 있었습니다. (Bug #32209415)

  • InnoDB는 테이블 파티션에 대한 일부 적법한 이름을 항상 올바르게 처리하지는 않았습니다. (Bug #32208630)

  • explicit_defaults_for_timestamp 변수가 비활성화된 상태에서 Clone 플러그인 설치가 PFS 테이블 생성 오류와 함께 실패했습니다. 이 변수 설정으로 인해 Clone Performance Schema 테이블의 TIMESTAMP 컬럼이 잘못되어 NOT NULL 컬럼으로 생성되었습니다. (Bug #32199611)

  • SHOW CREATE VIEWROLLUP 절을 사용하여 생성된 뷰에 대해 잘못된 문법을 생성했습니다. 이 문제는 SHOW CREATE VIEW를 사용하는 mysqldump에도 영향을 주었습니다. (Bug #32197353, Bug #101740)

  • SECONDARY_ENGINE_ATTRIBUTE를 사용하는 CREATE TABLE 또는 ALTER TABLE이 실패하면 메모리가 누수될 수 있었습니다. (Bug #32187507)

  • 연결 설정 실패로 인해 서버가 열린 연결 수를 잘못 계산할 수 있었습니다. (Bug #32156518)

  • MySQL 8.0.19에서 수행된 리팩터링 작업은 IFNULL()와 같은 함수를 사용하는 컬럼에 대해 left join을 올바르게 처리하지 못했습니다. (Bug #32141711)

    참조: 이 문제는 다음의 회귀입니다: Bug #30320525.

  • Optimizer가 적용할 수 없는 역방향 인덱스 스캔에도 Skip Scan을 사용하도록 선택할 수 있었으며, 이로 인해 예측할 수 없는 서버 동작이 발생했습니다. (Bug #32127290)

  • SHOW CREATE USER가 대기 중인 모든 트랜잭션을 커밋했습니다. (Bug #32123671)

  • 윈도우 함수를 포함하는 로드 가능 함수 인수는 윈도우 함수가 prepare 프로세스의 상당히 늦은 시점에 설정된다는 사실에도 불구하고 prepare 시점에 평가되었습니다. 이제 이러한 항목의 평가는 서브쿼리를 포함하는 로드 가능 함수 인수와 관련하여 수행되는 방식과 유사하게 실행 시점까지 지연됩니다. (Bug #32122078, Bug #32393265)

  • 비상수 기본 표현식이 있는 컬럼을 포함하는 테이블을 생성하면 이후의 ALTER TABLE 문이 실패했습니다. (Bug #32121425, Bug #101486)

  • 더 큰 BLOB 유사 컬럼의 값으로 BLOB 유사 컬럼을 업데이트하면 업데이트된 컬럼의 크기가 잘못되거나, 심지어 0이 될 수 있었습니다. (Bug #32112403)

  • 내부 큐에 대한 부적절한 잠금으로 인해 mysqlpump가 예기치 않게 종료될 수 있었습니다. (Bug #32067013)

  • MacOS에서 기본 설정 패널은 이제 초기화 중에 설정된 my.cnf 파일을 로드하는 옵션을 포함합니다. (Bug #32057159)

  • 서버가 ORDER BY 절이 있는 SELECT에서 GROUP_CONCAT()을 사용하는 문을 항상 올바르게 준비하지는 않았습니다. (Bug #32053547, Bug #31947466)

  • sys 스키마 create_synonym_db() 프로시저가 INFORMATION_SCHEMA 동의어를 생성하지 못했습니다. (Bug #32050275, Bug #101258)

  • 윈도우 함수에서 발생하는 오류가 항상 올바르게 전파되지는 않았으며, 이로 인해 디버그 빌드에서 어설션 실패가 발생할 수 있었습니다. (Bug #32028154)

  • 다른 스레드가 시작한 트랜잭션에서 XA COMMIT을 호출하면 Address Sanitizer 경고가 발생할 수 있었습니다. (Bug #32025408)

  • mysql 클라이언트를 배치 모드에서 사용할 때, USE 데이터베이스 이름이 따옴표로 처리된 경우 USE 뒤에 DROP DATABASE가 이어지면 해당 파서가 혼동될 수 있었습니다. (Bug #32015466, Bug #101124)

  • MySQL 8.0.17의 변경으로 인해 comp_err가 훨씬 느려졌습니다. 정상 성능이 복원되었습니다. (Bug #32014733)

    참조: 이 문제는 다음의 회귀입니다: Bug #29781631, Bug #95377.

  • INSERT 문에서 DATE 또는 DATETIME 값에 CAST()를 사용하면 "0000-00-00""2000-02-31"에 대해서는 경고가 발생했지만, "2000-01-00" 또는 "2000-00-01"에 대해서는 경고가 발생하지 않았습니다. 이제 이러한 각 경우에도 경고가 표시됩니다. (Bug #32013612)

  • CHANGE MASTER TO 문에 대한 MASTER_COMPRESSION_ALGORITHMS 값의 최대 길이가 잘못 검사되었습니다. (Bug #32008597)

  • (PREPAREs FROM "SELECTCAST(? AS YEAR)"에서와 같이) 동적 파라미터를 YEAR로 캐스팅할 때 타입 전파가 수행되지 않아, 해당 파라미터가 사용된 prepared statement 실행이 실패했습니다. (Bug #32002844)

  • MySQL 8.0으로 업그레이드된 MySQL 5.7 인스턴스의 일부 시스템 테이블 정의가 새 MySQL 8.0 설치의 시스템 테이블 정의와 달랐습니다. (Bug #31989290)

  • 서브쿼리를 사용하는 일부 SHOW 문에서 예기치 않은 서버 동작이 발생할 수 있었습니다. (Bug #31853180)

  • GROUP BY column HAVING column_expression IS [NOT] NULL을 사용하는 쿼리는 올바른 결과를 반환했지만, WITH ROLLUP이 추가되었을 때는 그렇지 않았습니다. (Bug #31848191)

  • SHOW ENGINE PERFORMANCE SCHEMA STATUS 문이 Performance Schema의 메모리 사용량을 잘못 보고했습니다. (Bug #31795132, Bug #100624)

  • Visual Studio 2019를 사용하여 엔터티 데이터 모델을 생성하려고 할 때, 일부 테이블을 entity framework wizard로 가져올 수 없었습니다. 이는 MySQL 8.0.21에서 직교 데이터 타입 집계에 적용된 변경 때문이었으며, 이 집계는 UNION의 컬럼과 CASEIF() 같은 함수 또는 연산자의 컬럼을 처리합니다. 이로 인해 이러한 경우 이전에는 처리할 필요가 없었던 ENUM 또는 SET 타입의 값을 반환할 수 있게 되었습니다. (Bug #31750645)

    참조: 다음도 참조하십시오: Bug #29698617.

  • 서브쿼리의 ORDER BY 절을 최적화하는 동안 외부 SELECT에서 참조되는 서브쿼리 트리를 정리할 가능성이 있었으며, 이로 인해 조기 종료가 발생할 수 있었습니다. (Bug #31721430)

  • mysql.func 시스템 테이블의 잘못된 형식의 이름으로 인해 예기치 않은 서버 동작이 발생할 수 있었습니다. (Bug #31674599)

  • 긴 로우가 많이 로드되는 경우 LOAD DATA 성능이 저하되었습니다. (Bug #31637142)

  • 세션이 자체 감사를 비활성화할 수 있었습니다. (Bug #31630954)

  • GCC와 함께 profile guided optimization을 사용하기 위한 컴파일러 옵션이 적절한 경우 -fprofile-partial-training-fprofile-update=prefer-atomic을 포함하도록 개선되었습니다. 제안해 주신 Dmitriy Philimonov에게 감사드립니다. (Bug #31450064, Bug #99781)

  • performance_schema_max_thread_classesperformance_schema_max_thread_instances 시스템 변수를 0으로 설정한 상태로 서버를 시작하면 MySQL Enterprise Firewall이 새 규칙을 생성할 수 없었습니다. (Bug #31335080, Bug #24947654, Bug #83519)

  • redo log에서 복구하는 동안 null 포인터가 증가되어, Undefined Behavior Sanitizer (UBSAN) 빌드에서 런타임 오류가 발생했습니다. (Bug #31173032, Bug #32428131, Bug #32483976)

  • log_slow_extra 시스템 변수를 활성화하여 slow query log 출력에 Errno 필드를 추가한 경우, 실패한 문에서도 오류 번호가 0이었습니다. (Bug #30769965, Bug #98220)

  • 디버그 빌드에서 utf32 캐릭터셋을 사용하는 특정 변환 작업이 예기치 않은 서버 동작을 유발할 수 있었습니다. (Bug #30746908)

  • 존재하지 않는 Performance Schema 테이블에서 SELECT... FOR UPDATE를 수행하면 ER_NO_SUCH_TABLE이 아니라 ER_TABLEACCESS_DENIED_ERROR가 생성되었습니다. (Bug #30701047, Bug #98068)

  • 저장 프로그램 로컬 변수의 잘못된 처리로 인해 예기치 않은 서버 동작이 발생할 수 있었습니다. (Bug #30366310)

  • Performance Schema metadata_locks 테이블은 메타데이터 잠금이 TRANSACTION 기간 동안 획득된 후 나중에 RENAME TABLE 작업에 의해 EXPLICIT 기간으로 수정되는 경우와 같이, 잘못된 DURATION 값을 표시할 수 있었습니다. (Bug #30065213, Bug #96237)

  • audit_log 플러그인은 시작 시 암호화 비밀번호를 생성한 경우 해당 비밀번호를 저장하지 못할 수 있었습니다. (Bug #29559793)

  • 플러그인을 제거하면 준비된 문의 후속 실행에 영향을 줄 수 있었습니다. (Bug #29363867)

  • 문자열 값을 가지는 사용자 정의 변수 또는 함수 결과를 double로 변환할 때(예: CAST() 사용) 잘림이 발생해도 경고가 발생하지 않았습니다. (Bug #27969934, Bug #21943299)

  • 뷰 정의에서 ESCAPE 절과 함께 LIKE를 사용한 경우, ESCAPE 절의 내용이 무시되어 잘못된 결과가 발생했습니다. (Bug #26086751)

  • ascii 캐릭터셋을 사용하는 문자 컬럼에 잘못된 ASCII 값(7비트 범위 밖)을 삽입할 수 있었습니다. 이제 이는 금지됩니다. (Bug #24847620)

  • 구성 값 내에서 공백 및 기타 특수 문자를 사용할 수 있도록, 이제 mysql_config_editor는 구성 파일에 쓰는 값을 큰따옴표 문자로 둘러싸며, 값 내에서 사용되는 큰따옴표 문자도 이스케이프합니다. (Bug #19953349, Bug #74691)

  • 집계 반복자가 로우를 찾지 못하면, 해당 SELECT 목록의 각 항목을 호출하여 이 사실을 알립니다(예를 들어, COUNT(*)가 자신을 0으로 설정하거나, SUM(foo)가 자신을 NULL로 설정할 수 있도록 하기 위한 것입니다). MySQL 8.0.22에서 수행된 내부 작업 이후, 숨겨진 항목도 의도치 않게 호출할 수 있었습니다. 이중으로 중첩된 서브쿼리를 사용하는 일부 쿼리에서는, 이러한 숨겨진 항목 중 하나가 자기 자신의 부모 서브쿼리가 될 수 있었으며(MySQL의 스칼라 서브쿼리는 ONLY_FULL_GROUP_BY가 아닌 쿼리에 대해 이 호출을 특별한 레거시 방식으로 처리합니다), 이로 인해 전체 서브쿼리가 그렇게 되어서는 안 되는 경우에도 NULL을 반환했습니다.

    이는 MySQL 8.0.21 및 이전 버전에서와 같이 보이는 항목에 대해서만 호출을 수행하도록 하여 수정되었습니다. (Bug #102101, Bug #32335256)

  • 액세스 경로에 대한 이전 스타일의 실행 계획을 해석할 때, LATERAL에 대한 캐시 무효화자는 모든 외부 조인이 완료될 때까지 지연되었습니다. 외부 조인은 캐시도 무효화해야 하는 null-complemented 로우를 생성할 수 있기 때문입니다. 외부 조인이 LATERAL을 포함하고, 해당 LATERAL이 같은 외부 조인 내부의 테이블만 참조하는 경우 문제가 발생했습니다. 이러한 경우에는 방출된 로우를 놓치고 캐시가 잘못 유지되는 일이 없도록 무효화자를 지연하지 않고 즉시 적용해야 합니다. 특히 특정 Information Schema 테이블이 외부 조인의 오른쪽에 있는 경우 이러한 일이 발생할 수 있었으며, 이는 이제 이 테이블들이 LATERAL을 사용하여 정의된 뷰이기 때문입니다.

    이를 수정하기 위해, 무효화할 구체화와 같은 (외부) 조인 중첩 내부에 들어갈 때까지만 무효화자의 방출을 지연하고, 그 이상은 지연하지 않도록 했습니다. 이는 또한 테이블의 로우가 둘 이상의 별도 구체화를 무효화해야 하고, 그중 일부는 조인 내부에 있으며 일부는 더 상위에 있는 경우도 올바르게 처리합니다. (Bug #101460, Bug #32113029, Bug #32311147)

    참조: 이 문제는 다음의 회귀입니다: Bug #98238, Bug #30766181.

  • Optimizer trace가 부동 소수점 숫자를 최대 6자로 출력했으며, 이는 부호, 소수점 및 지수가 이러한 문자 중 많은 부분을 사용할 수 있다는 점을 고려할 때 많은 값의 정밀도가 매우 낮을 수 있음을 의미했습니다. 이는 큰 숫자에서 특히 문제가 되었는데, 그러한 숫자의 정밀도는 따라서 1만큼 작아질 수 있었고, 절댓값이 DBL_MAX를 초과하는 값으로 반올림될 수 있어 JSON 파서에서 거부될 수 있었습니다.

    이제 이러한 숫자는 optimizer trace에서 항상 정밀도 6으로 출력됩니다. (Bug #101457, Bug #32113020)

    참조: 다음도 참조하십시오: Bug #94672, Bug #29493604.

  • Filesort는 내림차순 컬럼의 인덱스를 사용할 수 있고 사용된 경우에도 ORDER BY... DESC 절이 있는 쿼리에 사용되었습니다. 이는 동등 조건자의 필드와 일치하여 제거되어야 했음에도 ORDER BY 하위 절이 제거되지 않았기 때문에 발생했으며, 그 결과 optimizer가 쿼리를 내림차순 인덱스와 일치시키지 못해 최적이 아닌 성능으로 이어졌습니다. (Bug #101220, Bug #32038406)

  • debug 서버는 optimizer_search_depth가 조인에 사용된 JOIN_TAB 구조체 수보다 작을 때 assert에 도달했습니다. (Bug #100288, Bug #31655483)

  • ALTER TABLE 작업 EXCHANGE PARTITION, IMPORT TABLESPACE, IMPORT PARTITION TABLESPACE 이후에, 테이블스페이스의 이전 역할을 반영하는 직렬화된 디지털 정보가 남아 있었습니다. 이제 이러한 경우 테이블스페이스의 교환 또는 가져오기에 관여하는 두 테이블스페이스 모두에서 이전 SDI가 명시적으로 제거됩니다. (Bug #98501, Bug #30878065)

  • 정수 나눗셈 연산자(DIV)가 수행하는 타입 결정에서 결과의 정밀도가 예상보다 하나 작게 산출되었습니다.

    기여해 주신 Kaiwang Chen에게 감사드립니다. (Bug #96459, Bug #30156563)