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

MySQL 8.0.26 릴리스 노트

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

저자: Oracle 작성: 2021.07.20 약 62분 37,013자

DBA를 위한 핵심 내용

MySQL 8.0.26은 운영 관점에서 업그레이드 후 관측/자동화 호환성과 복제·InnoDB 복구 안정성을 가장 먼저 점검해야 하는 릴리스입니다. 특히 master/slave 용어가 source/replica로 대거 전환되면서 Performance Schema, 프로세스 목록, 반동기 복제 플러그인·변수명, 백업/모니터링 스크립트가 영향을 받을 수 있습니다. 외부 자료 기준으로 이 버전 자체에 대한 광범위한 공개 회귀 이슈는 확인되지 않았지만, 변경 범위가 커서 사전 검증이 필요합니다.

  1. Performance Schema 계측명, SHOW PROCESSLIST, SHOW REPLICA STATUS, 느린 쿼리 로그 등에 표시되는 용어가 바뀔 수 있으므로, 기존 master/slave 문자열을 파싱하는 모니터링·알람·리포트·백업 자동화는 업그레이드 전 테스트해야 합니다. 임시 완화책으로 terminology_use_previous=BEFORE_8_0_26 사용을 검토할 수 있습니다.
  2. CHANGE MASTER TO 계열은 새 CHANGE REPLICATION SOURCE TO 명명으로 이동하고, 반동기 복제도 rpl_semi_sync_source/rpl_semi_sync_replica 플러그인을 제공합니다. 단, 구·신 플러그인을 한 인스턴스에 동시에 설치할 수 없으므로 롤백 절차와 상태 변수 수집 로직을 함께 점검해야 합니다.
  3. 디스크 부족 중 tablespace 확장/복구 실패, 복구 중 체크포인트로 인한 커밋 손실 가능성, undo truncation·대형 버퍼풀·open files 관련 문제가 다수 수정되었습니다. 장애 복구 리허설에서는 redo 여유 공간, innodb_force_recovery 단계, 백업 복구 가능성을 함께 검증하는 것이 좋습니다.
  4. Group Replication은 보조 DR 그룹을 super_read_only로 유지하는 멤버 액션, view change UUID 분리, STOP/START 및 view change 경합 데드락 수정이 포함됩니다. 다만 group_replication_view_change_uuid를 쓰는 그룹은 모든 멤버가 8.0.26 이상이어야 하므로 혼합 버전 운영에 주의해야 합니다.
  5. TLSv1/TLSv1.1, --ssl, have_ssl, transaction_write_set_extraction, temptable_use_mmap 등이 사용 중단 경고 대상입니다. 감사 로그는 SQL 리터럴 대신 digest 기록과 크기 기반 정리를 지원하므로, 민감정보 노출과 로그 디스크 사용량을 동시에 줄일 수 있습니다.
  6. TempTable 사용 쿼리 성능 개선, prepared statement/ROLLUP/MIN/MAX/NOT IN/Fulltext 관련 잘못된 결과 수정, MTS 복제 writeset·GTID auto-position 문제 수정이 포함됩니다. SQL 결과 정확성 버그가 포함된 만큼, 단순 기능 릴리스가 아니라 안정성 패치로 보는 것이 적절합니다.

