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

MySQL 8.0.16 릴리스 노트

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

저자: Oracle 작성: 2019.04.25 약 69분 40,877자

DBA를 위한 핵심 내용

MySQL 8.0.16은 DBA 관점에서 업그레이드 방식, 권한 모델, 제약 조건, 암호화/복제 운영이 크게 바뀐 릴리스입니다. mysql_upgrade 의존도가 줄고 서버 기동 시 자동 업그레이드가 수행되며, CHECK 제약 조건이 실제로 강제되기 시작하고, SYSTEM_USER/partial revoke 등 계정 권한 모델이 세분화되었습니다. 보안 측면에서는 TLS 1.3, 런타임 TLS 재적재, binlog/relay log 및 테이블 암호화 관리가 강화되었지만, Group Replication의 TLS 1.3 미지원과 통신 프로토콜 버전 관리, 그리고 8.0.16~8.0.28 범위의 range optimizer 메모리 증가/OOM 가능성은 업그레이드 검증 항목에 포함하는 것이 좋습니다. (Google Cloud known issues, Tenable)

  1. 8.0.16부터 서버가 기동 시 기존 mysql_upgrade 작업을 자동 수행하며, --upgrade 옵션으로 동작을 제어합니다. 운영 절차에서는 업그레이드 직후 첫 기동 시간이 길어질 수 있음을 감안하고, 데이터 딕셔너리 버전 상승 및 롤백 불가성에 대비해 백업/리허설을 선행해야 합니다.
  2. SYSTEM_USER 권한으로 시스템 계정과 일반 계정이 구분되며, partial_revokes를 통해 전역 권한에서 특정 스키마 권한을 제외할 수 있습니다. 운영 자동화, 계정 위임, DEFINER 지정, 세션 종료 권한이 달라질 수 있으므로 기존 DBA/운영 계정의 권한 모델을 재검토해야 합니다.
  3. CHECK 제약 조건이 더 이상 무시되지 않고 실제로 적용됩니다. 과거에는 통과하던 DDL/DML이 실패할 수 있으므로, 애플리케이션 DDL과 데이터 품질을 사전에 점검해야 합니다. 외래 키 제약 조건명 생성 방식도 일부 되돌려져, 제약 조건 이름에 의존하는 스크립트는 확인이 필요합니다.
  4. TLS 1.3 지원, ALTER INSTANCE RELOAD TLS, binlog master key rotation, default_table_encryption, mysql 시스템 tablespace 암호화 지원이 추가되었습니다. 단, Group Replication은 TLS 1.3을 지원하지 않으므로 복제망 암호화 정책을 별도로 검증해야 합니다.
  5. 대형 메시지 fragmentation, message cache 크기 설정, autorejoin, 통신 프로토콜 버전 함수가 추가되고 group_replication_exit_state_action 기본값이 READ_ONLY로 변경되었습니다. 혼합 버전 그룹에서는 통신 프로토콜을 명시적으로 관리해야 하며, 업그레이드 후에도 자동으로 최신 프로토콜로 올라가지 않는 점에 주의해야 합니다.
  6. InnoDB undo/암호화/DDL, GTID/binlog rotation, Group Replication split-brain성 의사결정, 잘못된 쿼리 결과와 서버 종료 가능성 등 다수의 결함이 수정되었습니다. 특히 8.0.14/8.0.15에서 업그레이드 실패, Group Replication, 데이터 딕셔너리 관련 문제를 겪었다면 우선 검토할 가치가 있습니다.

