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

MySQL 8.0.33 릴리스 노트

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

저자: Oracle 작성: 2023.04.18 약 25분 14,609자

DBA를 위한 핵심 내용

MySQL 8.0.33은 백업 권한 회귀 수정, 복제/Group Replication 안정성, Optimizer 오답·성능 회귀 수정이 DBA 관점의 핵심입니다. 8.0.32에서 문제가 되었던 mysqldump --single-transaction 권한 요구가 완화되었고, binlog_order_commits, Previous_gtids, XA 복구, Group Replication Performance Schema 조회 중단 같은 운영 리스크가 다수 정리되었습니다.

  1. 8.0.32에서 mysqldump --single-transaction 사용 시 RELOAD 또는 FLUSH_TABLES 권한이 필요하던 회귀가 수정되어, 이제 GTID 모드가 켜져 있고 --set-gtid-purged=ON|AUTO인 경우에만 해당 권한 요구가 적용됩니다. 업그레이드 후 백업 계정 권한을 과도하게 부여해 두었다면 회수 여부를 검토하십시오.
  2. binlog_order_commits=OFF에서 다음 binlog의 Previous_gtids가 누락될 수 있던 문제, binlog_order_commits=ON에서 커밋 하위 단계 순서가 어긋날 수 있던 문제, XA XID 복구 문제가 수정되었습니다. GTID 기반 장애 복구·PITR 절차를 운영한다면 업그레이드 후 binlog/GTID 검증을 권장합니다.
  3. replication_group_communication_information, replication_group_member_stats 병렬 조회가 Group Replication 동작 중단으로 이어질 수 있던 문제와 보조 노드 relay log purge 중 비정상 종료가 수정되었습니다. 모니터링 쿼리를 자주 수행하는 클러스터에서 의미가 큽니다.
  4. INTERSECT/EXCEPT, 파생 테이블·뷰·윈도우 함수·해시 외부 조인·문자열/temporal 비교 관련 오답 가능성이 다수 수정되었습니다. 해당 기능을 사용하는 리포팅/정산성 SQL은 업그레이드 전후 결과 비교 테스트를 수행하는 것이 안전합니다.
  5. Performance Schema telemetry traces 인터페이스, statement_id 세션 추적, systemd 네트워크 의존성 조정, ALTER INSTANCE RELOAD TLS CPU 사용 문제 수정이 포함됩니다. TLS 재로딩과 오류 로그, Performance Schema 모니터링 대시보드의 동작 변화를 확인하십시오.
  6. 별도 웹 검색에서는 이 버전 자체에 대해 공식 릴리스노트 밖의 널리 알려진 대규모 회귀나 업그레이드 장애는 확인하지 못했습니다. 8.0.33은 8.0.32의 백업 권한/복제 안정성 보정 성격이 강합니다.