Audit Log 관련 사항

  • 이전에는 MySQL Enterprise Audit가 로깅한 각 이벤트에 SQL 문 리터럴 텍스트가 포함되었습니다. 대안을 제공하기 위해(문에 민감한 정보가 포함될 수 있기 때문에), 이제 audit log 필터링 언어는 문의 리터럴 텍스트가 아니라 문의 다이제스트를 로깅하는 기능을 지원합니다. 예를 들어, 다음 문을 로깅하는 대신:

    SELECT * FROM orders WHERE some_sensitive_column=1234567
    

    audit log 플러그인은 다음 다이제스트를 로깅할 수 있습니다:

    SELECT * FROM `orders` WHERE `some_sensitive_column` = ?
    

    이는 실제 데이터 값이 아니라 파라미터 마커가 나타나는 prepared statement에 대해 이미 로깅되는 내용과 유사합니다.

    다이제스트 로깅을 수행하려면, Replacement of Event Field Values에서 설명한 것처럼 문 리터럴 텍스트를 해당 다이제스트로 대체하는 audit filter 정의를 사용하십시오.

    텍스트 대체는 감사의 초기 단계(필터링 중)에 발생하므로, 문 리터럴 텍스트 또는 다이제스트 값을 로깅할지 여부의 선택은 나중에 기록되는 로그 형식과 관계없이 적용됩니다(즉, audit log 플러그인이 XML 또는 JSON 출력을 생성하는지 여부와 관계없습니다). (Bug #31482609, WL #14267, WL #14724)

  • MySQL Enterprise Audit의 경우, 새로운 audit_log_format_unix_timestamp 시스템 변수는 각 감사 레코드에 time 필드를 포함할 수 있게 합니다. 필드 값은 감사 이벤트가 생성된 날짜와 시간을 나타내는 UNIX 타임스탬프 값을 표현하는 정수입니다. time 필드는 JSON 형식 로그 파일에 대해서만 지원됩니다. (WL #14600)

  • MySQL Enterprise Audit의 경우, 새로운 audit_log_max_size 시스템 변수는 결합된 로그 파일 크기를 기준으로 audit log 파일 정리를 가능하게 합니다. 효과를 가지려면 audit_log_max_sizeaudit_log_rotate_on_size가 0보다 커야 합니다. 이것이 참이면, 정리 알고리즘은 audit_log_max_sizeaudit_log_prune_seconds와 함께 사용하며, audit_log_max_size의 0이 아닌 값이 audit_log_prune_seconds의 0이 아닌 값보다 우선합니다. 자세한 내용은 Audit Log Files의 공간 관리를 참조하십시오. (WL #14525)

Authentication 관련 사항

  • 이전에는 서버가 클라이언트로 보내는 “hello” 패킷의 일부로, 서버가 클라이언트 측 플러그인이 아니라 서버 측 Authentication 플러그인의 이름을 보냈습니다. 이제 서버는 클라이언트 측 이름을 보내며, 이는 클라이언트의 요구에 더 적합하고 추가 프로토콜 왕복을 피하는 데 도움이 될 수 있습니다. (WL #14308)

컴파일 관련 사항

  • macOS: 이제 ARM에서 macOS 11용 MySQL을 빌드할 수 있습니다(즉, Apple M1 시스템용입니다). (Bug #32386050, Bug #102259)

  • 이제 openSUSE 15 및 SLES 15에서 빌드하려면 패키지 gcc-9gcc9-c++에서 제공되는 GCC 9가 필요합니다.

    이제 SLES 12에서 빌드하려면 패키지 gcc-10gcc10-c++에서 제공되는 GCC 10이 필요합니다.

    또한 libmysqlclient C API 라이브러리를 기반으로 하는 서드파티 애플리케이션을 빌드할 때도 명시된 GCC 버전을 사용하는 것이 권장됩니다. (Bug #32886268, Bug #32886439)

  • 이제 Ubuntu 18.04(bionic)에서 빌드하려면 패키지 gcc-8g++-8에서 제공되는 GCC 8이 필요합니다. 또한 libmysqlclient C API 라이브러리를 기반으로 하는 서드파티 애플리케이션을 빌드할 때도 GCC 8을 사용하는 것이 권장됩니다. (Bug #32877062)

  • 이제 Solaris에서 GCC 10을 사용하여 MySQL을 빌드할 수 있으며, GCC 10이 기본이자 권장 컴파일러가 됩니다. 또한 libmysqlclient C API 라이브러리를 기반으로 하는 서드파티 애플리케이션을 빌드할 때도 GCC 10을 사용하는 것이 권장됩니다. (Bug #32552988)

컴포넌트 관련 사항

  • 새로운 컴포넌트 서비스는 서버 컴포넌트가 시스템 변수 값을 설정할 수 있게 합니다. 이 서비스에 대한 정보는 https://dev.mysql.com/doc/index-other.html 에서 제공되는 MySQL Server Doxygen 문서를 참조하십시오(s_mysql_mysql_system_variable_update_stringmysql_system_variable_update_string_imp 검색). (WL #12002)

사용 중단 및 제거 관련 사항

  • TLSv1 및 TLSv1.1 연결 프로토콜은 이제 사용 중단되었으며, 이에 대한 지원은 향후 MySQL 버전에서 제거될 수 있습니다. (배경 정보는 IETF 메모 Deprecating TLSv1.0 and TLSv1.1을 참조하십시오.) 더 안전한 TLSv1.2 및 TLSv1.3 프로토콜을 사용하여 연결하는 것이 권장됩니다. TLSv1.3은 MySQL 서버와 클라이언트 애플리케이션이 모두 OpenSSL 1.1.1 이상으로 컴파일되어 있어야 합니다.

    서버 측에서 이 사용 중단은 다음과 같은 영향을 줍니다:

    • tls_version 또는 admin_tls_version 시스템 변수에 사용 중단된 TLS 프로토콜을 포함하는 값이 할당되면, 서버는 사용 중단된 각 프로토콜에 대해 경고를 생성합니다:

      • 할당이 서버 시작 중 발생하면, 경고가 오류 로그에 나타납니다.
      • 할당이 런타임에 발생하면, 경고가 ALTER INSTANCE RELOAD TLS 문 실행 결과에 추가됩니다.
    • 클라이언트가 사용 중단된 TLS 프로토콜을 사용하여 성공적으로 연결하면, 서버는 오류 로그에 경고를 기록합니다.

    클라이언트 측에서 이 사용 중단은 가시적인 영향을 주지 않습니다. 클라이언트는 사용 중단된 TLS 프로토콜을 허용하도록 설정되어 있어도 경고를 발생시키지 않습니다. 여기에는 다음이 포함됩니다:

    • MySQL 서버에 대한 연결에 사용할 TLS 프로토콜을 지정하기 위한 --tls-version 옵션을 지원하는 클라이언트 프로그램.
    • 레플리카가 소스 서버에 대한 연결에 사용할 TLS 프로토콜을 지정할 수 있도록 하는 문. (CHANGE REPLICATION SOURCE TO에는 SOURCE_TLS_VERSION 옵션이 있으며, CHANGE MASTER TO에는 MASTER_TLS_VERSION 옵션이 있습니다.)
    • 조인하는 멤버가 분산 복구 연결에 사용할 TLS 프로토콜을 지정할 수 있도록 하는 group_replication_recovery_tls_version 시스템 변수.

    (Bug #32565996, WL #14519)

  • 시스템 변수 transaction_write_set_extraction은 이제 사용 중단되며, 이를 설정하거나 해당 값을 읽으려고 시도하면 경고 메시지가 발생합니다. 향후 MySQL 릴리스에서 제거될 것으로 예상하십시오. 이 시스템 변수는 다중 스레드 복제본을 가진 복제 소스 서버에서, 트랜잭션의 쓰기 세트에 대해 추출된 쓰기를 해시하는 데 사용되는 알고리즘을 지정하는 데 사용되었습니다. MySQL 8.0의 기본값이며 Group Replication에 필요한 XXHASH64 알고리즘은 이 시스템 변수가 사용되지 않을 때 선택됩니다. (WL #13950)

  • temptable_use_mmap 변수는 이제 사용 중단되며 향후 MySQL 버전에서 제거될 수 있습니다. (WL #14124)

  • MySQL의 TLS 지원은 서로 다른 보안 가능 포트 또는 프로토콜에 적용되는 명명된 TLS 매개변수 집합을 사용하는 채널 모델로 이동해 왔습니다. 예를 들어, 특정 TLS 채널의 상태를 쿼리하려면 Performance Schema tls_channel_status 테이블을 사용하십시오:

    mysql> SELECT VALUE FROM performance_schema.tls_channel_status
           WHERE CHANNEL = 'mysql_main' AND PROPERTY = 'Enabled';
    +-------+
    | VALUE |
    +-------+
    | Yes   |
    +-------+
    

    이로 인해 TLS 지원 전체에 적용되는 모놀리식 매개변수의 적용 가능성이 줄어들므로, 다음 옵션과 시스템 변수는 이제 사용 중단되며 향후 MySQL 버전에서 제거될 수 있습니다:

    --ssl--admin-ssl 옵션은 기본적으로 활성화되어 있으므로 일반적으로 이를 지정할 필요가 없습니다. 이러한 옵션을 부정 형식으로 지정하는 대신, 기본 또는 관리 인터페이스에 대해 암호화된 연결을 비활성화하려는 경우 해당 TLS 버전 시스템 변수를 빈 값으로 설정하여 지원되는 TLS 버전이 없음을 나타내십시오. 예를 들어 서버 my.cnf 파일의 다음 줄은 두 인터페이스 모두에 대해 암호화된 연결을 비활성화합니다:

      [mysqld]
      tls_version=''
      admin_tls_version=''
      ```
    
      (WL #14481)
    
    

오류 처리

  • 클라이언트 타임아웃에 대해 서버 오류 로그에 기록되는 정보에 이제 사용 가능한 경우 타임아웃 값과 클라이언트 사용자 및 호스트가 포함됩니다. (Bug #31581289, Bug #100112)

Event Scheduler 관련 사항

  • Event Scheduler가 활성화된 경우 super_read_only 시스템 변수를 활성화하면 events 데이터 딕셔너리 테이블의 event “last executed” 타임스탬프를 업데이트하지 못하게 됩니다. 이로 인해 Event Scheduler는 서버 오류 로그에 메시지를 기록한 후, 다음에 예약된 event를 실행하려고 할 때 중지됩니다.

    이전에는 super_read_only를 활성화하여 Event Scheduler가 중지된 경우, 이후 super_read_only를 비활성화한 뒤 Event Scheduler를 다시 활성화하여 수동으로 재시작해야 했습니다. 편의를 위해 이제 서버는 read_only 또는 super_read_only가 비활성화될 때 필요에 따라 Event Scheduler를 자동으로 재시작합니다. (Bug #31633859)

Firewall 관련 사항

  • MySQL 8.0.23에서 MySQL Enterprise Firewall은 이전에 구현된, 각각 단일 계정에 적용되는 계정 프로필에 더해, 각각 여러 계정에 적용될 수 있는 그룹 프로필을 구현했습니다. Using MySQL Enterprise Firewall을 참조하십시오.

    단일 멤버 계정을 가진 그룹 프로필은 논리적으로 해당 계정의 계정 프로필과 동일하므로, 계정 프로필과 그룹 프로필을 혼합하는 대신 그룹 프로필만 사용하여 Firewall을 관리할 수 있습니다. 새 Firewall 설치의 경우, 새 프로필을 일관되게 그룹 프로필로 생성하고 계정 프로필을 피함으로써 이를 수행합니다. 이미 계정 프로필을 포함하는 Firewall 설치에서 업그레이드하는 경우, MySQL Enterprise Firewall은 이제 계정 프로필을 그룹 프로필로 변환하기 위한 sp_migrate_firewall_user_to_group()이라는 저장 프로시저를 포함합니다.

    그룹 프로필이 제공하는 더 큰 유연성으로 인해, 계정 프로필과 관련된 Firewall의 모든 측면은 이제 사용 중단되었으며 향후 MySQL 버전에서 제거될 수 있습니다:

    • INFORMATION_SCHEMA 테이블: MYSQL_FIREWALL_USERS, MYSQL_FIREWALL_WHITELIST
    • mysql 시스템 스키마 테이블: firewall_users, firewall_whitelist
    • mysql 시스템 스키마 저장 프로시저: sp_reload_firewall_rules(), sp_set_firewall_mode()
    • 로드 가능한 함수: read_firewall_users(), read_firewall_whitelist(), set_firewall_mode()

    또한 서버가 시작 시 계정 프로필을 감지하면, 성공적으로 로드된 각 계정 프로필에 대해 경고를 기록합니다.

    계정 프로필을 그룹 프로필로 변환하는 방법에 대한 정보는(가능한 한 빨리 수행해야 합니다) Migrating Account Profiles to Group Profiles을 참조하십시오. (WL #14174)

패키징 관련 사항

  • 시스템 curl 라이브러리에 링크하는 대신 curl을 포함하는 바이너리 패키지는 curl 7.77.0을 사용하도록 업그레이드되었습니다. (Bug #33077562)
  • Ubuntu 패키지의 경우, mysqld용 AppArmor 프로파일이 PID 및 소켓 파일 이름과 관련하여 지나치게 제한적이었으며 프로파일의 정확한 이름을 사용하지 않는 서버에서 실패했습니다. 이제 프로파일은 파일이 위치한 디렉터리에 적용되어, 다른 파일 이름과 여러 서버에 적용될 수 있습니다. (Bug #32857611)
  • Ubuntu 21.04에서 dh-systemd 패키지가 제거되었으므로, 해당 배포판용으로 빌드된 MySQL 패키지에서 이에 대한 의존성이 제거되었습니다. (Bug #32688072)
  • Debian 패키지의 경우, systemd 서비스가 /etc/default/mysql 파일이 있는 경우 해당 파일에서 환경 변수를 읽을 수 있도록 EnvironmentFile 지시문이 추가되었습니다. (Bug #32082863, Bug #101363)
  • Debian 패키지는 이제 경로 이름에 /var/run 대신 /run을 사용합니다. (Bug #31955638)
  • 번들로 제공되는 lz4 라이브러리가 버전 1.9.3으로 업그레이드되었습니다. (Bug #29747853)
  • Debian 패키지의 경우, 이전에 설치된 배포판의 기존 파일을 대체하도록 보장하기 위해 MySQL 설정 파일의 update-alternatives 우선순위가 증가되었습니다. (Bug #29606955)

Pluggable Authentication 관련 사항

  • Linux: 이제 MySQL Enterprise Edition은 적절한 Kerberos 티켓을 사용할 수 있거나 얻을 수 있는 경우, 사용자가 Kerberos를 사용하여 MySQL Server에 인증할 수 있도록 하는 인증 방법을 지원합니다. 이는 Linux를 실행하는 MySQL 서버 및 클라이언트 호스트에서만 사용할 수 있지만, Linux가 아닌 호스트에서 실행되는 Kerberos 서비스에 접근할 수 있습니다. 자세한 내용은 Kerberos Pluggable Authentication을 참조하십시오.

    이 인증 방법은 서버 측의 authentication_kerberos와 클라이언트 측의 authentication_kerberos_client라는 한 쌍의 플러그인을 사용합니다. 서버 측 Kerberos 인증 플러그인은 MySQL Enterprise Edition에만 포함됩니다. 이는 MySQL 커뮤니티 배포판에는 포함되지 않습니다. 클라이언트 측 플러그인은 커뮤니티 배포판을 포함한 모든 배포판에 포함됩니다. 이를 통해 모든 배포판의 클라이언트가 서버 측 플러그인이 로드된 서버에 연결할 수 있습니다. (WL #14336)

서버 관리

  • innodb_strict_mode 시스템 변수의 세션 값을 설정하는 작업은 이제 제한된 작업이며, 세션 사용자는 제한된 세션 변수를 설정하기에 충분한 권한을 가지고 있어야 합니다.

    제한된 세션 변수를 설정하는 데 필요한 권한에 대한 정보는 System Variable Privileges를 참조하십시오. (Bug #32944980, WL #14610)

공간 데이터 지원

  • 이제 ST_Buffer() 함수는 지오메트리가 포인트 값인 경우 지오메트리 인수가 geographic spatial reference system (SRS)을 가지도록 허용합니다. 이전에는 ST_Buffer()가 Cartesian SRS의 지오메트리 인수만 지원했습니다. 이제 ST_Difference()ST_Union() 함수는 지오메트리 인수가 geographic SRS를 가지도록 허용합니다. 이전에는 ST_Difference()ST_Union()이 Cartesian SRS의 지오메트리 인수만 지원했습니다. Spatial Operator Functions을 참조하십시오. (WL #14126, WL #14188, WL #14266)

X 플러그인 관련 사항

  • X DevAPI Session.run_sql() 메서드를 사용하여 여러 결과를 반환하는 쿼리를 실행한 경우, 캐시 문제로 인해 result.column_names 속성은 활성 결과에 있는 컬럼을 반영하도록 업데이트되었지만, result.columns 속성은 업데이트되지 않았습니다. (Bug #32887586)
  • 업그레이드 프로세스 중에 X Plugin은 TCP 포트와 UNIX 소켓이 할당되면 연결을 받을 준비가 되었다는 메시지를 기록했습니다. 그러나 실제로는 업그레이드 프로세스가 완료된 후에야 연결을 수락할 수 있었습니다. 이제 이 메시지는 업그레이드가 완료된 후에만 발행됩니다. (Bug #32814997)

추가되거나 변경된 기능

  • 호환되지 않는 변경: MySQL 8.0.26부터, “source”로 변경되는 “master”, “replica”로 변경되는 “slave”, 그리고 “mta”(“multithreaded applier”)로 변경되는 “mts”(“multithreaded slave”)라는 용어가 포함된 대부분의 남아 있는 식별자에 대해 새 별칭 또는 대체 이름이 제공됩니다. 적용 가능한 경우 도움말 텍스트도 새 이름을 사용하도록 변경됩니다.

    다음 이름 대체는 Performance Schema 테이블, 프로세스 목록, 레플리카 상태 정보에서 표시됩니다. 이러한 변경은 이전 릴리스와 호환되지 않습니다. 이러한 계측 이름을 사용하는 모니터링 도구가 영향을 받을 수 있습니다:

    • mutex_instancesevents_waits_* Performance Schema 테이블에서 wait/synch/mutex/ 접두사와 함께 표시되는 계측된 잠금(mutex)
    • rwlock_instancesevents_waits_* Performance Schema 테이블에서 wait/synch/rwlock/ 접두사와 함께 표시되는 읽기/쓰기 잠금
    • cond_instancesevents_waits_* Performance Schema 테이블에서 wait/synch/cond/ 접두사와 함께 표시되는 계측된 조건 변수
    • memory_summary_* Performance Schema 테이블에서 memory/sql/ 접두사와 함께 표시되는 계측된 메모리 할당
    • threads Performance Schema 테이블에서 thread/sql/ 접두사와 함께 표시되는 스레드 이름
    • events_stages_* Performance Schema 테이블에서 stage/sql/ 접두사와 함께 표시되고, threadsprocesslist Performance Schema 테이블, SHOW PROCESSLIST 구문의 출력, Information Schema processlist 테이블, 그리고 느린 쿼리 로그에서는 접두사 없이 표시되는 스레드 단계
    • events_statements_history*events_statements_summary_*_by_event_name Performance Schema 테이블에서 statement/com/ 접두사와 함께 표시되고, threadsprocesslist Performance Schema 테이블, SHOW PROCESSLIST 구문의 출력, Information Schema processlist 테이블, 그리고 SHOW REPLICA STATUS 구문의 출력에서는 접두사 없이 표시되는 스레드 명령

    호환되지 않는 변경이 실제로 영향을 미치는 경우, 새 시스템 변수 terminology_use_previousBEFORE_8_0_26으로 설정하여 MySQL Server가 이전 목록에 지정된 객체의 이름에 대해 이전 버전을 사용하도록 할 수 있습니다. 이를 통해 이전 이름에 의존하는 모니터링 도구는 새 이름을 사용하도록 업데이트될 때까지 계속 작동할 수 있습니다. 이 시스템 변수는 개별 함수를 지원하기 위해 세션 범위로 설정할 수도 있고, 모든 새 세션의 기본값이 되도록 전역 범위로 설정할 수도 있습니다. 전역 범위를 사용하는 경우 느린 쿼리 로그에는 이름의 이전 버전이 포함됩니다.

semisynchronous 복제의 경우 시스템 변수와 상태 변수의 새 버전 또는 이전 버전 중 어느 것을 사용할지 선택할 수 있습니다. semisynchronous 복제를 구현하는 플러그인의 새 버전이 제공되며, 하나는 소스 서버용이고 하나는 복제본용입니다. 이 버전은 master 및 slave라는 용어를 source 및 replica로 대체하며, 이전 버전 대신 이 버전을 설치할 수 있습니다:

  • 소스용 rpl_semi_sync_master 플러그인(semisync_master.so 라이브러리)에는 새 버전 rpl_semi_sync_source(semisync_source.so 라이브러리)가 있습니다
  • 복제본용 rpl_semi_sync_slave 플러그인(semisync_slave.so 라이브러리)에는 새 버전 rpl_semi_sync_replica(semisync_replica.so 라이브러리)가 있습니다

한 인스턴스에 관련 플러그인의 새 버전과 이전 버전을 모두 설치할 수 없습니다. 플러그인의 새 버전을 사용하는 경우 새 시스템 변수와 상태 변수를 사용할 수 있지만 이전 변수는 사용할 수 없습니다. 플러그인의 이전 버전을 사용하는 경우 이전 시스템 변수와 상태 변수를 사용할 수 있지만 새 변수는 사용할 수 없습니다.

다음 내부 사용 항목은 새 용어를 사용하도록 변환되지만 사용자 또는 모니터링 도구에 외부로 노출되지 않으며, MySQL Server는 필요한 해결을 내부적으로 처리합니다:

  • 소스 코드의 C++ 파일명
  • C++ 파일의 헤더 가드
  • 디버그 심볼
  • 복제본이 복제 소스 서버에 연결할 때 복제 프로토콜 핸드셰이크에서 복제본이 전달하는 사용자 변수(복제본은 이전 이름과 새 이름을 모두 설정합니다)

다음 범주의 식별자에는 새 별칭이 있으며, 이전 이름을 사용하면 사용 중단 경고가 발생하지만 이전 이름은 계속 작동합니다. 두 이름 모두 Performance Schema 테이블과 상태 표시에 제공되며, 이를 읽을 때는 사용 중단 경고가 발생하지 않습니다. 새 별칭은 새 시스템 변수 terminology_use_previous의 영향을 받지 않으며, 이 변수가 설정되어 있어도 계속 사용할 수 있습니다:

  • “master”, “slave” 또는 “mts”라는 용어를 포함하는 시스템 변수입니다. 단, 이미 사용 중단되었거나 사용 중단이 예정된 일부 변수와 NDB에서 정의한 변수는 예외입니다. 이러한 시스템 변수가 SET PERSIST 문을 사용하여 지속되는 경우, 문에서 어느 이름을 지정했는지와 관계없이 이전 이름과 새 이름이 모두 지속됩니다. RESET PERSIST 문을 사용하면 둘 다 재설정됩니다.
  • “master”, “slave” 또는 “mts”라는 용어를 포함하는 상태 변수입니다. 단, NDB에서 정의한 변수는 예외입니다.
  • “master”, “slave” 또는 “mts”라는 용어를 포함하는 mysqld의 명령줄 옵션입니다. 단, 이미 사용 중단되었거나 사용 중단이 예정된 일부 옵션과 NDB에서 정의한 옵션은 예외입니다.
  • “master”, “slave” 또는 “mts”라는 용어를 포함하는 mysqladmin의 명령줄 옵션입니다.
  • “master”, “slave” 또는 “mts”라는 용어를 포함하는 mysqlbinlog의 명령줄 옵션입니다.
  • “master”, “slave” 또는 “mts”라는 용어를 포함하는 mysqldump의 명령줄 옵션입니다.
  • “master”라는 용어를 포함하는 SQL 함수입니다.

새 alias(또는 반동기 복제의 경우 대체 항목)를 가진 식별자의 전체 목록은 다음과 같습니다:

  • 시스템 변수:

    • master_verify_checksum에는 이제 alias source_verify_checksum가 있습니다
    • sync_master_info에는 이제 alias sync_source_info가 있습니다
    • init_slave에는 이제 alias init_replica가 있습니다
    • rpl_stop_slave_timeout에는 이제 alias rpl_stop_replica_timeout가 있습니다
    • log_slow_slave_statements에는 이제 alias log_slow_replica_statements가 있습니다
    • slave_max_allowed_packet에는 이제 alias replica_max_allowed_packet가 있습니다
    • slave_compressed_protocol에는 이제 alias replica_compressed_protocol가 있습니다
    • slave_exec_mode에는 이제 alias replica_exec_mode가 있습니다
    • slave_type_conversions에는 이제 alias replica_type_conversions가 있습니다
    • slave_sql_verify_checksum에는 이제 alias replica_sql_verify_checksum가 있습니다
    • slave_parallel_type에는 이제 alias replica_parallel_type가 있습니다
    • slave_preserve_commit_order에는 이제 alias replica_preserve_commit_order가 있습니다
    • log_slave_updates에는 이제 alias log_replica_updates가 있습니다
    • slave_allow_batching에는 이제 alias replica_allow_batching가 있습니다
    • slave_load_tmpdir에는 이제 alias replica_load_tmpdir가 있습니다
    • slave_net_timeout에는 이제 alias replica_net_timeout가 있습니다
    • sql_slave_skip_counter에는 이제 alias sql_replica_skip_counter가 있습니다
    • slave_skip_errors에는 이제 alias replica_skip_errors가 있습니다
    • slave_checkpoint_period에는 이제 alias replica_checkpoint_period가 있습니다
    • slave_checkpoint_group에는 이제 alias replica_checkpoint_group가 있습니다
    • slave_transaction_retries에는 이제 alias replica_transaction_retries가 있습니다
    • slave_parallel_workers에는 이제 alias replica_parallel_workers가 있습니다
    • slave_pending_jobs_size_max에는 이제 alias replica_pending_jobs_size_max가 있습니다
    • pseudo_slave_mode에는 이제 alias pseudo_replica_mode가 있습니다
    • skip_slave_start에는 이제 alias skip_replica_start가 있습니다
  • 반동기 복제에 새 rpl_semi_sync_sourcerpl_semi_sync_replica 플러그인을 사용하는 경우:

    • rpl_semi_sync_slave_enabledrpl_semi_sync_replica_enabled로 대체됩니다
    • rpl_semi_sync_slave_trace_levelrpl_semi_sync_replica_trace_level로 대체됩니다
    • rpl_semi_sync_master_wait_for_slave_count는 rpl_semi_sync_source_wait_for_replica_count로 대체됩니다
    • rpl_semi_sync_master_enabledrpl_semi_sync_source_enabled로 대체됩니다
    • rpl_semi_sync_master_timeoutrpl_semi_sync_source_timeout로 대체됩니다
    • rpl_semi_sync_master_trace_levelrpl_semi_sync_source_trace_level로 대체됩니다
    • rpl_semi_sync_master_wait_pointrpl_semi_sync_source_wait_point로 대체됩니다
  • 다음 시스템 변수는 변경되지 않습니다:

  • ndb_slave_conflict_role (NDB 시스템 변수는 변경되지 않습니다)

    • binlog_rotate_encryption_master_key_at_startup (“master key”는 허용되는 용어입니다)

    • slave_rows_search_algorithms (이 시스템 변수는 이미 사용 중단되었습니다)

    • master_info_repository (이 시스템 변수는 이미 사용 중단되었습니다)

    • 상태 변수:

      • Slave_open_temp_tables에는 이제 별칭 Replica_open_temp_tables가 있습니다
      • Slave_rows_last_search_algorithm_used에는 이제 별칭 Replica_rows_last_search_algorithm_used가 있습니다
    • 새로운 rpl_semi_sync_source 및 rpl_semi_sync_replica 플러그인을 반동기 복제에 사용하는 경우:

      • Rpl_semi_sync_slave_statusRpl_semi_sync_replica_status로 대체됩니다
      • Rpl_semi_sync_master_statusRpl_semi_sync_source_status로 대체됩니다
      • Rpl_semi_sync_master_clientsRpl_semi_sync_source_clients로 대체됩니다
      • Rpl_semi_sync_master_yes_txRpl_semi_sync_source_yes_tx로 대체됩니다
      • Rpl_semi_sync_master_no_txRpl_semi_sync_source_no_tx로 대체됩니다
      • Rpl_semi_sync_master_wait_sessionsRpl_semi_sync_source_wait_sessions로 대체됩니다
      • Rpl_semi_sync_master_no_timesRpl_semi_sync_source_no_times로 대체됩니다
      • Rpl_semi_sync_master_timefunc_failuresRpl_semi_sync_source_timefunc_failures로 대체됩니다
      • Rpl_semi_sync_master_wait_pos_backtraverseRpl_semi_sync_source_wait_pos_backtraverse로 대체됩니다
      • Rpl_semi_sync_master_tx_wait_timeRpl_semi_sync_source_tx_wait_time으로 대체됩니다
      • Rpl_semi_sync_master_tx_waitsRpl_semi_sync_source_tx_waits로 대체됩니다
      • Rpl_semi_sync_master_tx_avg_wait_timeRpl_semi_sync_source_tx_avg_wait_time으로 대체됩니다
      • Rpl_semi_sync_master_net_wait_timeRpl_semi_sync_source_net_wait_time으로 대체됩니다
      • Rpl_semi_sync_master_net_waitsRpl_semi_sync_source_net_waits로 대체됩니다
      • Rpl_semi_sync_master_net_avg_wait_timeRpl_semi_sync_source_net_avg_wait_time으로 대체됩니다
    • NDB 관련 상태 변수는 변경되지 않습니다.

    • mysqld의 경우 위 목록에 있는 별칭이 지정되거나 대체된 모든 시스템 변수의 명령줄 버전에는 동등한 명령줄 별칭 또는 대체 항목이 있으며, 시스템 변수가 아닌 다음 명령줄 옵션도 있습니다:

      • show-slave-auth-info에는 별칭 show-replica-auth-info가 있습니다
    • 다음 명령줄 옵션은 변경되지 않습니다:

  • abort-slave-event-count (이 명령줄 옵션은 사용 중단 예정입니다)

    • disconnect-slave-event-count (이 명령줄 옵션은 사용 중단 예정입니다)

    • master-info-file (이 명령줄 옵션은 이미 사용 중단되었습니다)

    • master-retry-count (이 명령줄 옵션은 이미 사용 중단되었습니다)

    • mysqladmin의 경우, 옵션 start-slave에는 이제 별칭 start-replica가 있으며, 옵션 stop-slave에는 이제 별칭 stop-replica가 있습니다.

    • mysqlbinlog의 경우, 옵션 read-from-remote-master에는 이제 별칭 read-from-remote-source가 있습니다.

    • mysqldump의 경우, 다음 명령줄 옵션에 새 별칭이 있습니다:

      • apply-slave-statements에는 이제 별칭 apply-replica-statements가 있습니다
      • delete-master-logs에는 이제 별칭 delete-source-logs가 있습니다
      • dump-slave에는 이제 별칭 dump-replica가 있습니다
      • include-master-host-port에는 이제 별칭 include-source-host-port가 있습니다
      • master-data에는 이제 별칭 source-data가 있습니다
    • 내장 SQL 함수 MASTER_POS_WAIT에는 새 별칭 SOURCE_POS_WAIT가 있습니다.

    (WL #14194, WL #14628)

  • InnoDB:innodb_segment_reserve_factor 시스템 변수는 빈 페이지로 예약되는 테이블스페이스 파일 세그먼트 페이지의 백분율을 설정할 수 있게 합니다. 자세한 내용은 Configuring the Percentage of Reserved File Segment Pages를 참조하십시오.

    기여해 주신 Facebook에 감사드립니다. (Bug #32312743, Bug #102044, WL #14521)

  • Group Replication: Group Replication의 경우, 단일 프라이머리 모드의 그룹을 이제 슈퍼 읽기 전용 모드로 유지되도록 설정할 수 있으므로, 복제된 트랜잭션만 수락하고 클라이언트의 직접 쓰기는 수락하지 않습니다. 이 설정은 그룹의 목적이 재해 허용을 위해 다른 그룹에 대한 보조 백업을 제공하는 것일 때, 보조 그룹이 첫 번째 그룹과 동기화된 상태로 유지되도록 보장할 수 있음을 의미합니다. 새 프라이머리가 선출될 때 그룹이 슈퍼 읽기 전용 모드로 유지되도록 설정할 수 있으며, 이는 일반적으로 프라이머리에서 해당 모드를 제거하기 위해 수행되는 동작을 비활성화하여 수행합니다.

    관리자는 지정된 상황에서 그룹 멤버가 수행할 동작을 활성화하고 비활성화할 수 있는 새 Group Replication 함수 group_replication_enable_member_action()group_replication_disable_member_action()를 사용하여 이러한 방식으로 그룹을 설정할 수 있습니다. 이 함수는 Group Replication 플러그인이 설치되어 있는 한 그룹의 일부가 아닌 서버에서도 사용할 수 있습니다. 멤버 동작은 프라이머리에서 설정되고 그룹 메시지를 사용하여 다른 그룹 멤버 및 참여하는 멤버에 전파됩니다. 또 다른 함수 group_replication_reset_member_actions()는 멤버 동작 설정을 모든 멤버 동작에 대한 기본 설정으로 재설정하는 데 사용할 수 있습니다. (WL #13855)

  • Group Replication: 이제 뷰 변경(View_change_log_event)에 대해 내부적으로 생성된 트랜잭션이 바이너리 로그에 기록될 때 사용되는 GTID의 일부를 구성하도록 대체 UUID를 선택할 수 있습니다. 이 릴리스에서 추가된 시스템 변수 group_replication_view_change_uuid는 그룹 이름(group_replication_group_name의 값) 대신 사용되는 UUID를 지정합니다. 대체 UUID를 사용하면 뷰 변경 이벤트를 그룹이 클라이언트로부터 수신한 트랜잭션과 더 쉽게 구분할 수 있습니다. 설정에서 그룹 간 장애 조치를 허용하고, 백업 그룹에만 해당하는 트랜잭션을 식별하여 폐기해야 하는 경우 유용할 수 있습니다. 그룹의 모든 멤버에는 동일한 대체 UUID가 지정되어야 하므로, 이 방식으로 설정된 그룹에는 MySQL 8.0.26 이전 릴리스의 멤버가 포함될 수 없습니다. (WL #14539)

  • Boost 다운로드 URL이 업데이트되었습니다. 기여해 주신 Marcelo Altmann에게 감사드립니다. (Bug #32856104, Bug #103611)

  • 이제 clone 플러그인은 donor MySQL 서버 인스턴스에서 동일한 버전 및 릴리스의 hotfix MySQL 서버 인스턴스로 클론하는 것을 허용합니다. 이전에는 hotfix 서버 인스턴스가 동일한 MySQL 버전 및 릴리스로 인식되지 않았습니다. (Bug #32523635)

  • 이제 다음 문은 캐릭터셋 이름을 기록할 때 utf8이 아니라 utf8mb3을 보고합니다: EXPLAIN, SHOW CREATE PROCEDURE, SHOW CREATE EVENT.

    이제 데이터 딕셔너리에서 검색된 저장 프로그램 정의는 캐릭터셋 참조에서 utf8이 아니라 utf8mb3을 보고합니다. 이는 SHOW CREATE 문과 같이 해당 정의에서 생성되는 모든 출력에 영향을 줍니다.

    이제 이 오류 메시지는 캐릭터셋 이름을 기록할 때 utf8이 아니라 utf8mb3을 보고합니다: ER_INVALID_CHARACTER_STRING. (Bug #32233614, Bug #32392077, Bug #32392209, Bug #32428538, Bug #32428598)

  • fdatasync() 시스템 호출을 지원하는 플랫폼에서 새 innodb_use_fdatasync 변수는 운영 체제 플러시에 fsync() 대신 fdatasync()를 사용할 수 있도록 허용합니다. fdatasync() 시스템 호출은 이후 데이터 검색에 필요한 경우가 아니면 파일 메타데이터 변경 사항을 플러시하지 않으므로, 잠재적인 성능 이점을 제공합니다. innodb_use_fdatasync 변수는 SET 문을 사용하여 동적으로 설정할 수 있습니다. (WL #14452)

수정된 버그

  • 호환되지 않는 변경: 트리거 본문 내에서, OLD 또는 NEW 값을 할당 대상으로 사용하는 SET 절이 포함된 INSERT 또는 UPDATE 문은 assertion을 발생시키거나 서버 종료로 이어질 수 있었습니다. 이러한 할당은 더 이상 허용되지 않습니다. (Bug #32803211)

  • 성능: 컬럼 간 값을 복사하는 데 사용되는 내부 함수가 개선되어, 값이 유사한 타입인 경우 필요하지 않은 계산이 더 이상 수행되지 않습니다. 임시 테이블을 사용하는 쿼리는 이 개선으로 인해 눈에 띄게 더 빨라져야 합니다. 내부 테스트에서는 이러한 쿼리가 이전보다 최대 11% 더 빠르게 실행되는 것으로 나타났습니다. 항상 그렇듯이, 결과는 환경, 설정 및 기타 요인에 따라 이와 다를 수 있습니다. (Bug #32742537)

  • InnoDB: 오류 로그의 불필요한 경고 메시지 수를 줄이기 위해, InnoDB 소스의 fil_space_acquire() 함수 인스턴스가 가능한 경우 fil_space_acquire_silent() 함수로 대체되었습니다. (Bug #32944543)

  • InnoDB: InnoDB 소스의 TRX_FORCE_ROLLBACK_ASYNC 플래그는 트랜잭션이 비동기적으로 롤백되었는지 또는 소유 스레드에 의해 롤백되었는지를 나타내며, 중복되는 것으로 확인되어 제거되었습니다. (Bug #32912595)

  • InnoDB: InnoDB 소스에서 UT_DELETE 매크로 대신 ut_delete 심볼을 사용하여 Performance Schema 메모리 추적을 비활성화하는 빌드(-DDISABLE_PSI_MEMORY=ON)에서 실패가 발생했습니다. (Bug #32910699)

  • InnoDB: InnoDB 소스의 딕셔너리 시스템 mutex_entermutex_exit 호출이 각각 dict_sys_mutex_enter()dict_sys_mutex_exit()로 이름이 변경되었습니다. (Bug #32907980)

  • InnoDB: 레거시 UNIV_INLINEUNIV_MATERIALIZE 아티팩트가 InnoDB 소스에서 제거되었습니다. 일부 헤더 파일의 메서드 선언에 UNIV_HOTBACKUP이 추가되었습니다. (Bug #32894165)

  • InnoDB: lock_sys 샤딩된 rw_lock 인덱스는 ut_rnd_interval() 함수가 생성한 임의 인덱스 값을 사용했으며, 이는 낮은 동시성 워크로드에 최적이 아니었습니다. (Bug #32880577)

  • InnoDB: innodb_redo_log_encrypt 변수의 문자열 값 설정이 올바르게 처리되지 않았습니다. (Bug #32851525)

  • InnoDB: 각각 전용 뮤텍스를 가진 읽기-쓰기 트랜잭션 집합(trx_sys->rw_trx_set) 샤드가 도입되어, 트랜잭션 집합 삽입 및 제거로 인해 발생하는 트랜잭션 시스템 뮤텍스(trx_sys->mutex) 경합을 완화했습니다. 관련 개선 사항에는 트랜잭션 집합 수정자를 덜 중요한 위치로 이동한 것, TrxUndoRsegs 생성자 내부의 힙 할당을 제거한 것, 트랜잭션 상태(trx->state) 및 트랜잭션 시작 시간(trx->start_time) 필드를 std::atomic 필드로 변환한 것, 그리고 트랜잭션에서 동작하는 스레드를 검증하기 위한 새 어설션 코드가 포함됩니다. (Bug #32832196)

  • InnoDB: InnoDB memcached GET 명령에 대한 레코드 버퍼 로직이 개정되었습니다. (Bug #32828352)

  • InnoDB: InnoDB 소스의 ut_list 베이스 멤버는 이제 런타임에 리스트의 베이스 노드에 멤버 포인터를 저장하는 대신, 리스트 타입의 요소 부분을 사용하여 리스트 노드를 찾습니다. 이 방식은 리소스를 낭비하고 있었습니다. 이 패치에는 다른 ut_list 관련 코드 개선 사항도 포함됩니다. (Bug #32820458)

  • InnoDB: MySQL 5.6에서 MySQL 5.7로 업그레이드한 후 undo log truncation을 활성화한 상태(innodb_undo_log_truncate=ON)로 서버를 시작하면, undo tablespace truncate 작업이 시작될 때 데드락이 발생했습니다. 이 데드락으로 인해 긴 세마포어 대기가 발생하고 결국 실패했습니다. MySQL 5.6에서 MySQL 5.7.35 이상으로 직접 업그레이드하면 이 잠재적 문제를 방지할 수 있습니다. (Bug #32800020)

  • InnoDB: PSI_memory_key 식별자에 대한 타입 안전성 개선 사항이 도입되었습니다. PSI_memory_key 식별자는 Performance Schema에서 메모리 작업 계측에 사용됩니다. 이 개선 사항으로 ut::aligned_name 라이브러리 함수가 컴파일 시간에 타입 오류를 보고할 수 있습니다. (Bug #32797838)

  • InnoDB: buf_get_LRU_mutex() 함수는 flush list에서 플러시할 때 불필요하게 LRU mutex를 획득하지 않도록 최적화되었습니다. (Bug #32797451, Bug #103391)

  • InnoDB: 디버그 빌드에서 Fil_shard::m_deleted_spaces(삭제된 tablespace 벡터)에 대한 접근이 Fil_shard mutex로 보호되지 않아 실패가 발생했습니다. (Bug #32792816)

  • InnoDB: 2GB RAM이 있는 시스템에서 --innodb-dedicated-server를 사용하여 MySQL을 시작하려고 하면 단일 redo log 파일이 생성되어 서버가 시작되지 못했습니다. 이제 이러한 경우에는 최소 두 개의 로그 파일이 생성됩니다.

    기여해 주신 Adam Cable에게 감사드립니다. (Bug #32788772, Bug #103372)

  • InnoDB: 테이블에 너무 많은 컬럼을 추가하여 컬럼 한도를 초과한 작업 후에 파티셔닝된 테이블을 truncate할 때 실패가 발생했습니다. 이제 ADD COLUMN 작업이 허용되기 전에 추가되는 컬럼 수가 평가됩니다. (Bug #32788564, Bug #103363)

  • InnoDB: 디스크가 거의 가득 찬 상태에서 punch hole을 지원하는 플랫폼에서는 큰 AUTOEXTEND_SIZE 설정으로 테이블스페이스를 생성하면 장치에 공간이 없다는 실패와 그 이후의 InnoDB 복구 실패로 이어질 수 있었습니다. (Bug #32771235)

  • InnoDB: 트랜잭션이 요청한 테이블 잠금 목록(trx->lock.table_locks)은 트랜잭션 잠금 목록(trx->lock.trx_locks)의 하위 집합이었으며, 이 목록이 제거되었습니다. 대신 이제 트랜잭션이 요청한 테이블 잠금은 트랜잭션 잠금 목록의 시작 부분에 나열됩니다. (Bug #32762881)

  • InnoDB: 디스크가 거의 가득 찬 상태에서 복구 중 실패가 발생하여 데이터가 일관되지 않은 상태로 남았습니다. 이 실패는 테이블스페이스 확장 작업을 재실행하는 데 사용되는 fil_tablespace_redo_extend() 함수에서 발생했습니다. (Bug #32749974, Bug #32748733)

  • InnoDB: file-per-table 테이블스페이스를 오프라인으로 재배치하고 innodb_directories 옵션을 사용하여 InnoDB에 새 위치를 알린 후, COPY 알고리즘을 사용한 ALTER TABLE 작업이 스토리지 엔진 오류로 실패했습니다. 이 실패는 이름 변경 검사로 인해 발생했으며, 이 검사는 새 디렉터리 위치 대신 데이터 디렉터리를 검색했습니다. (Bug #32721533)

  • InnoDB: C++ 표준 템플릿 라이브러리(STL)와 관련된 ut_allocator() 준수 문제가 해결되었습니다. (Bug #32715698)

  • InnoDB: InnoDB 소스에서 std::vector에 의해 인스턴스화된 ut_allocator::allocate() 인스턴스가 std::vector에 의해 암시적으로 수행되는 메모리 할당 및 할당 해제를 추적하지 못했습니다. 동일한 문제는 다른 C++ 표준 템플릿 라이브러리(STL) 및 STL 유사 데이터 구조에서도 발견되었습니다. (Bug #32715688)

  • InnoDB: InnoDB 소스의 ut_allocator::construct() 인터페이스는 C++11 이전 스타일로 구현된 사용자 지정 인터페이스로, 불필요한 오버헤드를 유발했습니다. 이 인터페이스는 필요하지 않았으며 제거되었습니다. (Bug #32715381)

  • InnoDB: InnoDB 소스의 ut_list 길이 멤버 변수는 정의되지 않은 동작 없이 lock free 접근을 허용하기 위해 atomic 필드로 교체되었습니다. 기본 ut_list 생성자는 모든 리스트 초기화를 수행하는 새 생성자로 교체되었습니다. (Bug #32715371)

  • InnoDB: InnoDB 소스의 ut_allocator() 메모리 부족 보고 메커니즘은 신뢰할 수 없었으며 제거되었습니다. (Bug #32715359)

  • InnoDB: InnoDB 소스의 ut_allocator::allocate_large()ut_allocator::deallocate_large() 함수에 대해 Performance Schema 메타데이터의 암시적 처리가 구현되었습니다. 이 수정은 Performance Schema 메타데이터 처리를 유사한 할당 함수의 처리와 일치시킵니다. (Bug #32714144)

  • InnoDB: 병렬 읽기 스레드 수가 머신 코어 수를 초과하는 경우 동시 SELECT COUNT(*) 쿼리로 인해 정체가 발생했습니다. 이 문제에 대한 패치는 MySQL 8.0.24에서 Windows 빌드용으로 제공되었습니다. MySQL 8.0.26 패치는 영향을 받는 다른 플랫폼에서 동일한 문제를 해결합니다. (Bug #32678019)

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

  • InnoDB: 레코드의 각 필드에 대한 오프셋을 결정하는 rec_get_offsets() 함수에 대한 비용이 큰 호출을 피하기 위해, 고정 길이를 가지고 가상 컬럼, instant 컬럼 등이 없는 것과 같은 특정 요구 사항을 충족하는 인덱스까지 오프셋 캐싱이 확장되었습니다. (Bug #32673649)

  • InnoDB: MySQL Enterprise Backup으로 복원된 데이터 디렉터리로 서버를 시작할 때, doublewrite buffer(innodb_doublewrite 변수로 제어됨)가 다음 서버 재시작 전까지 비활성화된 상태로 남아 있었습니다. (Bug #32642866)

  • InnoDB: 많은 수의 테이블을 생성할 때 “Too many open files” 오류가 발생했습니다. (Bug #32634620)

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

  • InnoDB: 비차단이어야 했던 페이지 추적 시스템 복구 실패로 인해 InnoDB 복구를 진행할 수 없었습니다. (Bug #32630875)

  • InnoDB: InnoDB mecached 플러그인 소스에서 정수 언더플로 문제가 해결되었습니다. (Bug #32620378, Bug #32620398)

  • InnoDB: 트랜잭션이 락 대기를 시작할 때 InnoDB 락 시스템은 현재 락을 보유한 트랜잭션에 대한 정보를 서버에 제공했지만, 락을 해제하고 다른 대기 중인 트랜잭션에 락을 부여한 후에는 서버에 알리지 못했습니다. 그 결과, 복제 어플라이어 스레드 코디네이터가 이 시나리오에서 세 번째 트랜잭션이 최초 대기 중인 트랜잭션 이후에 커밋될 경우 발생할 수 있는 의도된 트랜잭션 커밋 순서의 잠재적 데드락을 감지할 수 없었습니다. (Bug #32618301)

  • InnoDB: 고유 보조 인덱스에 레코드를 삽입할 때, 동시 트랜잭션이 영향을 받는 범위에 충돌하는 레코드를 삽입하지 못하도록 획득한 인덱스 레코드 락에 해당 범위 뒤의 첫 번째 레코드에 대한 불필요한 갭 락이 포함되었습니다. (Bug #32617942)

  • InnoDB: 동적으로 할당된 over-aligned 타입을 생성하는 InnoDB 코드가 ut::aligned_name 라이브러리 함수로 대체되었습니다. (Bug #32601599)

  • InnoDB: over-aligned 타입의 동적 저장소를 처리하는 API(ut::aligned_name 라이브러리 함수)에 속한 메모리 할당 함수가 Performance Schema를 사용한 메모리 추적을 지원하도록 확장되었습니다. HAVE_PSI_MEMORY_INTERFACE 소스 설정 옵션은 메모리 추적 모듈을 활성화합니다.

    0으로 초기화된 메모리 할당 지원을 제공하는 aligned_zalloc() 라이브러리 함수가 API에 추가되었습니다. (Bug #32600981)

References: 다음도 참조하십시오: Bug #32601599, Bug #32246061, Bug #32246200.

  • InnoDB: 히스토그램 통계를 생성하기 위한 목적으로 InnoDB 데이터를 샘플링하는 기능이 이제 InnoDB에서 지원하는 모든 트랜잭션 격리 수준에서 지원됩니다. 이전에는 샘플링이 READ UNCOMMITTED 격리 수준만 사용하여 수행되었습니다. (Bug #32555575)

  • InnoDB: 키 프리픽스 길이가 767바이트보다 큰 인덱스가 REDUNDANT 로우 형식으로 정의된 테이블에서 허용되어, 해당 로우 형식의 인덱스 키 프리픽스 길이 제한을 초과했습니다. 인덱스를 추가한 ALTER TABLE 작업은 테이블의 실제 로우 형식 대신 innodb_default_row_format 변수로 정의된 로우 형식에 대해 인덱스 키 프리픽스 길이를 검증했습니다. 이 수정으로 인덱스 키 프리픽스 길이가 올바른 로우 형식에 대해 검증되도록 보장합니다. (Bug #32507117, Bug #102597)

  • InnoDB: Adaptive hash index 래치가 의미 있는 래치 위치 정보를 제공하지 않았습니다. (Bug #32477773)

  • InnoDB: 서버 초기화 시점의 redo 및 undo 로그 암호화와 관련된 의존성이 제거되었습니다. (Bug #32476724)

  • InnoDB: 온라인 버퍼 풀 크기 조정 작업이 이전 버퍼 풀 페이지 해시를 해제하여, 이전 페이지 해시가 필요한 동시 버퍼 풀 조회와 충돌했습니다. (Bug #32460315)

  • InnoDB: TempTable 스토리지 엔진(internal_tmp_mem_storage_engine=TempTable)을 사용할 때, SELECT 목록에 255개를 초과하는 집계 함수가 있으면 인덱싱된 컬럼 필드 위치를 저장하는 내부 변수의 오버플로로 인해 오류가 발생했습니다. (Bug #32458104, Bug #102468)

  • InnoDB: 큰 버퍼 풀을 사용하는 인스턴스에서 undo 테이블스페이스 잘라내기 작업을 실행하는 동안 워크로드가 멈췄습니다. 표시된 undo 테이블스페이스를 잘라내는 함수는 이제 배타 래치 대신 공유 래치를 사용하며, 공유 래치는 더 짧은 시간 동안 획득됩니다. (Bug #32353863, Bug #102143)

  • InnoDB: 과도하게 정렬된 타입의 동적 저장을 처리하기 위한 프로그래밍 인터페이스가 추가되었습니다. (Bug #32246200, Bug #32246061)

  • InnoDB: 특정 상황에서 InnoDB 복구 중 실패가 발생하면 커밋된 변경 사항이 손실될 수 있었습니다. 복구 중 허용되었던 체크포인트는 적절한 체크포인트 작업에 필요한 페이지 플러싱, flush list 유지 관리, 또는 데이터 딕셔너리 테이블 버퍼에 변경 사항을 영속화하는 작업을 처리하지 않았습니다. 따라서 redo log 복구가 완료되고 데이터 딕셔너리 동적 메타데이터(srv_dict_metadata)가 데이터 딕셔너리 테이블(dict_table_t) 객체로 전송될 때까지 체크포인트와 checkpoint LSN 진행은 더 이상 허용되지 않습니다. 이 변경으로 인해 복구 중 또는 복구 후(하지만 데이터 딕셔너리 동적 메타데이터가 데이터 딕셔너리 테이블 객체로 전송되기 전)에 redo log 공간이 부족해지는 경우, 최소한 SRV_FORCE_NO_IBUF_MERGE 설정으로 시작하는 innodb_force_recovery 재시작이 필요할 수 있으며, 이 경우 실패하면 SRV_FORCE_NO_LOG_REDO 설정이 필요할 수 있습니다. 이 시나리오에서 innodb_force_recovery 재시작이 실패하면 백업에서 복구해야 할 수 있습니다. (Bug #32200595)

  • InnoDB: 이제 시작 중 롤백 세그먼트가 병렬로 초기화됩니다. 이전에는 롤백 세그먼트가 직렬로 초기화되었습니다.

    이 버그 수정의 기반이 된 기여를 제출해 준 Zheng Lai와 Tencent Cloud-Native Database 팀에 감사드립니다. (Bug #32170127, Bug #101658)

  • InnoDB: innodb_log_writer_threads 변수 설정 테스트 중 실패가 발생했습니다. 이 실패는 레이스 컨디션으로 인해 발생했습니다. (Bug #32129814)

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

  • InnoDB: undo 테이블스페이스를 truncate하던 purge 스레드와 INFORMATION_SCHEMA.FILES 테이블을 쿼리하던 서버 스레드 사이에서 레이스 컨디션이 발생했습니다. 그 결과, truncate된 undo 테이블스페이스가 쿼리 시 INFORMATION_SCHEMA.FILES 테이블에 나타나지 않았으며, 이는 다시 undo 테이블스페이스 파일 위치에 대해 INFORMATION_SCHEMA.FILES 테이블에 의존하기 때문에 MySQL Enterprise Backup 실패를 초래했습니다. (Bug #32104924, Bug #32654667)

  • InnoDB: DML 작업이 단일 테이블에 집중될 때 purge 작업이 단일 purge 스레드에 의해 수행되었으며, DML 작업에 대형 객체 값이 포함된 경우 이로 인해 purge 작업이 느려지고, purge 지연이 증가하며, 테이블스페이스 파일 크기가 증가할 수 있었습니다. 이 문제를 해결하기 위해, purge 지연이 innodb_max_purge_lag 설정보다 커지면 이제 purge 작업이 사용 가능한 purge 스레드 사이에 자동으로 재분배됩니다. (Bug #32089028)

  • InnoDB: INFORMATION_SCHEMA.INNODB_TABLESPACES 테이블을 채우는 함수가 파일의 space에 접근하고, 보호되지 않은 stat() 작업 및 파일 크기 정보 검색을 수행했습니다. (Bug #32025344)

  • InnoDB: InnoDB 소스의 trx_t::is_recovered 플래그와 관련된 코드가 여러 복잡성 및 정확성 문제를 해결하도록 개정되었습니다. 해결된 문제 중 하나는 XA 트랜잭션이 “recovered”로 잘못 설명되도록 했으며, 이는 클라이언트 세션이 XA PREPARE 이후 XA 트랜잭션에서 연결이 끊겼을 때 발생했습니다. (Bug #31870582)

  • InnoDB: Indexed_cells 멤버 함수(cell_from_mysql_buf_index_read())에 대한 TempTable 디버그 어설션 코드는 길이가 0인 NOT NULL 컬럼을 고려하지 않았습니다. (Bug #31091089)

  • InnoDB: InnoDB memcached 플러그인을 사용하여 단일 get 명령에서 여러 값을 검색하려고 하면 잘못된 값이 반환되었습니다. (Bug #29675958, Bug #95032)

  • InnoDB: trx_sys_t::mutex에 대한 경합을 줄이기 위해 trx_sys_t::serialisation_mutex가 도입되었습니다. 새 mutex는 트랜잭션 번호가 할당될 때 trx_sys_t::serialisation_list를 보호하며, 이는 이전에는 trx_sys_t::mutex로 보호되었습니다.

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

  • Partitioning: 테이블이 TIMESTAMP로 파티셔닝되고 시간대 오프셋이 있는 타임스탬프 리터럴이 SELECT 문의 WHERE 절에 사용된 경우, 파티션이 결과 세트에서 누락될 수 있었습니다.

    시간대 오프셋이 타임스탬프 리터럴에 지정된 경우, 시간대 오프셋이 없는 타임스탬프로 변환된 다음 타임스탬프 컬럼과 비교될 것으로 예상되지만, 모든 경우에 이 작업이 올바르게 수행되지는 않았으며, 그 결과 쿼리를 위해 스캔할 파티션을 선택하는 동안 파티션이 프루닝될 수 있었습니다.

    컬럼의 값과 비교하기 전에 시간대 오프셋이 있는 타임스탬프가 항상 앞서 설명한 대로 변환되도록 하여 이 문제를 수정했습니다. (Bug #101530, Bug #32134145)

  • Replication; Group Replication: 시스템 변수 replication_optimize_for_static_plugin_config가 설정된 경우, Group Replication 및 반동기식 복제용 플러그인이 서버 종료 시 깔끔하게 제거될 수 없었습니다. (Bug #32798287)

  • Replication: 복제 채널에 대해 CHANGE REPLICATION SOURCE TO 문에서 SOURCE_CONNECTION_AUTO_FAILOVER=1 옵션이 설정된 경우, STOP REPLICA IO_THREAD 문이 해당 채널의 연결 실패를 모니터링하는 모니터 스레드를 중지하지 않았으며, applier 스레드를 잘못 중지할 수 있었습니다. (Bug #32892977)

  • Replication: 그룹에 대해 뷰 변경이 발생하는 것과 동시에 START GROUP_REPLICATIONSTOP_GROUP_REPLICATION 문이 실행되면 데드락이 발생할 수 있었습니다. (Bug #32738137, Bug #32836868)

  • Replication: 코드의 잘못된 기본값으로 인해 값이 제공되지 않았음에도 복제 그룹에 허용된 IP 주소 allowlist가 암시적으로 재설정되었습니다. (Bug #32714911)

  • Replication: 그룹 멤버의 복제 채널이 트랜잭션을 커밋하려고 시도하는 중에 STOP GROUP_REPLICATION 문이 실행되면 데드락이 발생할 수 있었습니다. 이제 서버는 관련 잠금을 획득할 수 없는 경우 잠금과 커밋이 완료될 때까지 기다려 데드락을 유발하는 대신, 트랜잭션을 즉시 롤백합니다. (Bug #32633176)

  • Replication: 멀티스레드 복제본에서 트랜잭션을 재시도할 때 활성 이벤트에 대한 참조가 때때로 잘못 관리되었습니다. (Bug #32590974)

  • Replication: 128개를 초과하는 파티션이 있는 테이블의 마지막 파티션에서 DML 작업이 수행된 후, MySQL Server 및 mysqlbinlog 같은 MySQL 클라이언트가 바이너리 로그의 이벤트 정보를 잘못 파싱하여 부정확한 파티션 ID가 명시되었습니다. 이제 이 정보는 엔디언에 독립적인 이벤트 리더 함수를 사용하여 읽습니다. (Bug #32358736, Bug #102191)

  • Replication: 새 MySQL Server 설치에서 mysql.gtid_executed 시스템 테이블에는 지속 통계를 비활성화하기 위한 STATS_PERSISTENT=0 속성이 누락되어 있었으며, 이 속성은 다른 복제 관련 테이블에는 존재합니다. (Bug #32250735)

  • Replication: 테이블의 동일한 로우가 같은 이벤트에 의해 여러 번 업데이트된 경우, 복제 applier의 해시 스캔 알고리즘이 binlog_row_value_options=PARTIAL_JSON이 설정되었을 때 기록되는 JSON 부분 업데이트 검사를 누락했습니다. 이로 인해 “key not found” 오류와 함께 복제가 중지될 수 있었습니다. (Bug #32221703)

  • Replication: 이제 레플리카 서버는 GTID와 연결된 트랜잭션을 적용하고 커밋하기 전에 GTID의 트랜잭션 ID 부분을 확인하고 검증합니다. (Bug #32103192)

  • Replication: 트랜잭션 종속성을 계산하는 데 사용되는 writeset 해시에서 고유 보조 키가 누락된 경우, 멀티스레드 레플리카에서 트랜잭션을 실행할 때 오류가 발생하여 멀티스레드 레플리카에서 복제가 중지될 수 있었습니다. 이제 write set 해시는 read set 및 write set에 포함되지 않은 경우에도 항상 고유 보조 키를 포함합니다. (Bug #31636339)

  • Replication: MySQL 반동기 복제는 소스에 응답을 보낸 후 연결 산출물을 올바르게 정리하지 않아, 연결을 다시 설정해야 함을 의미하는 불일치가 발생했습니다. 이제 이 문제가 수정되었습니다. (Bug #31363518, Bug #32441220, Bug #32759421)

  • Replication: 다중 스레드 복제본(slave_parallel_workers > 0)에서 GTID 자동 위치 지정이 누락된 트랜잭션을 확인하는 데 사용하는 알고리즘은 계산 과정에서 이벤트 위치에 낮은 값(4)을 잠시 설정합니다. 해당 시점에 작업이 중지되면 트랜잭션 시퀀스의 간격을 해결하는 복구 프로세스가 실패할 수 있습니다. GTID 자동 위치 지정이 사용될 때는 간격을 해결하는 프로세스가 실제로 필요하지 않으므로, 이제 해당 상황에서는 이 프로세스가 비활성화되었습니다.

    그 결과, 다중 스레드 복제본에서 인스턴스에 GTID_MODE = ON이 설정되어 있고 CHANGE REPLICATION SOURCE TO 문을 사용하여 채널에 SOURCE_AUTO_POSITION이 설정된 경우, 이제 다음 동작이 적용됩니다:

    • START REPLICA UNTIL SQL_AFTER_MTS_GAPS 문은 실행할 첫 번째 이벤트를 찾으면 applier 스레드만 중지하며, 트랜잭션 시퀀스의 간격을 확인하려고 시도하지 않습니다.
    • CHANGE REPLICATION SOURCE TO 문은 트랜잭션 시퀀스에 간격이 있더라도 자동으로 실패하지 않습니다.

    이러한 변경된 동작은 GTID와 GTID 자동 위치 지정을 사용하는 다중 스레드 복제본에만 적용되며, 바이너리 로그 위치 기반 복제를 사용하는 복제본에는 적용되지 않습니다. (Bug #30571587, Bug #97694)

  • Group Replication: Group Replication을 single-primary 모드로 실행할 때 데이터 직렬화 중에 트랜잭션 데이터의 불필요한 복사본이 생성되었습니다. 이제 메모리 사용량을 줄이기 위해 이 작업이 단일 단계로 수행됩니다. (Bug #32781945)

  • Group Replication: GTID 기반 복제의 복제된 트랜잭션에는 원래 소스 서버에서 트랜잭션이 커밋된 시점을 보여 주는 original_commit_timestamp와, 복제본에서 커밋된 시점을 보여 주는 immediate_commit_timestamp가 포함됩니다. 이전에는 Group Replication 뷰 변경 이벤트에 대해 original_commit_timestamp가 설정되지 않았는데, 이 이벤트는 그룹에서 합의되지만 이후 각 그룹 멤버가 생성하고 적용하므로, 표시 가능한 출력에서 타임스탬프가 0으로 나타났습니다. 관측 가능성을 개선하기 위해, 이제 그룹 멤버는 뷰 변경 이벤트와 연결된 트랜잭션에 대해 로컬 타임스탬프 값을 설정합니다. (Bug #32668567)

  • Group Replication: 이전에는 복제된 트랜잭션의 원래 커밋 타임스탬프가 이를 적용하는 레플리카의 즉시 커밋 타임스탬프보다 더 최신인 경우, 경고 메시지가 오류 로그에 기록되었습니다. 관련 머신 간의 시계 차이와 복제 지연 변동이 비슷한 값을 가지는 경우 이 메시지가 부적절하게 발생할 수 있었으며, 머신 간 연결 품질이 더 좋을수록 이러한 상황이 더 발생하기 쉬울 수 있었습니다. Group Replication 장애 조치 중에는 모든 트랜잭션에 대해 메시지가 반환되어 로그가 과도하게 채워질 수 있었습니다. 이러한 상황을 방지하기 위해 경고 메시지가 제거되었습니다. (Bug #32554807)

  • Group Replication: group_replication_consistencyAFTER로 설정되어 있고 뷰 변경 이벤트가 로컬에서 준비된 트랜잭션이 완료된 이후까지 지연된 경우, 다른 GTID가 해당 트랜잭션에 적용되어 복제에서 오류가 발생할 수 있었습니다. 이제 이러한 상황을 방지하기 위해 데이터가 수신된 것과 동일한 순서로 처리됩니다. (Bug #31872708)

  • Microsoft Windows: Windows 이벤트 로그에 쓰기가 성공하지 못할 수 있었습니다. (Bug #32890918)

  • JSON: CSV 스토리지 엔진을 사용한 테이블에서 JSON 값을 읽으면 Cannot create a JSON value from a string with CHARACTER SET 'binary'와 같은 오류가 발생했습니다. 이는 CSV 엔진이 레코드 버퍼의 캐릭터셋으로 my_charset_bin을 사용하지만, JSON 값 생성에는 my_charset_bin에 대한 명시적 검사가 포함되어 있으며, 이 캐릭터셋이 제공되면 오류를 발생시키기 때문에 발생했습니다.

    이 문제는 항상 바이너리인 데이터를 보유하는 버퍼의 캐릭터셋 대신 컬럼의 실제 캐릭터셋을 전달하여 처리합니다. (Bug #102843, Bug #32597017)

  • 파생 조건 푸시다운 최적화를 적용할 수 있는 쿼리가 INSERT... SELECT의 일부일 때 해당 방식으로 최적화되지 않았습니다. (Bug #32959186)

  • 액세스 권한 정보에 대한 가져오기 작업이 많은 수의 계정과 스키마에서 매우 느려졌습니다. (Bug #32934351)

  • 전체 텍스트 인덱스 스캔 결과를 정렬해야 하는 쿼리가 일부 상황에서 올바르게 처리되지 않았습니다. (Bug #32924198)

  • PFS_notification_registry::is_empty()에 대한 코드 수정에 기여해 준 Xiaoyu Wang에게 감사드립니다. (Bug #32919118, Bug #103788)

  • 서브쿼리에 GROUP BY, ORDER BY, LIMIT가 포함되어 있고 커서를 사용하여 접근되는 쿼리가 서버 종료를 일으킬 수 있었습니다. (Bug #32918240)

  • --help--verbose 옵션과 함께 호출될 때, mysqld가 현재 디렉터리에 auto.cnf 파일을 생성했습니다. (Bug #32906164)

  • 뷰 참조가 포함된 조건을 materialized derived table로 푸시다운하는 쿼리가 서버 종료를 일으킬 수 있었습니다. (Bug #32905044, Bug #32324234)

  • ER_CANT_INITIALIZE_UDF 오류 메시지가 잘릴 수 있었습니다. (Bug #32891703)

  • MySQL 8.0.23에서 수행된 streaming aggregation(이미 정렬된 데이터의 GROUP BY) 단순화에서 회귀가 발견되었습니다.

    이 문제는 다음과 같이 수정합니다: fulltext search의 대상인 단일 테이블에 대해 암시적 그룹화가 있는 경우, MATCH() 임시 항목이 AggregateIterator로 전송되기 전에 이를 구체화하도록 이제 임시 테이블 삽입을 강제합니다. 이는 AggregateIterator가 수신한 로우를 저장하고 복원하려고 하지만, fulltext search 정보가 숨겨져 있으므로 이를 제대로 포함할 수 없기 때문입니다. (Bug #32889491)

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

  • -DBL_MAX를 문자열로 변환한 뒤 다시 double로 변환할 때, 새 double 값이 원래 값과 달라져 범위를 벗어난 것으로 거부되었습니다. (Bug #32888982, Bug #103709)

  • 이제 JSON_LENGTH() 함수가 선택적 path 인수를 포함할 때마다, 서버는 이를 JSON_LENGTH(JSON_EXTRACT(doc, path))로 다시 작성합니다. 이는 JSON_LENGTH()가 이제 여기에 표시된 것처럼 경로에서 와일드카드(예: $, ., *)와 배열 범위를 지원한다는 의미입니다:

    mysql> SELECT JSON_LENGTH('[1,2,3,4,5,6,7]', '$[2 to 4]') AS x;
    +------+
    | x    |
    +------+
    |    3 |
    +------+
    

    (Bug #32877703)

  • RPM 및 Debian 패키지에 일반적으로 사용되는 플래그의 경우, 새로운 WITH_PACKAGE_FLAGS CMake 옵션은 해당 플랫폼의 독립 실행형 빌드에 이러한 플래그를 추가할지 여부를 제어합니다. 기본값은 비디버그 빌드의 경우 ON입니다. 이는 빌드를 “강화”하는 데 사용됩니다. 예를 들어 -D_FORTIFY_SOURCE=2를 추가하는 방식입니다. (Bug #32876974)

  • NULLIF() 함수는 오류에 필요한 모든 검사를 수행하지 않았습니다. (Bug #32865008)

  • 다른 뷰에 의존하는 뷰의 경우, 덤프 파일 생성 중 사용된 SHOW CREATE VIEW 문의 출력이 복원 시 오류를 일으킬 수 있었습니다. (Bug #32854203, Bug #103583)

  • 쿼리 속성 코드는 큰 64비트 숫자를 올바르게 처리하지 못했습니다. (Bug #32847269)

  • Performance Schema metadata_locks 테이블에서 검색된 정보가 외래 키와 CHECK 제약 조건에 대해 올바르지 않을 수 있었습니다. (Bug #32832004, Bug #103532)

  • 뷰 컬럼의 고유한 이름을 생성할 때, 서버는 이제 이름이 표시되는 객체만 고려합니다. (Bug #32821372)

  • 조건이 구체화된 파생 테이블로 푸시다운될 때, 파생 테이블 표현식의 클론이 조건 내 컬럼(외부 쿼리 블록의 컬럼)을 대체합니다. 클론된 항목에 FULLTEXT 함수가 포함된 경우, 이 함수는 파생 테이블 쿼리 블록이 아니라 외부 쿼리 블록에 추가되었고, 이로 인해 문제가 발생했습니다. 이를 수정하기 위해 이제 이러한 항목을 클론할 때 파생 쿼리 블록을 사용합니다. (Bug #32820437)

  • 문에서 두 번 이상 사용된 공통 테이블 표현식이 있었고, 항상 참이거나 항상 거짓이어서 이후 해석 중 제거된 서브쿼리 안에서 적어도 한 번 사용되었습니다. (Bug #32813547, Bug #32813554)

  • 준비 시점에는 영구 테이블이었지만 첫 실행 시점에는 임시 테이블인 테이블에 대해 문이 준비된 경우, 어설션이 발생할 수 있었습니다. (Bug #32799797)

  • 공간 함수에서 사용하는 내부 함수가 메모리를 해제한 후 해당 메모리를 참조할 수 있었습니다. (Bug #32793104)

  • impossible filter 최적화가 해당 BKA 액세스 경로에 필요한 MRR 액세스 경로를 제거했습니다. (Bug #32787415)

  • 새로운 WITH_AUTHENTICATION_CLIENT_PLUGINS CMake 옵션은 해당 서버 인증 플러그인이 빌드되는 경우 자동으로 활성화됩니다. 따라서 해당 값은 다른 CMake 옵션에 따라 달라지며, 명시적으로 설정해서는 안 됩니다. (Bug #32778378)

  • MRR iterator는 일반적으로 impossible_null_ref()를 확인하여 NULL 키를 필터링하지만, 조인 조건에 IS NULL 조건자가 포함되어 있거나 NULL-safe equals 연산자 ≪=>가 사용된 경우 Optimizer는 조인 조건이 해당 조건자 항을 조인 조건의 일부로 사용하는지 확인해야 했으며, 이러한 경우 내부 플래그 HA_MRR_NO_NULL_ENDPOINTS를 설정하지 않아야 했습니다. 이제 비트마스크를 사용하여 키의 각 컬럼이 NULL을 거부하는지 확인하며, 이 경우 추가 확인 없이 HA_MRR_NO_NULL_ENDPOINTS를 설정할 수 있습니다. (Bug #32774281)

  • 열거 타입을 사용하는 시스템 변수의 경우 SET PERSIST_ONLY var_name = DEFAULT가 심볼릭 이름이 아니라 숫자 값을 영구 저장했습니다. (Bug #32761053)

  • X DevAPI 작업 Collection.replaceOne 및 Collection.addOrReplaceOne은 이제 문서에서 _id 필드의 값이 작업에 지정된 id 매개변수와 일치하는지 확인합니다. 일치하지 않으면 오류가 반환됩니다. (Bug #32753547)

  • C API를 사용하여 prepared statement를 실행하는 애플리케이션의 경우, 매개변수가 없는 prepared statement에 쿼리 속성을 사용할 수 없었습니다. (Bug #32753030, Bug #32790714, Bug #32955044)

  • IN()에 대한 인수가 항상 올바른 캐릭터셋으로 변환되지는 않았습니다. (Bug #32746552)

  • LOCATE() 함수는 인수를 평가할 수 없을 때 무조건 NULL을 반환했습니다. 이제 non-nullable로 결정된 표현식에서 사용되는 경우, 이 함수는 대신 0을 반환합니다. (Bug #32746536)

  • 내부 함수 my_well_formed_len_utf32()는 잘못된 길이의 문자열이 제공되면 assert했습니다. 이제 이러한 경우, 이 함수는 대신 잘못된 문자열을 보고합니다. (Bug #32745294)

  • 함수 TRIM(), RTRIM(), LTRIM()이 항상 적절한 오류 검사를 수행하지는 않았습니다. (Bug #32744772)

  • 내부 리졸버 함수의 이전 수정은 생성 컬럼을 해석할 수 없을 때 오류를 발생시키도록 보장했습니다. 생성 컬럼이 CREATE TABLE 문의 일부인 경우에는 문제없이 동작했지만, 생성 컬럼이 있는 테이블이 MySQL 5.7 데이터베이스에서 생성된 뒤 MySQL 8.0으로 업그레이드된 경우에는 오류가 보고되고 업그레이드가 종료되었습니다.

    오류를 발생시킨 테이블을 fix_generated_columns_for_upgrade() 함수에서 보고할 때 올바른 포인터를 사용하여 이 문제를 수정했습니다. (Bug #32738972)

  • SELECT 목록의 rollup 래퍼 내부를 살펴보고 GROUP BY 목록에서 동일한 항목을 찾으려고 할 때, 서버는 표현식 주변에 캐시가 추가되었을 수 있다는 점을 고려하지 않았습니다. 이제 해당 캐시는 항목을 찾기 전에 언래핑됩니다. (Bug #32729377, Bug #32918400)

  • MIN() 또는 MAX()를 사용한 준비된 명령문이 동적 매개변수도 포함한 경우 잘못된 결과를 반환할 수 있었습니다. (Bug #32713860, Bug #103170)

  • XA 트랜잭션이 데드락으로 인해 거부되거나 강제로 롤백된 직후 DML 문이 실행된 경우 복제가 실패할 수 있었습니다. (Bug #32707060)

  • GROUPING()의 여러 인스턴스를 포함하는 쿼리가 항상 올바르게 처리되지는 않았습니다. (Bug #32695103)

  • EXPLAIN ANALYZE를 실행할 때, materialization iterator는 기존 데이터만 유지하는 호출까지 포함하여 모든 단일 init() 호출을 계산하므로, materialization이 내부 호출 수에 비해 비용이 너무 적게 드는 것처럼 보이게 했습니다. materialization iterator가 호출 및 로우 수를 자체 데이터로 재정의할 수 있도록 하여 이 문제를 수정했습니다. (Bug #32688540)

  • 메타데이터 잠금 코드의 경쟁 조건으로 인해 서버가 종료될 수 있었습니다. (Bug #32686116)

  • covering full-text 인덱스에 대한 index-only scan은 여러 MATCH() 함수 호출이 있는 쿼리에서 MATCH() 호출이 평가된 순서에 따라 잘못된 결과를 반환할 수 있었습니다. (Bug #32685616)

  • prepared statement에 쿼리 속성을 포함하면 명령문 실행 실패가 발생할 수 있었습니다. (Bug #32676878)

  • 시스템 테이블에서 DDL 문을 실행하면 서버 종료가 발생할 수 있었습니다. (Bug #32665990)

  • --online-migration 옵션을 사용할 때 mysql_migrate_keyring은 마이그레이션 서버에 대한 연결 설정 중에 종료될 수 있었습니다. (Bug #32651203)

  • mysql_migrate_keyring은 소스 및 대상 키 저장소가 서로 달라야 한다는 조건을 적용하지 못했습니다. (Bug #32637784)

  • Ubuntu에서 시스템 캐시 크기 확인이 부정확할 수 있었습니다. (Bug #32619199, Bug #102926)

  • 서버는 HAVING 절에서 fulltext 인덱스가 있는 컬럼에 MATCH... AGAINST를 사용한 일부 쿼리를 올바르게 처리하지 못했습니다. (Bug #32617181)

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

  • GTID 기반 복제에서 복제된 트랜잭션에는 해당 트랜잭션이 원본 소스 서버에서 커밋된 시점을 표시하는 original_commit_timestamp와, 복제본에서 커밋된 시점을 표시하는 immediate_commit_timestamp가 포함됩니다. 이전에는 Group Replication 서버가 로컬에서 생성된 트랜잭션을 커밋할 때 original_commit_timestamp를 설정했지만, immediate_commit_timestamp는 설정하지 않았습니다. 관측 가능성을 개선하기 위해 이제 그룹 멤버가 이 타임스탬프를 설정합니다. 트랜잭션이 그룹에서 시작된 경우 original_commit_timestampimmediate_commit_timestamp는 모두 Group Replication에서 생성되며 서로 같습니다. 트랜잭션이 그룹 외부에서 시작된 경우 original_commit_timestamp는 보존되고, immediate_commit_timestamp가 설정됩니다. (Bug #32613896)

  • 내부 함수 Item_func_match::eq()는 인수가 Item_func_match_predicate인 상태로 호출될 때 디버그 빌드에서 어설션 실패를 발생시켰습니다. 이 어설션은 Item_func_match 객체가 Item_func_match_predicate 객체와 비교되지 않을 것이라는 예상으로 추가되었지만, 나중에 프레디케이트가 HAVING 절에 있을 때 ONLY_FULL_GROUP_BY 검사 중에 이러한 일이 발생할 수 있음이 확인되었습니다.

    이를 수정하기 위해 어설션을 제거하여 대신 이 함수가 false를 반환하도록 했습니다. (Bug #32611913)

  • 기본 키 컬럼에 GROUP BY... WITH ROLLUP과 함께 DISTINCT를 사용하는 SELECT가 해당 컬럼이 기본 키가 아닐 때와 다른 결과를 반환했습니다. (Bug #32565875)

  • SELECT 목록의 항목이 상수로 확인된 테이블에서 온 경우, ROLLUP 래퍼를 추가하기 전에 그 주변에 캐시를 추가할 수 있었으며, 이로 인해 해당 항목을 그룹 목록(이러한 래퍼가 없는 목록)에서 찾을 수 없게 되었습니다. 이는 캐시의 래핑을 해제하여 해결되었습니다. (Bug #32559356)

  • prepared statement 파라미터가 8KB보다 길고 다음 파라미터가 NULL 값을 나타내는 경우, C 클라이언트 라이브러리가 Malformed communication packet 오류를 생성할 수 있었습니다. (Bug #32558782)

  • 서로 다른 타입의 인수를 비교할 때, 그리고 해당 인수가 상수로 간주되는 경우, 서버는 반복 변환(및 발생 가능한 경고)을 줄이기 위해 자체 숨겨진 item cache를 삽입할 수 있습니다. 이는 EXPLAIN과 같은 어떤 명령문의 출력에서도 표시되지 않습니다.

    비교가 설정된 후 ROLLUP 해석이 실행되고 인수를 대체할 수 있다는 사실로 인해 문제가 발생했으며, 이는 비교에서 잘못된 결과로 이어질 수 있었습니다. 이제 이러한 일이 발생하면 비교가 캐시를 다시 검토해야 하며 오래된 값을 재사용할 가능성이 없도록 신호를 보냅니다. (Bug #32548377)

  • 로드 가능한 함수 구현에서 destructor에 대한 잘못된 참조 카운팅으로 인해 디버그 빌드에서는 assertion이 발생하거나, 비디버그 빌드에서는 해당 함수가 존재하지 않는다고 보고할 수 있었습니다. (Bug #32528898, Bug #102649)

  • MySQL 소스 배포판은 이제 Google Test 소스 코드를 번들로 포함하며, Google Test 기반 단위 테스트를 실행하기 위해 더 이상 다운로드할 필요가 없습니다. 따라서 WITH_GMOCKENABLE_DOWNLOADS CMake 옵션이 제거되었으며, 지정되더라도 무시됩니다.

    이 변경은 또한 소스 배포판에 빈 source_downloads 디렉터리가 잘못 포함되었던 문제와, WITH_UNIT_TESTS가 활성화되었지만 Google Test 소스를 찾을 수 없을 때 CMake가 실패하지 않았던 문제라는 몇 가지 빌드 문제도 수정합니다. (후자의 문제는 소스가 항상 존재하므로 더 이상 발생할 수 없습니다.) (Bug #32512077, Bug #27326599, Bug #29935278)

names in the code; "unnecessarily re-prepared" translates to 불필요하게 다시 준비될 수. Lastly

  • 쿼리에서 외부 batched key access와 block-nested loop(또는 hash join)이 함께 발생하면, 액세스 경로에 대한 플랜 해석에서 둘 다 nested loop로 되돌려졌습니다. 비동등 조인 조건이 특수한 종류의 BKA 인덱스 조건으로 push된 일부 경우에 문제가 발생했으며, 일반 인덱스 lookup(BKA 조건을 확인하지 않음)으로 변환함으로써 확인되었어야 하는 조건이 누락될 수 있었습니다.

    BKA 인덱스 조건을 제거하여 이 문제를 수정합니다. 이 조건의 사용은 매우 드물기 때문에, 대부분의 실제 쿼리에서 잠재적 이득은 매우 낮으며, 이를 제거하면 복잡도가 크게 감소합니다. (Bug #32424884)

  • mysql.user 시스템 테이블의 구조가 수동으로 변경된 경우 SHOW CREATE USER가 예기치 않은 서버 종료를 일으킬 수 있었습니다. (Bug #32417780, Bug #31654586)

  • group_concat_max_len 시스템 변수의 값이 큰 경우, GROUP_CONCAT() 함수를 사용하는 prepared statement가 실행 간에 불필요하게 다시 준비될 수 있었습니다. (Bug #32413530, Bug #102344)

  • 최적화의 일부로 walk and replace가 수행된 준비된 명령문 또는 저장 프로시저를 다시 실행할 때 변경 사항이 올바르게 롤백되지 않았습니다. (Bug #32384324, Bug #32573871)

  • 비동기 C API 함수를 사용하는 클라이언트 프로그램은 연결 시간 초과가 발생한 경우 메모리를 누수할 수 있었습니다. 이 문제를 수정하는 데 사용된 기여를 제공해 준 Facebook에 감사드립니다. (Bug #32372038, Bug #102189, Bug #32800091, Bug #103409, Bug #33171164, Bug #104461)

  • INFORMATION_SCHEMA를 통해 노출되는 동적 통계 캐시는 트랜잭션이 커밋될지 여부가 알려지기 전에 트랜잭션 도중 업데이트될 수 있었으며, 이로 인해 커밋된 상태가 아닌 상태에 해당하는 정보가 캐시될 가능성이 있었습니다. (Bug #32338335)

  • 암시적 트랜잭션의 시작 시점에 준비된 명령문을 다시 준비하면 ER_GTID_NEXT_TYPE_UNDEFINED_GROUP 오류가 발생할 수 있었습니다. (Bug #32326510, Bug #102031)

  • Performance Schema는 해시 인덱스를 지원하지 않으므로 Performance Schema thread pool 테이블 정의에서 USING HASH가 제거되었습니다. (Bug #32194617)

  • 명시적 시간대 오프셋이 있는 datetime 리터럴을 TIMESTAMP 컬럼에 삽입할 때, time_zone=SYSTEM이고 시스템 시간대에 DST 전환이 있는 경우 잘못된 시간이 생성될 수 있었습니다. (Bug #32173664, Bug #101670)

  • 윈도우 함수에 대해 ORDER BY를 설정하는 동안, 서브쿼리를 포함하는 윈도우 정의가 ORDER BY의 서브쿼리와 함께 제거되었습니다. (Bug #32103260)

  • 이제 group_replication_force_members 시스템 변수에 대해 SET PERSIST 또는 SET PERSIST_ONLY 문을 사용하는 것이 허용되지 않습니다. 이 시스템 변수는 START GROUP_REPLICATION 문을 실행할 수 있기 전에 사용 후 지워야 하므로, MySQL 서버 인스턴스의 옵션 파일에 영구 저장해서는 안 됩니다. (Bug #31983203)

  • MySQL 설치에 FEDERATED 테이블이 있는 경우 MySQL 5.7에서 8.0으로의 업그레이드가 실패했습니다. (Bug #31973053)

  • 컴포넌트 관련 시스템 변수를 영구 저장하면 불필요한 “unknown variable” 오류 메시지가 발생할 수 있었습니다. (Bug #31968366)

  • 전체 텍스트 검색 인덱스가 있는 테이블에 대량의 데이터를 로드할 때 메모리 부족 오류가 발생했습니다. 전체 텍스트 검색 보조 테이블에 데이터를 삽입할 때 전체 텍스트 검색 캐시에 할당된 메모리 중 일부가 계산되지 않았습니다. (Bug #31576731)

  • 정수 값과 십진수 값 사이의 UNION에 대한 정밀도가 잘못 계산될 수 있었으며, 이로 인해 결과에서 정수가 잘릴 수 있었습니다. (Bug #31348202, Bug #99567)

  • InnoDB가 테이블 통계를 계산할 수 없음을 나타내는 불필요한 경고를 오류 로그에 기록했습니다. (Bug #30865032)

  • 인덱스가 온라인으로 빌드될 때 가상 컬럼에 대한 보조 인덱스가 손상되었습니다.

    UPDATE 문에 대해서는 이를 다음과 같이 수정합니다: 인덱스 레코드의 가상 컬럼 값이 NULL로 설정된 경우, 클러스터 인덱스 레코드에서 이 값을 생성합니다. (Bug #30556595)

  • 테이블 수가 많은(100만 개) 데이터베이스에 대한 DROP DATABASE는 메모리 부족 상태를 초래할 수 있었습니다. (Bug #29634540)

  • system_time_zone 시스템 변수는 서버 시작 시 서버 호스트 설정 및 mysqld 환경에서 초기화되지만, 서버 호스트 시간대가 변경된 경우(예: 일광 절약 시간제로 인해) system_time_zone이 해당 변경을 반영하지 않았습니다. 이제 반영합니다. (Bug #29330089, Bug #94257)

  • Ubuntu에서 업그레이드할 때 기존 my.cnf 파일이 발견되면, 이 파일은 my.cnf.bak로 이름이 변경되고 경고가 발생합니다. (Bug #24486556, Bug #82639)

  • Boolean 시스템 변수에 음수 값을 할당할 수 있었습니다. (Bug #11758439, Bug #50643)

  • Prepared statement가 항상 인덱스 확장을 사용하지는 않았습니다(Use of Index Extensions 참조). (Bug #103711, Bug #32897525)

    참조: 다음도 참조하십시오: Bug #103710, Bug #32897503.

  • 활성화된 경우 prefer_ordering_index Optimizer 스위치는 prepared statement의 성능에 부정적인 영향을 미쳤습니다. (Bug #103710, Bug #32897503)

    참조: 다음도 참조하십시오: Bug #103711, Bug #32897525.

  • 연속적인 INSERT() 함수 호출이 때때로 잘못된 NULL 결과를 생성할 수 있었습니다. (Bug #103513, Bug #32824978)

  • 일부 NOT IN 서브쿼리가 NULL 처리의 회귀로 인해 올바른 결과를 반환하지 않았습니다. (Bug #103331, Bug #32773801)

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

  • SELECT... FOR UPDATE NOWAIT 문이 레코드 잠금을 얻을 수 없을 때마다, 이는 비교적 흔하게 발생하는 상황임에도 불구하고 Got error 203 when reading table... 메시지가 오류 로그에 기록되었으며, 이 로깅으로 인해 디스크 공간이 과도하게 사용되었습니다.

    이 기여를 해 주신 Brian Yue에게 감사드립니다. (Bug #103159, Bug #32705614)

  • 0 - (MAX(BIGINT) + 1)-(MAX(BIGINT) + 1)을 반환했습니다. 이제 대신 범위 초과 오류가 반환됩니다. (Bug #103093, Bug #32693863)