계정 관리 관련 사항

  • 이전에는 DROP ROLE 권한이 있는 사용자가 DROP ROLE 문을 사용하여 잠긴 계정 또는 잠금 해제된 계정을 삭제할 수 있었습니다. 이제 DROP ROLE 권한이 있는 사용자는 DROP ROLE을 사용하여 잠긴 계정만 삭제할 수 있습니다(잠금 해제된 계정은 아마도 단순히 역할로만 사용되는 것이 아니라 서버에 로그인하는 데 사용되는 사용자 계정입니다). CREATE USER 권한이 있는 사용자는 DROP ROLE을 사용하여 잠긴 계정 또는 잠금 해제된 계정을 삭제할 수 있습니다. (Bug #28953158, Bug #93263)

  • MySQL 계정 관리 기능에 여러 변경 사항이 적용되었습니다:

    • MySQL은 이제 사용자 계정 범주의 개념을 통합하며, 시스템 사용자와 일반 사용자는 새 SYSTEM_USER 권한을 보유했는지 여부에 따라 구분됩니다:

      • 시스템 사용자는 SYSTEM_USER 권한을 보유한 사용자입니다. 시스템 사용자는 시스템 계정과 일반 계정 모두에 대해 작업을 수행할 수 있습니다.
      • 일반 사용자는 SYSTEM_USER 권한을 보유하지 않은 일반적인 사용자입니다. 일반 사용자는 일반 계정에 대해 작업을 수행할 수 있지만, 시스템 계정에 대해서는 수행할 수 없습니다.

      사용자가 일반 계정에 대해 지정된 작업을 수행할 적절한 권한을 가지고 있으면, SYSTEM_USER는 해당 사용자가 시스템 계정에 대해서도 그 작업을 수행할 수 있게 합니다. SYSTEM_USER는 다른 어떤 권한도 내포하지 않으므로, 지정된 계정 작업을 수행할 수 있는 능력은 필요한 다른 권한의 보유 여부에 계속 기반합니다. 예를 들어 사용자가 일반 계정에 SELECTUPDATE 권한을 부여할 수 있다면, SYSTEM_USER가 있을 경우 해당 사용자는 시스템 계정에도 SELECTUPDATE를 부여할 수 있습니다.

      시스템 계정과 일반 계정을 구분하면 SYSTEM_USER 권한이 있는 계정을 해당 권한이 없는 계정으로부터 보호하여 특정 계정 관리 문제를 더 잘 제어할 수 있습니다. 예를 들어 CREATE USER 권한은 새 계정 생성뿐만 아니라 기존 계정의 수정과 제거도 가능하게 합니다. 시스템 사용자 개념이 없으면 CREATE USER 권한이 있는 사용자는 root 계정을 포함한 모든 기존 계정을 수정하거나 삭제할 수 있습니다. 시스템 사용자 개념은 root 계정(그 자체가 시스템 계정)에 대한 수정을 시스템 사용자만 수행할 수 있도록 제한할 수 있게 합니다. CREATE USER 권한이 있는 일반 사용자는 여전히 기존 계정을 수정하거나 삭제할 수 있지만, 일반 계정만 가능합니다.

    SYSTEM_USER 권한의 다른 운영상 영향은 다음과 같습니다:

    • SYSTEM_USER 권한이 있는 세션은 다른 필요한 권한에 더해 SYSTEM_USER 권한이 있는 사용자만 종료할 수 있습니다.
    • SYSTEM_USER 권한이 있는 계정은 다른 필요한 권한에 더해 SYSTEM_USER 권한이 있는 사용자만 저장 객체의 DEFINER로 지정할 수 있습니다.
    • SYSTEM_USER 권한이 있는 역할은 mandatory_roles 시스템 변수의 값에 나열될 수 없습니다.

    자세한 내용은 Account Categories를 참조하십시오.

    • 이전에는 특정 스키마를 제외하고 전역적으로 적용되는 권한을 부여할 수 없었습니다. 이제 새 partial_revokes 시스템 변수가 활성화된 경우 이것이 가능합니다. 예를 들어 다음 문은 계정이 mysql 시스템 스키마에 있는 테이블을 제외한 모든 테이블에서 선택하거나 모든 테이블에 삽입할 수 있게 합니다:

          SET PERSIST partial_revokes = ON;
          GRANT SELECT, INSERT ON *.* TO u1;
          REVOKE SELECT, INSERT ON mysql.* FROM u1;
          ```
      
          서버는 `mysql.user` 시스템 테이블의 `User_attributes` 컬럼에 `Restrictions` 속성을 추가하여 부분 취소를 기록합니다. [`SHOW GRANTS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-grants.html)는 부분 취소를 나타내기 위해 출력에 [`REVOKE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/revoke.html) 문을 포함합니다.
      
          [`partial_revokes`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_partial_revokes)를 활성화하면 MySQL은 스키마 이름에서 이스케이프되지 않은 `_` 및 `%` SQL 와일드카드 문자를, `\_` 및 `\%`로 이스케이프된 것처럼 리터럴 문자로 처리합니다. 이것은 권한 할당의 해석을 변경하므로, [`partial_revokes`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_partial_revokes)가 활성화될 수 있는 MySQL 설치에서는 스키마 권한 할당에서 이스케이프되지 않은 와일드카드 문자를 피하는 것이 바람직할 수 있습니다.
      
          자세한 내용은 [Privilege Restriction Using Partial Revokes](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/partial-revokes.html)를 참조하십시오.
        - [`GRANT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/grant.html) 문에는 문 실행에 사용할 권한 컨텍스트에 대한 추가 정보를 지정하는 새로운 `AS user [WITH ROLE]` 절이 있습니다. 이 문법은 SQL 수준에서 볼 수 있지만, 주된 목적은 이러한 제한이 바이너리 로그에 나타나도록 하여 부분 취소에 의해 부과되는 권한 부여자 권한 제한을 모든 노드에 걸쳐 균일하게 복제할 수 있게 하는 것입니다.
      
          자세한 내용은 [GRANT Statement](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/grant.html)를 참조하십시오.
      
        (WL #12098, WL #12364, WL #12820)
      
      ## C API 관련 사항
      
      - MySQL C API는 이제 MySQL 서버와의 논블로킹 통신을 위한 비동기 함수를 지원합니다:
      
        - [`mysql_real_connect_nonblocking()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-real-connect-nonblocking.html)
        - [`mysql_real_query_nonblocking()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-real-query-nonblocking.html)
        - [`mysql_store_result_nonblocking()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-store-result-nonblocking.html)
        - [`mysql_next_result_nonblocking()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-next-result-nonblocking.html)
        - [`mysql_fetch_row_nonblocking()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-fetch-row-nonblocking.html)
        - [`mysql_free_result_nonblocking()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-free-result-nonblocking.html)
      
        각 함수는 `_nonblocking` 접미사가 없는 동일한 이름의 동기 함수에 대응하는 비동기 함수입니다. 동기 함수는 서버 연결에서 읽기 또는 쓰기가 대기해야 하는 경우 블록됩니다. 비동기 함수는 애플리케이션이 서버 연결에서 작업을 계속 진행할 준비가 되었는지 확인할 수 있게 합니다. 준비되지 않은 경우 애플리케이션은 나중에 다시 확인하기 전에 다른 작업을 수행할 수 있습니다. [C API 비동기 인터페이스](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/c-api-asynchronous-interface.html)를 참조하십시오. (WL #11381)
      
      ## 캐릭터셋 지원
      
      - MySQL은 이제 `utf8mb4` 유니코드 캐릭터셋에 대해 새로운 중국어 콜레이션인 `utf8mb4_zh_0900_as_cs`를 지원합니다. `utf8mb4_zh_0900_as_cs`는 MySQL에서 유니코드에 사용할 수 있는 첫 번째 중국어 언어별 콜레이션입니다. 이 콜레이션은 악센트 구분 및 대소문자 구분을 수행합니다. 이 콜레이션의 특성은 적용 가능한 경우 언어별 규칙이 우선한다는 점을 제외하면 `utf8mb4_0900_as_cs`와 유사합니다. 자세한 내용은 [유니코드 캐릭터셋](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/charset-unicode-sets.html)을 참조하십시오. (WL #11825)
      
      ## 컴파일 관련 사항
      
      - **CMake**는 이제 사용 가능하고 명시적으로 비활성화되지 않은 경우, Clang에 대해 빌드 프로세스가 **llvm** **lld** 링커와 링크하도록 합니다. 이 링커의 사용을 비활성화하려면 [`-DUSE_LD_LLD=OFF`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_use_ld_lld) 옵션을 지정하십시오. (Bug #29264211)
      - EL6 및 EL7에서의 빌드는 이제 `devtoolset-7`이 아니라 `devtoolset-8`의 컴파일러를 사용하려고 시도합니다. (Bug #29198846)
      - 서버 빌드용 Boost 라이브러리의 최소 버전은 이제 1.69.0입니다. (Bug #29114233)
      - Visual Studio 2017에 대한 설정 시점 검사가 충분히 구체적이지 않았습니다. MySQL 컴파일 검사는 이제 최소한 Visual Studio update 15.8을 요구하며, 이는 버전 번호 1915입니다. (Bug #28970895)
      - 이제 MySQL은 C++14를 사용하여 컴파일할 수 있습니다. 컴파일러 지원에는 다음 최소 버전 요구 사항이 적용됩니다:
      
        - GCC 5.3 (Linux)
        - Clang 4.0 (FreeBSD)
        - XCode 9 (macOS)
        - Developer Studio 12.6 (Solaris)
        - Visual Studio 2017 (Windows)
      
        (WL #12424)
      
      ## 설정 관련 사항
      
      - MySQL 설정에는 이제 최소 **CMake** 버전 3.4.3이 필요합니다. 이로 인해 일부 Red Hat 및 Oracle Linux 플랫폼에서는 **cmake** 대신 **cmake3**를 사용해야 합니다. (Bug #29246216)
      - [`WITH_LZMA`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_with_lzma) **CMake** 옵션이 제거되었습니다. (Bug #29153932, Bug #93755)
      - 이제 `CMake` 설정에서 적절한 경우 `EXCLUDE_FROM_ALL` 옵션이 사용되어, 라이브러리는 실제로 어떤 실행 파일에서 사용되는 경우에만 빌드됩니다. (Bug #29052599)
      - 새로운 [`WITH_JEMALLOC`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_with_jemalloc) **CMake** 옵션은 `-ljemalloc`과 링크할지 여부를 나타냅니다. 이 옵션이 활성화되면 내장 `malloc()`, `calloc()`, `realloc()`, `free()` 루틴이 비활성화됩니다. 기본값은 `OFF`입니다. (Bug #29027974)
      - 새로운 [`WITH_LSAN`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_with_lsan) **CMake** 옵션은 AddressSanitizer 없이 LeakSanitizer를 실행할지 여부를 나타냅니다. 기본값은 `OFF`입니다. (Bug #28936574)
      - 새로운 [`WITH_ROUTER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_with_router) **CMake** 옵션은 MySQL Router를 빌드할지 여부를 나타냅니다. 기본값은 `ON`입니다. (Bug #28759234)
      - MySQL Server는 이제 정상 운영 모드로 서버를 실행하지 않고 시작 설정에 문제가 있는지 확인할 수 있게 하는 [`--validate-config`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_validate-config) 옵션을 지원합니다. 자세한 내용은 [서버 설정 검증](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-configuration-validation.html)을 참조하십시오. (WL #12360)
      
      ## 사용 중단 및 제거 관련 사항
      
      - `TempTable` 스토리지 엔진은 이제 디스크의 내부 임시 테이블을 관리하는 데 항상 `InnoDB`를 사용하며, 이 작업에 사용되는 스토리지 엔진의 선택은 더 이상 사용자가 설정할 수 없습니다. [`internal_tmp_disk_storage_engine`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_internal_tmp_disk_storage_engine) 시스템 변수가 제거되었습니다. (Bug #91377, Bug #28234637, WL #11974)
      
        참조: 다음도 참조하십시오: Bug #28081038, Bug #82556, Bug #27408352.
      
      ## 설치 관련 사항
      
      - 이전에는 새 MySQL 버전을 설치한 후 다음 시작 시 MySQL 서버가 데이터 딕셔너리 테이블을 자동으로 업그레이드했으며, 그 후 DBA가 `mysql` 스키마의 시스템 테이블뿐 아니라 `sys` 스키마 및 사용자 스키마와 같은 다른 스키마의 객체를 업그레이드하기 위해 **mysql_upgrade**를 수동으로 호출해야 했습니다.
      
        이제 서버는 이전에 **mysql_upgrade**가 처리하던 작업을 수행합니다. 새 MySQL 버전을 설치한 후 이제 서버는 다음 시작 시 필요한 모든 업그레이드 작업을 자동으로 수행하며, DBA가 **mysql_upgrade**를 호출하는 것에 의존하지 않습니다. 또한 서버는 도움말 테이블의 내용을 업데이트합니다(이는 **mysql_upgrade**가 수행하지 않던 작업입니다). 새로운 [`--upgrade`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_upgrade) 서버 옵션은 서버가 자동 데이터 딕셔너리 및 서버 업그레이드 작업을 수행하는 방식을 제어합니다. 자세한 내용은 [Upgrading MySQL](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/upgrading.html)을 참조하십시오.
      
        이 업그레이드 절차 변경으로 인해 일부 항목이 사용 중단됩니다:
      
        - **mysql_upgrade**는 더 이상 필요하지 않으므로 사용 중단됩니다.
        - [`--no-dd-upgrade`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_no-dd-upgrade) 서버 옵션은 [`--upgrade`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_upgrade) 옵션이 이를 대체하므로 사용 중단됩니다.
      
        **mysql_upgrade** 및 [`--no-dd-upgrade`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_no-dd-upgrade) 옵션은 향후 MySQL 버전에서 제거될 예정입니다. (Bug #28146052, Bug #28162609, Bug #91205, Bug #29185739, Bug #27740692, Bug #28547424, Bug #91961, WL #12413, WL #12918)
      
      ## 패키징 관련 사항
      
      - MySQL Cluster 8.0용 Docker 이미지는 이제 [다운로드할 수 있습니다](https://hub.docker.com/r/mysql/mysql-cluster/tags). (Bug #30010921, Bug #96084)
      - 시스템 `curl` 라이브러리에 링크하는 대신 `curl`을 포함하는 바이너리 패키지는 이제 `curl` 7.64.0을 사용합니다. (Bug #29357198)
      - Henry Spencer 정규식 라이브러리(`extra/regex`)는 더 이상 MySQL 8.0에서 사용되지 않으며, 더 이상 소스 배포판에 포함되지 않습니다. (Bug #29192306)
      - 최신 버전의 `glibc`에 Sun RPC가 포함되지 않으므로, RPM 패키지는 이제 `libtirpc` 및 `rpcgen`에 대한 의존성을 가집니다. (Bug #28995257)
      - `support-files/magic` 파일이 MySQL 소스 트리에서 제거되었습니다. 대부분의 MySQL 파일 형식은 운영 체제 파일 타입 기능으로 처리됩니다. (Bug #18335080, Bug #71898)
      - MySQL은 이제 MySQL Server 및 Test Suite용 “Minimal Install” Linux generic 바이너리 다운로드 패키지를 제공합니다. Minimal install 패키지는 디버그 바이너리를 제외하고 디버그 심볼이 제거되어, 일반 Linux generic 바이너리 패키지보다 크기가 상당히 작습니다. 다운로드는 https://dev.mysql.com/downloads/ 에서 제공됩니다.
      - MySQL Enterprise Edition용 Docker 이미지는 이제 [My Oracle Support](https://support.oracle.com/)에서 다운로드할 수 있습니다.
      
      ## 파서 관련 사항
      
      - 파서는 더 이상 테이블 별칭을 지정하기 위한 문서화되지 않은 비표준 `= alias_name` 문법을 허용하지 않습니다. (Bug #29205289)
      - 파서는 이제 이전에는 저장 프로그램 내에서 레이블로 사용하는 것이 제한되었던 여러 추가 비예약 키워드를 레이블로 사용할 수 있도록 허용합니다: `ACCOUNT`, `ALWAYS`, `BACKUP`, `CLOSE`, `FORMAT`, `GROUP_REPLICATION`, `HOST`, `INVISIBLE`, `OPEN`, `OPTIONS`, `OWNER`, `PARSER`, `PORT`, `REMOVE`, `RESTORE`, `ROLE`, `SECONDARY`, `SECONDARY_ENGINE`, `SECONDARY_LOAD`, `SECONDARY_UNLOAD`, `SECURITY`, `SERVER`, `SOCKET`, `SONAME`, `UPGRADE`, `VISIBLE`, `WRAPPER`. (Bug #29033659)
      - 파서는 outer join에 대한 ODBC 이스케이프 문법(`{ OJ outer_join }`)을 허용했지만, `OJ`가 아닌 식별자도 허용했습니다. 파서는 이제 `OJ`만 허용합니다.
      
        이제 `OJ`는 비예약 키워드입니다.
      
        (Bug #22320942)
      
      ## Performance Schema 관련 사항
      
      - 새 Performance Schema [`keyring_keys`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-keyring-keys-table.html) 테이블은 MySQL Keyring의 키에 대한 메타데이터를 노출합니다. 키 메타데이터에는 키 ID, 키 소유자, 백엔드 키 ID가 포함됩니다. [`keyring_keys`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-keyring-keys-table.html) 테이블은 키 내용과 같은 민감한 keyring 데이터를 노출하지 않습니다. [The keyring_keys table](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-keyring-keys-table.html)을 참조하십시오. (WL #11543)
      
      ## 플러그인 관련 사항
      
      - MySQL은 이제 서버가 [`CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html) 문을 파싱하고 실행하기 전에 서버가 수신한 해당 문을 수정하는 `ddl_rewriter` 플러그인을 포함합니다. 이 플러그인은 `ENCRYPTION`, `DATA DIRECTORY`, `INDEX DIRECTORY` 절을 제거하며, 암호화된 데이터베이스 또는 데이터 디렉터리 외부에 테이블이 저장된 데이터베이스에서 생성된 SQL 덤프 파일로부터 테이블을 복원할 때 유용할 수 있습니다. 예를 들어, 이 플러그인은 이러한 덤프 파일을 암호화되지 않은 인스턴스 또는 데이터 디렉터리 외부 경로에 접근할 수 없는 환경으로 복원할 수 있게 할 수 있습니다. 설치되면 `ddl_rewriter`는 플러그인 메모리 사용량을 추적하기 위한 Performance Schema `memory/rewriter/ddl_rewriter` 계측기를 노출합니다. 자세한 내용은 [The ddl_rewriter Plugin](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/ddl-rewriter.html)을 참조하십시오. (WL #12668)
      
      ## 보안 관련 사항
      
      - 이전에는 grant 테이블이 손상된 경우 MySQL 서버가 오류 로그에 메시지를 기록했지만, [`--skip-grant-tables`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_skip-grant-tables) 옵션이 지정된 것처럼 계속 실행되었습니다. 이로 인해 실제로 [`--skip-grant-tables`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_skip-grant-tables)가 지정되지 않았더라도 서버가 예기치 않은 상태로 동작했습니다. 이제 서버는 [`--skip-grant-tables`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_skip-grant-tables)로 시작되지 않은 한, 오류 로그에 메시지를 기록한 후 중지됩니다. (해당 옵션으로 서버를 시작하면 진단 작업을 수행하기 위해 연결할 수 있습니다.) (Bug #29394501, Bug #94394, WL #12971)
      - 일부 플랫폼(Windows, macOS 및 Generic Linux)에서 MySQL과 함께 번들로 제공되는 OpenSSL 라이브러리가 버전 1.0.2r로 업그레이드되었습니다. 그 밖의 모든 플랫폼에서는 MySQL이 시스템에 설치된 OpenSSL을 사용합니다. 새 OpenSSL 버전에서 수정된 문제는 [http://www.openssl.org/news/vulnerabilities.html](http://www.openssl.org/news/vulnerabilities.html)에 설명되어 있습니다. (Bug #28988091)
      - 익명 사용자에게 역할을 부여하는 것은 더 이상 지원되지 않습니다. 이러한 역할이 문제가 되는 동작을 유발했기 때문입니다. (Bug #28910120)
      - OpenSSL 1.1.1은 암호화된 연결을 위한 TLS v1.3 프로토콜을 지원하며, 서버와 클라이언트가 모두 OpenSSL 1.1.1 이상을 사용하여 컴파일된 경우 MySQL도 이제 TLS v1.3을 지원합니다:
      
        - 일부 TLSv1.3 암호 스위트는 기본적으로 활성화됩니다. [`tls_ciphersuites`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_tls_ciphersuites) 시스템 변수는 서버가 허용하는 TLSv1.3 암호 스위트를 명시적으로 지정할 수 있게 합니다.
        - [`--tls-ciphersuites`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/connection-options.html#option_general_tls-ciphersuites) 클라이언트 옵션은 클라이언트가 허용하는 TLSv1.3 암호 스위트를 지정합니다. 이 옵션은 다음 프로그램에 적용됩니다: **mysql**, **mysqladmin**, **mysqlbinlog**, **mysqlcheck**, **mysqldump**, **mysqlimport**, **mysqlpump**, **mysqlshow**, **mysqlslap**, **mysqltest**, **mysql_secure_installation** 및 **mysql_upgrade**.
        - [`mysql_options()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-options.html) C API 함수에는 클라이언트 라이브러리 내부에서 클라이언트 프로그램이 허용하는 TLSv1.3 암호 스위트를 지정하는 새 `MYSQL_OPT_TLS_CIPHERSUITES` 옵션이 있습니다.
      
      자세한 내용은 [Encrypted Connection TLS Protocols and Ciphers](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/encrypted-connection-protocols-ciphers.html)를 참조하십시오.
      
        Group Replication은 TLSv1.3을 지원하지 않습니다.
      
        (WL #12361)
      
      - 서버가 새 연결에 사용하는 TLS 컨텍스트를 이제 런타임에 재설정할 수 있습니다. 예를 들어 이 기능은 SSL 인증서가 만료될 만큼 오랫동안 실행 중인 MySQL 서버를 재시작하지 않도록 하는 데 유용할 수 있습니다. 동적 SSL 재설정 기능은 다음 변경 사항을 기반으로 합니다:
      
        - TLS 컨텍스트를 정의하는 시스템 변수는 동적이며 런타임에 변경할 수 있습니다: [`ssl_ca`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_ssl_ca), [`ssl_capath`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_ssl_capath), [`ssl_cert`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_ssl_cert), [`ssl_cipher`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_ssl_cipher), [`ssl_crl`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_ssl_crl), [`ssl_crlpath`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_ssl_crlpath), [`ssl_key`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_ssl_key), [`tls_ciphersuites`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_tls_ciphersuites). [`tls_version`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_tls_version).
        - [`ALTER INSTANCE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-instance.html) 문은 컨텍스트를 정의하는 시스템 변수의 현재 값에서 TLS 컨텍스트를 재설정하는 `RELOAD TLS` 동작을 지원합니다.
        - 다음 상태 변수는 서버가 새 연결에 사용하는 TLS 컨텍스트를 반영합니다: [`Current_tls_ca`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-status-variables.html#statvar_Current_tls_ca), [`Current_tls_capath`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-status-variables.html#statvar_Current_tls_capath), [`Current_tls_cert`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-status-variables.html#statvar_Current_tls_cert), [`Current_tls_cipher`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-status-variables.html#statvar_Current_tls_cipher), [`Current_tls_ciphersuites`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-status-variables.html#statvar_Current_tls_ciphersuites), [`Current_tls_crl`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-status-variables.html#statvar_Current_tls_crl), [`Current_tls_crlpath`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-status-variables.html#statvar_Current_tls_crlpath), [`Current_tls_key`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-status-variables.html#statvar_Current_tls_key), [`Current_tls_version`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-status-variables.html#statvar_Current_tls_version).
      
      [`ALTER INSTANCE RELOAD TLS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-instance.html#alter-instance-reload-tls)는 TLS 컨텍스트를 다시 설정할 때 해당 시스템 변수 값에서 이러한 상태 변수를 업데이트합니다.
      
        자세한 내용은 [암호화된 연결을 위한 서버 측 런타임 설정 및 모니터링](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/using-encrypted-connections.html#using-encrypted-connections-server-side-runtime-configuration)을 참조하십시오.
      
        유사한 기능에 대한 코드를 제출해 준 Facebook에 감사드립니다(다만 해당 코드는 사용되지 않았습니다). (WL #11541)
      
        참조: 다음도 참조하십시오: Bug #27980097.
      - MySQL 8.0에서 기본 인증 플러그인이 `mysql_native_password`에서 `caching_sha2_password`로 변경되었습니다. `caching_sha2_password`는 `sha256_password` 인증 플러그인의 기능을 상위 집합으로 제공하므로, `sha256_password`는 이제 사용 중단되었으며 향후 MySQL 버전에서 제거될 예정입니다. `sha256_password`를 사용하여 인증하는 MySQL 계정은 대신 `caching_sha2_password`를 사용하도록 마이그레이션해야 합니다. (WL #12694)
      
      ## 공간 데이터 지원
      
      - [`ST_Length()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/gis-linestring-property-functions.html#function_st-length) 함수는 이제 반환 값의 단위를 지정할 수 있도록 하는 선택적 두 번째 인수를 받습니다. 허용되는 단위는 새로운 `INFORMATION_SCHEMA` [`ST_UNITS_OF_MEASURE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-st-units-of-measure-table.html) 테이블에 나열된 단위입니다. [LineString and MultiLineString Property Functions](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/gis-linestring-property-functions.html) 및 [The INFORMATION_SCHEMA ST_UNITS_OF_MEASURE Table](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-st-units-of-measure-table.html)을 참조하십시오. (WL #12657)
      
      ## SQL 문법 관련 사항
      
      - **호환되지 않는 변경:** MySQL 5.7에서는 `CONSTRAINT symbol` 절 없이 `InnoDB` 테이블에 대한 `FOREIGN KEY` 정의를 지정하거나, `symbol` 없이 `CONSTRAINT` 키워드를 지정하면 `InnoDB`가 생성된 제약 조건 이름을 사용했습니다. 해당 동작은 MySQL 8.0에서 변경되어, `InnoDB`가 생성된 이름 대신 `FOREIGN KEY index_name` 값을 사용했습니다. 제약 조건 이름은 스키마(데이터베이스)별로 고유해야 하므로, 이 변경은 스키마별로 고유하지 않은 외래 키 인덱스 이름으로 인해 오류를 발생시켰습니다. 이러한 오류를 방지하기 위해 새 제약 조건 명명 동작은 되돌려졌으며, `InnoDB`는 다시 생성된 제약 조건 이름을 사용합니다.
      
        `InnoDB`와의 일관성을 위해, 이제 `NDB` 스토리지 엔진은 `CONSTRAINT symbol` 절이 지정되지 않았거나 `symbol` 없이 `CONSTRAINT` 키워드가 지정된 경우 생성된 제약 조건 이름을 사용합니다. MySQL 5.7 기반의 `NDB` 릴리스와 이전 MySQL 8.0 릴리스에서는 `NDB`가 `FOREIGN KEY index_name` 값을 사용했습니다.
      
        위에서 설명한 변경 사항은 이전 외래 키 제약 조건 명명 동작에 의존하는 애플리케이션에 비호환성을 도입할 수 있습니다. (Bug #29173134)
      - 이전에는 MySQL이 제한된 형태의 `CHECK` 제약 조건 문법을 허용했지만, 이를 파싱하고 무시했습니다. 이제 MySQL은 모든 스토리지 엔진에 대해 테이블 및 컬럼 `CHECK` 제약 조건의 핵심 기능을 구현합니다. 제약 조건은 [`CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html) 및 [`ALTER TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 문을 사용하여 정의됩니다. 새 [`INFORMATION_SCHEMA.CHECK_CONSTRAINTS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-check-constraints-table.html) 테이블은 테이블에 정의된 `CHECK` 제약 조건에 대한 정보를 제공합니다. 자세한 내용은 [CHECK Constraints](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table-check-constraints.html)를 참조하십시오. (Bug #11744849, Bug #3464, Bug #3465, Bug #11746042, Bug #22759, WL #929)
      
      ## sys 스키마 관련 사항
      
      - MySQL은 이제 Performance Schema 데이터를 형식화하거나 검색하는 내장 SQL 함수를 포함하며, 이러한 함수는 기존 `sys` 스키마 저장 함수와 동등한 것으로 사용할 수 있습니다:
      
        - [`FORMAT_BYTES()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-functions.html#function_format-bytes): 바이트 수를 단위가 있는 값으로 변환합니다. [`sys.format_bytes()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/sys-format-bytes.html)와 유사합니다.
        - [`FORMAT_PICO_TIME()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-functions.html#function_format-pico-time): 피코초 단위의 시간을 단위가 있는 값으로 변환합니다. [`sys.format_time()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/sys-format-time.html)과 유사합니다.
        - [`PS_THREAD_ID()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-functions.html#function_ps-thread-id): 지정된 스레드에 대한 Performance Schema 스레드 ID를 반환합니다. `NULL`이 아닌 인수로 호출된 [`sys.ps_thread_id()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/sys-ps-thread-id.html)와 유사합니다.
        - [`PS_CURRENT_THREAD_ID()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-functions.html#function_ps-current-thread-id): 현재 스레드에 대한 Performance Schema 스레드 ID를 반환합니다. `NULL` 인수로 호출된 [`sys.ps_thread_id()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/sys-ps-thread-id.html)의 단축 형식입니다.
      
        내장 함수는 `sys` 함수와 달리 어느 스키마에서든 호출할 수 있으며 한정자가 필요하지 않습니다. `sys` 함수는 `sys.` 스키마 한정자를 사용하거나 `sys`가 현재 스키마여야 합니다.
      
        내장 함수는 해당 `sys` 함수를 대체하며, 해당 `sys` 함수는 이제 사용 중단되었고 향후 MySQL 버전에서 제거될 예정입니다. `sys` 함수를 사용하는 애플리케이션은 대신 내장 함수를 사용하도록 조정해야 하며, `sys` 함수와 내장 함수 사이의 일부 사소한 차이를 염두에 두어야 합니다. [Performance Schema Functions](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-functions.html)를 참조하십시오. (WL #7803)
      
      ## 테스트 스위트 관련 사항
      
      - **mysql-test-run.pl**은 이제 `MTR_UNIQUE_IDS_DIR` 환경 변수를 지원하며, 이 변수는 동시에 실행되는 여러 **mysql-test-run.pl** 인스턴스가 모든 **chroot** 환경에 대한 공통 위치로 사용할 unique-IDs 디렉터리를 지정하도록 설정할 수 있습니다. 이를 통해 해당 인스턴스는 포트 번호를 예약할 때 충돌을 피할 수 있습니다. 기여해 주신 Facebook에 감사드립니다. (Bug #29221085, Bug #93950)
      - **my_safe_process** 프로그램은 **mysqltest_safe_process**로 이름이 변경되었으며, 이제 테스트 스위트 파일이 아니라 **mysqltest**와 같은 다른 바이너리와 함께 설치됩니다. (Bug #29198969)
      - `all_persisted_variables` 테스트에 대한 다음 변경 사항이 구현되었습니다:
      
        - 테스트 출력의 하드코딩된 값 수를 제한하기 위해 해당 값을 로컬 변수에 넣습니다. 그 위에 리베이스되는 새 패치가 새 시스템 변수를 추가하더라도 원래 테스트 케이스의 많은 줄을 변경할 필요가 없으므로, 리베이스 프로세스가 더 쉬워집니다.
        - 수정된 버그에 대한 항목을 제거하고, 미해결 버그로 인해 테스트되지 않았던 시스템 변수를 포함하도록 쿼리를 수정합니다.
      
        기여해 주신 Facebook 팀에 감사드립니다. (Bug #29013375, Bug #93478)
      
      ## X 플러그인 관련 사항
      
      - X Plugin은 이전에 쿼리 정리가 종료되고 세션이 비활성화된 후 `StmtExecuteOk` 메시지를 클라이언트에 반환했습니다. 이제 메시지는 결과가 알려지는 즉시, 그리고 쿼리 정리 전에 반환되며, 이는 성능을 눈에 띄게 개선합니다. (Bug #28997370)
      - X Plugin은 I/O 인터페이스 준비에 실패하여 사용자 연결을 사용할 수 없을 때 시스템 메시지 "X Plugin ready for connections"를 로그에 기록했습니다. (Bug #28906360)
      - X Plugin 코드의 일부 항목은 기본적으로 Performance Schema에 대해 계측되지 않았습니다. (Bug #28898155)
      - X Protocol은 이제 연결을 다시 인증하거나 닫지 않고 세션 상태를 재설정하기 위해 `COM_RESET_CONNECTION` 유틸리티 명령을 지원합니다. (Bug #28732455)
      - MySQL Server 소스 코드를 Clang 8 컴파일러를 사용하여 빌드할 때 X Plugin에서 컴파일 경고가 발생했습니다. (Bug #28732158)
      
      ## 추가되거나 변경된 기능
      
      - **InnoDB:** TempTable 스토리지 엔진이 점유한 메모리 양이 [`temptable_max_ram`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_temptable_max_ram) 변수로 정의된 한도를 초과하면, TempTable 스토리지 엔진은 내부 인메모리 임시 테이블을 위한 공간을 메모리 매핑 임시 파일로 할당합니다. 이제 이 동작은 [`temptable_use_mmap`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_temptable_use_mmap) 변수로 제어되며, 이 변수를 비활성화하여 TempTable 스토리지 엔진이 대신 `InnoDB` 온디스크 내부 임시 테이블을 사용하도록 할 수 있습니다. 자세한 내용은 [MySQL에서 내부 임시 테이블 사용](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/internal-temporary-tables.html)을 참조하십시오. (Bug #28944457)
      - **InnoDB:** undo 로그 잘림과 관련된 백그라운드 활동을 모니터링하기 위해 `undo` 및 `purge` 서브시스템 카운터가 추가되었습니다. 카운터 이름과 설명을 보려면 [`INFORMATION_SCHEMA.INNODB_METRICS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-innodb-metrics-table.html) 테이블을 쿼리하십시오.
      
      

      SELECT NAME, SUBSYSTEM, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%truncate%';

      
      카운터 활성화 및 카운터 데이터 쿼리에 대한 정보는 [InnoDB INFORMATION_SCHEMA Metrics 테이블](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-information-schema-metrics-table.html)을 참조하십시오. (Bug #28813526, WL #12600)
      - **InnoDB:** 새로운 [`innodb_spin_wait_pause_multiplier`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_spin_wait_pause_multiplier) 변수는 스레드가 mutex 또는 rw-lock 획득을 기다릴 때 발생하는 spin-lock 폴링 지연 시간에 대해 더 큰 제어 기능을 제공합니다. 이제 서로 다른 프로세서 아키텍처에서 PAUSE 명령어 지속 시간의 차이를 고려하도록 지연 시간을 더 세밀하게 조정할 수 있습니다. 자세한 내용은 [Spin Lock 폴링 설정](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-performance-spin_lock_polling.html)을 참조하십시오. (WL #12616)
      - **InnoDB:** 수정된 페이지 추적을 지원하기 위해 내부 서비스 인터페이스가 추가되었습니다. (WL #11082)
      
      - **InnoDB:** `InnoDB` 저장 데이터 암호화 기능이 이제 `mysql` 시스템 테이블스페이스의 암호화를 지원합니다. `mysql` 시스템 테이블스페이스에는 `mysql` 시스템 데이터베이스와 MySQL 데이터 딕셔너리 테이블이 포함됩니다. (WL #12063)
      - **Group Replication:** 그룹 통신 엔진(XCom)에는 합의 프로토콜의 일부로 그룹 멤버 간에 교환되는 메시지와 해당 메타데이터를 위한 캐시가 포함됩니다. 다른 기능 중에서도 메시지 캐시는 다른 그룹 멤버와 통신할 수 없었던 기간 후에 그룹으로 돌아오는 멤버의 복구에 사용됩니다.
      
      이전에는 메시지 캐시의 크기 제한이 메모리 1GB로 고정되어 있었고, 캐시에 있는 최대 메시지 수도 고정되어 있었습니다. 이제 MySQL 8.0.13에서 도입된 [`group_replication_member_expel_timeout`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_member_expel_timeout) 시스템 변수를 설정하여 멤버가 추방되는 대신 그룹으로 돌아올 수 있는 시간을 최대 1시간까지 허용할 수 있으므로, 캐시 크기에 고정된 1GB 제한이 있으면 이러한 노드가 통신을 다시 설정할 때 놓친 메시지를 복구하지 못할 수 있습니다.
      
      이러한 이유로, 이 릴리스부터 XCom 메시지 캐시는 포함할 수 있는 메시지 수에 대한 고정 제한이 없으며, 사용할 수 있는 메모리 양에 대해 설정된 제한으로만 경계가 정해집니다. 캐시 크기 제한은 새 [`group_replication_message_cache_size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_message_cache_size) 시스템 변수를 사용하여 설정할 수 있으며, 이 변수는 이전 MySQL Server 버전에서 사용된 것처럼 기본값 및 최솟값 설정이 1GB입니다. 캐시 크기 제한에 도달하면 XCom은 결정되고 전달된 가장 오래된 엔트리를 제거합니다. 캐시 크기 제한은 런타임에 동적으로 늘리거나 줄일 수 있습니다. 캐시 크기 제한을 줄이면 XCom은 현재 크기가 제한보다 작아질 때까지 결정되고 전달된 가장 오래된 엔트리를 제거합니다. Group Replication Group Communication System(GCS)은 현재 연결할 수 없는 멤버의 복구에 필요할 가능성이 있는 메시지가 메시지 캐시에서 제거될 때 경고를 발생시킵니다. (Bug #26482507, WL #11615)
      
      - **Group Replication:** Group Replication 그룹 멤버 간에 전송되는 큰 메시지는 이제 사용자 정의 임계값 크기를 초과할 때 여러 메시지로 분할될 수 있습니다. 비정상적으로 큰 메시지를 전송하면 일부 그룹 멤버가 실패한 것으로 보고되어 그룹에서 추방될 수 있습니다. 이는 그룹 통신 엔진(XCom)이 사용하는 단일 스레드가 메시지를 처리하는 데 너무 오랫동안 점유되므로, 일부 그룹 멤버가 수신자를 실패한 것으로 보고할 수 있기 때문입니다.
      
      새로운 시스템 변수 [`group_replication_communication_max_message_size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_communication_max_message_size)는 Group Replication 통신의 최대 메시지 크기를 지정합니다. 이 크기보다 큰 메시지는 자동으로 별도로 전송되고 수신자가 재조립하는 프래그먼트로 분할됩니다. 프래그먼트화된 메시지의 메시지 전달은 메시지의 모든 프래그먼트가 모든 그룹 멤버에 의해 수신되고 재조립되었을 때 완료된 것으로 간주됩니다. 프래그먼트화는 기본적으로 적용되며, 시스템 변수에 0 값을 지정하여 해제할 수 있습니다.
      
      이전 MySQL Server 릴리스는 메시지 프래그먼트화를 지원하지 않으므로, 이전 버전과의 호환성을 보장하기 위해 Group Replication에는 이제 그룹에 대한 통신 프로토콜이라는 개념이 있습니다. 통신 프로토콜 버전은 그룹이 지원하기를 원하는 가장 오래된 MySQL Server 버전을 수용하도록 설정됩니다. 버전 X의 MySQL 서버는 그룹의 통신 프로토콜 버전이 X보다 작거나 같은 경우에만 복제 그룹에 참여하고 `ONLINE` 상태에 도달할 수 있습니다.
      
      새 [`group_replication_get_communication_protocol()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-functions-for-communication-protocol.html#function_group-replication-get-communication-protocol) 함수를 사용하여 그룹에서 사용 중인 통신 프로토콜을 확인할 수 있으며, 이 함수는 그룹이 지원하는 가장 오래된 MySQL Server 버전을 반환합니다. 새 멤버가 복제 그룹에 참여하면, 그룹의 기존 멤버가 알리는 통신 프로토콜 버전을 확인합니다. 참여하는 멤버가 해당 버전을 지원하면, 그 멤버가 추가 통신 기능을 지원하더라도 그룹에 참여하고 그룹이 알린 통신 프로토콜을 사용합니다. 참여하는 멤버가 통신 프로토콜 버전을 지원하지 않으면, 그룹에서 추방됩니다.
      
      이전 릴리스의 멤버가 참여할 수 있도록 그룹의 통신 프로토콜 버전을 변경해야 하는 경우, 허용하려는 가장 오래된 멤버의 MySQL Server 버전을 지정하려면 새 [`group_replication_set_communication_protocol()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-functions-for-communication-protocol.html#function_group-replication-set-communication-protocol) 함수를 사용하십시오. 이렇게 하면 가능한 경우 그룹이 호환되는 통신 프로토콜 버전으로 폴백합니다. 복제 그룹의 모든 멤버를 새 MySQL Server 릴리스로 업그레이드해도, 그룹의 통신 프로토콜 버전은 이에 맞게 자동으로 업그레이드되지 않습니다. 더 이상 이전 릴리스의 멤버를 지원할 필요가 없는 경우, [`group_replication_set_communication_protocol()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-functions-for-communication-protocol.html#function_group-replication-set-communication-protocol) 함수를 사용하여 통신 프로토콜 버전을 멤버를 업그레이드한 새 MySQL Server 버전으로 설정하십시오. (Bug #26438884, Bug #23240361, Bug #28474580, Bug #91830, Bug #28642504, Bug #26941977, Bug #29240931, WL #11610)
      - **Group Replication:** 새 시스템 변수 [`group_replication_autorejoin_tries`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_autorejoin_tries)를 사용하면 멤버가 추방되었거나 [`group_replication_unreachable_majority_timeout`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_unreachable_majority_timeout) 설정에 도달하기 전에 그룹의 과반수에 접촉할 수 없는 경우, 해당 멤버가 그룹에 자동으로 다시 참여하기 위해 수행하는 시도 횟수를 지정할 수 있습니다. 기본값인 `0`은 멤버가 다시 참여를 시도하지 않고, [`group_replication_exit_state_action`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_exit_state_action) 시스템 변수로 지정된 동작을 진행함을 의미합니다.
      
      오래된 읽기 가능성을 허용할 수 있고 수동 개입의 필요성을 최소화하려는 경우, 특히 일시적인 네트워크 문제로 인해 멤버가 추방되는 일이 상당히 자주 발생하는 환경에서는 자동 재참여를 활성화하십시오. 시도 횟수를 지정하면, 멤버의 추방 또는 연결할 수 없는 과반수 제한 시간이 도달했을 때 해당 멤버는 다시 참여를 시도하고(현재 플러그인 옵션 값을 사용), 그런 다음 지정된 시도 횟수까지 추가 자동 재참여 시도를 계속 수행합니다. 자동 재참여 시도가 실패한 후, 멤버는 다음 시도 전에 5분 동안 대기합니다. 자동 재참여 절차 중에 멤버는 super read only 모드로 유지되며, 복제 그룹에 대한 자체 뷰에 `ERROR` 상태를 표시합니다. 멤버는 언제든지 [`STOP GROUP_REPLICATION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/stop-group-replication.html) 문을 사용하거나 서버를 종료하여 수동으로 중지할 수 있습니다. 멤버가 다시 참여하거나 중지되지 않은 상태에서 지정된 시도 횟수가 모두 소진되면, 멤버는 [`group_replication_exit_state_action`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_exit_state_action)에 지정된 동작을 진행합니다. (Bug #25673350, Bug #84784, Bug #28732174, WL #11284)
      
      - **Group Replication:** [`group_replication_exit_state_action`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_exit_state_action)의 기본값이 `ABORT_SERVER`에서 `READ_ONLY`로 변경되었습니다. (WL #12659)
      - 이전에는 런타임에 평가되던 일부 `InnoDB` 메모리 할당 함수가 이제 컴파일 시간에 평가되어 성능이 향상되었습니다. (Bug #29370811, Bug #94380)
      - `IN` 서브쿼리에 대한 세미조인 최적화가 `EXISTS` 서브쿼리에서도 작동하도록 확장되었습니다. 이제 이러한 서브쿼리는 first-match, materialization, duplicate weedout 및 loose index scan을 포함하여 `IN` 서브쿼리와 동일한 세미조인 전략으로 처리될 수 있습니다.
      
      또한 Optimizer는 서브쿼리에 연결된 `WHERE` 조건에서 단순 상관된 동등 조건자를 decorrelate하여, 이를 `IN` 서브쿼리의 표현식과 유사하게 처리할 수 있도록 합니다. 이제 decorrelation은 `EXISTS` 서브쿼리뿐만 아니라 `IN` 서브쿼리에도 수행됩니다.
      
      세미조인 작업으로 변환되는 `IN` 서브쿼리에 적용 가능한 모든 힌트와 Optimizer 스위치는 변환된 `EXISTS` 서브쿼리에도 적용 가능합니다. `IN` 서브쿼리의 이러한 최적화에 대한 모든 제한 사항도 변환된 `EXISTS` 서브쿼리에 적용되므로, 예를 들어 aggregate `EXISTS` 서브쿼리는 변환될 수 없습니다.
      
      자세한 내용은 [Optimizing IN and EXISTS Subquery Predicates with Semijoin Transformations](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/semijoins.html)를 참조하십시오. (Bug #28805105, Bug #28857990, WL #4389)
      - SQL 표준 및 다른 RDBMS와의 일관성을 위해, 이제 단일 테이블뿐만 아니라 다중 테이블 [`DELETE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/delete.html) 문에서도 테이블 별칭이 지원됩니다. (Bug #27455809)
      
      - 컬럼 타입과 관련하여 상수 값이 범위를 벗어나거나 잘못된 타입인 상수와 컬럼 값 사이의 비교를 수행하는 `WHERE` 조건은 이제 실행 중이 아니라 최적화 중에 처리됩니다. 예를 들어, 타입이 [`TINYINT UNSIGNED`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/integer-types.html)인 컬럼 `c`가 있는 테이블 `t`가 주어진 경우, 쿼리 [`SELECT * FROM t WHERE c < 256`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/select.html)의 조건은 256이 이 타입의 컬럼에 대해 범위를 벗어나므로 `SELECT * FROM t WHERE TRUE`로 폴딩될 수 있습니다. `NULL` 컬럼과의 비교도 최적화될 수 있습니다. 컬럼 `c`가 nullable이면 같은 쿼리는 `SELECT * FROM t WHERE c IS NOT NULL`로 최적화될 수 있습니다.
      
      이러한 방식으로 처리될 수 있는 비교는 `>`, `>=`, `<`, `<=`, `=`, `<>`/`!=`, `<=>`입니다. (`BETWEEN` 및 `IN`은 현재 지원되지 않습니다.) 범위와 타입을 기반으로 비교가 폴딩될 수 있는 타입에는 정수, 부동소수점, 고정소수점 숫자 타입이 포함됩니다. [`BIT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/bit-type.html)는 이 최적화에서 지원되지 않으며, 날짜 및 시간 타입의 컬럼도 지원되지 않습니다.
      
      자세한 내용은 [Constant-Folding Optimization](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/constant-folding-optimization.html)을 참조하십시오. (Bug #90100, Bug #25484743, Bug #29048682, Bug #27703371, WL #11935)
      
      참조: 다음도 참조하십시오: Bug #28172538, Bug #29699347.
      - [`EXPLAIN`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/explain.html) 출력에 대해 생성된 이터레이터 트리를 출력하고 사용자가 실행이 실제로 어떻게 설정되었는지 이해하는 데 도움을 주기 위한 실험적 트리 형식이 추가되었습니다. `EXPLAIN FORMAT=TREE`는 현재 프로덕션에서 지원되지 않으며, 그 문법과 출력은 모두 MySQL의 후속 버전에서 변경될 수 있습니다. (WL #12074)
      
      - MySQL 서버에서 바이너리 로그 및 릴레이 로그 암호화([`binlog_encryption=ON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_encryption))를 사용 중인 경우, 이제 서버가 실행 중인 동안 언제든지 [`ALTER INSTANCE ROTATE BINLOG MASTER KEY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-instance.html#alter-instance-rotate-binlog-master-key)를 실행하여 바이너리 로그 마스터 키를 순환할 수 있습니다. 조직의 보안 정책을 준수하기 위해 이를 정기적으로 수행할 수 있으며, 현재 또는 이전 바이너리 로그 마스터 키 중 하나가 손상되었을 가능성이 있다고 의심되는 경우에도 수행할 수 있습니다.
      
      바이너리 로그 마스터 키를 순환하면 새 마스터 키가 새 바이너리 로그 및 릴레이 로그 파일의 파일 암호를 암호화하는 데 사용되며, 키가 다시 변경될 때까지 이후 파일에도 사용됩니다. 서버의 기존 암호화된 바이너리 로그 파일 및 릴레이 로그 파일에 대한 파일 암호도 가장 최근 파일부터 시작하여 새 바이너리 로그 마스터 키를 사용해 차례로 다시 암호화됩니다. 암호화되지 않은 파일은 건너뜁니다. 마지막으로, 보존된 바이너리 로그 파일 또는 릴레이 로그 파일에 더 이상 적용되지 않는 모든 바이너리 로그 암호화 키가 keyring에서 정리됩니다. (WL #12080)
      - 이제 암호화 기본값을 정의하고 적용하여 테이블 암호화를 전역적으로 관리할 수 있습니다. [`default_table_encryption`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_default_table_encryption) 변수는 새로 생성되는 스키마와 일반 테이블스페이스에 대한 암호화 기본값을 정의합니다. 스키마의 암호화 기본값은 스키마를 생성할 때 `DEFAULT ENCRYPTION` 절을 사용하여 정의할 수도 있습니다. 기본적으로 테이블은 생성되는 스키마 또는 일반 테이블스페이스의 암호화를 상속합니다.
      
      암호화 기본값은 [`table_encryption_privilege_check`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_table_encryption_privilege_check) 변수를 활성화하여 적용됩니다. 권한 검사는 [`default_table_encryption`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_default_table_encryption) 설정과 다른 암호화 설정으로 스키마 또는 일반 테이블스페이스를 생성하거나 변경할 때, 또는 기본 스키마 암호화와 다른 암호화 설정으로 테이블을 생성하거나 변경할 때 발생합니다.
      
      [`TABLE_ENCRYPTION_ADMIN`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/privileges-provided.html#priv_table-encryption-admin) 권한은 [`table_encryption_privilege_check`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_table_encryption_privilege_check)가 활성화된 경우 기본 암호화 설정을 재정의할 수 있게 합니다.
      
      자세한 내용은 [스키마 및 일반 테이블스페이스에 대한 암호화 기본값 정의](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-data-encryption.html#innodb-schema-tablespace-encryption-default)를 참조하십시오. (WL #12261)
      - 파티셔닝된 테이블에 삽입, 삭제 또는 업데이트가 수행되면 이제 바이너리 로그는 로우 이벤트가 발생한 파티션 및 해당되는 경우 서브파티션에 대한 정보를 기록합니다. 관련된 테이블이 동일하더라도 다른 파티션 또는 서브파티션에서 발생하는 변경에 대해서는 새 로우 이벤트가 생성됩니다. 따라서 트랜잭션에 세 개의 파티션 또는 서브파티션이 포함되면 세 개의 로우 이벤트가 생성됩니다. 업데이트 이벤트의 경우 파티션 정보는 “before” 이미지와 “after” 이미지 모두에 대해 기록됩니다. **mysqlbinlog**를 사용하여 바이너리 로그를 볼 때 `-v` 또는 `--verbose` 옵션을 지정하면 파티션 정보가 표시됩니다. 파티션 정보는 로우 기반 로깅이 사용 중인 경우에만 기록됩니다([`binlog_format=ROW`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_format)). (WL #12168)
      
      ## 수정된 버그
      
      - **NDB Cluster:** 테이블 접근 타입 [`eq_ref`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/explain-output.html#jointype_eq_ref)로 실행된 쿼리의 [`EXPLAIN`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/explain.html)이, 해당 쿼리에 대해 조건 푸시다운이 지원되지 않는 경우에도 조건이 푸시다운되는 것으로 표시할 수 있었습니다. 이제 [`NDB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/mysql-cluster.html)가 가능한 푸시다운 최적화를 위해 조건을 확인하기 전에 접근 타입을 확인합니다.
      
      이 수정은 푸시된 조인의 일부인 테이블 처리에는 영향을 주지 않으며, 이에 대해 `NDB`는 이전과 같이 푸시된 조건을 계속 지원합니다. (Bug #27429615)
      
      참조: 함께 참조하십시오: Bug #27397802, Bug #27808758, Bug #90301.
      - **InnoDB:** 시작 시 undo 테이블스페이스 암호화를 활성화한 후에도 undo 테이블스페이스가 암호화되지 않은 상태로 남아 있었습니다. (Bug #29477795)
      - **InnoDB:** MySQL 8.0.14에서 undo 테이블스페이스 DDL 지원과 함께 도입된 문제가 있는 매크로가 수정되었습니다. (Bug #29324132, Bug #94243)
      - **InnoDB:** 잘못된 범위에서 정의된 정적 스레드 로컬 변수가 스레드 종료 시 해제되지 않았습니다. (Bug #29305186)
      
      - **InnoDB:** [`performance_schema.data_locks`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-data-locks-table.html) `LOCK_DATA` 컬럼은 고유 보조 인덱스에 설정된 잠금에 대해 잠긴 레코드의 보조 인덱스 값만 표시했으며, 이는 식별된 레코드의 고유성을 보장하기에 충분하지 않았습니다. 이제 잠긴 레코드의 클러스터형 인덱스 컬럼 값이 추가됩니다. (Bug #29296645)
      - **InnoDB:** XA 트랜잭션 복구를 위해 롤백 세그먼트를 사용하는 트랜잭션 수가 잘못 계산되어 undo 테이블스페이스 잘라내기 작업이 진행되지 못했고, purge 스레드가 undo 테이블스페이스가 비게 되는지 확인하느라 바쁜 상태로 남았습니다. (Bug #29273194)
      
      참조: 이 문제는 다음의 회귀입니다: Bug #29273194.
      - **InnoDB:** 압축된 file-per-table 테이블스페이스의 space ID를 가져오지 못한 후 시작 시 유효하지 않은 assertion이 발생했습니다. 유효하지 않은 assertion 코드는 제거되었습니다. (Bug #29221385, Bug #93760)
      - **InnoDB:** 최적화된 `InnoDB` 내부 임시 테이블은 in-place `UPDATE` 작업을 지원하지 않았으며, 이로 인해 delete-marked 레코드 수가 지속적으로 증가했습니다. 많은 수의 delete-marked 레코드는 쿼리 실행 시간이 예상보다 길어지게 할 수 있었습니다. (Bug #29207450)
      
      - **InnoDB:** Contention-Aware Transaction Scheduling (CATS) 알고리즘의 `std::sort` 함수가 동일한 가중치의 트랜잭션에 대해 원래 FIFO 순서를 보존하도록 `std::stable_sort` 함수로 대체되었습니다. (Bug #29058967)
      - **InnoDB:** 잘못 초기화된 변수로 인해 write-ahead가 예상대로 작동하지 않았습니다.
      
      기여해 주신 Yuhui Wang에게 감사드립니다. (Bug #29028838, Bug #93442)
      - **InnoDB:** 생성 컬럼의 베이스 컬럼 정보가 저장되지 않았습니다. (Bug #29021730)
      - **InnoDB:** 보조 인덱스에 대한 암시적 잠금 검사가 불필요하게 콜레이션 규칙을 사용하여 컬럼을 비교했습니다. (Bug #29010725)
      - **InnoDB:** [`innodb_flush_method`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_flush_method) `O_DIRECT_NO_FSYNC` 설정과 관련된 어설션 코드가 해당 설정의 최근 수정으로 인해 더 이상 유효하지 않았습니다. 어설션 코드가 개정되었습니다. (Bug #29007731)
      
      참조: 다음도 참조하십시오: Bug #27309336.
      - **InnoDB:** undo log 암호화를 활성화한 상태로 서버를 시작할 때, 새로 생성된 undo 테이블스페이스의 마스터 키가 서버 UUID 없이 생성되었습니다. 서버 UUID가 아직 생성되지 않은 경우 undo 테이블스페이스는 DefaultMasterKey를 사용해야 합니다. (Bug #29006275)
      
      - **InnoDB:** 데이터 딕셔너리 코드가 반환된 데이터 딕셔너리 객체를 확인하지 않았으며, 이로 인해 null 포인터 접근으로 서버가 종료될 가능성이 있었습니다. (Bug #28977444, Bug #93362)
      - **InnoDB:** 실패한 [`CREATE UNDO TABLESPACE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-tablespace.html) 작업으로 인해 undo 테이블스페이스 파일이 남아 있었습니다. (Bug #28966457)
      - **InnoDB:** [`CREATE UNDO TABLESPACE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-tablespace.html) 문이 파일 이름의 유효하지 않은 문자로 인해 Windows에서 실패했습니다. 이 실패는 undo 테이블스페이스 파일을 생성하는 호출에 `OS_FILE_ON_ERROR_NO_EXIT` 속성이 누락되어 hang 상태를 초래했습니다. (Bug #28955676)
      - **InnoDB:** [`innodb_undo_log_encrypt`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_undo_log_encrypt) 변수의 값을 수정하는 작업이 blocking 작업이 아니었으며, 이로 인해 작업이 성공적으로 완료된 것으로 보인 후 백그라운드 스레드에 의해 수정 사항이 되돌려질 수 있었습니다. (Bug #28952870)
      - **InnoDB:** 유효하지 않은 debug assertion이 `temptable::Handler::primary_key_is_clustered` 함수에서 제거되었습니다. (Bug #28949332)
      
      - **InnoDB:** [`ALTER TABLE... EXCHANGE PARTITION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/partitioning-management-exchange.html) 작업이 데이터 딕셔너리의 컬럼 `table_id` 값을 올바르게 업데이트하지 않았습니다. (Bug #28927005)
      - **InnoDB:** **innochecksum** 유틸리티에서 발견된 메모리 누수가 제거되었습니다. (Bug #28917614, Bug #93164)
      - **InnoDB:** 가상 컬럼에 인덱스를 생성하려는 시도가 실패한 뒤 이어진 DDL 작업이 assertion failure를 발생시켰습니다. (Bug #28825718)
      - **InnoDB:** 크기가 128KB 이하인 압축된 BLOB에 대한 부분 업데이트 작업에서 성능 회귀가 관찰되었습니다. (Bug #28784301)
      - **InnoDB:** 집계 쿼리를 실행하면 `Valgrind` 경고가 발생했습니다. (Bug #28711717)
      - **InnoDB:** [`CHECK TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/check-table.html) 작업이 assertion failure를 발생시켰습니다. 함수 종료 전에 로컬 호출 스택 변수에 대한 포인터가 다시 null로 설정되지 않았습니다. (Bug #28525110)
      - **InnoDB:** DDL 로그 함수가 `ER_TOO_MANY_CONCURRENT_TRXS` 오류를 처리하도록 수정되었습니다. (Bug #28523127, Bug #92071)
      - **InnoDB:** purge 스레드가 LOB 데이터 페이지를 해제하지 못했습니다. (Bug #28510599)
      - **InnoDB:** 일부 DDL 로그 테이블 트랜잭션이 DDL 로그 복구 전에 롤백되지 않았습니다. (Bug #28494969)
      
      - **InnoDB:** [`SHOW CREATE TRIGGER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-create-trigger.html) 처리 중 호출되어 테이블 이름을 가져오는 함수가 예상된 소문자 변환을 수행하지 않았습니다. (Bug #28351038)
      - **InnoDB:** [`INFORMATION_SCHEMA.INNODB_FOREIGN`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-innodb-foreign-table.html) `TYPE` 컬럼이 잘못된 값을 보고했습니다. (Bug #28315651, Bug #91577)
      - **InnoDB:** Linux AIO 핸들러 함수가 완료된 I/O 이벤트의 성공 여부를 확인하지 못했습니다. 기여해 주신 Wei Zhao에게 감사드립니다. (Bug #27850600, Bug #90402)
      - **InnoDB:** 트랜잭션이 보조 인덱스에 대한 암시적 잠금을 보유하는지 확인하는 검사에서 어설션 실패가 발생했습니다. 가상 컬럼을 포함하는 보조 인덱스의 컬럼을 변경하지 않는 트랜잭션이 암시적 잠금을 보유하는 것으로 잘못 판단될 수 있었습니다. (Bug #27491839)
      - **InnoDB:** [`CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html) 스레드가 호출한 함수가 백그라운드 스레드에 의해 해제된 후 테이블 객체에 접근하려고 시도했습니다.
      
      패치를 제공해 주신 Yan Huang에게 감사드립니다. (Bug #27373959, Bug #89126)
      
      - **InnoDB:** 두 세션이 `INSERT... ON DUPLICATE KEY UPDATE` 작업을 동시에 실행하면 데드락이 발생했습니다. 튜플의 부분 롤백 중에 다른 세션이 해당 튜플을 업데이트할 수 있었습니다. 이 버그에 대한 수정은 Bug #11758237, Bug #17604730 및 Bug #20040791에 대한 수정을 되돌립니다. (Bug #25966845)
      - **InnoDB:** 조인된 테이블에 접근하는 데 사용된 메서드가 `const`인 경우, [`InnoDB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-storage-engine.html)는 일치하는 로우를 여러 번 잠금 해제하려고 시도했습니다. (Bug #20939184)
      - **InnoDB:** 인덱스를 추가할 때 [`INFORMATION_SCHEMA.TABLES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-tables-table.html)의 `INDEX_LENGTH` 값이 업데이트되지 않았습니다. (Bug #19811005)
      - **Partitioning:** 일부 파티셔닝 DDL 문은 잘못된 테이블 식별자를 사용한 이름 검증 검사로 인해 부적절하게 거부되었습니다. (Bug #29317007)
      - **Partitioning:** [`ALTER TABLE... COALESCE PARTITION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table-partition-operations.html)을 롤백하는 동안, 서버가 이 문으로 인해 삭제된 파티션을 잠그고 닫으려고 시도하는 경우가 있었습니다. (Bug #28517446)
      
      - **파티셔닝:** `ALGORITHM=INPLACE`를 사용하는 [`ALTER TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 문으로 파티셔닝된 테이블에 추가된 `AUTO_INCREMENT` 키가 각 파티션에서 다시 시작되었습니다. (Bug #92241, Bug #28573894)
      - **Replication:** `WAIT_FOR_EXECUTED_GTID_SET()` 함수가 소수 부분을 포함하는 타임아웃 값(예: `1.5`)과 함께 사용된 경우, 캐스팅 로직의 오류로 인해 타임아웃이 가장 가까운 정수 초로 내림되었고, 1초보다 작은 값(예: `0.1`)의 경우 0으로 내림되었습니다. 이제 캐스팅 로직이 수정되어 타임아웃 값이 반올림 없이 원래 지정된 대로 적용됩니다.
      
      기여해 주신 Dirkjan Bussink에게 감사드립니다. (Bug #29324564, Bug #94247)
      - **Replication:** 시스템 변수 [`group_replication_consistency`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_consistency)에 대한 일관성 수준 `AFTER`에는 `BEFORE_ON_PRIMARY_FAILOVER`가 제공하는 일관성 보장이 포함되지 않았습니다. 이미 `BEFORE` 및 `BEFORE_AND_AFTER` 일관성 수준에 암시적으로 존재했던 이러한 일관성 보장이 이제 `AFTER`에서도 제공됩니다. (Bug #29315752, Bug #94213)
      
      - **Replication:** Debian 기반 플랫폼(예: Ubuntu)에서 호스트 이름이 127.0.1.1로 해석되는 경우(이 플랫폼의 기본값)에는 기본 설정을 사용하여 클러스터를 생성할 수 없었습니다. 이제 이러한 상황에서는 클러스터를 생성하고 인스턴스를 추가하기 전에 해당 인스턴스에 대한 적절한 검증이 수행됩니다. (Bug #29246110)
      - **Replication:** 차단된 그룹에서 [`group_replication_force_members`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_force_members)에 잘못된 값을 설정한 다음 [`STOP GROUP_REPLICATION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/stop-group-replication.html)을 실행하면 서버가 예기치 않게 중지될 수 있었습니다. (Bug #29119961)
      
      - **Replication:** `mysql.gtid_executed` 테이블에 접근할 수 없을 때 MySQL Server의 동작은 적절한 오류 응답 및 동작을 제공하도록 리팩터링되었습니다. 이제 MySQL 서버는 서버가 read only 또는 super read only 모드일 때 `mysql.gtid_executed` 테이블에 대한 쓰기가 허용되도록 보장하므로, 이러한 모드에서도 바이너리 로그 파일을 계속 로테이트할 수 있습니다. `mysql.gtid_executed` 테이블에 쓰기 접근을 할 수 없고 최대 파일 크기([`max_binlog_size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_max_binlog_size))에 도달한 것 이외의 어떤 이유로든 바이너리 로그 파일이 로테이트되는 경우, 현재 바이너리 로그 파일이 계속 사용됩니다. 로테이션을 요청한 클라이언트에는 오류 메시지가 반환되고, 서버에는 경고가 로깅됩니다. `mysql.gtid_executed` 테이블에 쓰기 접근을 할 수 없고 [`max_binlog_size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_max_binlog_size)에 도달한 경우, 서버는 [`binlog_error_action`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_error_action) 설정에 따라 응답합니다. `IGNORE_ERROR`가 설정된 경우 서버에 오류가 로깅되고 바이너리 로깅이 중지되며, `ABORT_SERVER`가 설정된 경우 서버가 종료됩니다. (Bug #29111514)
      
      - **Replication:** 멤버가 과반수를 잃었는지 여부를 평가하려고 시도하는 동안 [`STOP GROUP_REPLICATION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/stop-group-replication.html)을 실행하면 서버가 예기치 않게 중지될 수 있었습니다. (Bug #29053128)
      - **Replication:** [`RESET MASTER TO`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/reset.html) 문을 사용하여 바이너리 로그 파일의 시작 인덱스 번호를 지정할 때, 지정할 수 있는 최대 숫자가 최대 정수 값에서 2000000000으로 낮아졌습니다. 최대 정수 값을 지정한 경우, 더 이상 바이너리 로그 파일을 생성할 수 없었기 때문에 서버를 시작할 수 없었습니다. 이전에는 서버가 이 상황에서 세그멘테이션 오류도 발생시켰습니다. (Bug #28980788, Bug #28995220)
      - **Replication:** GTID를 사용 중이고 바이너리 로깅이 비활성화된 복제 슬레이브에서, DDL 문이 테이블 필터에 의해 필터링되면 디버그 모드에서 assertion이 발생했습니다. (Bug #28965972)
      - **Replication:** 바이너리 로그에서 문 기반 복제 이벤트의 deserialization과 관련된 두 문제가 수정되었습니다. (Bug #28889181, Bug #29028491)
      
      - **Replication:** applier 스레드가 테이블을 여는 과정에 있는 동안 중지된 경우 오류가 설정되지 않았으며, 이는 빌드 타입에 따라 세그멘테이션 오류 또는 어설션을 초래할 수 있었습니다. 이제 이 상황에서 오류 처리가 올바르게 활성화됩니다. (Bug #28864557)
      - **Replication:** 서버에서 GTID가 사용 중인 경우, 마스터가 auto-skip 함수를 사용하여 트랜잭션을 건너뛸 때마다 복제 슬레이브의 마스터 정보 로그가 동기화되었습니다. 이 프로세스는 슬레이브로 전송되는 더미 하트비트로 끝나며, 이로 인해 로그에 대한 강제 flush가 발생했고, 이는 슬레이브의 쓰기 부하에 큰 누적 영향을 줄 수 있었습니다. 동일한 서버에서 발생했으므로 무시되는 이벤트가 있는 순환 복제 토폴로지에서도 동일한 문제가 발생할 수 있었으며, 이러한 이벤트도 슬레이브에서 로그에 대한 강제 flush와 함께 처리되었습니다. 이제 슬레이브 처리 코드가 변경되어 하트비트 이벤트와 순환 복제를 통해 수신된 무시된 이벤트에 대한 강제 flush가 제거되었으므로, 마스터 정보 로그는 적절한 경우에만(예를 들어, `CHANGE MASTER` 문이 실행되거나 바이너리 로그가 순환되는 경우) 동기화됩니다. (Bug #28815555, Bug #85158)
      
      - **Replication:** [`ALTER TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 문을 `DEFAULT` 절과 함께 사용하여 새 컬럼에 대한 표현식 기본값을 지정하고, 해당 표현식 기본값이 비결정적 함수를 참조하는 경우, 이 문은 명령문 기반 복제에 안전하지 않습니다. 이전에는 이러한 문도 GTID 일관성 측면에서 평가되었지만, 해당 문은 GTID 일관성에 영향을 주지 않으므로 이는 적절한 검사가 아니었습니다. 이제 이러한 문은 바이너리 로깅에 대해서만 평가되며, 사용 중인 바이너리 로깅 형식에 따라 처리됩니다. [`binlog_format`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_format)이 `STATEMENT`로 설정된 경우, 해당 문은 로그에 기록되지만 경고 메시지가 오류 로그에 기록됩니다. [`binlog_format`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_format)이 `MIXED` 또는 `ROW`로 설정된 경우, 해당 문은 실행되지 않으며 오류 메시지가 오류 로그에 기록됩니다. (Bug #28799939)
      
      - **Replication:** 단일 프라이머리 모드([`group_replication_single_primary_mode=ON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_single_primary_mode), 기본값)로 설정된 복제 그룹에서 심각한 네트워크 지연이 그룹에 영향을 미친 경우, 프라이머리와 세컨더리가 트랜잭션에 대해 서로 다른 결정을 내릴 수 있었으며, 이로 인해 멤버의 `gtid_executed` 세트에 차이가 발생할 수 있었습니다. 이 문제는 이제 수정되었습니다. (Bug #28768550, Bug #28966455, Bug #92690)
      - **Replication:** [`group_replication_force_members`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_force_members) 시스템 변수를 사용하여 그룹에 새 설정을 강제로 적용할 때, 이제 그룹 통신 엔진(XCom)은 현재 연결할 수 없는 그룹 멤버를 포함하지 않았는지 확인합니다. 해당 멤버가 발견되면 재설정이 허용되지 않고 오류가 반환됩니다. (Bug #28678845)
      
      - **Replication:** 바이너리 로그에 기록된 [`GRANT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/grant.html) 문이 일부 경우에 잘못 로깅되어, 마스터에서 성공적으로 실행된 [`GRANT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/grant.html) 문이 복제 슬레이브에서 오류를 발생시킬 수 있었습니다. (Bug #28643405, Bug #29155451, Bug #93750)
      - **Replication:** 스토리지 엔진이 `STATEMENT` 형식으로 로깅할 수 있지만 `ROW` 형식으로는 로깅할 수 없는 기능을 가진 경우, [`binlog_format`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_format)이 `STATEMENT`로 설정되어 있으면 안전하지 않은 SQL 문이 로깅되고 경고 메시지가 오류 로그에 기록되어야 합니다. 그러나 이러한 문은 대신 실행되지 않았고 오류 메시지가 오류 로그에 기록되었으며, 이는 [`binlog_format`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_format)이 `MIXED` 또는 `ROW`로 설정된 경우의 올바른 동작입니다. 이제 이 문제는 수정되어, [`binlog_format`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_format)이 `STATEMENT`로 설정된 경우 안전하지 않은 문이 예상대로 경고와 함께 로깅됩니다. (Bug #28429993, Bug #73936)
      
      - **Replication:** 복제 그룹 멤버가 잠시 오프라인 상태가 된 다음, 그룹이 해당 멤버의 장애를 감지하고 그 멤버를 제거하도록 재구성되기 전에 다시 복제 그룹에 재참여를 시도할 수 있습니다. 이전에는 이 상황에서 재참여하는 멤버가 충돌 전 인카네이션을 대상으로 한 메시지를 수신하고 처리하면 XCom의 합의 프로토콜에 참여할 수 있었습니다. 이로 인해 XCom이 동일한 합의 라운드에 대해 서로 다른 값을 전달할 수 있었습니다. 재참여하는 멤버가 장애 전과 후에 서로 다른 결정을 내릴 수 있었기 때문입니다. 이 상황을 방지하기 위해, 이제 재참여하는 멤버는 충돌 전 인카네이션을 대상으로 한 메시지를 무시합니다. (Bug #27383487)
      - **Replication:** 과부하된 서버에서는 멤버가 그룹에 참여할 때 해당 지점을 표시하는 `VIEW_CHANGE_LOG_EVENT` 이벤트가 올바른 위치에 기록되지 않을 가능성이 있었습니다. 이로 인해 새로 참여하는 서버로의 데이터 전송에서 오류와 데이터 불일치가 발생할 수 있었습니다. 이제 `VIEW_CHANGE_LOG_EVENT` 이벤트는 바이너리 로그의 올바른 위치에 기록됩니다. 또한 이벤트 기록 지연에 대한 경고가 로그에 기록됩니다. (Bug #93347, Bug #28971594)
      
      - **Replication:** 서버 시작 시 멤버가 그룹에 참여할 때, 예를 들어 서버가 그룹과 호환되지 않아 참여 프로세스가 실패한 경우, 오프라인 멤버가 여전히 다른 멤버를 온라인 상태로 볼 가능성이 있었습니다. 이제 이러한 상황에서는 [`performance_schema.replication_group_members`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-replication-group-members-table.html) 테이블에 표시되는 정보가 `OFFLINE` 상태일 때 로컬 멤버로 제한됩니다. (Bug #92110, Bug #28533993)
      - **Replication:** 복구 채널이 실패하는 경우, 처리되지 않은 릴레이 로그가 삭제되고 있었습니다. (Bug #90671, Bug #27940732)
      - **Group Replication:** 멤버의 로컬 주소에 지정된 포트가 사용 중일 때 [`START GROUP REPLICATION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/start-group-replication.html)이 제대로 작동하지 않았습니다. (Bug #29347285)
      
      - **Group Replication:** Group Replication의 IP 주소 화이트리스트([`group_replication_ip_whitelist`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_ip_whitelist))에 호스트 이름이 지정된 경우, IPv4 주소도 사용할 수 있을 때 이름 확인 및 화이트리스트 비교에 IPv6 주소가 사용되었습니다. Group Replication 연결에는 항상 IPv4 주소가 우선되어야 합니다. 이제 호스트 이름이 IPv4 주소로 확인되면, IPv6 주소는 화이트리스트와 비교할 때 고려되지 않습니다. (Bug #28841543)
      
      - **Group Replication:** 이전에는 [`FLUSH RELAY LOGS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/flush.html#flush-relay-logs) 문을 사용하여 Group Replication `group_replication_applier` 채널의 릴레이 로그를 수동으로 순환할 수 없었습니다. 이 제한으로 인해, MySQL 8.0.14부터 사용할 수 있는 것처럼 바이너리 로그 파일과 릴레이 로그 파일에 대해 암호화가 활성화된 경우([`binlog_encryption=ON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_encryption)), 암호화가 다시 비활성화되면 해당 채널에서 사용 중인 릴레이 로그 파일을 즉시 순환할 수 없었습니다. 이 제한은 MySQL 8.0.16부터 사용할 수 있는 바이너리 로그 마스터 키 순환에도 유사한 영향을 미쳤습니다. 이제 이 제한은 제거되었으며, [`FLUSH RELAY LOGS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/flush.html#flush-relay-logs) 문과 이에 대응하는 내부 요청은 이제 다른 모든 채널과 마찬가지로 `group_replication_applier` 채널에서 작동합니다. 단, 트랜잭션이 적용되는 동안 요청이 수신되면 요청은 트랜잭션이 종료된 후 수행됩니다. 요청자는 트랜잭션이 완료되고 순환이 수행되는 동안 기다려야 합니다. 이 동작은 트랜잭션이 분할되는 것을 방지하며, 이는 Group Replication에서 허용되지 않습니다. (Bug #28684376)
      
      - **Group Replication:** 복제 그룹 멤버가 과반수 손실로 인해 그룹에서 축출된 후 로컬 뷰를 트리거할 수 있었습니다. 이로 인해 해당 멤버가 축출 후 정상 작업을 재개했다는 잘못된 메시지가 표시되었습니다. 이제 Group Replication은 로컬 뷰를 전달하기 전에 해당 멤버가 축출되지 않았는지 확인합니다. (Bug #27349236)
      - **Group Replication:** [`group_replication_communication_debug_options`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_communication_debug_options)에 유효하지 않은 값이 지정된 경우, Group Communication System은 해당 내부 변수를 `GCS_DEBUG_NONE`으로 설정했고, 서버는 [`SHOW VARIABLES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-variables.html) 쿼리에 대해 유효하지 않은 값을 반환했습니다. 이제 이 시스템 변수의 값은 서버 초기화 중에 확인되며, 유효하지 않은 값이 지정된 경우 오류 메시지가 로그에 기록되고 Group Replication이 자동으로 시작되지 않습니다. (Bug #26729404)
      - **macOS:** 이제 Makefiles가 아니라 Xcode로 빌드하는 경우 macOS에서 `CMake` 3.12.4 이상(`UseModernBuildSystem = NO`를 강제함)이 필요합니다. (Bug #28893131)
      
      - **Microsoft Windows:** [`named_pipe_full_access_group`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_named_pipe_full_access_group) 시스템 변수에 대한 유효성 테스트가 `NULL` 값을 고려하지 않았습니다. (Bug #29256690)
      - **Microsoft Windows:** 동일한 호스트에서 동일한 사용자로 **mysqld**의 여러 인스턴스가 [`--no-monitor`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_no-monitor) 옵션과 함께 시작되었을 때, `SHUTDOWN` 명령이 잘못된 서버 프로세스를 종료했습니다. 이 수정은 프로세스의 프로세스 ID를 추가하여 [`--no-monitor`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_no-monitor)와 함께 사용할 고유한 종료 이벤트 이름을 생성합니다. (Bug #28723675)
      - **JSON:** JSON 경로 파서는 이제 MySQL 서버의 대부분의 다른 컴포넌트와 동일한 방식으로 오류를 전파하며, 오류 시 true를 반환하고 성공 시 false를 반환합니다. (Bug #28851426)
      - **JSON:** `Json_wrapper::get_datetime()`에서 필요하지 않은 타입 조회를 제거했습니다. (Bug #28851324)
      - `authentication_ldap_simple` 플러그인이 인증을 잘못 적용할 수 있었습니다. (Bug #29637712)
      - EL8에서 MariaDB에서 MySQL로 성공적으로 업그레이드할 수 있도록 RPM 패키지 obsoletes가 업데이트되었습니다. (Bug #29413354)
      
      - 외부 조인의 결과에 `NULL` 확장 로우가 예상되는 위치에 `NULL`이 아닌 로우가 포함될 수 있었습니다. (Bug #29402481)
      
      참조: 이 문제는 다음 버그의 회귀입니다: Bug #27808758.
      - `SET PASSWORD FOR...`를 prepared statement로 실행할 수 없었습니다. (Bug #29387041, Bug #94416)
      - Visual Studio에서 빌드할 때 MySQL Router 라이브러리를 빌드하는 동안 실패할 수 있었습니다. (Bug #29382197)
      
      참조: 이 문제는 다음 버그의 회귀입니다: Bug #29361890.
      - 가져온 외래 키가 참조되는 테이블보다 먼저 정의된 경우 작동하지 않았습니다. (Bug #29379078, Bug #94400)
      
      참조: 이 문제는 다음 버그의 회귀입니다: Bug #28493257.
      - resolve time에 `LIKE` 표현식의 `ESCAPE` 절을 평가하는 동안 오류가 발생했을 때, 오류 상태가 호출자에게 전파되지 않았습니다. (Bug #29368521)
      - `innodb_table_stats_backup` 및 `innodb_index_stats_backup` 메타데이터 백업 테이블의 테이블스페이스 파일이 MySQL 5.7에서 MySQL 8.0으로 in-place 업그레이드한 후 제거되지 않았습니다. (Bug #29365552)
      - 서브쿼리를 평탄화하는 동안 항상 false인 조건자가 존재하면 MySQL Optimizer가 어떤 종류의 변환도 수행하지 않아 준비되지 않은 서브쿼리가 발생했으며, 해당 서브쿼리는 나중에 실행될 때 assert되었습니다. 이 문제를 해결하기 위해, 이제 이러한 조건자가 서브쿼리에 존재하면 서브쿼리의 쿼리 표현식이 쿼리 블록에서 연결 해제됩니다. (Bug #29356132)
      
      - MySQL 8.0.11, 8.0.12 또는 8.0.13에서 MySQL 8.0.14 또는 8.0.15로 업그레이드할 때 이벤트, 루틴 또는 트리거가 [`ALLOW_INVALID_DATES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/sql-mode.html#sqlmode_allow_invalid_dates) SQL 모드로 정의되어 있으면 실패했습니다. 데이터 딕셔너리의 SQL 모드 식별자가 MySQL 8.0.14에서 변경되어 마이그레이션 실패가 발생했습니다. (Bug #29350955)
      - RPM 빌드는 [`WITH_SSL`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_with_ssl) 설정 구성을 무시했습니다. (Bug #29347534)
      - [`TO_SECONDS()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/date-and-time-functions.html#function_to-seconds) 함수의 길이 메타데이터가 항상 올바르게 계산되지는 않았습니다. (Bug #29321387)
      - 항상 true 또는 false이기 때문에 제거된 윈도잉 함수를 사용하는 조건이 항상 올바르게 처리되지는 않았습니다. (Bug #29320484)
      - [`SET ROLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/set-role.html) 문에서 메모리 누수가 발생할 수 있었습니다. (Bug #29304583)
      - Windows에서 MySQL 5.7에서 MySQL 8.0으로 업그레이드할 때 “Error 197 from SE while migrating tablespaces” 오류와 함께 실패했습니다. 이 오류는 테이블스페이스 파일을 열려고 시도할 때 발생한 액세스 공유 위반 때문이었습니다. (Bug #29292860)
      
      참조: 이 문제는 다음 버그의 회귀입니다: Bug #28642608.
      
      - [`COMPILATION_COMMENT_SERVER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_compilation_comment_server) 값이 RPM 패키지에서 올바르지 않을 수 있었습니다. (Bug #29284651)
      - 새 테이블 정의에 기본 키가 없고 [`sql_require_primary_key`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_sql_require_primary_key) 시스템 변수가 활성화된 경우, 테이블이 이미 존재하더라도 `CREATE TABLE IF NOT EXISTS`가 실패했습니다. (Bug #29283055, Bug #94134)
      - 모든 파티션이 제거되도록 가지치기된 파티션된 테이블에서의 delete가 항상 올바르게 처리되지는 않았습니다. (Bug #29280186)
      - GNU `gold` 링커에 대한 **CMake** 검사가 Clang에서 실패할 수 있었습니다. (Bug #29278244)
      - MySQL 8.0.16 릴리스에 대해 데이터 딕셔너리 버전이 증가했습니다. (Bug #29278241)
      - `DISTINCT`와 함께 사용되는 함수에 잘못된 타입의 인수가 전달된 경우 항상 올바르게 처리되지는 않았습니다. (Bug #29277571)
      - [`QUOTE()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/string-functions.html#function_quote) 함수의 길이 메타데이터가 항상 올바르게 계산되지는 않았습니다. (Bug #29276074)
      
      - [`GREATEST()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/comparison-operators.html#function_greatest) 또는 [`LEAST()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/comparison-operators.html#function_least)를 평가할 때, MySQL은 반환 값의 올바른 signedness를 `NULL` 여부를 확인하기 전에 검사했습니다. (Bug #29275835)
      - strict SQL 모드가 적용되지 않았을 때, [`max_allowed_packet`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_max_allowed_packet)보다 큰 결과를 나타내기 위해 `NULL`을 반환하는 일부 문자열 함수의 값이 일관되지 않은 동작으로 처리되었으며, 이로 인해 출력이 잘못 정렬되고 다른 오동작이 발생할 수도 있었습니다. (Bug #29272683)
      
      참조: 함께 참조하십시오: Bug #97301, Bug #29133127.
      - 특정 서버 버전으로의 업그레이드가 지원되는지 확인하는 로직이 반대로 되어, 업그레이드가 지원되지 않는 서버 버전을 확인했습니다. (Bug #29270297)
      - 이벤트 생성이 잘못된 반복 간격을 저장할 수 있었습니다. (Bug #29269819, Bug #94085)
      - 뷰 참조 또는 변환에 의해 생성된 항목을 포함하는 WHERE 조건이 항상 올바르게 처리되지는 않았습니다. (Bug #29268867, Bug #29268698, Bug #28723669, Bug #29244238)
      - **mysql_ssl_rsa_setup**이 GCC 9를 사용하여 컴파일되지 않았습니다. (Bug #29245251)
      
      - **CMake**가 MySQL과 함께 작동하기에 너무 오래된 `libtirpc` 라이브러리를 찾으면, 대신 `glibc`의 Sun RPC를 사용하려고 시도합니다. (Bug #29240701)
      - 서버가 쿼리 실행 시간의 잘못된 계산으로 인해 느린 쿼리를 느린 쿼리 로그에 쓰지 못할 수 있었습니다. (Bug #29232684, Bug #93963)
      - 위치를 사용하는 MySQL 정규 표현식 함수가 코드포인트 위치가 아니라 16비트 청크를 기반으로 하는 내부 인덱스를 사용했습니다. (Bug #29231490)
      - Windows에서 MySQL MSI 설치 관리자가 Visual Studio 2015 Redistributable이 설치되었는지 올바르게 감지하지 못할 수 있었습니다. (Bug #29227209)
      - SDI `JSON` 파일에 `Index_impl` 객체의 `m_hidden` 필드가 포함되지 않았습니다. 이로 인해 `InnoDB`가 여러 숨겨진 인덱스를 추가하기 때문에 SDI `JSON`을 사용하여 테이블의 `CREATE` 문을 다시 생성하기 어려웠습니다. 이제 SDI `JSON`에는 `m_hidden` 필드가 포함됩니다. 이 변경으로 SDI 형식이 변경되므로, SDI 버전 번호가 현재 서버 버전 번호로 증가했습니다. (Bug #29210646, Bug #93914)
      - 범위 프레임의 마지막 로우에 대한 위치 힌트가 프레임의 실제 마지막 로우보다 한 로우 뒤로 업데이트되었습니다. (Bug #29201831)
      - 컬럼 정의에서 첫 번째 제약 조건이 `CHECK` 제약 조건일 때 여러 제약 조건 정의가 허용되지 않았습니다. (Bug #29191994)
      - 시작 중 버퍼링된 오류 로그 정보는 서버가 업그레이드를 수행 중인 경우 너무 오래 버퍼링될 수 있었습니다. (Bug #29189532)
      
      - nullable 컬럼의 경우 컬럼이 `NULL`일 때를 제외하고 항상 true인 표현식을 찾으면, 해당 표현식은 `column IS NOT NULL`로 폴딩되었습니다. 이러한 표현식이 중첩된 경우, 이로 인해 `NULL` 로우가 잘못 선택되었습니다. 이러한 일이 발생하지 않도록 하기 위해, 이제 이러한 표현식이 중첩된 경우 대신 `IF(column IS NULL, NULL, TRUE)`로 폴딩됩니다. (Bug #29179604)
      - [`PERIOD_ADD()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/date-and-time-functions.html#function_period-add)는 Windows 플랫폼에서 *`period`* 인수에 대해 길이가 32비트를 초과하는 값을 올바르게 처리하지 못했습니다. (Bug #29175262)
      - [`sql_auto_is_null`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_sql_auto_is_null)이 활성화된 경우, `WHERE auto_increment_col IS NULL` 형식의 `WHERE` 절은 `WHERE auto_increment_col =` [`LAST_INSERT_ID()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-functions.html#function_last-insert-id)로 다시 작성됩니다. 이 변환은 auto-increment된 값마다 한 번만 수행되었으므로, 변환이 수행될지 여부를 사전에 알기 어려웠습니다. 이제 `sql_auto_is_null`이 활성화될 때마다 변환이 조건 없이 수행됩니다.
      
      또한 이제 `LAST_INSERT_ID()`가 반환하는 값은 unsigned로 처리되며, signed [`BIGINT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/integer-types.html)의 범위를 벗어나는 auto-increment된 값과 매칭하지 못하던 문제가 수정되었습니다. (Bug #29171668)
      
      - Debian 및 Ubuntu에서 noninteractive 모드의 설치 작업이 `root` 비밀번호를 무시하여, `auth_socket` 인증 플러그인이 기본적으로 설치되는 결과가 발생했습니다. (Bug #29165407)
      - `harness_plugin_eventlog` 선언이 일부 빌드 환경에서 컴파일 오류를 발생시켰습니다. (Bug #29160214)
      - 상수 폴딩 중 decimal 상수를 원하는 소수 자릿수로 자르거나 확장하는 로직이 부족했습니다. 확장 여부 결정이 전체 소수 자릿수가 아니라 0이 아닌 소수 자릿수의 개수를 기준으로 이루어졌기 때문에, 소수 부분의 불필요한 후행 0이 소수 부분을 확장하려는 시도를 유발할 수 있었고, 이로 인해 내부 함수 `widen_fraction()`에서 assert(디버그 빌드에서)가 발생했습니다. 이 문제는 불필요한 후행 0을 단순히 자를 수 있는 위치를 식별하여 수정되었습니다. 이 경우 비교 연산자를 조정할 필요가 없으며, 대신 상수를 후행 0이 더 적은 상수로 대체할 수 있습니다. (Bug #29155439)
      - Windows에서 내부 함수 `get_mysql_time_from_str_no_warn()`가 항상 적절한 오류 검사를 수행하지는 않았습니다. (Bug #29155126)
      
      참조: 다음도 참조하십시오: Bug #29175262.
      
      - 특정 조건에서 동일한 테이블의 이름을 여러 번 변경한 [`RENAME TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/rename-table.html) 문이 assertion을 발생시키거나 서버 종료를 유발할 수 있었습니다. (Bug #29140407)
      - 디버그 빌드의 경우 [`--event-scheduler=DISABLED`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_event_scheduler)로 서버를 시작하면 특정 이벤트에 대해 assertion이 발생할 수 있었습니다. (Bug #29140298, Bug #93719)
      - 디버그 빌드에서 strict SQL 모드가 적용되지 않은 경우, 결과가 [`max_allowed_packet`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_max_allowed_packet)보다 길면 [`CONCAT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/string-functions.html#function_concat) 및 [`CONCAT_WS()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/string-functions.html#function_concat-ws) 함수가 assertion을 발생시켰습니다. (Bug #29133127)
      - 범위를 벗어난 소수부가 `SET SESSION timestamp` 문에서 잘못된 타임스탬프를 생성할 수 있었습니다. (Bug #29120569, Bug #93600)
      - `mysql_service_component_sys_variable` 서비스는 컴포넌트 시스템 변수에는 접근할 수 있었지만 서버 또는 플러그인 시스템 변수에는 접근할 수 없었습니다. (Bug #29113463)
      - `ALTER TABLE... CONVERT TO CHARACTER SET`이 메모리 접근 오류를 발생시킬 수 있었습니다. (Bug #29058369, Bug #93603)
      
      - `mysql.tablespaces.name` 컬럼 제한은 259바이트였으며, 이는 허용되는 식별자 길이에 필요한 것보다 작았습니다. 컬럼 제한이 268바이트로 늘어났습니다. (Bug #29053560, Bug #93587)
      - 디버그 빌드에서 어설션을 발생시킨 공간 연산의 경우, 파티션 처리 코드가 오류를 무시하여 서버가 종료되었습니다. (Bug #29047811)
      - 외부에 저장된 길이가 0인 LOB가 어설션 실패를 발생시켰습니다. (Bug #29047795)
      - 크로스 컴파일 실패를 피하기 위해 `COMPILE_DEFINITIONS` 및 `COMPILE_FLAGS` **CMake** 옵션 처리가 조정되었습니다. (Bug #29041100)
      - [`max_error_count`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_max_error_count) 시스템 변수가 0으로 설정된 경우에도 서버가 첫 번째 diagnostics area 메시지를 읽으려고 시도할 수 있었으며, 그 결과 메모리 접근 오류가 발생했습니다. (Bug #29031684)
      
      - 상수 문자열과 [`DATE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/datetime.html) 값을 비교할 때, MySQL은 먼저 문자열을 `DATE`로 변환한 다음 비교를 수행하려고 시도합니다. 변환이 실패하면, MySQL은 `DATE`를 문자열로 취급하여 비교를 실행했으며, 이로 인해 예측할 수 없는 동작이 발생할 수 있었습니다. 이제 이러한 경우 문자열을 `DATE`로 변환하는 데 실패하면, 비교는 [`ER_WRONG_VALUE`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_wrong_value)와 함께 실패합니다. (Bug #29025656)
      
      참조: 함께 참조하십시오: Bug #95466, Bug #29812087.
      - [`--users`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/mysqlpump.html#option_mysqlpump_users) 옵션을 사용할 때, **mysqlpump**는 `CREATE USER` 및 `GRANT` 문을 출력에 기록했지만, 덤프가 생성한 다른 객체에 적용하기에는 너무 늦었습니다. 결과적으로, 덤프 파일을 복원하면 해당 파일이 생성한 다른 객체에 적용하기에는 너무 늦게 사용자 계정이 생성되었습니다. 이제 **mysqlpump**는 다른 객체보다 먼저 사용자 계정을 덤프 파일에 기록합니다. (Bug #29023216)
      - [`WITH`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/with.html) 키워드 위치의 문법 오류에 대해, 파서 오류 메시지가 잘못된 위치에서 문제를 식별했습니다. (Bug #29022263)
      
      - 최신 버전의 International Components for Unicode (ICU)를 사용한 MySQL 빌드는 이제 잘못된 형식의 정규 표현식에 대해 일반 오류 [`ER_REGEXP_ERROR`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_regexp_error) 대신 [`ER_REGEXP_ILLEGAL_ARGUMENT`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_regexp_illegal_argument)를 반환합니다. (Bug #29016798)
      - Windows에서 파일 시스템이 대소문자를 구분하는 경우 LDAP 라이브러리를 찾을 수 없었습니다. (Bug #29016220)
      - [`INFORMATION_SCHEMA.TABLES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-tables-table.html) 테이블의 `TABLE_COMMENT` 컬럼에서 선택된 값이 잘릴 수 있었습니다. (Bug #29014272, Bug #93451)
      - 해제되지 않은 스키마와 관련된 데이터 계층 메모리 누수가 ASAN 및 Valgrind 빌드에서 발견되었습니다. (Bug #29008688)
      - `ROLLUP`을 사용하는 `GROUP BY` 쿼리는 표현식을 포함하는 `ORDER BY` 절과 함께 사용될 때 잘못해서 [`ER_WRONG_FIELD_WITH_GROUP`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_wrong_field_with_group)을 발생시켰습니다.
      
      동일한 문제는 함수 기준으로 정렬할 때 ROLLUP을 사용하는 `GROUP BY` 쿼리 결과의 잘못된 정렬도 초래했습니다. (Bug #29006668, Bug #29054096)
      
      - 생성된 컬럼 정의에서 파서가 여러 `COLLATE` 절을 허용했습니다. 이제 단일 `COLLATE` 절만 허용합니다. (Bug #28997518)
      - `INSERT... ON DUPLICATE KEY UPDATE`가 잘못된 업데이트를 수행할 수 있었습니다. (Bug #28995498, Bug #93410)
      
      참조: 이 문제는 다음의 회귀입니다: Bug #26188578.
      - 손상된 `mysql.user` 테이블이 서버 종료를 유발할 수 있었습니다. (Bug #28986737)
      - Performance Schema [`data_locks`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-data-locks-table.html) 또는 [`data_lock_waits`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-data-lock-waits-table.html) 테이블에서 로우를 읽을 때 스캔 중 제한 없는 수의 로우가 반환될 수 있었고, 과도한 메모리 할당으로 인해 서버 종료가 발생했습니다. 이제 이러한 상황에서는 오류가 발생합니다. (Bug #28977428, Bug #87748)
      - 빈 테이블에 대한 `LATERAL` 조인의 구체화 비용을 계산하면 assertion이 발생했습니다. 이제 이러한 경우에는 쿼리 비용이 0으로 보고됩니다. (Bug #28976533)
      - 디버그 빌드의 경우, `CREATE` 또는 `ALTER` DDL 문에서 컬럼 타입에 대한 주석 문자열에 잘못된 `utf8` 문자가 있으면 assertion이 발생했습니다. (Bug #28972424, Bug #93321)
      
      - `tirpc` 헤더에 대한 **CMake** 검사는 이제 더 많은 Linux 플랫폼에서 헤더를 찾을 수 있도록 `pkgconfig` 사용으로 폴백합니다. 이를 위해서는 **pkgconfig**가 설치되어 있어야 합니다. (Bug #28970313, Bug #93341, Bug #28997093)
      - 서브쿼리의 `WHERE` 절에 있는 컴포넌트가 비결정적일 때 **mysqld**에서 계획되지 않은 종료가 발생할 수 있었으며, 이 특정 사례에서는 동일한 문장에서 설정되기도 한 사용자 변수를 참조했기 때문이었습니다. 이 문제는 비결정적 컴포넌트를 가진 조건자를 무시하도록 하여 수정되었습니다.
      
      또한 일반적으로 비결정적 서브쿼리는 외부 로우마다 평가되어야 하므로, 이러한 서브쿼리는 구체화 전략의 대상이 되어서는 안 됩니다. 이는 비결정적 조건자의 상관 관계를 제거하지 않음으로써 방지됩니다. 가능한 경우 non-semijoin 및 비결정적 서브쿼리에 대한 동일한 전략 선택도 이제 적용됩니다. (Bug #28970261)
      - 테이블 스토리지 엔진을 변경하는 [`ALTER TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 문은 사용자 수준 잠금과 명시적 테이블 잠금이 이전에 획득된 경우 중단될 수 있었습니다. (Bug #28966941)
      - `LIMIT... OFFSET`과 함께 사용된 [`COUNT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/aggregate-functions.html#function_count)는 이 절과 함께 사용된 다른 집계 함수로 얻은 결과와 다른 결과를 반환했습니다. (Bug #28961843)
      
      - `MYSQL_HOME` 환경 변수의 값을 추출하면 환경에서 `MYSQL_HOME` 뒤에 저장된 변수의 값이 변경될 수 있었습니다. (Bug #28960613)
      - `Item_subselect::walk_body()`가 이제 `FROM` 절을 순회합니다. (Bug #28955358)
      - 다음 두 `IN` 서브쿼리가 있는 쿼리의 쿼리 계획에서 문제가 발견되었습니다:
      
      - 최상위 쿼리에 대한 외부 참조를 포함하는 파생 테이블이 있는 서브쿼리
      - 외부 상관되지 않았고, 세미조인되었으며, lateral이 아니었던 파생 테이블이 있는 서브쿼리.
      
      두 번째 서브쿼리의 경우: 의존성 맵 계산에서 관련 없는 lateral 테이블을 제외하지 않았으며, 첫 번째 서브쿼리에 있는 파생 테이블의 의존성을 잘못 포함했습니다. (Bug #28954838)
      - 특정 `GROUP BY` 쿼리에서 상수 표현식을 평가하는 동안 생성된 오류가 적시에 확인되지 않았습니다. (Bug #28949452)
      
      - [`DATE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/datetime.html) 또는 [`DATETIME`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/datetime.html) 값을 문자열과 비교할 때 MySQL은 먼저 문자열을 동일한 타입(`DATE` 또는 [`DATETIME`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/datetime.html))으로 변환하려고 시도한 다음, 두 값을 해당 타입의 값으로 비교하려고 시도합니다. 이 변환이 실패하면 MySQL은 Incorrect date value 경고를 발생시킨 다음 값을 문자열로 비교하는 방식으로 폴백하며, 이는 예상된 동작입니다. 일부 경우에는 변환된 문자열이 유효한 `DATE` 또는 `DATETIME` 값을 반영하지 않았더라도 경고가 발생하지 않았고, 따라서 해당 문자열이 그 타입의 값으로 `DATE` 또는 `DATETIME` 값과 비교되었습니다. 이제 이러한 경우에는 `ALLOW_INVALID_DATES` 서버 SQL 모드가 명시적으로 설정된 경우를 제외하고, 변환된 문자열이 비교되기 전에 항상 `DATE` 또는 `DATETIME`으로서의 유효성이 검사됩니다. (Bug #28940878)
      - 긴 클라이언트 호스트 이름이 예기치 않은 서버 동작을 일으킬 수 있었습니다. (Bug #28936359)
      - 단일 prepared statement에서 많은 수의 파라미터를 치환하면 과도하고 불필요한 메모리 재할당이 발생할 수 있었습니다. 이는 `String::append()`가 수행하는 것처럼 `String::replace()`가 지수적 버퍼 증가를 사용하도록 하여 수정되었습니다. (Bug #28929977)
      
      - 트랜잭션 관련 작업의 결과를 확인하지 못해 데이터 딕셔너리 캐시가 데이터 딕셔너리 내용과 동기화되지 않을 수 있었습니다. (Bug #28923782, Bug #93196)
      - **mysqld** 프로세스에서 사용할 수 있는 온라인 CPU 수의 결정이 이제 더 정확해졌습니다. 기여해 주신 Daniel Black에게 감사드립니다. (Bug #28907677, Bug #93144)
      - [`INFORMATION_SCHEMA.TABLES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-tables-table.html) `TABLE_COMMENT` 컬럼이 유효하지 않은 뷰로 인해 잘못된 오류 메시지를 보고했습니다. (Bug #28901919)
      - 업그레이드 후, [`INFORMATION_SCHEMA.TABLES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-tables-table.html) 뷰가 여러 [`sys`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/sys-schema.html) 스키마 뷰에 대해 “View '*`view_name`*' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them”를 보고했습니다. 업그레이드 프로세스가 참조하는 뷰 상태를 업데이트하지 않았습니다. (Bug #28901821)
      - 많은 고유 컬럼 값을 가진 대형 테이블(수백만 로우)에 대해 히스토그램을 생성하는 데 과도한 시간이 걸렸습니다.
      
      이 수정으로 고유 값이 적은 데이터 세트에서는 이 프로세스가 약간 느려지고 이전보다 메모리를 조금 더 소비하지만, 고유 값이 많은 대형 데이터 세트에서는 상당히 더 빨라졌습니다. (Bug #28888936)
      
      - MySQL 5.7에서 MySQL 8.0으로 업그레이드할 때, 업그레이드 중에는 억제되어야 하는 키 길이 오류로 인해 `InnoDB` 4K 페이지 크기를 사용하는 인스턴스에서 업그레이드가 실패했습니다. (Bug #28884503)
      - 잘못 설정된 keyring 플러그인으로 인해 서버가 종료될 수 있었습니다. (Bug #28876033)
      - [`COUNT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/aggregate-functions.html#function_count) 함수 사용과 관련된 사례에서 두 가지 문제가 발견되었습니다:
      
      - `COUNT()`에 전달된 인수가 nullable 표현식인 경우, 이 함수가 잘못된 결과를 반환할 수 있었습니다.
      - [`EXISTS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/exists-and-not-exists-subqueries.html) 서브쿼리와 함께 `COUNT()`를 사용하는 쿼리가 잘못된 결과를 반환했습니다.
      
      (Bug #28857990, Bug #29240516)
      
      - MySQL 빌드 중 **ccache**를 호출하기 위한 명령이 잘못 생성되었습니다. (Bug #28841612, Bug #92927)
      - 이전에는 삽입 컬럼 이름을 여러 번 나열한 [`INSERT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/insert.html) 문에서, 첫 번째 중복 이름만 보고되었습니다. 이제 모든 중복 이름이 보고됩니다. (Bug #28836669)
      - `ROLLUP`을 사용할 때, `GROUP BY`가 일부 로우에서 `NULL`을 생성할 수 있습니다. 이러한 로우 중 하나를 참조하는 표현식은 `NULL`을 잃을 수 있었고, 잘못된 결과를 생성했습니다. (Bug #28836345)
      
      - 테이블 열기 시도에 실패한 후, 스토리지 엔진에서 테이블을 발견하려는 시도에서 오류 반환을 확인하지 않았으며, 이로 인해 오류가 발생한 경우 서버가 중단될 수 있었습니다. (Bug #28828450)
      - 특정 역할을 부여받은 사용자를 삭제하려고 할 때 서버가 종료될 수 있었습니다. (Bug #28817441)
      - MySQL이 [`-DWITH_MYSQLX=0`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_with_mysqlx)으로 설정된 경우 MySQL Router 컴파일이 실패했습니다. (Bug #28811356)
      - 데이터 딕셔너리 업그레이드 중 호출되는 함수가 `avoid_temporal_upgrade` 매개변수를 일시적으로 수정하여 이전 temporal 타입에 대한 검사가 항상 수행되도록 했습니다. 여러 스레드가 이 함수를 동시에 호출할 수 있었기 때문에, 데이터 딕셔너리 업그레이드 중에 매개변수 값을 안전하게 수정할 수 있도록 보장하는 검사가 추가되었습니다. (Bug #28805429)
      - `EXISTS` 서브쿼리는 세미조인 작업으로 변환됩니다. 옵티마이저는 이 세미조인에 대해 구체화 조회 전략을 선택하지만, 서브쿼리가 외부 쿼리 블록과 상관되어 있지 않기 때문에 조회에 사용할 키가 없었으며, 이로 인해 부모 쿼리가 실패했습니다. 이 문제를 해결하기 위해, 구체화된 쿼리가 상수를 키로 갖도록 보장하기 위해 두 개의 동일한 상수 항목을 키로 사용합니다(따라서 구체화된 테이블이 최대 하나의 로우로 구성되도록 합니다). (Bug #28805105)
      
      - [`Last_query_cost`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-status-variables.html#statvar_Last_query_cost) 상태 변수는 이제 서브쿼리 또는 유니온과 같은 여러 블록을 포함하는 쿼리의 비용을 표시합니다. (이전에는 이 변수가 단일 쿼리 블록으로 구성된 단순 쿼리에 대해서만 설정되었습니다.) (Bug #28786951)
      - 치명적 시그널이 발생했을 때 **mysqld**가 표시하는 메시지가 단순화되고 더 많은 정보를 제공하도록 변경되었습니다. 또한 오래되어 부정확해진 메모리 사용량 계산을 표시하지 않습니다. (Bug #28773322, Bug #92731)
      - [`skip_name_resolve`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_skip_name_resolve) 시스템 변수는 [`SET PERSIST_ONLY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/set-variable.html)를 사용하여 활성화하도록 지속 설정할 수 있었지만, 비활성화하도록 지속 설정할 수는 없었습니다. (Bug #28749668)
      - 단일 테이블 update 및 delete 쿼리에 필요한 경우를 제외하고, iterator에서 사용되지 않고 불필요한 condition pushdown 처리를 제거했습니다. (Bug #28745859)
      - Optimizer가 수행하는 ref 액세스에 대한 `NULL` 조기 필터링의 일부로 `IS NOT NULL` 조건자가 추가됩니다. star-join 토폴로지를 가진 쿼리의 경우 이러한 조건자의 중복 사본이 불필요하게 추가되어, 영향을 받는 `WHERE` 조건의 평가 효율성이 낮아졌습니다. (Bug #28727717)
      
      - MySQL이 시스템 라이브러리의 번들 버전을 사용하도록 설정된 경우, **CMake**가 시스템 include의 순서를 잘못 생성할 수 있었습니다. (Bug #28727631, Bug #92615)
      - double에서 long long으로의 변환과 관련된 일부 숫자 연산이 Windows와 Linux에서 서로 다른 결과를 반환할 수 있었습니다. (Bug #28706832)
      - prepared statement 실행 중 null 포인터에 접근하려는 시도가 발생할 수 있었습니다. (Bug #28692136)
      - [`FROM_UNIXTIME()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/date-and-time-functions.html#function_from-unixtime)는 반올림했을 때 epoch 값을 초과하는 인수가 전달되면 범위를 벗어난 값을 반환했습니다. 이제 다른 범위를 벗어난 값의 경우와 같이 `NULL`을 반환합니다. (Bug #28671811, Bug #92501)
      - 복제된 DDL 작업으로 인해 [`slave_parallel_workers`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-replica.html#sysvar_slave_parallel_workers) 시스템 변수를 사용해 시작된 서버에서 복구 중 'duplicate entry on primary key' 오류가 발생할 수 있었습니다. (Bug #28670843)
      - 계정의 빈 호스트 이름으로 인해 서버가 잘못 동작할 수 있었습니다. (Bug #28653104)
      - MySQL 5.7에서 MySQL 8.0으로의 업그레이드 프로세스가 테이블스페이스 파일의 존재 여부를 확인하지 않아, 일관되지 않은 데이터 딕셔너리가 발생할 수 있었습니다. (Bug #28642608)
      
      - [`ENUM`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/enum.html)의 타입 캐스팅이 서브쿼리 안에서와 서브쿼리가 아닌 경우에 서로 다르게 동작했습니다. (Bug #28547906, Bug #92173)
      - 부동 소수점 값의 잘림을 발생시킨 문은 서버 SQL 모드에 `STRICT_TRANS_TABLES`가 포함된 경우에도 prepared statement로 실행될 수 있었습니다. 또한 바이너리 로깅 모드가 `MIXED`인 경우, 이러한 문이 슬레이브로 전파되어 그곳에서 오류를 발생시켰습니다. (Bug #28546855)
      - 런타임에 [`thread_cache_size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_thread_cache_size) 값을 줄여도 스레드 캐시의 크기가 줄어들지 않았습니다. (Bug #28508923, Bug #92024)
      - 일부 오류 메시지가 제거된 `PASSWORD()` 함수를 여전히 언급했습니다. (Bug #28498714)
      - 연결이 `thread_pool` 플러그인에 의해 관리되는 경우, 실패한 연결 시도에 대해 [`Aborted_connects`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-status-variables.html#statvar_Aborted_connects) 상태 변수가 증가하지 않았습니다. (Bug #28490126)
      - **mysqladmin shutdown**은 **mysqld**가 종료될 때까지 기다리지 않았습니다. (Bug #28466137, Bug #91803)
      
      참조: 이 문제는 다음의 회귀입니다: Bug #25364806.
      
      - [`GRANT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/grant.html) 문에서 사용자로 [`CURRENT_USER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-functions.html#function_current-user)를 지정하면 실패할 수 있었습니다. (Bug #28454014)
      - short-circuit 평가를 수행하는 쿼리를 실행한 저장 프로시저를 반복적으로 호출할 때 항상 올바르게 처리되지 않았습니다. (Bug #28379655)
      - Keyring 마이그레이션은 소스 keyring에 대한 읽기 접근만 필요해야 하지만, 사용자가 쓰기 접근 권한을 가지고 있지 않으면 실패했습니다. (Bug #28339014)
      - keyring 마이그레이션을 수행하는 사용자에게 keyring 파일에 대한 쓰기 접근 권한이 없으면 마이그레이션은 실패했지만 최종 오류 로그 메시지에서 성공으로 보고했습니다. (Bug #28330922)
      - `FLUSH STATUS` 실행 중에 Performance Schema가 세션 상태를 글로벌 상태로 불필요하게 집계하여 일부 상태 변수에 대해 중복 카운트가 발생했습니다. (Bug #28291258, Bug #91541)
      - **mysql_secure_installation**은 더 이상 `.mysql_secret` 파일에서 비밀번호를 읽으려고 시도하지 않습니다. 이 파일은 제거된 프로그램인 **mysql_install_db**에 의해 생성되었습니다. (Bug #28235716, Bug #91270)
      - 일부 상태 변수 값이 원래 값으로 돌아가기 전에 일시적으로 증가할 수 있었습니다. (Bug #27839644, Bug #90351)
      
      - 클라이언트 프로그램은 [`--ssl-fips-mode`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/connection-options.html#option_general_ssl-fips-mode)가 지정되었지만 FIPS 모드를 지정된 옵션 값으로 설정할 수 없는 경우 종료되지 않았습니다. (Bug #27809371)
      - [`ALTER INSTANCE ROTATE INNODB MASTER KEY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-instance.html#alter-instance-rotate-innodb-master-key)를 실행하고 키를 `keyring_file` 플러그인에서 `keyring_encrypted_file` 플러그인으로 마이그레이션하면 암호화된 테이블을 사용할 수 없게 될 수 있었습니다. (Bug #27760952)
      - MySQL Community에서 Commercial로 업그레이드할 때 데이터 디렉터리가 존재하는 경우에도 `root` 비밀번호 프롬프트가 표시되었습니다. (Bug #27741998)
      - 클라이언트/서버 프로토콜에서 prepared statement에 대한 잘못 구성된 패킷이 감지되지 않은 채 어설션이 발생할 수 있었습니다. (Bug #27627731)
      - X Plugin을 사용할 때 쿼리 처리량을 높이기 위해 스레드의 세션 연결 및 연결 해제 처리에 변경이 이루어졌습니다. 이전에는 모든 명령마다 세션(`Srv_session`)이 현재 스레드에 연결되고 현재 스레드에서 분리되었지만, 이제 이 스레드 전환은 현재 세션의 연결을 해제할 때 또는 현재 스레드와 연결 대상 스레드가 서로 다른 플러그인에 속할 때만 발생합니다. (Bug #27463277)
      
      - `PERSIST` 및 `PERSIST_ONLY` 키워드는 실수로 예약되었습니다. 이제 이들은 비예약 키워드입니다. (Bug #25220656)
      - 클라이언트 연결 활동과 동시에 플러그인을 설치하고 제거하면 서버 종료가 발생할 수 있었습니다. (Bug #22980441)
      - [`LOAD_FILE()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/string-functions.html#function_load-file) 함수는 `/proc` 아래의 파일과 같이 `stat()`을 참고 정보로만 간주해야 하는 파일에 대해 실패할 수 있었습니다. (Bug #18394503, Bug #72027)
      - 쿼리 대상 테이블에 암시적 전체 텍스트 인덱스가 있고 정렬 버퍼의 크기가 정렬된 키를 담기에 충분하지 않은 경우, `ORDER BY` 절을 사용하는 쿼리가 아무 메시지 없이 실패했습니다. (Bug #93241, Bug #28940361)
      - 문자열 값을 반환하는 로드 가능 함수는 이제 명시적 반환 타입을 설정합니다. 함수에 전달된 인수에 따라 이는 [`VARCHAR`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/char.html), [`MEDIUMBLOB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/blob.html) 또는 [`LONGBLOB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/blob.html) 중 하나입니다. (Bug #92890, Bug #28828169)
      - 내부 메서드 `Item_result::item_cmp_type()`의 비교를 더 효율적으로 만들었습니다. 기여해 주신 Daniel Black에게 감사드립니다. (Bug #92784, Bug #28796107)
      
      - 산술 표현식에 사용된 윈도우 함수는 이를 포함하는 쿼리가 `DISTINCT`를 사용할 때 잘못된 결과를 생성했습니다. (Bug #92503, Bug #28672483)
      - 복잡한 조인이 포함된 일부 쿼리에서 파일 핸들이 누수되었습니다. (Bug #90902, Bug #28039829)
      - Fedora 패키징은 이제 Fedora 30을 지원합니다.
      - Ubuntu 14.04 및 SLES 11은 EOL이며, 더 이상 지원되지 않습니다.