Audit Log 관련 사항

  • MySQL Enterprise Audit는 이전에 필터 및 사용자 계정 데이터의 영구 저장을 위해 mysql 시스템 데이터베이스의 테이블을 사용했습니다. 향상된 유연성을 위해, 새로운 audit_log_database 서버 시스템 변수는 이제 서버 시작 시 글로벌 스키마 네임스페이스의 다른 데이터베이스를 지정할 수 있도록 허용합니다. mysql 시스템 데이터베이스는 테이블 저장을 위한 기본 설정입니다. (WL #15500)

컴파일 관련 사항

  • Microsoft Windows: Visual Studio 2017 이상에 대한 MSVC Code Analysis 지원을 추가했습니다. 이는 현재 디렉터리와 그 하위 디렉터리에서 이 분석을 활성화하거나 비활성화하는 새로운 MSVC_CPPCHECK(기본값 OFF) CMake 옵션을 추가합니다. (Bug #34828882)

  • MySQL이 GNU 컴파일러 또는 clang으로 빌드될 때 7.86보다 큰 curl 버전에 대해 curl 사용 중단 경고를 -Wno-error로 낮췄습니다. (Bug #35111625)

  • macOS에서 curl 인터페이스를 링크할 때 필요에 따라 공유 시스템 라이브러리와 링크하도록 -framework CoreFoundation-framework SystemConfiguration을 추가했습니다. (Bug #35104962)

  • MY_INCLUDE_SYSTEM_DIRECTORIES 매크로를 라이브러리 인터페이스로 교체했습니다. (Bug #35018072, Bug #35028089, Bug #35072295)

  • 대체 링커를 지원하도록 CMake 코드를 개선했습니다. (Bug #34963568)

  • 빌드 시스템에서 사용 중단된 Docs/mysql.info 파일을 제거했습니다. (Bug #34960126)

  • 최상위 .clang-tidy 파일과 strings/mysys/ 디렉터리의 관련 .clang.tidy 파일을 추가했습니다. 또한 헤더 파일에서 clang-tidy를 사용할 수 있도록 compdb 지원을 활성화했습니다. (Bug #34917075)

  • uca-dump 및 uctypedump 같은 기능을 위한 유지보수되지 않거나 사용되지 않는 여러 C++ 소스 파일을 제거했습니다. (Bug #34898978)

  • 명령줄에서 컴파일할 때 GCC 및 Clang에 대해 컬러 처리된 컴파일러 출력을 활성화하는 CMake 빌드 옵션을 추가했습니다. 활성화하려면 -DFORCE_COLORED_OUTPUT=1을 CMake에 전달하십시오. (Bug #34897192)

  • Windows에서 3rd-party 라이브러리에 대해 관련 .dll 파일의 .pdb 파일이 발견되는 경우 해당 파일도 설치합니다. (Bug #34863555)

  • Enterprise Linux 8 및 Enterprise Linux 9 빌드는 이제 GCC 11 대신 GCC 12를 사용합니다. (Bug #34829151)

  • -static-libgcc -static-libstdc++로 빌드하면 이제 요구되는 대로 번들 protobuf도 정적 라이브러리로 빌드합니다.

    기여해 주신 Alex Xing에게 감사드립니다. (Bug #110216, Bug #35123848)

컴포넌트 관련 사항

  • INSTALL COMPONENT는 이제 하나 이상의 컴포넌트를 설치하는 동안 컴포넌트 시스템 변수의 값을 설정하는 SET 절을 포함합니다. 새 절은 변수 값을 할당하는 다른 방법과 관련된 불편함과 제한을 줄입니다. 사용 정보는 INSTALL COMPONENT Statement를 참조하십시오. (WL #10916)

사용 중단 및 제거 관련 사항

  • 사용자 정의 콜레이션(Adding a Collation to a Character Set 참조)은 이제 사용 중단되었습니다. 이제 다음 중 하나가 발생하면 경고가 로그에 기록됩니다:

    사용자 정의 콜레이션 지원은 향후 MySQL 버전에서 제거될 것으로 예상해야 합니다. (WL #14277)

MySQL Enterprise 관련 사항

  • MySQL Enterprise Edition은 이제 MySQL 8.0.13에서 도입된 플러그인 라이브러리 기반이 아니라, 컴포넌트 기반의 데이터 마스킹 및 비식별화 기능을 제공합니다. 컴포넌트 구현은 딕셔너리를 관리하기 위한 전용 권한을 제공하며, 특정 타입 목록을 다음 항목을 포함하도록 확장합니다:

    • Canada Social Insurance Number
    • United Kingdom National Insurance Number
    • International Bank Account Number
    • Universally Unique Identifier (UUID)

    개선된 테이블 기반 딕셔너리 레지스트리가 플러그인에서 사용하던 파일 기반 딕셔너리를 대체합니다. 컴포넌트 구현과 플러그인 구현 간 차이점의 요약은 Data-Masking Components Versus the Data-Masking Plugin을 참조하십시오. 기존 플러그인 사용자는 새로운 MySQL Enterprise Data Masking and De-Identification 컴포넌트를 설치하기 전에 서버 측 플러그인을 제거하고 해당 로드 가능 함수를 삭제해야 합니다. (Bug #33851601, WL #12641)

Performance Schema 관련 사항

  • Performance Schema Server Telemetry Traces 서비스가 이 릴리스에 추가되었습니다. 플러그인 및 컴포넌트가 SQL 문의 수명 주기와 관련된 알림을 검색할 수 있는 방법을 제공하는 인터페이스입니다.

    이 인터페이스에 대한 자세한 내용은 MySQL 소스 코드 문서의 Server telemetry traces service 섹션을 참조하십시오.

    다음이 추가되었습니다:

    • 상태 변수 Telemetry_traces_supported. 서버 텔레메트리 트레이스가 지원되는지 여부입니다. (Boolean)
    • threads 테이블에 TELEMETRY_ACTIVE 컬럼이 추가되었습니다. 스레드에 활성 텔레메트리 세션이 연결되어 있는지 여부를 나타냅니다.

    (WL #15059)

플러그인 관련 사항

  • 쿼리 rewrite 플러그인에 대한 digest 길이는 32바이트여야 하지만, 이것이 항상 강제되지는 않았습니다. (Bug #34991760)

추가되거나 변경된 기능

  • 중요한 변경: OpenSSL 라이브러리가 번들로 제공되는 플랫폼에서 MySQL Server에 링크된 OpenSSL 라이브러리가 버전 1.1.1t로 업데이트되었습니다. OpenSSL 버전 1.1.1t에서 수정된 문제는 https://www.openssl.org/news/cl111.txt에 설명되어 있습니다. (Bug #35092429)

  • Replication: MySQL 제품에서 사용되는 오래된 용어를 변경하기 위한 지속적인 작업의 일환으로, MySQL Replication과 관련된 오류 메시지에서 “master”, “slave”, “MTS” 용어가 각각 “source”, “replica”, “MTA”로 대체되었습니다. 여기에는 복제와 관련하여 messages_to_clients.txtmessages_to_error_log.txt에 나열된 모든 오류 메시지가 포함되며, 현재 작업은 다른 컨텍스트에서 사용되는 메시지에 대해서는 이 대체를 수행하지 않습니다.

    자세한 내용은 MySQL 8.0 Error Message Reference를 참조하십시오. (Bug #108422, Bug #34594819, WL #14191)

  • Replication: mysqlbinlog --start-position은 이제 --read-from-remote-server 또는 --read-from-remote-source 옵션도 함께 사용되지 않는 한 최대 18446744073709551615까지의 값을 허용하며, 이 경우 최댓값은 4294967295입니다. (Bug #77818, Bug #21498994)

  • 시스템 curl 라이브러리에 링크하는 대신 curl을 포함하는 바이너리 패키지가 curl 7.88.1을 사용하도록 업그레이드되었습니다. (Bug #34828111)

  • 명명된 컬럼의 기본값을 지정하기 위해 생성 컬럼을 DEFAULT(col_name)와 함께 사용하는 것은 허용되지 않으며, 이제 오류 메시지를 발생시킵니다. (Bug #34463652, Bug #34369580)

  • 새로운 TELEMETRY_LOG_ADMIN 권한은 이제 텔레메트리 로그 설정을 활성화합니다. 이 권한은 MySQL HeatWave on AWS를 통해서만 배포되는 telemetry_log 플러그인에 의해 정의됩니다. (Bug #111395, Bug #35494180)

  • 이제 성공적으로 실행된 명령문에 대해 Statement ID를 클라이언트에 반환할 수 있습니다. 이를 세션별로 활성화하려면 session_track_system_variables 값에 statement_id를 추가하거나, session_track_system_variables를 특수 값 *(asterisk)로 설정하십시오. (WL #15418)

수정된 버그

  • NDB Cluster: 반복적으로 동시 스키마 작업을 수행하는 동안 NDB 딕셔너리에서 테이블을 열 때 가끔 발생할 수 있는 일시적 오류가 재시도되지 않았습니다. (Bug #34843889)

  • NDB Cluster: 반복 중에 ordered 인덱스 스캔은 동시에 스캔되는 각 ordered 인덱스 프래그먼트 내에서 커서 위치를 유지합니다. ordered 인덱스 프래그먼트는 DML 트랜잭션 커밋의 결과로 수정되고 밸런싱되며, 이로 인해 스캔 커서를 트리 내에서 이동해야 할 수 있습니다. 쿼리 스레드가 설정된 상태(AutomaticThreadConfig가 1로 설정됨)로 실행할 때 여러 스레드가 동일한 인덱스 프래그먼트 트리 구조에 접근할 수 있으며, 여러 스레드의 스캔은 동일한 구조에 해당 커서가 존재할 수 있습니다.

    현재 문제는 DML 작업을 커밋할 때 스캔 커서를 이동하는 로직에서 모든 스캔 커서가 인덱스 프래그먼트를 소유한 LDM 스레드에 속한다고 가정했기 때문에 발생했으며, 이는 그러한 프래그먼트가 쿼리 스레드에 속할 수 있다는 가능성을 허용하지 않았습니다. (Bug #33379702)

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

  • InnoDB: innodb_doublewrite와 관련된 오류 메시지가 이제 오류 로그에 표시됩니다. (Bug #34883045, Bug #109330)

  • InnoDB: 온라인 DDL 작업이 범위를 벗어난 메모리에 접근하지 못하도록 방지했습니다. (Bug #34750489, Bug #108925)

  • InnoDB: ALTER TABLE... AUTO_INCREMENT가 MAX + 1보다 작게 설정될 수 있었으며 MAX + 1로 강제되지 않았습니다. (Bug #33419246, Bug #105092)

  • InnoDB: Innodb_data_pending_fsyncs가 변수 오버플로로 인해 매우 높은 부정확한 값을 표시할 수 있었습니다. (Bug #30133150)

  • Partitioning: 파티셔닝된 테이블에 대한 일부 IN() 쿼리가 항상 올바르게 처리되지는 않았습니다. (Bug #34801284)

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

  • Partitioning: INDEX_MERGE Optimizer 힌트를 사용하는 쿼리가 모든 경우에 올바르게 처리되지는 않았습니다. (Bug #34797257)

  • Replication: XID에 널 바이트가 포함된 XA 트랜잭션을 복구할 수 없었습니다. (Bug #34918985)

  • 복제: binlog_order_commits1과 같게 설정되었을 때, 임의의 두 트랜잭션과 커밋 단계의 임의의 하위 단계에 대해, 바이너리 로그에 먼저 기록된 트랜잭션이 예상대로 항상 해당 하위 단계를 먼저 실행하지는 않았습니다. (Bug #34703698)

  • 복제: 일부 바이너리 로그 이벤트가 항상 올바르게 처리되지는 않았습니다. (Bug #34617506)

  • 복제: 바이너리 로그 복구 프로세스가 가능한 모든 오류 상태를 보고하지 않았습니다. (Bug #33658850)

  • 복제: CHANGE REPLICATION SOURCE TO SOURCE_CONNECTION_AUTO_FAILOVER=1 이후, 장애 조치가 실제로는 해당 장애 조치에 예상되는 조건이었음에도 문제가 있음을 암시하는 여러 오해의 소지가 있는 경고를 로그에 생성했습니다. 이러한 로그 메시지는 그에 맞게 업데이트되었습니다. (Bug #32135376)

  • 복제: 트랜잭션이 실패했을 때, 부작용으로 복제 데이터 리포지토리와 관련된 불필요한 오류 메시지가 로그에 기록되었습니다. 이제 이러한 경우 실패한 트랜잭션 또는 그 원인의 문제와 직접 관련되지 않은 이러한 오류 메시지를 억제합니다. (Bug #19820134)

  • 복제: binlog_order_commitsOFF로 설정하면 다음 바이너리 로그 파일의 Previous_gtids 이벤트에서 GTID가 누락될 수 있었습니다.

    기여해 주신 Yewei Xu 및 Tencent 팀에 감사드립니다. (Bug #109485, Bug #34930969)

  • 복제: ER_RPL_REPLICA_ERROR_RUNNING_QUERY의 오류 메시지 텍스트에서 제안된 SQL 문을 수정했습니다.

    기여해 주신 Dan McCombs에게 감사드립니다. (Bug #109154, Bug #34822612)

  • 복제: 해시 스캔은 변경사항의 해시를 빌드하고, 대상 테이블 또는 인덱스를 스캔하며, 현재 엔트리에 대해 일치하는 변경사항이 있으면 이를 적용합니다. 빌드 단계에서는 이전 이미지만 사용하고, 이후 이미지는 모두 건너뜁니다. 일부 경우에는 (건너뛴) 이후 이미지에 대해 생성 컬럼이 계산되어 복제 오류가 발생했기 때문에 문제가 발생했습니다. 이는 해시 스캔과 같은 탐색 전용 호출에 대해 더 이상 생성 컬럼을 계산하지 않도록 하여 수정되었습니다.

    기여해 주신 dc huang에게 감사드립니다. (Bug #107366, Bug #34198907)

  • Replication: 특정한 드문 경우에, 두 번째 세션의 사용자가 WAIT_FOR_EXECUTED_GTID_SET()을 실행한 후 이 두 번째 세션이 여전히 첫 번째 세션의 다음 GTID 세트를 기다리는 동안, 한 세션에서 gtid_mode=OFF를 설정할 수 있었습니다. 이로 인해 두 번째 세션이 함수가 반환되기를 무기한 기다릴 수 있었습니다. (Bug #99921, Bug #31505993)

  • Group Replication: Performance Schema replication_group_communication_informationreplication_group_member_stats 테이블에 병렬로 접근하면, 이후의 Group Replication 작업이 중단되는 경우가 있었습니다. (Bug #34870181)

  • Group Replication: 특정한 경우에, Group Replication 보조 노드가 릴레이 로그를 제거하는 동안 예기치 않게 종료되었습니다. (Bug #34397106)

  • Group Replication: Group Replication 플러그인을 종료할 때, 관련 이벤트가 오류 로그에 보고되는 순서가 때때로 혼란을 초래했습니다. 의심의 여지를 없애기 위해, 이제 Plugin group_replication reported: 'Plugin 'group_replication' has been stopped.가 실제로 종료와 관련된 마지막 로그 메시지이며, 플러그인 종료와 관련된 다른 모든 이벤트가 로그에 기록된 후에만 기록되도록 했습니다. (Bug #109345, Bug #34887491)

  • Microsoft Windows: authentication_fido_client 플러그인은 Windows 클라이언트 호스트에서 FIDO 장치를 찾을 수 없는 경우 인증 프로세스 중 응답을 중지했습니다. (Bug #34918044)

  • 특정 경우에 CONVERT(utf8mb3_column USING UTF16)는 Cannot convert string '\x--...' from binary to utf16 오류와 함께 거부되었습니다. (Bug #35129361)

  • 문자열 컬럼에서 두 테이블을 조인하고, 테이블 중 하나의 컬럼에 해당 컬럼을 temporal 리터럴과 비교하는 추가 조건자가 있는 경우, 일부 경우에 상수 전파가 조인 조건을 잘못 수정하여 문자열을 비교할 때 문자열 의미 체계가 아니라 temporal 의미 체계를 사용하게 했습니다. 이로 인해 조인에서 잘못된 결과가 반환되었습니다. (Bug #35115909)

  • prepared statement에서 mysql_reset_connection() C API 함수를 호출한 후 반환되는 오류 메시지가 함수 이름을 올바르게 식별하지 못했습니다. (Bug #35107280)

  • 윈도잉 함수와 관련된 문제에 대한 이전 수정에서 발생한 회귀를 수정했습니다.

    기여해 주신 Dmitry Lenev에게 감사드립니다. (Bug #35061924)

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

  • 변환에서 서브쿼리를 대체할 때, 지정된 쿼리 블록에 서브쿼리가 포함되어 있는지 여부를 나타내는 내부 플래그(PROP_SUBQUERY)가 이후에 업데이트되지 않았습니다. (Bug #35060385)

  • 클라이언트가 캐릭터셋을 허용되지 않는 클라이언트 캐릭터셋(ucs2, utf16, utf16le 또는 utf32)으로 설정하면, 클라이언트가 인증 플러그인을 사용할 때 예기치 않은 동작이 발생할 수 있었습니다. (Bug #35054579)

  • EXPLAIN ANALYZE는 평균 로우 수가 1보다 작을 때 0을 표시했습니다. 이를 수정하기 위해 이제 EXPLAIN ANALYZEEXPLAIN FORMAT=TREE의 출력에서 숫자를 포맷하여, 0.001-999999.5 범위의 숫자는 십진수로 출력하고, 이 범위를 벗어나는 숫자는 engineering notation을 사용하여 출력합니다(예: 1.23e+9, 934e-6). 또한 후행 0은 더 이상 출력되지 않으며, 1e-12보다 작은 숫자는 0으로 출력됩니다.

    이는 숫자 값과 관계없이 일관된 정밀도를 보장하고 가독성을 개선하는 동시에, 반올림 오류를 최소화하는 데 도움이 됩니다. (Bug #34990948)

  • NTILE() 함수가 모든 경우에 올바르게 작동하지 않았습니다. (Bug #34986665)

  • 뷰에 대한 일부 조인이 올바르게 수행되지 않았습니다. (Bug #34985359)

  • correlated scalar subquery를 derived table로 변환하면, 서브쿼리에 중복 조건자가 포함된 경우 InnoDB 테이블에 대해 잘못된 결과가 발생했습니다. 이 문제의 영향을 받을 수 있는 쿼리의 예는 다음과 같습니다:

    SELECT * FROM t1 
    WHERE (
      SELECT t2.a FROM t2
      WHERE t2.a = t1.a AND t2.a = t1.a
        ) > 0;
    

    (Bug #34973220)

  • SPACE() 함수와 관련된 문제로 이어질 가능성이 있던 sql/item_strfunc.cc의 assert를 수정했습니다. (Bug #34962821)

  • ROW_COUNT()LPAD() 또는 RPAD()length 인수로 사용하면 예상대로 수행되지 않았습니다. (Bug #34961236)

  • ORDER BY 절에 CASE 함수가 있는 표현식을 포함한 윈도우 함수를 가진 쿼리가 서버 종료로 이어질 수 있었습니다. (Bug #34933045)

  • 이전 문제에 대한 수정으로 인해 HAVING 절을 최적화할 때 debug 빌드에서 assertion이 발생했습니다. (Bug #34923792)

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

  • mysqld_multi를 사용할 때 "--password" 사용을 "--password=*****"로 가리는 시스템이 "--password-history" 및 "--password-require-current" 정의도 "--password"로 일치시켰지만, 이제는 대신 "--password="를 명시적으로 검사합니다. (Bug #34918740)

  • 일부 경우에 mysql_bind_param() C API 함수를 호출하면 서버가 응답하지 않는 상태가 될 수 있었습니다. (Bug #34869076)

  • authentication_oci_client 플러그인은 항목 중 하나라도 공백으로 구분된 등호 문자를 포함하는 경우(예: key_file = /home/user/.oci/oci_api_key.pem) 유효한 설정 파일을 열 수 없었습니다. 이제 'key=value' 및 'key = value' 항목 형식이 모두 지원됩니다. (Bug #34864078)

  • INTERSECT 또는 EXCEPT 연산의 결과가 다른 테이블과 조인될 때 잘못된 결과가 반환되었습니다. 이 문제는 이러한 경우에 DISTINCT 또는 ALL과 함께 사용된 이러한 연산에 영향을 주었습니다. (Bug #34843764)

  • 뷰 쿼리를 준비할 때, 해당 작업은 (데이터 딕셔너리에 저장된 캐릭터셋 대신) 시스템 캐릭터셋을 사용한 다음 유효하지 않은 문자열 오류를 보고했습니다. (Bug #34800905)

  • 뷰를 포함한 파생 테이블에서 작동하는 준비된 문은 오류 후 테이블을 다시 여는 코드의 문제로 인해 예기치 않게 중지될 수 있었습니다. (Bug #34798403)

  • debug 빌드에서 RANDOM_BYTES() 함수에 의해 특정 경우 발생하던 assertion을 제거했습니다. (Bug #34781507)

  • 시작 시 persisted 변수가 설정되는 방식에 문제가 있어, 특정 변수가 해당 persisted 값으로 올바르게 설정되지 않았습니다. (Bug #34751419)

  • MAKETIME() 함수가 모든 경우에 올바르게 동작하지 않았습니다. (Bug #34745241)

  • 여러 인수를 사용하는 일부 함수가 예상된 결과를 생성하지 않았습니다. (Bug #34741801)

  • 테이블이 사용된 괄호로 묶인 쿼리 블록 외부의 ORDER BY에서, 그리고 해당 쿼리 블록 자체에는 LIMIT 또는 ORDER BY가 없는 경우, 테이블 참조가 오류를 발생시켰습니다. (Bug #34704011)

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

  • ON 절의 일부로 불가능한 조건을 포함하는 left join이 MySQL 5.7에서처럼 최적화되지 않았으므로, 이후 버전에서는 해당 불가능한 조건이 있을 때보다 없을 때 쿼리가 더 빠르게 실행되었습니다. 불가능한 조건을 포함하는 이러한 쿼리의 예는 SELECT * FROM t1 JOIN t2 ON t1.c1=t2.c1 AND 1=2입니다. (Bug #34668756)

  • 외부 쿼리 블록으로 병합된 파생 테이블의 일부이거나, 세미 조인으로 변환된 서브쿼리의 일부였던 사용자 정의 함수의 경우, 이 UDF가 결정적인지 여부에 대한 정보가 처리 중에 손실되었습니다. (Bug #34666531)

  • JSON 로깅이 활성화되어 있고 감사 로그 필터 정의에 이벤트 서브클래스가 지정된 경우, 빈 항목("": { })이 기록된 이벤트의 끝에 추가되었습니다. (Bug #34659904)

  • 일부 서브쿼리가 제대로 실행되지 않았습니다. (Bug #34616553)

  • SELECT 쿼리의 asymmetric_encrypt() 컴포넌트 함수가 복호화할 NULL 필드를 만난 후, NULL이 아닌 다른 암호화된 필드에 대해 NULL 값을 반환할 수 있었습니다. (Bug #34598912)

  • 서버가 audit log 플러그인을 제거한 후 항상 정상적으로 종료되지는 않았습니다. (Bug #34594035)

  • 특정 antijoin이 서버에서 올바르게 처리되지 않았습니다. (Bug #34370673)

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

  • MySQL 5.7 Optimizer에 로우를 필터링하기 위한 인덱스 선택지가 2개, 즉 하나는 primary이고 하나는 secondary인 경우, range scan이 더 많은 키 부분을 사용하기 때문에 secondary 인덱스의 range scan을 선택합니다. MySQL 8.0은 이 로직을 사용하지 않고, 대신 WHERE 절 필터링으로 로우를 필터링하기 위해 primary 인덱스를 선택했습니다. 이러한 경우에는 LIMIT가 존재하고 데이터 분포의 특성 때문에 primary key 사용이 적합하지 않습니다. 상수 제거 때문에 ORDER BY를 처리하는 동안 secondary 인덱스가 고려되지 않았습니다. 이로 인해 동일한 쿼리에 대해 MySQL 5.7과 MySQL 8.0에서 매우 다른 쿼리 계획이 생성되었습니다.

    MySQL 8.0에서는 ORDER BY 평가 중 인덱스의 상수 키 부분을 건너뛰는 작업을 쿼리가 상수 최적화된 경우에만 수행하도록 하여 이 문제를 해결합니다. 이 작업은 이 시점에는 수행할 수 있지만, LIMIT 분석 중에는 수행할 수 없습니다. (Bug #34291261)

  • MySQL 데이터 딕셔너리는 se_private_id 값의 실패한 조회(찾을 수 없는 ID)를 캐시하며, 이는 InnoDB가 이러한 ID를 재사용하지 않는다는 사실에 의존하여 InnoDB 전용 코드의 실행 속도를 높입니다. 이 가정은 다른 스토리지 엔진, 특히 NDB에는 반드시 성립하지 않으며, 이 문제는 이전에 이 캐시를 사용하지 않도록 하여 해결되었습니다.

    이전에 NDB에 대해 수행한 수정 사항을 확장하여, 이제 캐시 조회가 테이블이 InnoDB 스토리지 엔진을 사용하는 경우에만 사용되도록 합니다. (Bug #34145006)

    References: 참조: Bug #33824058.

  • DENSE_RANK()를 사용하고, 여기에 WITH ROLLUP이 추가되었을 가능성이 있는 일부 쿼리에서 예상치 못한 결과가 확인되었습니다. (Bug #34099408)

  • 이전에 ROLLUP 처리를 다시 구현하기 위해 수행된 작업 이후 sql/sql_tmp_table.cc에서 발생한 assert를 수정했습니다. (Bug #33830659)

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

  • 어떤 테이블도 사용하지 않는 일부 CTE가 항상 올바르게 처리되지는 않았습니다. (Bug #33725542)

    References: 이 문제는 다음의 회귀입니다: Bug #27062031.

  • 쿼리의 ORDER BY 목록에만 존재하는 윈도우 함수 호출의 윈도우 프레임에서 로우에 접근하면 오류가 발생했습니다. (Bug #33069747)

  • ORDER BY column과 함께 사용된 PERCENT_RANK()가 올바른 결과를 반환하지 않았습니다. (Bug #33064174)

    References: 이 문제는 다음의 회귀입니다: Bug #27484133.

  • --exclude-tables--include-tables mysqlpump 옵션이 뷰를 처리하지 못했습니다. (Bug #21303549)

  • MySQL systemd 서비스 unit 설정을 After=network-online.target에서 Wants=network-online.target으로 변경하여, 서비스가 시작되기 전에 설정된 모든 네트워크 장치를 사용할 수 있고 IP 주소가 할당되도록 했습니다. (Bug #109996, Bug #35068274)

  • AVG(...)OVER (ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING)이 올바른 결과를 반환하지 않았습니다. (Bug #109725, Bug #35013880)

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

  • subquery_to_derived optimizer switch가 활성화된 경우, SELECT 1 FROM t1 WHERE NOT EXISTS (VALUES ROW(1), ROW(2)) 형식의 쿼리가 디버그 빌드에서 assert를 발생시켰습니다. (Bug #109723, Bug #35014318)

    참조: 다음도 참조하십시오: Bug #108910, Bug #34746261.

  • mysqlimport--delete 옵션과 함께 사용할 때 예약어 테이블 이름을 이스케이프하지 않았습니다. (Bug #109711, Bug #34999015)

  • 파생 테이블로 푸시다운하기 위해 조건을 복제할 때, 조건을 나타내는 문자열의 문자는 128보다 작은 값(ASCII 하위 집합)에 대해서만 utfmb4로 올바르게 변환되었으며, ASCII 하위 집합 밖의 코드 포인트는 유효하지 않은 문자로 변환되어 결과 캐릭터 문자열이 유효하지 않게 되었습니다. UNION이 없는 파생 테이블의 경우, 이로 인해 파생 테이블의 컬럼 이름이 ASCII 하위 집합 밖의 문자를 사용하고 WHERE 조건에서 사용될 때 문제가 발생했습니다. UNION이 있는 파생 테이블의 경우, WHERE 조건에 ASCII 하위 집합 밖의 문자가 있을 때 문제가 발생했습니다.

    이러한 경우 조건을 나타내는 데 사용되는 문자열을 연결 캐릭터셋으로 초기화하여 이 문제를 수정했습니다. (Bug #109699, Bug #34996488)

  • mysqldump 버전 8.0.32에서 --single-transaction을 사용하려면 RELOAD 또는 FLUSH_TABLES 권한이 필요했습니다. 이제 이 요구 사항은 gtid_mode=ON(기본값 OFF)이고 --set-gtid-purged = ON|AUTO(기본값 AUTO)인 경우에만 적용됩니다. (Bug #109685, Bug #109701, Bug #34993824, Bug #34998910, Bug #35020512)

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

  • sha256_scramble_generator.ccsha2_password_common.cc의 스크램블 생성기 알고리즘에 대한 내부 문서에 존재하던 여러 문제를 수정했습니다.

    기여해 주신 Niklas Keller에게 감사드립니다. (Bug #109576, Bug #34967141)

  • CREATE USER IF NOT EXISTS는 사용자가 이미 존재하고 비밀번호가 업데이트되지 않은 경우에도 비밀번호 이력 항목을 추가했습니다. 이로 인해 이후의 ALTER USER 문이 거부되었습니다. (Bug #109415, Bug #34906592)

  • eq_ref 액세스를 사용하는 많은 조인이 이전 버전만큼 잘 수행되지 않았습니다. 이 문제는 MySQL 8.0.29에서 처음 보고되었습니다. (Bug #109361, Bug #34891365)

  • 해시 외부 조인이 때때로 NULL을 decimal 0 또는 non-padding 콜레이션을 사용하는 빈 문자열과 잘못 매칭하여 잘못된 결과로 이어졌습니다. (Bug #109211, Bug #34837464)

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

  • ALTER INSTANCE RELOAD TLS가 내부적으로 사용하는 객체는 reader 수가 상당히 자주 0에 도달해야 한다는 가정하에, reader 수가 0에 도달할 때까지 해제되지 않았습니다. SSL handshake 중에 보유되는 읽기 잠금은 일반적으로 네트워크 호출을 포함하는 비용이 큰 작업이므로, 클라이언트와 서버 간 왕복에 지나치게 긴 시간이 걸리면 잠금이 비교적 오랜 시간 동안 보유되었습니다. 이는 이 객체의 값을 변경할 때 충분한 수의 수신 SSL 연결이 생성되고 있으면 reader 수가 적절한 시간 안에 0에 도달하지 않을 수 있으며, 잠금을 보유한 스레드가 잠금이 해제될 때까지 CPU의 100%를 사용하게 남겨진다는 것을 의미했습니다.

    이 객체에 대한 포인터를 새 값으로 설정한 후, 그러나 이전 객체를 해제하기 전에 대기를 추가하여 이를 수정했습니다.

    기여해 주신 Sinisa Milivojevic에게 감사드립니다. (Bug #107567, Bug #34284186)

  • mysqldump 또는 mysqlpump가 필드의 기본값을 UTF-8로 변환할 수 없는 경우(예를 들어, 필드가 BINARY 타입이고 기본값이 유효한 UTF-8과 일치하지 않는 경우), 해당 작업은 가져오기에 유효하지 않은 결과를 생성했습니다. 또한 --hex-blob 옵션을 사용해도 이 문제가 해결되지 않았습니다. 이제 기본값을 시스템 캐릭터셋으로 변환합니다. 이것이 실패하면, 서버는 사람이 더 읽기 쉽도록 대신 값을 16진수로 전송합니다. (Bug #104840, Bug #33322551)

  • C API(libmysqlclient) 클라이언트 라이브러리를 사용하는 연결은 FUTURE 암호화 정책에서 실패할 수 있었습니다. (Bug #104778, Bug #33316709)

  • 공유 구체화를 사용한 공통 테이블 식에 대한 임시 테이블을 복제하는 동안, 복제된 임시 테이블이 해시 중복 제거를 사용하는 것으로 표시되지 않아 잘못된 결과가 발생했습니다. 이제 복제된 임시 테이블에 대해 해시 필드를 올바르게 설정하고, 이를 고려하도록 숨겨진 필드 수를 업데이트합니다. (Bug #102251, Bug #32383712)

    참조: 다음도 참조하십시오: Bug #103052, Bug #32659629.

  • CREATE EVENTALTER EVENT는 전달된 모든 값(DO 절에 있는 값은 제외)이 실제로 값을 확인하지 않고 스칼라로 해석된다고 가정했습니다. 이로 인해 그러한 값이 실제로 로우인 경우 assertion이 발생했습니다.

    이제 이러한 항목을 해석할 때 컬럼 수에 대한 명시적 검사를 수행하며, 항목이 스칼라 값이 아니라 로우를 생성하는 경우 오류를 보고합니다. (Bug #57552, Bug #11764690)

  • 기반 필드가 상수인 뷰 참조는 해당 참조가 outer join의 inner 테이블 일부인 경우 상수로 표시되지 않습니다. 조건을 파생 테이블로 push down할 때 해당 참조가 제거되고 기반 필드만 복제되어 이것이 상수가 되었으며, 잘못된 결과로 이어진다는 점이 확인되었습니다.

    이 문제를 해결하기 위해, 먼저 조건에서 사용하는 테이블이 파생 테이블과 일치하는지 또는 상수 표현식인지 확인하는 검사를 추가하여 그러한 조건을 파생 테이블로 push down하지 않도록 보장합니다. 이 둘 중 하나에 해당하는 경우에만 실제로 조건을 push down합니다. (Bug #34661, Bug #11747971)