---
title: "MySQL 8.0.0 릴리스 노트"
description: "MySQL 8.0.0 Community Server 릴리스 노트 한국어 번역본"
tags: [ MySQL, 릴리스노트 ]
image: "mysql-release-note.png"
author: "Oracle"
published: "2016-09-12"
updated: ""
source_url: "https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-0.html"
---

## 계정 관리 관련 사항

- **호환되지 않는 변경:** `mysql` 시스템 데이터베이스의 grant 테이블은 이제 `InnoDB`(트랜잭션) 테이블입니다. 이전에는 이 테이블들이 `MyISAM`(비트랜잭션) 테이블이었습니다. 이 변경은 다음 테이블에 적용됩니다: `user`, `db`, `tables_priv`, `columns_priv`, `procs_priv`, `proxies_priv`.

  grant 테이블 스토리지 엔진 변경은 계정 관리 구문의 동작에 수반되는 변경의 기반이 됩니다. 이전에는 여러 사용자를 명명하는 계정 관리 구문이 일부 사용자에 대해서는 성공하고 다른 사용자에 대해서는 실패할 수 있었습니다. 이제 각 구문은 트랜잭션 방식이며, 명명된 모든 사용자에 대해 성공하거나 오류가 발생하면 롤백되어 아무 효과도 없습니다. 구문이 성공하면 바이너리 로그에 기록되지만, 실패하면 기록되지 않습니다. 이 경우 롤백이 발생하고 변경 사항은 적용되지 않습니다. 앞의 동작은 다음 구문에 적용됩니다: [`ALTER USER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-user.html), [`CREATE ROLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-role.html), [`CREATE USER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-user.html), [`DROP ROLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-role.html), [`DROP USER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-user.html), [`GRANT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/grant.html), [`RENAME USER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/rename-user.html), [`REVOKE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/revoke.html). (`SET PASSWORD`는 최대 한 명의 사용자에게만 적용되고 이미 사실상 트랜잭션 방식이므로 목록에 포함되지 않습니다.) 이러한 동작 변경의 부수 효과는 MySQL 5.7 마스터에서 부분적으로 완료된 계정 관리 구문이 MySQL 8.0 슬레이브에서 복제될 때 실패한다는 것입니다. 자세한 내용은 [Atomic Data Definition Statement Support](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/atomic-ddl.html)를 참조하십시오.

  이전 버전에서 이 MySQL 릴리스로 업그레이드하는 경우, 이러한 변경 사항을 `mysql` 시스템 데이터베이스에 반영하려면 **mysql_upgrade**를 실행하고 서버를 다시 시작해야 합니다.

  > [!note]
  > MySQL이 이전 버전에서 업그레이드되었지만 grant 테이블이 `MyISAM`에서 `InnoDB`로 업그레이드되지 않은 경우, 서버는 해당 테이블을 읽기 전용으로 간주하며 계정 관리 구문은 오류를 발생시킵니다.

  스토리지 엔진이 `MyISAM`에서 `InnoDB`로 변경됨에 따라, 권한 부여 테이블에서 `ORDER BY` 없이 `SELECT`를 수행하면 이전과 다른 로우 순서가 생성될 수 있습니다. 쿼리 결과에 특정 로우 정렬 특성이 필요하면 `ORDER BY` 절을 포함하십시오. (WL #7158, WL #9045)
- MySQL은 이제 이름이 지정된 권한 모음인 역할을 지원합니다. 역할을 사용하면 권한 집합을 계정에 할당할 수 있으며, 원하는 권한 할당을 개념화하고 이를 구현하는 데 모두 개별 권한 부여의 편리한 대안을 제공합니다:

  - 역할을 생성하고 삭제할 수 있습니다.
  - 역할에 권한을 부여하고 역할에서 권한을 회수할 수 있습니다.
  - 역할을 사용자 계정에 부여하고 사용자 계정에서 회수할 수 있습니다.
  - 계정의 활성 역할은 해당 계정에 부여된 역할 중에서 선택할 수 있으며, 해당 계정의 세션 중에 변경할 수 있습니다.

  자세한 내용은 [Using Roles](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/roles.html)를 참조하십시오.

  > [!note]
  > 이제 `ROLE`은 예약어이며 식별자 따옴표 처리 없이 식별자로 사용할 수 없습니다.

  (WL #988)

## C API 관련 사항

- `libmysqlclient` 공유 라이브러리의 주 버전 번호가 MySQL 5.7에서 사용된 20에서 MySQL 8.0의 21로 증가했습니다. (Bug #77600, Bug #21363863)

## 캐릭터셋 지원

- `utf8mb4` 유니코드 캐릭터셋에는 `utf8mb4_0900_ai_ci`라는 새 general 콜레이션이 있습니다. `utf8mb4`에는 또한 언어별 규칙이 적용 가능한 경우 우선한다는 점을 제외하고 `utf8mb4_0900_ai_ci`와 유사한 특성을 가진 여러 새 언어별 콜레이션이 있습니다. 언어별 콜레이션은 다음 표에 표시된 것처럼 콜레이션 이름의 ISO 639-1 언어 코드로 표시됩니다. 두 경우에는 언어 코드에 변형을 나타내는 추가 항목이 있습니다(독일어 전화번호부 순서, 전통 스페인어).

  **Table 5 utf8mb4 UCA 9.0.0 언어별 콜레이션**

  | 언어 | 콜레이션 |
  | --- | --- |
  | 크로아티아어 | `utf8mb4_hr_0900_ai_ci` |
  | 체코어 | `utf8mb4_cs_0900_ai_ci` |
  | 덴마크어 | `utf8mb4_da_0900_ai_ci` |
  | 에스페란토 | `utf8mb4_eo_0900_ai_ci` |
  | 에스토니아어 | `utf8mb4_et_0900_ai_ci` |
  | 독일어 전화번호부 순서 | `utf8mb4_de_pb_0900_ai_ci` |
  | 헝가리어 | `utf8mb4_hu_0900_ai_ci` |
  | 아이슬란드어 | `utf8mb4_is_0900_ai_ci` |
  | 라트비아어 | `utf8mb4_lv_0900_ai_ci` |
  | 리투아니아어 | `utf8mb4_lt_0900_ai_ci` |
  | 폴란드어 | `utf8mb4_pl_0900_ai_ci` |
  | 고전 라틴어 | `utf8mb4_la_0900_ai_ci` |
  | 루마니아어 | `utf8mb4_ro_0900_ai_ci` |
  | 슬로바키아어 | `utf8mb4_sk_0900_ai_ci` |
  | 슬로베니아어 | `utf8mb4_sl_0900_ai_ci` |
  | 현대 스페인어 | `utf8mb4_es_0900_ai_ci` |
  | 전통 스페인어 | `utf8mb4_es_trad_0900_ai_ci` |
  | 스웨덴어 | `utf8mb4_sv_0900_ai_ci` |
  | 터키어 | `utf8mb4_tr_0900_ai_ci` |
  | 베트남어 | `utf8mb4_vi_0900_ai_ci` |

  `utf8mb4_0900_ai_ci`는 또한 다음 표의 언어에 대해 accent-insensitive, case-insensitive 콜레이션으로 동작합니다.

  **Table 6 utf8mb4_0900_ai_ci가 적합한 언어**

  | 언어 이름 | 언어 코드 |
  | --- | --- |
  | 독일어(사전 순서) | de |
  | 영어 | en |
  | 캐나다 프랑스어(locale fr_CA) | fr |
  | 아일랜드 게일어 | ga |
  | 인도네시아어 | id |
  | 이탈리아어 | it |
  | 룩셈부르크어 | lb |
  | 말레이어 | ms |
  | 네덜란드어 | nl |
  | 포르투갈어 | pt |
  | 스와힐리어 | sw |
  | 줄루어 | zu |

  `utf8mb4_da_0900_ai_ci`는 또한 다음 표의 언어에 대해 accent-insensitive, case-insensitive 콜레이션으로 동작합니다.

  **Table 7 utf8mb4_da_0900_ai_ci가 적합한 언어**

  | 언어 이름 | 언어 코드 |
  | --- | --- |
  | 노르웨이어 | no |
  | 노르웨이어 보크몰 | nb |
  | 노르웨이어 뉘노르스크 | nn |

  비언어별 `utf8mb4_0900_ai_ci` 및 언어별 `utf8mb4_LANG_0900_ai_ci` 유니코드 콜레이션은 각각 다음 특성을 가집니다:

  - 이 콜레이션은 Unicode Collation Algorithm (UCA) 9.0.0 및 Common Locale Data Repository (CLDR) v30을 기반으로 하며, 악센트 비구분이고 대소문자 비구분입니다. 이러한 특성은 콜레이션 이름의 `_0900`, `_ai`, `_ci`로 표시됩니다. 예외: `utf8mb4_la_0900_ai_ci`는 Classical Latin이 CLDR에 정의되어 있지 않기 때문에 CLDR을 기반으로 하지 않습니다.
  - 이 콜레이션은 [U+0, U+10FFFF] 범위의 모든 문자에 대해 작동합니다.
  - 이 콜레이션이 언어별이 아닌 경우, 보조 문자를 포함한 모든 문자를 기본 순서(아래 설명)로 정렬합니다. 이 콜레이션이 언어별인 경우, 해당 언어의 문자는 언어별 규칙에 따라 올바르게 정렬하고, 해당 언어에 속하지 않는 문자는 기본 순서로 정렬합니다.
  - 기본적으로 이 콜레이션은 DUCET 테이블(Default Unicode Collation Element Table)에 나열된 코드 포인트가 있는 문자를 해당 테이블에 할당된 가중치 값에 따라 정렬합니다. 이 콜레이션은 DUCET 테이블에 나열된 코드 포인트가 없는 문자를 UCA에 따라 구성된 암시적 가중치 값을 사용하여 정렬합니다.
  - 비언어별 콜레이션의 경우 축약 시퀀스의 문자는 별도의 문자로 처리됩니다. 언어별 콜레이션의 경우 축약이 문자 정렬 순서를 변경할 수 있습니다.

  자세한 내용은 [Unicode Character Sets](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/charset-unicode-sets.html)를 참조하십시오. (WL #9125, WL #9108, WL #9479)

## 컴파일 관련 사항

- **Microsoft Windows:** Windows에서 MySQL을 빌드할 때 툴체인은 이제 가능한 경우 64비트 도구를 우선 사용합니다(이전에는 32비트). 이렇게 하면 링크 속도가 빨라지고 32비트 링커의 제한된 주소 공간과 관련된 문제를 방지합니다. (Bug #80675, Bug #22900585)
- **CMake**는 이제 GNU **gold** 링커를 사용할 수 있고 명시적으로 비활성화되지 않은 경우 빌드 프로세스가 해당 링커로 링크하도록 합니다. 이 링커 사용을 비활성화하려면 [`-DUSE_LD_GOLD=OFF`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_use_ld_gold) **CMake** 옵션을 지정하십시오. (Bug #23759968, Bug #82163)
- `WITH_EXTRA_CHARSETS` **CMake** 옵션이 제거되었습니다. MySQL 빌드는 이제 기본적으로 모든 캐릭터셋으로 구성됩니다. 더 적은 캐릭터셋을 원하는 사용자는 `cmake/character_sets.cmake`를 직접 편집하고 서버를 다시 컴파일할 수 있습니다. (Bug #80005, Bug #22552125)
- 서버 빌드를 위한 Boost 라이브러리의 최소 버전은 이제 1.60.0입니다. (Bug #79380, Bug #22253921)
- 소스 코드 베이스를 정리하는 작업이 수행되었으며, 여기에는 다음이 포함됩니다: 불필요한 **CMake** 검사를 제거하고, 소스 파일에서 사용되지 않는 매크로를 제거하고, 의존성 수를 줄이고 더 모듈화되도록 헤더 파일을 재구성하고, 정의가 없는 함수 선언을 제거하고, 로컬로 작성된 함수를 업계 표준 라이브러리의 동등한 함수로 대체했습니다.
- MySQL 소스 코드는 이제 C++11 기능을 허용하고 사용합니다. 지원되는 모든 플랫폼에서 양호한 수준의 C++11 지원을 활성화하기 위해, 이제 다음 최소 컴파일러 버전이 적용됩니다:

  - GCC: 4.8 이상
  - Clang: 3.4 이상(OS X의 Xcode 7)
  - Solaris Studio: 12.4 이상(Solaris 클라이언트 빌드만 해당)
  - Visual Studio: 2015
  - CMake: Windows에서는 필요한 Visual Studio 버전으로 인해 필요한 CMake 버전이 3.2.3 이상이 됩니다

  Solaris에서는 `stlport` 라이브러리가 더 이상 사용되지 않습니다. 이로 인해 `SUNPRO_CXX_LIBRARY` **CMake** 옵션은 쓸모없게 되었으므로 제거되었습니다. (WL #8896)

## 컴포넌트 관련 사항

- MySQL Server에는 이제 서버 확장성을 개선하기 위한 컴포넌트 기반 인프라가 포함됩니다:

  - 컴포넌트는 서버와 다른 컴포넌트에서 사용할 수 있는 서비스를 제공합니다. (서비스 사용과 관련하여, 서버는 다른 컴포넌트와 동등한 하나의 컴포넌트입니다.) 컴포넌트는 자신이 제공하는 서비스를 통해서만 서로 상호작용합니다.
  - [`INSTALL COMPONENT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/install-component.html) 및 [`UNINSTALL COMPONENT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/uninstall-component.html) 문은 런타임에 컴포넌트를 조작하기 위한 SQL 인터페이스를 제공합니다.
  - 로더 서비스는 설치된 컴포넌트를 `mysql.component` 시스템 테이블에 등록하고, 이후 서버 재시작을 위해 시작 시퀀스 중에 등록된 컴포넌트를 설치합니다.

  컴포넌트 인프라 및 해당 SQL 수준 인터페이스에 대한 일반 정보는 [MySQL Components](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/components.html)를 참조하십시오. 컴포넌트의 내부 구현에 대한 정보는 [https://dev.mysql.com/doc/index-other.html](https://dev.mysql.com/doc/index-other.html)에서 제공되는 MySQL Server Doxygen 문서를 참조하십시오. (WL #4102)

## 설정 관련 사항

- **호환되지 않는 변경; InnoDB:** 이전에는 [`innodb_read_only`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_read_only) 시스템 변수를 활성화하면 `InnoDB` 스토리지에 대해서만 테이블 생성 및 삭제가 방지되었습니다. MySQL 8.0부터는 [`innodb_read_only`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_read_only)를 활성화하면 모든 스토리지 엔진에 대해 이러한 작업이 방지됩니다. 테이블 생성 및 삭제 작업은 `mysql` 시스템 데이터베이스의 데이터 딕셔너리 테이블을 수정하지만, 해당 테이블은 `InnoDB` 스토리지 엔진을 사용하며 [`innodb_read_only`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_read_only)가 활성화된 경우 수정할 수 없습니다. 동일한 원칙은 데이터 딕셔너리 테이블 수정을 필요로 하는 다른 테이블 작업과, 권한 부여 테이블 및 `func`와 `plugin` 테이블처럼 `InnoDB` 스토리지 엔진을 사용하는 `mysql` 데이터베이스의 다른 테이블을 수정하는 작업에도 적용됩니다. (Bug #21611899)
- 메모리 매핑된 트랜잭션 코디네이터에 대해 하드코딩된 8KB 메모리 페이지 크기는 페이지 크기가 훨씬 더 큰 ARM64 및 PowerPC 같은 플랫폼에는 너무 작았습니다. 이제 서버는 하드코딩된 값을 사용하는 대신 현재 플랫폼의 페이지 크기를 가져오기 위해 시스템 호출을 실행합니다. [`--log-tc-size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_log-tc-size) 옵션에 대한 결과로, 최소값과 기본값은 이제 페이지 크기의 6배입니다. 또한 값은 페이지 크기의 배수여야 합니다. 패치를 제공해 주신 Alexey Kopytov에게 감사드립니다. (Bug #23014086, Bug #80818, Bug #26931470, Bug #87995)

- MySQL은 이제 `SET` 문 구문의 [`SET PERSIST`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/set-variable.html) 변형을 지원하여, 런타임에 설정 변경을 수행하고 해당 변경이 서버 재시작 후에도 지속되도록 합니다. [`SET GLOBAL`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/set-variable.html)과 마찬가지로, [`SET PERSIST`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/set-variable.html)는 동적(런타임에 설정 가능)인 모든 글로벌 시스템 변수에 대해 허용됩니다. 이 문은 런타임 변수 값을 변경하지만, 또한 변수 설정을 데이터 디렉터리의 `mysqld-auto.cnf`라는 옵션 파일에 기록합니다. 시작 시 서버는 다른 모든 옵션 파일 이후에 이 파일을 처리합니다. 자세한 내용은 [Persisted System Variables](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/persisted-system-variables.html)를 참조하십시오.

  각 시스템 변수가 가장 최근에 어떻게 설정되었는지를 보여 주는 정보를 제공하기 위해, Performance Schema에는 이제 각 시스템 변수와 해당 변수가 값을 가져온 소스를 나열하는 [`variables_info`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-variables-info-table.html) 테이블이 있습니다. [Performance Schema variables_info Table](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-variables-info-table.html)을 참조하십시오.

  이전 버전에서 이 MySQL 릴리스로 업그레이드하는 경우, 이 변경 사항을 Performance Schema에 반영하려면 **mysql_upgrade**를 실행하고 서버를 재시작해야 합니다. (WL #8688)

## 데이터 딕셔너리 관련 사항

- **호환되지 않는 변경:** MySQL Server는 이제 트랜잭션 테이블에 있는 데이터베이스 객체에 대한 정보를 포함하는 전역 데이터 딕셔너리를 통합합니다. 이전 MySQL 릴리스에서는 딕셔너리 데이터가 메타데이터 파일 및 비트랜잭션 시스템 테이블에 저장되었습니다.

  > [!important]
  > 데이터 딕셔너리가 활성화된 서버는 데이터 딕셔너리가 없는 서버와 비교하여 몇 가지 일반적인 운영상 차이를 수반합니다. [Data Dictionary Usage Differences](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/data-dictionary-usage-differences.html)를 참조하십시오. 또한 MySQL 8.0으로 업그레이드하는 경우, 업그레이드 절차는 이전 MySQL 릴리스와 다소 다르며 특정 선행 조건을 확인하여 설치의 업그레이드 준비 상태를 검증해야 합니다. 자세한 내용은 [Upgrading MySQL](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/upgrading.html), 특히 [Preparing Your Installation for Upgrade](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/upgrade-prerequisites.html)를 참조하십시오.

  `InnoDB`는 MySQL 8.0.0 릴리스에서 계속 자체 데이터 딕셔너리를 사용합니다.

  다음 목록은 이 변경의 주요 영향을 간략히 설명합니다:

  - 이전에 베이스 테이블 및 뷰와 연결되었던 `.frm` 메타데이터 파일은 더 이상 존재하지 않습니다. 이전에 `.frm` 파일에 저장되었던 메타데이터는 이제 데이터 딕셔너리 테이블에 저장됩니다.

    마찬가지로, 이전에 `.TRG` 및 `.TRN` 파일에 저장되었던 트리거 메타데이터는 데이터 딕셔너리 테이블에 저장되며, 해당 파일은 더 이상 존재하지 않습니다.
  - `.frm` 파일이 제거됨에 따라, `.frm` 파일 구조가 부과하던 64KB 테이블 정의 크기 제한이 제거됩니다.
  - `.frm` 파일이 제거됨에 따라, [`INFORMATION_SCHEMA.TABLES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-tables-table.html) `VERSION` 필드는 이제 MySQL 5.7에서 사용된 마지막 `.frm` 파일 버전인 `10`의 하드코딩된 값을 보고합니다.
  - `.frm` 파일이 제거됨에 따라, `sync_frm` 시스템 변수가 제거됩니다.
  - MySQL 데이터 딕셔너리를 제공하는 새로운 딕셔너리 객체 캐시는 이전에 접근한 데이터 딕셔너리 객체를 메모리에 저장하여 객체 재사용을 가능하게 하고 디스크 I/O를 최소화합니다. 가장 최근에 사용되지 않은 객체를 메모리에서 제거하기 위해 LRU 기반 제거 전략이 사용됩니다. 이 캐시는 서로 다른 객체 타입을 저장하는 여러 파티션으로 구성됩니다. 자세한 내용은 [Dictionary Object Cache](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/data-dictionary-object-cache.html)를 참조하십시오.
  - 새로운 내부 데이터 딕셔너리 API를 통해 서버, 내부 스토리지 엔진 및 플러그인이 MySQL 데이터 딕셔너리에 접근하고 데이터를 저장할 수 있습니다. 스키마, 테이블스페이스, 테이블스페이스 파일, 테이블, 파티셔닝된 테이블, 테이블 파티션 데이터, 트리거, 저장 루틴, 이벤트, 테이블 객체, 뷰, 캐릭터셋 및 콜레이션을 처리하기 위한 내부 데이터 딕셔너리 API가 도입되었습니다.

    이 변경으로 [`CREATE TRIGGER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-trigger.html) 및 [`DROP TRIGGER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-trigger.html) 작업에 대한 데이터 딕셔너리 업데이트와 바이너리 로그 쓰기가 단일 원자적 트랜잭션으로 결합됩니다.
  - 데이터 딕셔너리 테이블은 보이지 않지만, 대부분의 경우 대신 쿼리할 수 있는 대응되는 `INFORMATION_SCHEMA` 테이블이 있습니다. 이를 통해 애플리케이션 사용을 위한 안정적인 `INFORMATION_SCHEMA` 인터페이스를 유지하면서, 서버 개발이 진행됨에 따라 기반 데이터 딕셔너리 테이블을 변경할 수 있습니다.

    일부 `INFORMATION_SCHEMA` 테이블은 데이터 딕셔너리 테이블에 대한 뷰로 완전히 다시 구현되었습니다:

    ```
    CHARACTER_SETS
    COLLATIONS
    COLLATION_CHARACTER_SET_APPLICABILITY
    COLUMNS
    KEY_COLUMN_USAGE
    SCHEMATA
    STATISTICS
    TABLES
    TABLE_CONSTRAINTS
    VIEWS
    ```

    해당 테이블에 대한 쿼리는 이제 다른 더 느린 수단이 아니라 데이터 딕셔너리 테이블에서 정보를 가져오기 때문에 더 효율적입니다. 특히, 데이터 딕셔너리 테이블에 대한 뷰인 각 `INFORMATION_SCHEMA` 테이블에 대해 다음이 적용됩니다:

    - 서버는 더 이상 `INFORMATION_SCHEMA` 테이블의 각 쿼리에 대해 임시 테이블을 생성할 필요가 없습니다.
    - 기반 데이터 딕셔너리 테이블이 이전에는 디렉터리 스캔(예: 데이터베이스 내에서 데이터베이스 이름 또는 테이블 이름을 열거하기 위한 경우) 또는 파일 열기 작업(예: `.frm` 파일에서 정보를 읽기 위한 경우)으로 얻었던 값을 저장하는 경우, 해당 값에 대한 `INFORMATION_SCHEMA` 쿼리는 이제 대신 테이블 조회를 사용합니다. (또한, 뷰가 아닌 `INFORMATION_SCHEMA` 테이블의 경우에도 데이터베이스 및 테이블 이름과 같은 값은 데이터 딕셔너리에서 조회하여 가져오며 디렉터리 또는 파일 스캔이 필요하지 않습니다.)
    - 기반 데이터 딕셔너리 테이블의 인덱스를 통해 Optimizer가 효율적인 쿼리 실행 계획을 구성할 수 있으며, 이는 쿼리마다 임시 테이블을 사용하여 `INFORMATION_SCHEMA` 테이블을 처리했던 이전 구현에는 해당하지 않았습니다.

    앞의 개선 사항은 데이터 딕셔너리 테이블에 대한 뷰인 `INFORMATION_SCHEMA` 테이블에 대응하는 정보를 표시하는 [`SHOW`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show.html) 문에도 적용됩니다. 예를 들어, [`SHOW DATABASES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-databases.html)는 [`SCHEMATA`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-schemata-table.html) 테이블과 동일한 정보를 표시합니다.


      `INFORMATION_SCHEMA` 쿼리가 테이블 통계를 검색하는 경우, 서버는 이제 `INFORMATION_SCHEMA` 테이블에 캐시된 통계를 사용하거나 스토리지 엔진에서 직접 최신 통계를 가져올 수 있습니다. `information_schema_stats` 시스템 변수는 서버가 사용하는 통계 소스를 제어합니다.

    - `information_schema_stats`가 `CACHED`(기본값)인 경우, 서버는 [`STATISTICS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-statistics-table.html) 및 [`TABLES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-tables-table.html) 테이블에 저장된 캐시된 통계를 사용합니다.
    - `information_schema_stats`가 `LATEST`인 경우, 서버는 스토리지 엔진에서 직접 통계를 가져옵니다. 이 경우 서버는 [`STATISTICS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-statistics-table.html) 및 [`TABLES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-tables-table.html)에 대한 쿼리를 `STATISTICS_DYNAMIC` 및 `TABLES_DYNAMIC` 테이블에 저장된 최신 통계에 대한 쿼리로 처리합니다.

      영향을 받는 `INFORMATION_SCHEMA` 테이블 통계 컬럼은 다음을 포함합니다:

      ```
      STATISTICS.CARDINALITY
      TABLES.AUTO_INCREMENT
      TABLES.AVG_ROW_LENGTH
      TABLES.CHECKSUM
      TABLES.CHECK_TIME
      TABLES.CREATE_TIME
      TABLES.DATA_FREE
      TABLES.DATA_LENGTH
      TABLES.INDEX_LENGTH
      TABLES.MAX_DATA_LENGTH
      TABLES.TABLE_ROWS
      TABLES.UPDATE_TIME
      ```

    자세한 내용은 [Optimizing INFORMATION_SCHEMA Queries](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-optimization.html)를 참조하십시오.
  - `foreign_keys` 및 `foreign_key_column_usage` 테이블은 이제 외래 키 정보를 저장합니다. 외래 키 정보를 가져오는 표준 SQL 방식은 `INFORMATION_SCHEMA` [`REFERENTIAL_CONSTRAINTS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-referential-constraints-table.html) 및 [`KEY_COLUMN_USAGE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-key-column-usage-table.html) 테이블을 사용하는 것입니다. 이러한 테이블은 이제 `foreign_keys`, `foreign_key_column_usage` 및 기타 데이터 딕셔너리 테이블에 대한 뷰로 구현됩니다.

    일부 외래 키 오류에 대해, 서버는 이제 더 적절하고 더 많은 정보를 제공하는 오류 메시지를 생성합니다.

  > [!note]
  > **비호환성:** 이전에는 MySQL이 64자를 초과하는 외래 키 이름을 지원했습니다. `foreign_keys` 및 `foreign_key_column_usage` 테이블에 저장되는 외래 키 이름은 SQL 표준에 따라 최대 64자이므로, 더 긴 외래 키 이름은 더 이상 허용되지 않습니다.
  - 데이터 딕셔너리는 데이터베이스 객체에 대한 정보를 제공하므로, 서버는 더 이상 데이터베이스를 찾기 위해 데이터 디렉터리의 디렉터리 이름을 검사하지 않습니다. 따라서 `--ignore-db-dir` 옵션과 `ignore_db_dirs` 시스템 변수는 불필요해졌으며 제거되었습니다. 이에 따라 시스템 설정과 애플리케이션 프로그램을 업데이트하십시오.
  - 이전에는 [`CREATE TEMPORARY TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-temporary-table.html)을 사용하여 존재하지 않는 데이터베이스의 이름으로 테이블 이름을 한정함으로써 존재하지 않는 데이터베이스에 테이블을 생성할 수 있었습니다. 이는 더 이상 허용되지 않습니다.
  - 시스템 테이블 변경 사항:

    - 많은 시스템 테이블이 `MyISAM`(비트랜잭션) 테이블에서 `InnoDB`(트랜잭션) 테이블로 변환되었습니다. 예를 들어, 이 릴리스 노트의 다른 곳에서 설명한 것처럼 grant 테이블은 이제 `InnoDB` 테이블입니다. 다른 예시는 다음과 같습니다.
    - `mysql` 시스템 데이터베이스에서 로드 가능한 함수 정보를 저장하는 `func` 테이블은 이제 `InnoDB`(트랜잭션) 테이블입니다. 이전에는 `MyISAM`(비트랜잭션) 테이블이었습니다.

      이 변경의 결과로, [`CREATE FUNCTION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-function.html) 및 [`DROP FUNCTION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-function.html) 문은 로드 가능한 함수에 사용되는 경우에도 암시적 커밋을 발생시킵니다([암시적 커밋을 발생시키는 문](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/implicit-commit.html) 참조). 이전에는 저장 함수에 사용될 때 암시적 커밋을 발생시켰지만, 로드 가능한 함수에 대해서는 그렇지 않았습니다.
    - 이전에는 저장 루틴 및 이벤트에 대한 정보가 `mysql` 시스템 데이터베이스의 `proc` 및 `event` 테이블에 저장되었습니다. 이러한 테이블은 더 이상 사용되지 않습니다. 대신 저장 루틴 및 이벤트에 대한 정보는 `mysql` 시스템 데이터베이스의 `routines`, `events`, `parameters` 데이터 딕셔너리 테이블에 저장됩니다. 이전 테이블은 `MyISAM`(비트랜잭션) 스토리지 엔진을 사용했습니다. 새 테이블은 `InnoDB`(트랜잭션) 엔진을 사용합니다.

      이전에는 잘못된 문자가 포함된 저장 루틴을 생성하면 경고가 발생했습니다. 이제는 오류가 발생합니다.
    - 시스템 테이블(예: 시간대 또는 로그 테이블)에 대한 접근을 비시스템 테이블에 대한 접근과 구분할 수 있도록, 서버는 `System lock` 및 `Opening tables` 스레드 상태 대신 `Locking system tables` 및 `Opening system tables` 스레드 상태를 사용합니다. [General Thread States](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/general-thread-states.html)를 참조하십시오.
  - `InnoDB` 변경 사항:

    - 지속 `InnoDB` 테이블스페이스에는 이제 직렬화된 형식의 딕셔너리 객체 데이터인 *Serialized Dictionary Information (SDI)*을 위한 트랜잭션 스토리지가 포함됩니다. 앞에서 언급한 `.frm` 및 트리거 메타데이터 파일이 사라지는 것과 함께, `.SDI` 파일이 나타나는 것을 볼 수 있습니다. 이러한 파일은 직렬화된 딕셔너리 정보 파일입니다. SDI 트랜잭션 스토리지는 아직 완전히 구현되지 않은 진행 중인 기능을 위해 예약되어 있습니다.
    - 새 명령줄 유틸리티인 **ibd2sdi**는 지속 `InnoDB` 테이블스페이스에서 직렬화된 딕셔너리 정보(SDI)를 추출하는 데 사용됩니다. 이 릴리스의 지속 `InnoDB` 테이블스페이스에는 SDI 데이터가 없습니다. **ibd2sdi** 유틸리티는 향후 사용을 위해 예약되어 있습니다.
    - `InnoDB` 시작 코드는 MySQL 데이터 딕셔너리 기능과 관련된 MySQL 초기화 변경 사항을 지원하도록 리팩터링되었습니다.
  - 업그레이드 및 다운그레이드 관련 영향:

    - MySQL 5.7에서 MySQL 8.0으로 업그레이드하려면 [Upgrading MySQL](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/upgrading.html)에 설명된 업그레이드 절차를 수행해야 합니다.
    - MySQL 8.0에서 MySQL 5.7로 다운그레이드하는 것은 논리적 다운그레이드 방법(**mysqldump** 다운그레이드)을 사용하는 경우에만 지원됩니다. 인플레이스 다운그레이드는 지원되지 않습니다.

  (Bug #80481, Bug #22811659, WL #6378, WL #6383, WL #7896, WL #6384, WL #7897, WL #6388, WL #7898, WL #7284, WL #7630, WL #7836, WL #6390, WL #6382, WL #6389, WL #6387, WL #6385, WL #7053, WL #7158, WL #8980, WL #8150, WL #7488, WL #7066, WL #6929, WL #6391, WL #6392, WL #6599)

## 데이터 타입 관련 사항

- 비트 함수 및 연산자는 [`BIT_COUNT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/bit-functions.html#function_bit-count), [`BIT_AND()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/aggregate-functions.html#function_bit-and), [`BIT_OR()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/aggregate-functions.html#function_bit-or), [`BIT_XOR()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/aggregate-functions.html#function_bit-xor), [`&`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/bit-functions.html#operator_bitwise-and), [`|`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/bit-functions.html#operator_bitwise-or), [`^`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/bit-functions.html#operator_bitwise-xor), [`~`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/bit-functions.html#operator_bitwise-invert), [`<<`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/bit-functions.html#operator_left-shift), 및 [`>>`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/bit-functions.html#operator_right-shift)로 구성됩니다. MySQL 8.0 이전에는 비트 함수 및 연산자가 [`BIGINT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/integer-types.html)(64비트 정수) 인수를 요구하고 [`BIGINT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/integer-types.html) 값을 반환했으므로, 최대 범위가 64비트였습니다. [`BIGINT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/integer-types.html)가 아닌 인수는 연산을 수행하기 전에 [`BIGINT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/integer-types.html)로 변환되었으며 잘림이 발생할 수 있었습니다. 이제 비트 함수 및 연산자는 바이너리 문자열 타입 인수([`BINARY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/binary-varbinary.html), [`VARBINARY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/binary-varbinary.html), 및 [`BLOB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/blob.html) 타입)를 허용하고 같은 타입의 값을 반환하므로, 64비트보다 큰 인수를 받고 반환 값을 생성할 수 있습니다. 비바이너리 문자열 인수는 이전과 같이 [`BIGINT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/integer-types.html)로 변환되어 그에 따라 처리됩니다.

  비트 함수 및 연산자에 대해 바이너리 문자열 인수를 허용하면 더 큰 값을 조작하기 쉬워질 뿐만 아니라, UUID 및 IPv6 값과 같은 특정 타입의 데이터에 대해 이전에는 쉽게 수행할 수 없었던 비트 연산을 수행하기도 쉬워집니다. 예시는 [Bit Functions and Operators](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/bit-functions.html)를 참조하십시오.

  이 동작 변경의 한 가지 영향은 바이너리 문자열 인수에 대한 비트 연산이 MySQL 8.0에서 5.7과 다른 결과를 생성할 수 있다는 점입니다. MySQL 5.7과 8.0 사이의 잠재적 비호환성에 대해 MySQL 5.7에서 준비하는 방법에 대한 정보는 [MySQL 5.7 Reference Manual](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/)의 [Bit Functions and Operators](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/bit-functions.html)를 참조하십시오. (WL #8699)

## 사용 중단 및 제거 관련 사항

- **중요한 변경; InnoDB:** 다음 `InnoDB` 파일 형식 설정 옵션은 MySQL 5.7.7에서 deprecated 되었으며 이제 제거되었습니다:

  - `innodb_file_format`
  - `innodb_file_format_check`
  - `innodb_file_format_max`
  - `innodb_large_prefix`

  파일 형식 설정 옵션은 MySQL 5.1의 이전 `InnoDB` 버전과 호환되는 테이블을 생성하는 데 필요했습니다. 이제 MySQL 5.1이 제품 수명 주기의 끝에 도달했으므로, 이러한 옵션은 더 이상 필요하지 않습니다.

  `FILE_FORMAT` 컬럼은 [`INNODB_SYS_TABLES`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/information-schema-innodb-sys-tables-table.html) 및 [`INNODB_SYS_TABLESPACES`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/information-schema-innodb-sys-tablespaces-table.html) Information Schema 테이블에서 제거되었습니다. (WL #7704)
- **InnoDB:** `innodb_stats_sample_pages` 시스템 변수가 제거되었습니다. `innodb_stats_sample_pages`는 MySQL 5.6.3에서 deprecated 되었으며 [`innodb_stats_transient_sample_pages`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_stats_transient_sample_pages)로 대체되었습니다. (WL #8903)
- **InnoDB:** `innodb_locks_unsafe_for_binlog` 시스템 변수가 제거되었습니다. `innodb_locks_unsafe_for_binlog`는 MySQL 5.6.3에서 deprecated 되었습니다. [`READ COMMITTED`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-transaction-isolation-levels.html#isolevel_read-committed) 격리 수준은 유사한 기능을 제공합니다. (WL #8894)
- **InnoDB:** XA 트랜잭션에서 2단계 커밋 지원을 활성화하는 `innodb_support_xa` 시스템 변수가 제거되었습니다. MySQL 5.7.10부터 XA 트랜잭션에서 2단계 커밋에 대한 `InnoDB` 지원은 항상 활성화됩니다. (WL #8843)

- Deprecated된 **mysql_install_db** 프로그램이 MySQL 배포판에서 제거되었습니다. 데이터 디렉터리 초기화는 대신 [`--initialize`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_initialize) 또는 [`--initialize-insecure`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_initialize-insecure) 옵션과 함께 **mysqld**를 호출하여 수행해야 합니다. 또한 **mysql_install_db**에서 사용하던 **mysqld**의 Deprecated된 `--bootstrap` 옵션이 제거되었으며, **mysql_install_db**의 설치 위치를 제어하던 `INSTALL_SCRIPTDIR` `CMake` 옵션이 제거되었습니다.

  이전에는 버전 1 테스트 스위트 코드가 MySQL 소스 배포판의 `mysql-test/lib/v1` 디렉터리에 있었습니다. 이 코드는 **mysql_install_db**를 사용했으며 제거되었습니다. `MYSQL_INSTALL_DB` 환경 변수와 `MTR_VERSION` 환경 변수 값 1은 더 이상 지원되지 않습니다. (WL #9071)
- **mysql_plugin** 유틸리티가 제거되었습니다. 대안으로는 [`--plugin-load`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_plugin-load) 또는 [`--plugin-load-add`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_plugin-load-add) 옵션을 사용하여 서버 시작 시 플러그인을 로드하거나, [`INSTALL PLUGIN`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/install-plugin.html) 문을 사용하여 런타임에 로드하는 방법이 있습니다. (WL #8927)
- Deprecated된 `mysql_shutdown()` C API 함수와 해당 `COM_SHUTDOWN` 클라이언트/서버 프로토콜 명령이 제거되었습니다. 대신 [`mysql_query()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-query.html)를 사용하여 [`SHUTDOWN`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/shutdown.html) 문을 실행하십시오. (WL #9014)

## Doxygen 관련 사항

- MySQL 소스 코드는 내부 문서화에 Doxygen을 사용하도록 업데이트되었습니다. 이 작업은 진행 중입니다. 새 MySQL 버전이 배포됨에 따라 Doxygen 문서는 업데이트되며, 최신 버전은 항상 [https://dev.mysql.com/doc/index-other.html](https://dev.mysql.com/doc/index-other.html)에서 사용할 수 있습니다.

  또한 [Generating MySQL Doxygen Documentation Content](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-installation-doxygen.html)의 지침을 사용하여 MySQL 소스 배포판에서 Doxygen 콘텐츠를 로컬로 생성할 수도 있습니다. (WL #8493)

## Optimizer 관련 사항

- **InnoDB:** 스토리지 엔진 인터페이스는 이제 Optimizer가 여러 로우를 읽을 것으로 예상하는 스캔에 사용할 레코드 버퍼의 크기에 대한 정보를 제공할 수 있게 합니다. 버퍼 크기는 예상 크기에 따라 달라질 수 있습니다. `InnoDB`는 이 가변 크기 버퍼링 기능을 사용하여 로우 프리페칭을 활용하고, 래칭 및 B-tree 탐색의 오버헤드를 줄입니다. 이전에는 `InnoDB`가 작은 고정 크기 버퍼를 사용했습니다. (WL #7093)
- Optimizer는 이제 파생 테이블 또는 뷰를 외부 쿼리 블록에 병합할지, 아니면 내부 임시 테이블을 사용하여 구체화할지를 지정하기 위한 테이블 수준 [`MERGE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/optimizer-hints.html#optimizer-hints-table-level) 및 [`NO_MERGE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/optimizer-hints.html#optimizer-hints-table-level) 힌트를 지원합니다. 예:

  ```
  SELECT /*+ MERGE(dt) */ * FROM (SELECT * FROM t1) AS dt;
  SELECT /*+ NO_MERGE(dt) */ * FROM (SELECT * FROM t1) AS dt;
  ```

  자세한 내용은 [Optimizer Hints](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/optimizer-hints.html)를 참조하십시오. (Bug #79554, Bug #22328100, WL #9307)
- MySQL은 이제 보이지 않는 인덱스를 지원합니다. 보이지 않는 인덱스는 Optimizer가 전혀 사용하지 않지만, 그 외에는 일반적으로 유지됩니다. 인덱스는 기본적으로 보이는 상태입니다. 보이지 않는 인덱스를 사용하면 해당 인덱스가 필요한 것으로 판명될 경우 되돌려야 하는 파괴적인 변경을 수행하지 않고도, 인덱스 제거가 쿼리 성능에 미치는 영향을 테스트할 수 있습니다. 이 기능은 기본 키가 아닌 인덱스에 대해 `InnoDB` 테이블에 적용됩니다.

  새 인덱스에 대해 인덱스가 보이지 않는지 여부를 명시적으로 제어하려면 [`CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html), [`CREATE INDEX`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-index.html) 또는 [`ALTER TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html)의 인덱스 정의 일부로 `VISIBLE` 또는 `INVISIBLE` 키워드를 사용하십시오. 기존 인덱스의 보이지 않음 상태를 변경하려면 `ALTER TABLE... ALTER INDEX` 작업에 `VISIBLE` 또는 `INVISIBLE` 키워드를 사용하십시오. 자세한 내용은 [Invisible Indexes](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/invisible-indexes.html)를 참조하십시오. (WL #8697)

- `mysql` 시스템 데이터베이스에는 이제 컬럼 값에 대한 통계를 저장하도록 설계된 `column_stats` 테이블이 포함됩니다. 자세한 내용은 [Optimizer Statistics](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/optimizer-statistics.html)를 참조하십시오. (WL #8706)

## 패키징 관련 사항

- 이전 MySQL 시리즈의 Development Milestone 릴리스는 development milestone *`N`*을 나타내기 위해 `-mN` 접미사를 사용하여 번호가 지정되었습니다. MySQL 8.0에서는 development 릴리스가 `-dmr` 접미사를 사용합니다. 예를 들어, 이 MySQL 릴리스는 `8.0.0-dmr`로 번호가 지정되었습니다. (Bug #80408, Bug #22748154)
- 이 릴리스 노트의 다른 곳에서 설명한 C++11 기능 사용의 결과로, 다음 패키징 변경이 적용되었습니다:

  - Red Hat Enterprise Linux 5 및 Oracle Linux 5 RPM에 대한 지원이 중단되었습니다
  - Generic binary tarball 빌드가 Red Hat Enterprise Linux 6으로 이동되었습니다

  (WL #8896)

## Parser 관련 사항

- **비호환 변경:** [`SELECT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/select.html) 및 [`UNION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/union.html)에 대한 Parser 규칙이 더 일관되도록(동일한 [`SELECT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/select.html) 문법이 이러한 각 컨텍스트에서 균일하게 적용됩니다) 그리고 중복을 줄이도록 리팩터링되었습니다. 이 작업으로 인해 사용자에게 보이는 여러 효과가 발생했으며, 특정 구문을 다시 작성해야 할 수 있습니다:

  - `NATURAL JOIN`은 표준 SQL을 준수하여 선택적 `INNER` 키워드(`NATURAL INNER JOIN`)를 허용합니다.
  - 괄호가 없는 right-deep 조인이 표준 SQL을 준수하여 허용됩니다(예: `... JOIN... JOIN... ON... ON`).
  - 이제 `STRAIGHT_JOIN`은 다른 내부 조인과 유사하게 `USING` 절을 허용합니다.
  - Parser는 쿼리 표현식 주위의 괄호를 허용합니다. 예를 들어 `(SELECT... UNION SELECT...)`가 허용됩니다.
  - Parser는 `SQL_CACHE` 및 `SQL_NO_CACHE` 쿼리 수정자의 문서화된 허용 배치 위치를 더 잘 따릅니다.
  - 이전에는 서브쿼리에서만 허용되었던 `UNION`의 왼쪽 중첩이 이제 최상위 구문에서도 허용됩니다. 예를 들어 이제 이 구문은 유효한 것으로 허용됩니다:

    ```
    (SELECT 1 UNION SELECT 1) UNION SELECT 1;
    ```
  - 잠금 절(`FOR UPDATE`, `LOCK IN SHARE MODE`)은 비-`UNION` 쿼리에서만 허용됩니다. 이는 잠금 절을 포함하는 `SELECT` 구문에 괄호를 사용해야 함을 의미합니다. 이 구문은 더 이상 유효한 것으로 허용되지 않습니다:

    ```
    SELECT 1 FOR UPDATE UNION SELECT 1 FOR UPDATE;
    ```

    대신, 구문을 다음과 같이 작성하십시오:

    ```
    (SELECT 1 FOR UPDATE) UNION (SELECT 1 FOR UPDATE);
    ```

  (Bug #11746363, Bug #25734, WL #8083, WL #8907)

- [`CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html)에 대한 Parser 규칙이 컨텍스트에 독립적이도록, 그리고 유지 관리성과 확장성을 개선하도록 리팩터링되었습니다. 이 작업으로 인해 사용자에게 보이는 여러 효과가 발생했습니다:

  - 생성 컬럼의 경우 `NOT NULL NULL`을 포함하면 `NOT NULL` 속성을 포함하는 컬럼이 되었으며, 이는 비생성 컬럼과 달랐습니다. 이제 이러한 정의는 최종 속성 `NULL`을 사용하며, 그 결과 nullable 컬럼이 됩니다(비생성 컬럼과 일관됩니다).
  - [`CREATE TEMPORARY TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-temporary-table.html)은 더 이상 `TEMPORARY`의 여러 인스턴스를 허용하지 않습니다.
  - 이전에는 `PARSE_GCOL_EXPR`가 키워드였으며 저장 프로그램에서 레이블로 사용할 수 없었습니다. 이제 더 이상 키워드가 아니며 레이블로 사용할 수 있습니다.
  - 일부 문법 오류에 대한 메시지는 구문 내 오류 위치와 관련하여 더 정밀해졌습니다.

  (WL #7840, WL #8067, WL #8433, WL #8434, WL #8345)

## Performance Schema 관련 사항

- **비호환 변경:** Performance Schema는 이제 서버 오류(및 경고)를 계측하고, 일련의 요약 테이블을 통해 이에 대한 통계 정보를 노출합니다:

  - `error` 계측기는 오류 정보가 수집되는지 여부를 제어합니다(기본적으로 활성화됨).
  - 여러 테이블은 다양한 방식으로 요약된 오류 정보를 포함합니다: [`events_errors_summary_global_by_error`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-error-summary-tables.html), [`events_errors_summary_by_account_by_error`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-error-summary-tables.html), [`events_errors_summary_by_host_by_error`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-error-summary-tables.html), [`events_errors_summary_by_thread_by_error`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-error-summary-tables.html), [`events_errors_summary_by_user_by_error`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-error-summary-tables.html).
  - [`performance_schema_error_size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-system-variables.html#sysvar_performance_schema_error_size) 시스템 변수는 계측되는 오류의 수를 제어합니다.

  자세한 내용은 [Error Summary Tables](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-error-summary-tables.html)를 참조하십시오

  이전 버전에서 이 MySQL 릴리스로 업그레이드하는 경우, 이러한 변경 사항을 `performance_schema` 데이터베이스에 반영하려면 **mysql_upgrade**를 실행하고 서버를 재시작해야 합니다.

  앞선 변경 사항의 결과로 두 개의 서버 오류 심볼 이름이 변경되었습니다: `ER_CANT_SET_ENFORCE_GTID_CONSISTENCY_ON_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS`는 이제 [`ER_CANT_ENFORCE_GTID_CONSISTENCY_WITH_ONGOING_GTID_VIOLATING_TX`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_cant_enforce_gtid_consistency_with_ongoing_gtid_violating_tx)이고, `ER_SET_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS`는 이제 [`ER_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TX`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_enforce_gtid_consistency_warn_with_ongoing_gtid_violating_tx)입니다.

    또한 여러 서버 오류 코드는 더 이상 서버에서 사용되지 않는 것으로 확인되어 obsolete로 제거되었습니다. 이러한 오류 중 하나라도 구체적으로 테스트하는 애플리케이션은 업데이트해야 합니다:

  ```
  ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE
  ER_BINLOG_ROW_RBR_TO_SBR
  ER_BINLOG_ROW_WRONG_TABLE_DEF
  ER_CANT_ACTIVATE_LOG
  ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION
  ER_CANT_CREATE_FEDERATED_TABLE
  ER_CANT_CREATE_SROUTINE
  ER_CANT_DELETE_FILE
  ER_CANT_GET_WD
  ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF
  ER_CANT_SET_WD
  ER_CANT_WRITE_LOCK_LOG_TABLE
  ER_CREATE_DB_WITH_READ_LOCK
  ER_CYCLIC_REFERENCE
  ER_DB_DROP_DELETE
  ER_DELAYED_NOT_SUPPORTED
  ER_DIFF_GROUPS_PROC
  ER_DISK_FULL
  ER_DROP_DB_WITH_READ_LOCK
  ER_DROP_USER
  ER_DUMP_NOT_IMPLEMENTED
  ER_ERROR_DURING_CHECKPOINT
  ER_ERROR_ON_CLOSE
  ER_EVENTS_DB_ERROR
  ER_EVENT_CANNOT_DELETE
  ER_EVENT_CANT_ALTER
  ER_EVENT_COMPILE_ERROR
  ER_EVENT_DATA_TOO_LONG
  ER_EVENT_DROP_FAILED
  ER_EVENT_MODIFY_QUEUE_ERROR
  ER_EVENT_NEITHER_M_EXPR_NOR_M_AT
  ER_EVENT_OPEN_TABLE_FAILED
  ER_EVENT_STORE_FAILED
  ER_EXEC_STMT_WITH_OPEN_CURSOR
  ER_FAILED_ROUTINE_BREAK_BINLOG
  ER_FLUSH_MASTER_BINLOG_CLOSED
  ER_FORM_NOT_FOUND
  ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF__UNUSED
  ER_FRM_UNKNOWN_TYPE
  ER_GOT_SIGNAL
  ER_GRANT_PLUGIN_USER_EXISTS
  ER_GTID_MODE_REQUIRES_BINLOG
  ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST
  ER_HASHCHK
  ER_INDEX_REBUILD
  ER_INNODB_NO_FT_USES_PARSER
  ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR
  ER_LOAD_DATA_INVALID_COLUMN_UNUSED
  ER_LOGGING_PROHIBIT_CHANGING_OF
  ER_MALFORMED_DEFINER
  ER_MASTER_KEY_ROTATION_ERROR_BY_SE
  ER_NDB_CANT_SWITCH_BINLOG_FORMAT
  ER_NEVER_USED
  ER_NISAMCHK
  ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR
  ER_NO_FILE_MAPPING
  ER_NO_GROUP_FOR_PROC
  ER_NO_RAID_COMPILED
  ER_NO_SUCH_KEY_VALUE
  ER_NO_SUCH_PARTITION__UNUSED
  ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE
  ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED
  ER_ORDER_WITH_PROC
  ER_PARTITION_SUBPARTITION_ERROR
  ER_PARTITION_SUBPART_MIX_ERROR
  ER_PART_STATE_ERROR
  ER_PASSWD_LENGTH
  ER_QUERY_ON_MASTER
  ER_RBR_NOT_AVAILABLE
  ER_SKIPPING_LOGGED_TRANSACTION
  ER_SLAVE_CHANNEL_DELETE
  ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT
  ER_SLAVE_MUST_STOP
  ER_SLAVE_WAS_NOT_RUNNING
  ER_SLAVE_WAS_RUNNING
  ER_SP_GOTO_IN_HNDLR
  ER_SP_PROC_TABLE_CORRUPT
  ER_SQL_MODE_NO_EFFECT
  ER_SR_INVALID_CREATION_CTX
  ER_TABLE_NEEDS_UPG_PART
  ER_TOO_MUCH_AUTO_TIMESTAMP_COLS
  ER_UNEXPECTED_EOF
  ER_UNION_TABLES_IN_DIFFERENT_DIR
  ER_UNSUPPORTED_BY_REPLICATION_THREAD
  ER_UNUSED1
  ER_UNUSED2
  ER_UNUSED3
  ER_UNUSED4
  ER_UNUSED5
  ER_UNUSED6
  ER_VIEW_SELECT_DERIVED_UNUSED
  ER_WRONG_MAGIC
  ER_WSAS_FAILED
  ```

    (WL #8058)

- 이전에는 Performance Schema [`events_statements_current`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-events-statements-current-table.html) 테이블의 `DIGEST` 및 `DIGEST_TEXT` 컬럼이 명령문 실행이 끝난 후에만 채워졌습니다. 이제 해당 컬럼은 파싱 직후와 명령문 실행이 시작되기 전에 채워집니다. 이를 통해 모니터링 애플리케이션은 명령문 실행 중에 명령문 다이제스트 정보에 액세스할 수 있습니다. (Bug #23336542)
- 이전에는 Performance Schema 최적화가 모니터링 데이터 수집에 수반되는 오버헤드를 줄이는 데 중점을 두었습니다. 이러한 이전 작업을 보완하여, 이제 해당 데이터를 가져오는 Performance Schema 쿼리에 대해서도 오버헤드가 줄어듭니다. 이는 대부분의 Performance Schema 테이블에 인덱스를 추가함으로써 달성되며, 이를 통해 optimizer는 전체 테이블 스캔 이외의 실행 계획에 액세스할 수 있습니다. 이러한 인덱스는 해당 테이블을 사용하는 [`sys`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/sys-schema.html) 스키마 뷰와 같은 관련 객체의 성능도 향상시킵니다. 자세한 내용은 [Performance Schema 쿼리 최적화](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-optimization.html)를 참조하십시오. (WL #6616)
- [`setup_actors`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-setup-actors-table.html) Performance Schema 테이블의 `ROLE` 컬럼 크기가 16자에서 32자로 증가했습니다. (WL #9262)

## 보안 관련 사항

- [`validate_password_check_user_name`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/validate-password-options-variables.html#sysvar_validate_password_check_user_name) 시스템 변수는 이제 비활성화되는 대신 기본적으로 활성화됩니다. 이는 `validate_password` 플러그인이 활성화되어 있을 때, 이제 기본적으로 현재 세션 사용자 이름과 일치하는 비밀번호를 거부함을 의미합니다. (WL #9480)
- 클라이언트 측 `--ssl` 및 `--ssl-verify-server-cert` 옵션이 제거되었습니다. `--ssl=1` 또는 `--enable-ssl` 대신 [`--ssl-mode=REQUIRED`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/connection-options.html#option_general_ssl-mode)를 사용하십시오. `--ssl=0`, `--skip-ssl` 또는 `--disable-ssl` 대신 [`--ssl-mode=DISABLED`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/connection-options.html#option_general_ssl-mode)를 사용하십시오. `--ssl-verify-server-cert` 옵션 대신 [`--ssl-mode=VERIFY_IDENTITY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/connection-options.html#option_general_ssl-mode)를 사용하십시오. (서버 측 [`--ssl`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_ssl) 옵션은 변경되지 않습니다.)

  C API의 경우, [`mysql_options()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-options.html)에 대한 `MYSQL_OPT_SSL_ENFORCE` 및 `MYSQL_OPT_SSL_VERIFY_SERVER_CERT` 옵션은 클라이언트 측 `--ssl` 및 `--ssl-verify-server-cert` 옵션에 해당하며 제거되었습니다. 대신 옵션 값으로 `SSL_MODE_REQUIRED` 또는 `SSL_MODE_VERIFY_IDENTITY`를 사용하는 `MYSQL_OPT_SSL_MODE`를 사용하십시오. (WL #9091)

## 공간 데이터 지원

- Well-Known Text (WKT) 값의 가져오기 및 내보내기를 위한 공간 함수가 OpenGIS `'GEOMETRYCOLLECTION EMPTY'` 표준 문법이 아니라 MySQL `'GEOMETRYCOLLECTION()'` 비표준 문법을 사용했습니다. 이제 가져오기에서는 두 문법을 모두 인식하며, 내보내기에서는 표준 문법을 사용합니다. [WKT 값에서 Geometry 값을 생성하는 함수](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/gis-wkt-functions.html)를 참조하십시오. (Bug #23632147, Bug #81964)
- [`ST_X()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/gis-point-property-functions.html#function_st-x) 및 [`ST_Y()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/gis-point-property-functions.html#function_st-y) 공간 함수는 이제 각각 X 또는 Y 좌표 값을 지정하는 선택적 두 번째 인수를 허용합니다. 두 인수를 사용하는 경우, 함수 결과는 첫 번째 인수의 포인트 값에서 해당 좌표가 수정된 값입니다. 또한 단일 인수를 사용하는 [`ST_X()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/gis-point-property-functions.html#function_st-x) 및 [`ST_Y()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/gis-point-property-functions.html#function_st-y)는 이제 더 엄격해져서, 인수가 유효한 geometry이지만 포인트가 아닌 경우 `NULL`을 반환하는 대신 [`ER_UNEXPECTED_GEOMETRY_TYPE`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_unexpected_geometry_type) 에러를 생성합니다. 자세한 내용은 [포인트 속성 함수](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/gis-point-property-functions.html)를 참조하십시오. (WL #8606)
- [`ST_SRID()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/gis-general-property-functions.html#function_st-srid) 공간 함수는 이제 SRID 값을 지정하는 선택적 두 번째 인수를 허용합니다. 두 인수를 사용하는 경우, 함수 결과는 두 번째 인수에 따라 SRID가 수정된 첫 번째 인수의 geometry 값입니다. 자세한 내용은 [일반 Geometry 속성 함수](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/gis-general-property-functions.html)를 참조하십시오. (WL #8543)

- MySQL은 이제 공간 데이터에 사용하기 위해 SRID 0 이외의 공간 참조 시스템에 대한 정보를 저장합니다. 이 정보는 `st_spatial_reference_systems` 데이터 딕셔너리 테이블에 저장되며 EPSG Dataset 8.7을 기반으로 합니다. 공간 참조 시스템에 대한 정보는 [Spatial Reference System Support](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-reference-systems.html)를 참조하십시오.

  이전에는 [`ST_IsValid()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-convenience-functions.html#function_st-isvalid), [`ST_MakeEnvelope()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-convenience-functions.html#function_st-makeenvelope), [`ST_Validate()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-convenience-functions.html#function_st-validate) 함수가 SRID 0인 지오메트리 인수를 요구했습니다. 이제 이 함수들은 투영 공간 참조 시스템에 대한 SRID가 있는 지오메트리 인수를 허용합니다. (WL #8579)
- MySQL 5.7에서는 여러 이름으로 사용할 수 있던 여러 공간 함수가 공간 함수 네임스페이스를 더 일관성 있게 만드는 방향으로 나아가기 위해 deprecated되었으며, 목표는 각 공간 함수 이름이 정확한 연산을 수행하는 경우 `ST_`로 시작하고, 최소 경계 사각형을 기반으로 하는 연산을 수행하는 경우 `MBR`로 시작하도록 하는 것이었습니다. deprecated된 함수는 이제 제거되어, 대응하는 `ST_` 및 `MBR` 함수만 남았습니다:

  - 다음 함수는 `MBR` 이름을 위해 제거되었습니다: `Contains()`, `Disjoint()`, `Equals()`, `Intersects()`, `Overlaps()`, `Within()`.
  - 다음 함수는 `ST_` 이름을 위해 제거되었습니다: `Area()`, `AsBinary()`, `AsText()`, `AsWKB()`, `AsWKT()`, `Buffer()`, `Centroid()`, `ConvexHull()`, `Crosses()`, `Dimension()`, `Distance()`, `EndPoint()`, `Envelope()`, `ExteriorRing()`, `GeomCollFromText()`, `GeomCollFromWKB()`, `GeomFromText()`, `GeomFromWKB()`, `GeometryCollectionFromText()`, `GeometryCollectionFromWKB()`, `GeometryFromText()`, `GeometryFromWKB()`, `GeometryN()`, `GeometryType()`, `InteriorRingN()`, `IsClosed()`, `IsEmpty()`, `IsSimple()`, `LineFromText()`, `LineFromWKB()`, `LineStringFromText()`, `LineStringFromWKB()`, `MLineFromText()`, `MLineFromWKB()`, `MPointFromText()`, `MPointFromWKB()`, `MPolyFromText()`, `MPolyFromWKB()`, `MultiLineStringFromText()`, `MultiLineStringFromWKB()`, `MultiPointFromText()`, `MultiPointFromWKB()`, `MultiPolygonFromText()`, `MultiPolygonFromWKB()`, `NumGeometries()`, `NumInteriorRings()`, `NumPoints()`, `PointFromText()`, `PointFromWKB()`, `PointN()`, `PolyFromText()`, `PolyFromWKB()`, `PolygonFromText()`, `PolygonFromWKB()`, `SRID()`, `StartPoint()`, `Touches()`, `X()`, `Y()`.
  - `GLength()`는 [`ST_Length()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/gis-linestring-property-functions.html#function_st-length)를 위해 제거되었습니다.

  (WL #8157)

## 테스트 스위트 관련 사항

- **mysql-test-run.pl**은 이제 `--do-suite` 옵션을 지원합니다. 이 옵션은 `--do-test`와 유사하지만 실행할 테스트의 전체 스위트를 지정할 수 있습니다. (Bug #24350345)
- **mysqltest** `rmdir` 명령은 제거할 디렉터리에 파일이나 디렉터리가 하나라도 포함되어 있으면 실패합니다. 디렉터리와 그 내용(있는 경우)의 재귀적 제거를 가능하게 하기 위해, **mysqltest**는 이제 `force-rmdir` 명령을 지원합니다. (Bug #24316799)
- 두 가지 새로운 테스트 스위트 옵션을 통해 테스트 케이스를 더 쉽게 디버그할 수 있습니다:

  - **mysql-test-run.pl**은 옵션을 **mysqltest**에 전달할 수 있게 하는 `--mysqltest=options` 옵션을 지원합니다.
  - **mysqltest**는 실행된 프로그램의 출력을 즉시 `stdout`에 출력하게 하는 `--trace-exec` 옵션을 지원합니다.

  **mysql-test-run.pl**은 이제 `MTR_CTEST_TIMEOUT` 환경 변수를 인식합니다. 이 변수가 설정되면, 값은 **ctest** 유닛 테스트 명령에 전달할 초 단위 제한 시간입니다. (Bug #21821049, Bug #21278845)
- MySQL 테스트 스위트의 테스트 케이스에서, 이전에는 서버 오류에 대해서만 `--error` 명령에 심볼릭 오류 이름을 사용할 수 있었습니다. 이제 클라이언트 오류에 대해서도 이 작업이 가능합니다. 예를 들면 다음과 같습니다:

  ```
  --error CR_SERVER_GONE_ERROR
  ```

  (Bug #21048973, Bug #76972)

- **mysqltest** 프로그램에는 이제 소스 디렉터리에서 대상 디렉터리로 패턴과 일치하는 모든 파일을 복사하는 `copy_files_wildcard` 명령이 있습니다. [https://dev.mysql.com/doc/index-other.html](https://dev.mysql.com/doc/index-other.html)에서 제공되는 MySQL Server Doxygen 문서를 참조하십시오. (Bug #82111, Bug #23743035)

## X 플러그인 관련 사항

- `Protobuf` 디코더 클래스는 중첩 객체 수를 50개(기본값)로 제한했습니다. (Bug #23707238, Bug #82025)
- `list_objects` 문은 테이블을 컬렉션으로 잘못 보고했습니다. (Bug #23631240)
- `create_collection` 문은 primary key 대신 `'_id'` 컬럼에 unique key 인덱스가 있는 컬렉션 테이블을 생성했습니다. (Bug #23284569)

## 추가되거나 변경된 기능

- **호환되지 않는 변경; 파티셔닝:** MySQL 서버에서 일반 파티셔닝 핸들러가 제거되었습니다. 이 변경의 일부로, **mysqld**는 더 이상 `--partition` 및 `--skip-partition` 옵션을 지원하지 않으며, 서버는 더 이상 `-DWITH_PARTITION_STORAGE_ENGINE`을 사용하여 빌드할 수 없습니다. 또한 `partition`은 더 이상 [`SHOW PLUGINS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-plugins.html)의 출력에 표시되지 않거나, [`INFORMATION_SCHEMA.PLUGINS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-plugins-table.html) 테이블에 표시되지 않습니다.

  지정된 테이블의 파티셔닝을 지원하려면, 이제 해당 테이블에 사용되는 스토리지 엔진이 자체 (“네이티브”) 파티셔닝 핸들러를 제공해야 합니다. [`InnoDB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-storage-engine.html)는 네이티브 파티셔닝 핸들러를 포함하는 MySQL 8.0에서 지원되는 유일한 스토리지 엔진입니다. 다른 스토리지 엔진을 사용하여 MySQL 8.0에서 파티셔닝된 테이블을 생성하려는 시도는 실패합니다. (MySQL NDB Cluster에서 사용하는 [`NDB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/mysql-cluster.html) 스토리지 엔진도 자체 파티셔닝 핸들러를 제공하지만, 현재 MySQL 8.0에서는 지원되지 않습니다.)

  **업그레이드에 미치는 영향.** [`InnoDB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-storage-engine.html)가 아닌 스토리지 엔진(예: [`MyISAM`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/myisam-storage-engine.html))을 사용하는 파티셔닝된 테이블을 MySQL 5.7(또는 이전 버전)에서 MySQL 8.0으로 직접 업그레이드하는 것은 지원되지 않습니다. 이러한 테이블을 MySQL 8.0과 호환되도록 업그레이드하는 옵션은 두 가지이며, 여기에 나열되어 있습니다:

  - 테이블의 파티셔닝을 제거하십시오. [`ALTER TABLE... REMOVE PARTITIONING`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table-partition-operations.html) 문을 실행하여 데이터 손실 없이 이 작업을 수행할 수 있습니다.
  - [`ALTER TABLE... ENGINE=INNODB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html)를 사용하여 테이블에 사용되는 스토리지 엔진을 `InnoDB`로 변경하십시오. 이렇게 하면 테이블의 파티셔닝은 그대로 유지됩니다. 서버를 MySQL 8.0으로 업그레이드하기 전에, 파티셔닝된 모든 비-`InnoDB` 테이블에 대해 이러한 작업 중 적어도 하나를 수행해야 합니다. 그렇지 않으면 업그레이드 후 이러한 테이블을 사용할 수 없습니다.

    `MyISAM` 테이블을 `InnoDB`로 변환하는 방법에 대한 자세한 내용은 [Converting Tables from MyISAM to InnoDB](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/converting-tables-to-innodb.html)를 참조하십시오.

  MySQL 5.7 또는 그 이전 버전에서 **mysqldump**를 사용하여 생성한 덤프 파일에서 MySQL 8.0 서버로 데이터베이스를 가져올 때도 이와 유사한 상황이 발생합니다. 이는 그러한 지원이 없는 스토리지 엔진을 사용하는 파티셔닝된 테이블을 생성하게 되는 테이블 생성문이 MySQL 8.0에서 오류와 함께 실패하기 때문입니다. 이러한 이유로 덤프 파일에서 파티셔닝된 테이블을 생성하는 모든 문이 지원되지 않는 스토리지 엔진도 함께 지정하지 않도록 해야 합니다. `InnoDB`가 아닌 `STORAGE ENGINE` 옵션 값을 사용하는 `CREATE TABLE` 문에서 파티셔닝에 대한 모든 참조를 제거하거나, 스토리지 엔진을 `InnoDB`로 지정하거나(`InnoDB`가 기본값으로 사용되도록 허용하거나) 하여 이를 수행할 수 있습니다.

  자세한 내용은 [Partitioning Limitations Relating to Storage Engines](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/partitioning-limitations-storage-engines.html)를 참조하십시오. (WL #8971, WL #9457)
- **InnoDB:** [`innodb_buffer_pool_debug`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_buffer_pool_debug) 옵션은 버퍼 풀이 1GB보다 작은 크기일 때 여러 버퍼 풀 인스턴스를 허용하며, [`innodb_buffer_pool_instances`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_buffer_pool_instances)에 적용되는 1GB 최소 버퍼 풀 크기 제약 조건을 무시합니다. (Bug #24287290)

- **InnoDB:** 새로운 동적 설정 옵션인 [`innodb_deadlock_detect`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_deadlock_detect)를 사용하여 데드락 감지를 비활성화할 수 있습니다. 높은 동시성 시스템에서는 많은 스레드가 같은 잠금을 기다릴 때 데드락 감지가 속도 저하를 일으킬 수 있습니다. 경우에 따라 데드락 감지를 비활성화하고 데드락이 발생했을 때 트랜잭션 롤백에 [`innodb_lock_wait_timeout`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_lock_wait_timeout) 설정을 사용하는 것이 더 효율적일 수 있습니다. (Bug #23477773, WL #9383)
- **InnoDB:** `libinnodb_zipdecompress.a` 라이브러리는 외부 도구가 `page_zip_decompress_low()` 함수를 사용하여 `InnoDB` 페이지를 압축 해제할 수 있도록 합니다. (Bug #21405300, Bug #77664)
- **InnoDB:** 일부 워크로드에서 발생할 수 있는 경합을 해결하기 위해 버퍼 풀 뮤텍스가 제거되고 여러 리스트 및 해시 보호 뮤텍스로 대체되었습니다. 또한 여러 버퍼 풀 관련 변수는 더 이상 버퍼 풀 뮤텍스 보호가 필요하지 않습니다. 패치를 제공한 Yasufumi Kinoshita와 Laurynas Biveinis에게 감사드립니다. (Bug #20381905, Bug #75534, WL #8423)
- **InnoDB:** `InnoDB`는 이제 [`ALTER TABLE ALGORITHM=COPY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 작업 중 10000 로우마다 발생하던 중간 커밋을 피합니다. 중간 커밋의 목적은 중단된 [`ALTER TABLE ALGORITHM=COPY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 작업의 경우 복구 속도를 높이는 것이었습니다. [`ALTER TABLE ALGORITHM=COPY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 작업이 중단되면, 이제 undo 로그가 롤백되기 전에 DDL 로그 복구 중 새 커밋되지 않은 테이블이 삭제되므로 커밋되지 않은 테이블에 대한 시간이 많이 소요되는 데이터 롤백을 피합니다. 이제 [`ALTER TABLE ALGORITHM=COPY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 작업에 대해서는 `IGNORE` 절이나 롤백 기능이 필요한 다른 요소가 없는 한 undo 로깅이 억제됩니다.

  변경 중인 테이블에 전문 인덱스가 있는 경우, [`ALTER TABLE ALGORITHM=COPY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 작업이 새 커밋되지 않은 테이블에 로우를 삽입할 때 전문 데이터가 전문 보조 테이블에 삽입됩니다. 이전에는 전문 데이터가 트랜잭션 커밋 시에만 처리되었습니다. (Bug #17479594)

- **InnoDB:** 동일한 테이블에서 여러 purge 스레드가 로우를 purge하여 발생할 수 있는 읽기-쓰기 잠금 경합을 줄이기 위해, 이제 undo 레코드는 테이블 ID별로 그룹화되어 서로 다른 purge 스레드에 할당됩니다. (WL #9387)
- **InnoDB:** 이제 `InnoDB` 코드는 스레드 관리를 위해 C++ `std::thread` 라이브러리를 사용합니다. (WL #9359)
- **InnoDB:** 압축 및 비압축 [`BLOB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/blob.html) 데이터에 대한 작업을 위한 내부 C++ 인터페이스를 제공하도록 [`BLOB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/blob.html) 코드가 리팩터링되었습니다. (WL #8985, WL #9141)
- **InnoDB:** 이제 `InnoDB` **memcached** 플러그인은 여러 `get` 작업(단일 **memcached** 쿼리에서 여러 키/값 쌍 가져오기) 및 범위 쿼리를 지원합니다. [InnoDB memcached Multiple get and Range Query Support](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-memcached-multiple-get-range-query.html)를 참조하십시오. (WL #6650)
- **InnoDB:** 인덱스 트리 손상이 발생하면 `InnoDB`는 손상 플래그를 redo 로그에 기록하며, 이로 인해 손상 플래그는 크래시 세이프가 됩니다. 또한 `InnoDB`는 각 체크포인트에서 인메모리 손상 플래그 데이터를 엔진 전용 시스템 테이블에 기록합니다. 복구 중에 `InnoDB`는 두 위치 모두에서 손상 플래그를 읽고 결과를 병합한 뒤 인메모리 테이블 및 인덱스 객체를 손상된 것으로 표시합니다. (WL #7816)
- **InnoDB:** MySQL 데이터 디렉터리 외부에 테이블스페이스 데이터 파일을 생성할 때 `InnoDB`는 더 이상 `.isl` 파일(`InnoDB` 심볼릭 링크 파일)을 생성하지 않습니다.

  이 변경으로 인해 서버가 오프라인 상태일 때 `.isl` 파일을 수동으로 수정하여 원격 테이블스페이스를 이동하는 것은 지원되지 않습니다. (WL #6416)

- **InnoDB:** `InnoDB`는 더 이상 압축된 임시 테이블을 지원하지 않습니다. [`innodb_strict_mode`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_strict_mode)가 활성화된 경우(기본값), [`CREATE TEMPORARY TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html)은 `ROW_FORMAT=COMPRESSED` 또는 `KEY_BLOCK_SIZE`가 지정되면 오류를 반환합니다. [`innodb_strict_mode`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_strict_mode)가 비활성화된 경우, 경고가 발생하고 임시 테이블은 압축되지 않은 로우 형식을 사용하여 생성됩니다.

  이 변경으로 모든 임시 테이블은 공유 임시 테이블스페이스인 `ibtmp1`에 생성됩니다.

  `PER_TABLE_TABLESPACE` 및 `IS_COMPRESSED` 컬럼은 [`INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-innodb-temp-table-info-table.html)에서 제거되었습니다. (WL #7899)
- **InnoDB:** 새 [`INFORMATION_SCHEMA.INNODB_CACHED_INDEXES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-innodb-cached-indexes-table.html) 테이블은 각 인덱스에 대해 `InnoDB` 버퍼 풀에 캐시된 인덱스 페이지 수를 보고합니다. (WL #7170)
- **InnoDB:** `innodb_checksums` 시스템 변수가 제거되었습니다. `innodb_checksums`는 MySQL 5.6.3에서 [`innodb_checksum_algorithm`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_checksum_algorithm)으로 대체되었습니다. (WL #8893)
- **InnoDB:** `InnoDB` 시작 코드가 리팩터링되었습니다. (WL #7488)
- **InnoDB:** [`innodb_flush_method`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_flush_method)의 기본값은 더 이상 `NULL`이 아닙니다. Unix 계열 시스템에서 기본값은 `fsync`입니다. Windows 시스템에서 기본값은 `unbuffered`입니다.

  Windows에서 [`innodb_flush_method`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_flush_method) 설정은 더 이상 `innodb_use_native_aio` 설정에 영향을 주지 않습니다. 이제 Windows에서 [`innodb_flush_method`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_flush_method)에 가능한 설정은 `unbuffered`(버퍼링되지 않은 I/O) 및 `normal`(버퍼링된 I/O) 두 가지입니다. 이 변경으로 버퍼링된 I/O와 함께 비동기 I/O를 활성화할 수 있으며, 이는 새로운 조합([`innodb_use_native_aio=ON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_use_native_aio) 및 [`innodb_flush_method=normal`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_flush_method))입니다. `async_unbuffered` 설정이 제거되었습니다.

  이제 [`innodb_flush_method`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_flush_method) 및 [`innodb_change_buffering`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_change_buffering) 설정 옵션을 숫자 값으로 설정할 수 있습니다. (WL #7488)
- **InnoDB:** `InnoDB`는 더 이상 MySQL 데이터 디렉터리 외부에 file-per-table 테이블스페이스 데이터 파일을 생성할 때 `.isl` 파일(InnoDB Symbolic Link 파일)을 생성하지 않습니다. 이제 `InnoDB`는 원격 테이블스페이스 데이터 파일을 찾는 데 redo 로그를 사용합니다.

  `.isl` 파일을 수정하여 MySQL 데이터 디렉터리 외부에 생성된 file-per-table 테이블스페이스 데이터 파일을 오프라인으로 재배치하는 것은 더 이상 지원되지 않습니다. (WL #6416)
- **InnoDB:** 현재 최대 자동 증가 카운터 값은 이제 값이 변경될 때마다 redo 로그에 기록되고, 각 체크포인트에서 엔진 전용 시스템 테이블에 저장됩니다. 이러한 변경으로 현재 최대 자동 증가 카운터 값이 서버 재시작 후에도 유지됩니다. 추가로:

  - 서버 재시작은 더 이상 `AUTO_INCREMENT = N` 테이블 옵션의 효과를 취소하지 않습니다. 자동 증가 카운터를 특정 값으로 초기화하거나 자동 증가 카운터 값을 더 큰 값으로 변경하면, 새 값은 서버 재시작 후에도 유지됩니다.
  - [`ROLLBACK`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/commit.html) 작업 직후 서버를 재시작해도 더 이상 롤백된 트랜잭션에 할당되었던 자동 증가 값이 재사용되지 않습니다.
  - 예를 들어 [`UPDATE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/update.html) 작업에서 `AUTO_INCREMENT` 컬럼 값을 현재 최대 자동 증가 값보다 큰 값으로 수정하면, 새 값이 유지되고, 이후 [`INSERT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/insert.html) 작업은 새롭고 더 큰 값부터 자동 증가 값을 할당합니다.

  자세한 내용은 [AUTO_INCREMENT Handling in InnoDB](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-auto-increment-handling.html) 및 [InnoDB AUTO_INCREMENT Counter Initialization](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-auto-increment-handling.html#innodb-auto-increment-initialization)을 참조하십시오. (Bug #199, Bug #13726455, WL #6204)

- **Replication:** [CHANGE MASTER TO](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/change-master-to.html) 문이 에러 로그(`mysqld.log`)에 기록되는 방식에 두 가지 개선 사항이 있습니다:

  - 이전에는 옵션 지정(예: `MASTER_USER =` 및 `MASTER_PASSWORD =`) 사이에 쉼표가 들어가지 않았으므로, 복사하여 붙여넣는 방식으로 해당 문을 사용하려는 사용자는 쉼표를 수동으로 삽입해야 했습니다. 이제 해당 문이 에러 로그에 기록될 때 쉼표가 삽입됩니다.
  - `MASTER_PASSWORD` 값의 자리 표시자로 리터럴 “<secret>”이 삽입될 때 이제 따옴표가 사용되지 않으므로, 복사하여 붙여넣기 전에 리터럴을 실제 비밀번호로 바꾸는 것을 잊은 사용자는 다른 문제가 발생하는 대신 즉시 문법 에러를 받습니다.

  (Bug #18194384)

- **Replication:** [`gtid_executed`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-gtids.html#sysvar_gtid_executed)가 비어 있는지 여부와 관계없이 [`gtid_purged`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-gtids.html#sysvar_gtid_purged)에 GTID를 추가할 수 있으므로, 이제 GTID 기반 복제 서버의 백업을 복원할 수 있습니다. 이를 통해 기존 GTID 정보와 바이너리 로그를 잃지 않고 GTID 기반 복제 서버의 백업을 복원할 수 있습니다. 추가할 GTID는 백업을 수행한 시점에 [`gtid_executed`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-gtids.html#sysvar_gtid_executed)에 존재했던 GTID입니다. `SET GTID_PURGED`의 문법이 확장되어 `SET GTID_PURGED ="+gtid_set"`이 기존 [`gtid_purged`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-gtids.html#sysvar_gtid_purged) GTID 세트에 *`gtid_set`*을 추가합니다. (WL #6591)

- **Replication:** 로우 기반 복제의 진행 상황을 표시하기 위해 새로운 Performance Schema stage가 추가되었습니다. 이러한 stage를 사용하여 로우 기반 복제에서 느린 작업의 진행 상황을 확인할 수 있습니다. 또한 변경 사항이 어느 데이터베이스에 적용되고 있는지 확인할 수 있습니다. 이는 로우 기반 복제 문제 해결에 도움이 되며 성능 튜닝을 위한 더 많은 정보를 제공합니다. 자세한 내용은 [Monitoring Row-based Replication](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-solutions-rbr-monitoring.html)을 참조하십시오. (WL #7364)
- **JSON:** 이 릴리스에서는 MySQL에 저장된 [`JSON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json.html) 문서와 함께 사용할 수 있도록, 때때로 인라인 경로 연산자라고도 하는 unquoting 추출 연산자 [`->>`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-search-functions.html#operator_json-inline-path)가 추가되었습니다. 새 연산자는 [`->`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-search-functions.html#operator_json-column-path) 연산자와 유사하지만, 값의 JSON unquoting도 수행합니다. JSON 컬럼 `mycol`과 JSON 경로 표현식 `mypath`에 대해, 다음 세 표현식은 동등합니다:

  - [`JSON_UNQUOTE(`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-modification-functions.html#function_json-unquote) [`JSON_EXTRACT(mycol, "$.mypath"))`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-search-functions.html#function_json-extract)
  - `JSON_UNQUOTE(mycol`[`->`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-search-functions.html#operator_json-column-path)`"$.mypath")`
  - `mycol->>"$.mypath"`

  `->>` 연산자는 `JSON_UNQUOTE(JSON_EXTRACT())`가 허용되는 모든 SQL 문에서 사용할 수 있습니다. 여기에는 `SELECT` 목록, `WHERE` 및 `HAVING` 절, `ORDER BY` 및 `GROUP BY` 절이 포함되지만 이에 국한되지는 않습니다.

  자세한 내용은 [Functions That Search JSON Values](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-search-functions.html) 및 [JSON Path Syntax](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json.html#json-path-syntax)를 참조하십시오. (Bug #78736, Bug #21980346, WL #9124)

- 더 정확한 추정치를 생성하기 위해, [`MEMORY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/memory-storage-engine.html) 스토리지 엔진은 이제 정수 산술이 아니라 부동소수점 산술을 사용하여 인덱스 통계(키당 레코드 추정치)를 계산합니다. (Bug #23024059)
- 새로운 **CMake** 옵션인 [`INSTALL_STATIC_LIBRARIES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_install_static_libraries)는 정적 라이브러리 설치 여부에 대한 제어를 가능하게 합니다. 기본값은 `ON`입니다. `OFF`로 설정하면 다음 라이브러리가 설치되지 않습니다: `libmysqlclient.a`, `libmysqld.a`, `libmysqlservices.a`. (Bug #22891432)
- 내부 `mysql_prepare_create_table()` 서버 함수는 코드 유지보수성과 명확성을 개선하기 위해 리팩터링되었습니다. 이 코드 개정으로 인해 [`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)에 대해 다음과 같은 사소한 동작 변경이 발생합니다:

  - `NULL` 컬럼을 기반으로 두 번째 기본 키를 생성하려는 시도는 이제 [`ER_PRIMARY_CANT_HAVE_NULL`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_primary_cant_have_null) 오류가 아니라 [`ER_MULTIPLE_PRI_KEY`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_multiple_pri_key) 오류를 생성합니다.
  - 생성 컬럼을 기반으로 두 번째 기본 키를 생성하려는 시도는 이제 [`ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_unsupported_action_on_generated_column) 오류가 아니라 [`ER_MULTIPLE_PRI_KEY`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_multiple_pri_key) 오류를 생성합니다.
  - [`JSON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json.html) 컬럼에 전체 텍스트 키를 생성하려는 시도는 이제 [`ER_BAD_FT_COLUMN`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_bad_ft_column) 오류가 아니라 [`ER_JSON_USED_AS_KEY`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_json_used_as_key) 오류를 생성합니다.
  - 키를 지원하지 않는 스토리지 엔진(예: [`EXAMPLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/example-storage-engine.html))에서 키를 생성하려는 시도는 이제 [`ER_TOO_MANY_KEY_PARTS`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_too_many_key_parts) 오류가 아니라 [`ER_TOO_MANY_KEYS`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_too_many_keys) 오류를 생성합니다.

    (Bug #22884886)

- 이전에는 임베디드 서버인 `libmysqld`에 대해 Performance Schema가 빌드되지 않았습니다. 이로 인해 [`show_compatibility_56=OFF`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-system-variables.html#sysvar_show_compatibility_56)와 함께 [`SHOW STATUS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-status.html) 및 [`SHOW VARIABLES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-variables.html) 문을 사용할 수 없었습니다. 그 설정에서는 해당 문이 Performance Schema 테이블에서 결과를 가져오기 때문입니다. 이제 `libmysqld`의 경우 필요한 Performance Schema 테이블이 빌드되므로(수집되는 계측은 없음), 이러한 `SHOW` 문이 [`show_compatibility_56=OFF`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-system-variables.html#sysvar_show_compatibility_56)와 함께 지원될 수 있습니다. (Bug #22809694)
- [`JSON_CONTAINS()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-search-functions.html#function_json-contains), [`JSON_SEARCH()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-search-functions.html#function_json-search) 및 기타 MySQL JSON 함수에서 사용하는 여러 내부 함수는 JSON 객체를 검사할 때 키, 값 또는 둘 모두의 로컬 복사본을 과도하게 많이 생성했습니다. 이러한 복사는 많은 경우 제거되었거나 줄어들었습니다. 또한 이러한 함수 중 일부에서 사용하는 임시 객체의 수명이 줄어들었습니다. 이러한 변경으로 인해 이러한 JSON 함수 및 관련 JSON 함수는 이전보다 더 효율적으로 수행되고, 필요한 리소스도 더 적어질 것입니다. (Bug #22602142)

- 시스템 **lz4** 및 **openssl zlib** 명령을 사용할 수 있으면 **lz4_decompress** 및 **zlib_decompress** 유틸리티는 불필요합니다. 두 가지 변경으로 해당 유틸리티가 빌드되지 않도록 할 수 있습니다: 새 [`WITH_LZ4`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_with_lz4) **CMake** 옵션이 `system`으로 설정되면 **lz4_decompress**가 빌드되거나 설치되지 않습니다. [`WITH_ZLIB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_with_zlib) **CMake** 옵션이 `system`으로 설정되면 **zlib_decompress**가 빌드되거나 설치되지 않습니다. (Bug #22329851)
- MySQL 문자열 라이브러리의 소스 파일이 C(`.c` 접미사)에서 C++(`.cc` 접미사)로 변환되었습니다. 이를 통해 라이브러리 코드에서 더 엄격한 컴파일 검사와 C++ 기능 사용이 가능해집니다. (Bug #22124719)
- `mysys` 라이브러리의 소스 코드는 이제 더 엄격한 컴파일 검사를 활용하고 C++ 기능 사용을 허용하기 위해 C가 아닌 C++를 사용합니다. (Bug #21881278)
- 성능 향상 및 다른 플랫폼과의 더 나은 호환성을 위해 OS X의 `my_sync()`는 이제 `F_FULLSYNC` 플래그와 함께 `fcntl()`을 사용하는 대신 `fsync()`를 사용합니다. (Bug #20742269)
- 새 **CMake** 옵션인 [`WITH_TSAN`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_with_tsan)은 이를 지원하는 컴파일러에서 ThreadSanitizer를 활성화할 수 있게 합니다. (Bug #80409, Bug #23171902)
- 이전에 단일 mutex로 보호되던 전역 연결 목록이 8개 부분으로 파티셔닝되었으며, 각 부분은 자체 mutex 인스턴스로 보호됩니다. 그 결과 연결 처리의 오버헤드가 감소하고 성능이 향상됩니다. 이 변경이 모니터링 목적에 대해 가지는 의미는 Performance Schema가 이제 `LOCK_thd_list` mutex, `LOCK_thd_remove` mutex, `COND_thd_list` condition variable 각각에 대해 8개의 서로 다른 인스턴스를 노출한다는 것입니다. (WL #9250)
- MySQL은 이제 UUID 값을 조작하고 더 쉽게 다룰 수 있도록 하는 함수를 제공합니다:

  - [`UUID_TO_BIN()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/miscellaneous-functions.html#function_uuid-to-bin) 및 [`BIN_TO_UUID()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/miscellaneous-functions.html#function_bin-to-uuid)는 문자열 및 바이너리 형식의 UUID 값(각각 16진수 문자 및 [`VARBINARY(16)`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/binary-varbinary.html)로 표현됨) 간에 변환합니다. 이를 통해 문자열 UUID 값을 더 적은 저장 공간을 사용하는 바이너리 값으로 변환할 수 있습니다. 바이너리로 변환된 UUID 값은 향상된 인덱싱 효율성을 허용하는 방식으로 표현될 수 있습니다.
  - [`IS_UUID()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/miscellaneous-functions.html#function_is-uuid)는 인수가 유효한 문자열 형식 UUID 값인지 여부를 나타내기 위해 1 또는 0을 반환합니다.

    자세한 내용은 [기타 함수](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/miscellaneous-functions.html)를 참조하십시오. (WL #8920)
- 서버는 이제 이전 서버 실행에서 남은 임시 테이블을 정리하기 위해 스토리지 엔진에 의존합니다. `InnoDB`는 재시작 시 임시 테이블스페이스를 폐기하여 이를 수행합니다. `MyISAM` 및 기타 유사한 스토리지 엔진은 여전히 특정 이름 패턴을 가진 이러한 엔진에 속한 파일을 찾아 남은 테이블을 감지하기 위해 임시 디렉터리를 스캔하는 방식에 의존합니다. (WL #7784)
- 서버는 더 이상 특수 문자가 포함된 pre-MySQL 5.1 데이터베이스 이름을 `#mysql50#` 접두사를 추가한 5.1 형식으로 변환하지 않습니다. 이러한 변환이 더 이상 수행되지 않으므로 **mysqlcheck**의 `--fix-db-names` 및 `--fix-table-names` 옵션, [`ALTER DATABASE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-database.html) 문의 `UPGRADE DATA DIRECTORY NAME` 절, 그리고 `Com_alter_db_upgrade` 상태 변수가 제거되었습니다.

  업그레이드는 한 메이저 버전에서 다른 메이저 버전으로만 지원되므로(예: 5.0에서 5.1로, 또는 5.1에서 5.5로), 이전 5.0 데이터베이스 이름을 현재 MySQL 버전으로 변환해야 할 필요성은 거의 남아 있지 않습니다. 우회 방법으로, 더 최근 릴리스로 업그레이드하기 전에 MySQL 5.0 설치를 MySQL 5.1로 업그레이드하십시오. (WL #8186)

## 수정된 버그

- **호환되지 않는 변경:** 공간 값의 연결은 별 의미가 없으므로, 이제 [`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) 함수는 공간 인수에 대해 오류를 생성합니다. (Bug #22893669)
- **중요한 변경; JSON:** 이제 [`JSON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json.html) 함수(예: [`JSON_EXTRACT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-search-functions.html#function_json-extract))와 함께 사용할 때 빈 문자열 값을 키로 사용할 수 있습니다. 이러한 경우에는 따옴표로 묶어야 합니다. (Bug #79643, Bug #22366102)
- **NDB Cluster:** 이전에는 서버가 `NDB` 없이 빌드된 경우에도 `mysql.ndb_binlog_index` 테이블이 생성되었습니다. 이제 이 테이블은 서버가 `NDB`와 함께 빌드된 경우에만 생성됩니다. (Bug #22874872)
- **InnoDB; Microsoft Windows:** 지정되지 않은 블록 크기로 인해 클러스터 페이지 크기가 8K 이상인 Windows NTFS에서 [`INFORMATION_SCHEMA.TABLESPACES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-tablespaces-table.html) 테이블이 비어 있었습니다. (Bug #23598872)
- **InnoDB; Microsoft Windows:** Visual Studio 2015 Update 2로 `InnoDB`를 컴파일하면 경고가 반환되었습니다. (Bug #23056963)
- **InnoDB:** 외래 키 제약 조건을 추가하는 [`ALTER TABLE... ALGORITHM=COPY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 작업은 10000개의 로우가 복사된 후 발생한 중간 커밋으로 인해 실패했습니다. 중간 커밋은 외래 키 검사 플래그를 재설정하여 작업이 실패하게 했습니다. 더 이상 중간 커밋이 발생하지 않습니다. (Bug #28662255, Bug #92471)

  참조: 다음도 참조하십시오: Bug #17479594.
- **InnoDB:** CPU에 대한 정보를 가져오는 데 사용되는 `ut_cpuid()` 함수에서 불필요한 검사가 제거되었습니다. (Bug #24405292)
- **InnoDB:** 삭제된 테이블스페이스에 대한 비동기 읽기 작업에서 오류가 발생했습니다. (Bug #24388498)
- **InnoDB:** `dict_col_t` 접근자가 `InnoDB` 코드에 추가되었습니다. (Bug #24363566)

- **InnoDB:** `InnoDB` 코드의 `dict_col` 함수가 접근자로 대체되었습니다. (Bug #24361098)
- **InnoDB:** `InnoDB` 코드의 `dict_index_t` 함수가 접근자로 대체되었습니다. (Bug #24361023)
- **InnoDB:** 예약된 adaptive hash index 검색 래치를 확인하고 해제하던 불필요한 코드가 제거되었습니다. (Bug #24300175)
- **InnoDB:** 32비트 운영 체제에서 4G보다 큰 시스템 테이블스페이스 데이터 파일 크기는 오버플로우 조건을 초래할 수 있었습니다. (Bug #23753625)
- **InnoDB:** 테이블 객체 데이터에 접근하기 위한 내부 메서드가 `dict_table_t`에 추가되었습니다. (Bug #23748128)
- **InnoDB:** 업그레이드 중 기존 테이블스페이스와의 `space_id` 충돌을 피하기 위해 첫 번째 undo 테이블스페이스가 `space_id` 1을 사용해야 한다는 제한이 제거되었습니다. 이제 첫 번째 undo 테이블스페이스는 1이 아닌 `space_id`를 사용할 수 있습니다. undo 테이블스페이스의 `space_id` 값은 여전히 연속된 순서로 할당됩니다. (Bug #23517560)
- **InnoDB:** 테이블의 인덱스를 반복하기 위한 내부 접근자 함수가 접근자 메서드로 대체되었습니다. 사용되지 않는 코드가 제거되었습니다. (Bug #23336108)
- **InnoDB:** 이전에는 SQL 스크립트로 생성되던 `mysql.innodb_index_stats` 및 `mysql.innodb_table_stats` 테이블 정의가 이제 하드 코딩됩니다. 그 결과 `dict_table_schema_check` 함수는 더 이상 필요하지 않으며 제거되었습니다. (Bug #23336079)
- **InnoDB:** `ut_snprint` 함수가 C++11 `snprintf` 함수로 대체되었습니다. (Bug #23329353)
- **InnoDB:** 일관성을 위해 `InnoDB` 코드의 `ulint` 인스턴스가 `space_id_t` 및 `page_no_t` 데이터 타입으로 대체되었습니다. (Bug #23297169)
- **InnoDB:** `InnoDB` 코드에서 boost::atomic 사용이 std::atomic으로 대체되었습니다. (Bug #23280649)
- **InnoDB:** MySQL 바이너리가 NUMA 기능과 함께 빌드되지 않았습니다. (Bug #23259754)
- **InnoDB:** `UNIV_NONINL` 및 `UNIV_MUST_NOT_INLINE`에 대한 참조가 제거되었습니다. `UNIV_NONINL`이 정의된 경우에만 필요했던 `fut0fut.cc` 및 `ut0byte.cc` 파일도 제거되었습니다. (Bug #23150562)
- **InnoDB:** `mutex_own()` 매핑은 Clang 또는 최신 GCC 컴파일러로 컴파일할 때 경고를 발생시켰습니다. (Bug #23090278)

- **InnoDB:** `InnoDB` 메모리 할당 이벤트 데이터를 확인하기 위해 Performance Schema를 쿼리하면 값이 0으로 잘못 보고되었습니다. (Bug #23020280)
- **InnoDB:** `DBUG_OFF` 컴파일 시점 플래그가 `UNIV_DEBUG` 플래그로 대체되었습니다. 오류 로그 출력을 개선하기 위해, `ut_dbg_assertion_failed()`는 이제 `sql_print_error()`를 사용하여 파일 이름, 라인 번호, 메시지를 한 줄에 표시합니다. 스레드 ID는 그 다음 줄에 표시됩니다. (Bug #22996442, Bug #23028144)
- **InnoDB:** `SHOW ENGINE INNODB STATUS` 출력에 음수인 대기당 spin rounds 값이 표시되었습니다. 패치를 제공해 준 Laurynas Biveinis에게 감사드립니다. (Bug #22844987, Bug #79703)
- **InnoDB:** `innodb_disable_resize_buffer_pool_debug` 옵션이 제거되었습니다. 이 변경에 대한 패치는 코드 변수도 제거하고 `buf_pool_resize()` 함수를 단순화했습니다. (Bug #22755053)
- **InnoDB:** 전역 카운터(`ut_rnd_ulint_counter`)가 멀티 코어 시스템에서 확장 가능하도록 스레드 로컬 카운터로 변경되었습니다. (Bug #22733635, Bug #80354)
- **InnoDB:** 성공적인 [`ALTER TABLE... ALGORITHM=COPY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 작업 후, 클러스터형 인덱스 레코드의 이전 버전을 빌드하는 동안 어설션이 발생했습니다. (Bug #22707367)
- **InnoDB:** 가상 인덱스가 있는 테이블의 카운터를 업데이트한 DML 작업이 `row_parse_int()`에서 어설션을 발생시켰습니다. (Bug #22650195)
- **InnoDB:** libevent 2.0으로 컴파일된 경우 `InnoDB` **memcached** 플러그인이 로드되지 않았습니다. (Bug #22646919)
- **InnoDB:** 정수 기반 `rec_per_key` 값에 대한 사용되지 않는 계산이 `InnoDB`에서 제거되었습니다. 정수 기반 `rec_per_key` 정보는 이전 릴리스에서 부동 소수점 인덱스 통계로 대체되었습니다. (Bug #22625348)
- **InnoDB:** 느린 종료 시, 백그라운드 롤백 스레드가 종료되기 전에 purge 스레드 종료가 시작되어 어설션 실패가 발생했습니다. (Bug #22561332)
- **InnoDB:** 해제되지 않은 힙으로 인해 `row_vers_old_has_index_entry()`에서 블록이 손실되었습니다. (Bug #22543834, Bug #79973)
- **InnoDB:** 전송 가능한 테이블스페이스 디버그 테스트에서 경합 조건으로 인한 어설션이 발생했습니다. (Bug #22453668)

- **InnoDB:** undo 테이블스페이스가 누락되어 서버가 시작되지 않았습니다. (Bug #22452992)
- **InnoDB:** 복구 프로세스에 의해 도입된 버퍼링된 undo 테이블스페이스 변경으로 인해 undo 테이블스페이스를 닫으려고 시도하는 동안 `InnoDB` 복구에서 어설션이 발생했습니다. (Bug #22361764)
- **InnoDB:** memcached가 참조하는 메모리의 재할당에서 어설션이 발생했습니다. (Bug #22304250, Bug #79500)
- **InnoDB:** C++11로 `InnoDB`를 빌드하면 “register” 지원 중단 경고가 반환되었습니다. 지원 중단된 “register” 키워드가 제거된 후에도 “register” 지원 중단 경고 처리가 코드에 남아 있었습니다. 또한, 사용되지 않는 `yyset_extra()` 선언이 제거되었습니다. (Bug #22292704)
- **InnoDB:** 파티셔닝된 테이블에 대한 [`SHOW CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-create-table.html) 출력이 테이블 파티션의 테이블스페이스 할당 정보를 정확하게 표시하지 않았습니다. (Bug #22245554)
- **InnoDB:** [`ALTER TABLE...TRUNCATE PARTITION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 작업이 테이블의 `KEY_BLOCK_SIZE` 속성을 무시하고 대신 기본값을 사용했으며, 이 값은 [`innodb_page_size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_page_size) 값의 절반입니다. (Bug #22186558, Bug #79223)
- **InnoDB:** **innochecksum**의 메모리 누수가 수정되었습니다. (Bug #22179518)
- **InnoDB:** [`INNODB_CACHED_INDEXES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-innodb-cached-indexes-table.html) 테이블에 `SPACE_ID` 컬럼이 추가되었습니다. `INDEX_ID` 값은 더 이상 전역 고유 식별자가 아닙니다. (Bug #22172026)
- **InnoDB:** 가상 컬럼에 대한 purge 스레드 open table 콜백에서 예기치 않은 데이터 딕셔너리 테이블 래치로 인해 어설션이 발생했습니다. 임시 해결 방법으로, 가상 생성 컬럼에 대해 purge가 일시적으로 비활성화됩니다. 이 임시 해결 방법은 가상 컬럼의 인덱스에 대해 purge되지 않은 삭제 표시 레코드로 인해 b-tree 확장을 유발할 수 있습니다. (Bug #22153217)

- **InnoDB:** [`foreign_key_checks`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_foreign_key_checks)가 비활성화된 경우 full-text 인덱스와 외래 키 제약 조건이 있는 테이블 생성이 실패했습니다. (Bug #22094601, Bug #78955)

  참조: 이 문제는 다음의 회귀입니다: Bug #16845421.
- **InnoDB:** `ha_innobase::m_primary_key` 필드가 제거되었습니다. 이 필드는 중복되었습니다. 부울 조건자 `TABLE_SHARE::is_missing_primary_key()`가 추가되었습니다. (Bug #21928734, Bug #78662)
- **InnoDB:** 초기화되지 않은 페이지를 로드하려고 시도한 버퍼 풀 로드 작업으로 인해 Valgrind 실패가 발생했습니다. (Bug #21747906)
- **InnoDB:** `InnoDB` **memcached** 플러그인에 의해 도입된 사용되지 않는 함수가 제거되었습니다. (Bug #21625760)
- **InnoDB:** [`innodb_buffer_pool_size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_buffer_pool_size) 설정 옵션에서 사용되는 내부 전역 변수가 제거되었습니다. (Bug #21512749)
- **InnoDB:** 버퍼 풀 크기 조정 작업 중 `InnoDB` page cleaner 스레드에서 assertion이 발생했습니다. (Bug #21473497)
- **InnoDB:** 두 번째 버퍼가 추가되어 동시 로그 버퍼 쓰기와 플러시가 가능해짐에 따라 로그 버퍼 경합이 줄었습니다. 로그 버퍼 플러시를 보호하기 위해 새 mutex가 추가되었습니다. 패치를 제공해 주신 Zhai Weixiang에게 감사드립니다. (Bug #21352937, Bug #77094)
- **InnoDB:** 사용되지 않는 `InnoDB` 및 `libsql` 함수와 변수가 제거되었으며, 가능한 경우 전역 심볼이 static 키워드로 변환되었습니다. (Bug #21153166, Bug #21141390, Bug #77146, Bug #21178589)
- **InnoDB:** full-text 인덱스 구현, 데이터 딕셔너리 업데이트, persistent statistics 업데이트에 사용되는 내부 SQL parser에서 사용되지 않는 여러 사전 정의 함수가 제거되었습니다. (Bug #21126390, Bug #77111)
- **InnoDB:** 이제 `SysTablespace::parse_units()` 함수는 메가바이트 수 대신 파일의 페이지 수를 반환합니다. `SysTablespace::normalize_size()` 함수가 제거되었습니다. `SysTablespace::parse_params()`의 오류 메시지가 수정되었습니다. (Bug #21040199, Bug #76949)

- **InnoDB:** 영구 테이블의 경우, `InnoDB` 인덱스의 내부 고유 식별자(`index_id`)가 이제 테이블스페이스 식별자(`space_id`,`index_id`)를 포함합니다. 이 변경으로 인덱스 식별자가 `InnoDB` 인스턴스 수준뿐만 아니라 테이블스페이스 수준에서도 고유해지며, 인덱스 식별자 할당과 관련된 향후 작업을 지원합니다. (Bug #20737524, Bug #76392)
- **InnoDB:** `mtr0mtr.cc`에서 중복 함수가 제거되었고, `ReleaseBlocks` 함수의 이름이 `AddDirtyBlocksToFlushList`로 변경되었습니다. (Bug #20735882, Bug #76343)
- **InnoDB:** **innochecksum**과 관련된 코드가 정리되고 재구성되었습니다. 체크섬 기능은 이제 `buf0checksum.cc`에 위치합니다. (Bug #20518099)
- **InnoDB:** `__attribute__((nonnull))`가 `InnoDB` 코드에서 제거되었습니다. 이 속성은 더 이상 `InnoDB` 코딩 지침에서 허용되지 않습니다. (Bug #20468234)
- **InnoDB:** 외부 `BLOB` 필드 참조를 처리하고 조작하기 위한 논리적 인터페이스를 제공하도록 새 struct가 추가되었습니다. (Bug #18195972)
- **InnoDB:** [`TRUNCATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/truncate-table.html)이 이제 [`DROP TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-table.html) 및 [`CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html)에 매핑됩니다. 이 변경에는 다음과 같은 영향이 있습니다:

  - 대형 버퍼 풀과 활성화된 [`innodb_adaptive_hash_index`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_adaptive_hash_index)가 있는 시스템에서, 이전에는 [`TRUNCATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/truncate-table.html) 작업이 테이블의 adaptive hash index 항목을 제거할 때 발생하는 LRU 스캔 때문에 일시적인 시스템 성능 저하를 일으켰습니다. [`TRUNCATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/truncate-table.html)을 [`DROP TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-table.html) 및 [`CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html)에 다시 매핑하면 문제가 되는 LRU 스캔을 피할 수 있습니다.
  - [`TRUNCATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/truncate-table.html)은 일시적으로 원자적이지 않습니다. [`TRUNCATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/truncate-table.html) 작업 중 서버 종료가 발생하면 테이블이 삭제되고 `InnoDB` `SYS_FOREIGN` 및 `SYS_FOREIGN_COLS` 시스템 테이블에 고아 외래 키 제약 조건이 남을 수 있습니다.
  - `InnoDB` **memcached** 플러그인 `flush_all` 명령은 [`TRUNCATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/truncate-table.html) 대신 `DELETE`를 호출합니다. [`DELETE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/delete.html)는 삭제된 각 로우에 대해 undo-logging, delete-marking, 그리고 최종적으로 purge를 포함하므로 [`FLUSH TABLES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/flush.html#flush-tables)보다 오버헤드 비용이 더 높습니다.
  - file-per-table 테이블스페이스의 내부 truncate table 작업에 대해 발생하던 로그 체크포인트가 로그 플러시로 대체되었습니다.

    (Bug #16834993, Bug #68184, Bug #16207919, WL #6795)

- **InnoDB:** `InnoDB`는 조각 페이지에 사용되는 익스텐트의 대부분 페이지를 낭비했습니다. (Bug #16204823, Bug #67963)
- **Partitioning:** 일부 경우에는 모든 파티션이 이미 파싱 시점에 프루닝된 뒤 최적화 중 파티션 프루닝이 두 번째로 시도되는 문제로 인해 assert가 발생했습니다. (Bug #23194259)
- **Partitioning:** 테이블 이름과 임의의 파티션 이름의 결합 길이가 61자를 초과하는 파티션된 테이블은 **mysqldump**를 사용하여 생성된 백업에서 가져올 수 없었습니다. 테이블이 서브파티셔닝도 사용하는 경우에는 테이블 이름, 임의의 파티션 이름, 그리고 이 파티션의 임의의 서브파티션 이름의 결합 길이가 57자를 초과하면 동일한 문제가 트리거되었습니다.

  이는 내부 `mysql.innodb_table_stats` 테이블이 테이블 이름을 저장하는 데 사용되는 컬럼에 대해 최대 64자만 허용했기 때문입니다. 하지만 InnoDB는 파티션된 또는 서브파티션된 테이블에 대해 각 파티션 또는 서브파티션마다 `innodb_table_stats`에 로우를 저장하며, 여기서 테이블 이름을 나타내는 데 실제로 사용되는 값은 각각 `table_name#P#partition_name` 또는 `table_name#P#partition_name#SP#subpartition_name` 패턴을 따릅니다. 이 문제는 이러한 속성의 최대 결합 길이에 `#P#` 및 `#SP#`를 더한 길이(199자)를 수용하도록 `innodb_table_stats`의 정의를 변경하여 수정되었습니다. (Bug #72061, Bug #18416479)
- **Replication:** `Slave_worker::write_info()`에서 `DBUG_ENTER()`는 인수로 “`Slave_worker::write_info`” 대신 “`Master_info::write_info`”를 사용했습니다. 이 수정은 해당 인수를 바로잡습니다. 패치를 제공해 주신 Stewart Smith에게 감사드립니다. (Bug #21658067, Bug #78133)

- **Replication:** 멀티스레드 슬레이브와 함께 [`START SLAVE UNTIL position`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/start-slave.html) 문을 사용할 때 사용할 수 있었던 유일한 `UNTIL` 절은 `SQL_BEFORE_GTIDS`였습니다. 이제 멀티스레드 슬레이브는 [`START SLAVE UNTIL MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_position`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/start-slave.html) 및 [`START SLAVE UNTIL RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_position`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/start-slave.html) 문과 호환됩니다. (Bug #75843, Bug #20513547)
- **Microsoft Windows:** Windows에서 여러 스레드에서 전역 [`log_syslog`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_log_syslog) 시스템 변수를 설정하면 서버 종료가 발생할 수 있었습니다. (Bug #22180046)
- **Solaris:** 클라이언트 라이브러리가 `Cstd` 라이브러리를 사용하여 Solaris에서 빌드되지 않았습니다. (Bug #24353920, Bug #82347)
- **JSON:** [`CHECKSUM TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/checksum-table.html)은 [`JSON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json.html) 값 자체가 아니라 값의 메모리 주소를 사용하여 체크섬을 계산했으며, 이로 인해 체크섬이 달라졌습니다. 이제 이러한 경우 계산은 해당 값의 주소가 아니라 실제 `JSON` 값을 기반으로 합니다. (Bug #23535703)
- **JSON:** [`JSON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json.html) 매개변수를 기대하는 저장 프로시저에 `NULL`을 전달하면 디버그 빌드에서 어설션 실패가 발생했습니다. (Bug #23209914)
- **JSON:** [`JSON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json.html) 경로 인수의 파싱은 NULL 경로와 문법적으로 유효하지 않은 경로를 구분하지 못했습니다.

  이제 이러한 경로의 파싱이 유효한 non-NULL 경로, NULL 경로, 유효하지 않은 경로를 명확히 구분하도록 변경되었습니다. (Bug #22816576)
- **JSON:** 디버그 빌드에서 서버가 [`JSON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json.html) 객체를 보관하기 위해 임시 테이블을 생성할 때 어설션이 발생할 수 있었습니다. (Bug #22782948)

- **JSON:** 오류를 발생시킨 [`JSON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json.html) 함수를 실행한 쿼리가 서버 종료를 유발할 수 있었습니다. (Bug #22253965)
- 존재하지 않는 데이터베이스의 일부가 되도록 테이블 이름을 변경하는 작업은 실패했지만(정상 동작), Unknown 오류 메시지가 표시되었습니다. 이제 적절한 오류 메시지가 생성되며, 이는 데이터 딕셔너리 구현의 일부로 수정되었습니다. (Bug #25167507, Bug #84000)
- FreeBSD에서 세그멘테이션 폴트가 발생한 경우, 서버가 스택 추적을 생성하지 않았습니다. (Bug #24566529, Bug #23575445, Bug #81827)
- macOS에서 Clang을 사용하여 컴파일된 빌드에 대해, GCC의 경우와 마찬가지로 이제 스택 추적 디맹글링이 수행됩니다. (Bug #23606094, Bug #81908)
- `libevent`가 필요하지 않은 경우에도 macOS에서 빌드되었습니다. (Bug #23228287, Bug #81311)
- [`JSON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json.html) 값을 반환하는 함수가 저장 프로시저의 [`CASE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/case.html) 문의 일부로 호출되는 경우 서버 종료를 유발할 수 있었습니다. (Bug #23212765)
- 이전에는 Performance Schema에서 사용된 전체 메모리에 대해 [`SHOW ENGINE PERFORMANCE_SCHEMA STATUS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-engine.html)와 `SELECT * FROM performance_schema.memory_summary_global_by_event_name`이 서로 다른 값을 보고했습니다. `memory/performance_schema/scalable_buffer`로 계측되는 확장 가능한 버퍼 페이지용 메모리가 [`SHOW ENGINE STATUS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-engine.html) 출력에서 누락되었습니다. 이제 해당 문에는 누락된 메모리가 포함되며, `(pfs_buffer_scalable_container).memory`로 표시됩니다. (Bug #23104498)
- GCC의 `-fexpensive-optimizations` 옵션으로 인해 ARM64 및 PowerPC 빌드가 다른 플랫폼과 약간 다르게 부동 소수점 연산을 계산했습니다. 이 옵션은 `-O2` 및 더 높은 최적화 레벨에 의해 활성화되었습니다. 이제 이 옵션은 이로 인해 부정적인 영향을 받는 플랫폼에서 비활성화됩니다. (Bug #23046775)
- [`ALTER TABLE... OPTIMIZE PARTITION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html)과 같은 관리 작업이 실패한 후, lock-tables 모드에서 Performance Schema에서 선택하면 중단될 수 있었습니다. (Bug #23044286)

- AddressSanitizer가 활성화된 빌드에서 [`CAST(... AS BINARY)`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/cast-functions.html#function_cast)가 서버 종료를 일으킬 수 있었습니다. (Bug #22900560)
- 일부 공간 함수가 오류 메시지에서 다른 공간 함수 이름을 사용하여 보고되었습니다. (Bug #22883056, Bug #80627)
- 최적화 모드에서 Clang을 사용할 때 `my_strtod_int()` 함수에 대한 Valgrind 경고를 수정했습니다. (Bug #22839888)
- 소수점 이하 64자리 값을 대상으로 하는 정밀 수학 연산이 0 결과를 생성할 수 있었습니다. (Bug #22828692)
- [`ST_GeomFromGeoJSON()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-geojson-functions.html#function_st-geomfromgeojson)가 유효한 인수를 사용해도 오류를 반환할 수 있었습니다. (Bug #22804853)
- [`STRICT_TRANS_TABLES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/sql-mode.html#sqlmode_strict_trans_tables) SQL 모드가 활성화된 디버그 빌드에서 롤백할 수 없는 변경을 수행한 후 이어서 [`ER_NO_DEFAULT_FOR_FIELD`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_no_default_for_field) 오류를 생성한 [`INSERT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/insert.html) 또는 [`REPLACE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replace.html) 문이 어설션을 발생시킬 수 있었습니다. (Bug #22635253)
- Optimizer에 원본과 대상이 겹치는지 확인하지 않는 `memcpy()` 호출이 포함되어 있었습니다. (Bug #22537196)
- 디버그 빌드에서 [`JSON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json.html) 값에 접근한 서브쿼리 결과에 대한 오류 검사가 누락되어 어설션이 발생할 수 있었습니다. (Bug #22522073)
- [`CREATE TABLE... SELECT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html) 문을 준비한 다음 테이블을 플러시하여 테이블을 닫고 준비된 문을 실행하면 서버 종료가 발생할 수 있었습니다. (Bug #22393309)
- 조인의 일부인 파생 테이블의 select 목록에서 매개변수를 사용한 준비된 문이 서버 종료를 일으킬 수 있었습니다. (Bug #22392374, Bug #24380263)

- 일부 grant 테이블은 MySQL 5.7.8에서 최대 사용자 이름 길이가 16자에서 32자로 증가한 것을 고려하지 않았습니다. (Bug #22379607, Bug #79680)
- 생성된 컬럼 표현식을 재평가하면 이전에 해제된 메모리에 접근하고 서버가 종료될 수 있었습니다. (Bug #22346120)
- 대상 인덱스 값이 로우 버퍼에 성공적으로 저장되지 않은 상태에서 인덱스를 검색하는 [`HANDLER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/handler.html) read 문은 서버 종료를 유발할 수 있었습니다. (Bug #22321965)
- `NULL` 값에 대한 숫자에서 `ZEROFILL`로의 변환을 부적절하게 처리하면 서버 종료로 이어질 수 있었습니다. (Bug #22281205)
- [`SET`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/set-variable.html) 문에서 변수를 설정하기 위해 로우 생성자를 포함하는 서브쿼리를 사용하면 서버 종료가 발생할 수 있었습니다. (Bug #22276843)
- SQL 모드에 [`ALLOW_INVALID_DATES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/sql-mode.html#sqlmode_allow_invalid_dates)가 포함되지 않은 경우, `invalid_date IN (subquery)`를 포함하고 서브쿼리 구체화로 처리된 쿼리는 서버 종료를 유발할 수 있었습니다. (Bug #22262843)
- 임베디드 서버의 경우, 유효하지 않은 인수에 대한 검사 뒤의 코드가 누락되거나 올바르지 않은 인수로 호출되었으며, 이는 부적절한 종료로 이어질 수 있었습니다. (Bug #22262706)
- OS X에서 `vio_io_wait()`는 `select()`를 사용하여 파일 디스크립터 수가 1024개로 제한되었습니다. 이제 이 제한을 피하기 위해 대신 kqueue 이벤트 알림이 사용됩니다. FreeBSD도 kqueue를 사용하도록 변경되었습니다. (Bug #22244911)
- 저장 루틴 로딩에 기본 데이터베이스를 임시로 변경하는 작업이 포함되고 원래 기본 데이터베이스를 복원하는 중 오류가 발생하면 메모리 누수가 발생할 수 있었습니다. (Bug #22179795)
- **CMake** 설정은 `-Wno-xxx` 대신 `-Wxxx` 컴파일러 옵션을 검사하도록 조정되었습니다. 이는 후자가 GCC에서 false positive를 생성하기 때문입니다. (Bug #21881753)

- `INFORMATION_SCHEMA.EVENTS.LAST_EXECUTED`와 `mysql.event.last_executed`의 값 사이에 불일치가 있을 수 있었습니다. 더 이상 이러한 문제가 발생하지 않습니다. 이벤트 정보는 보이지 않는 `mysql.events` 데이터 딕셔너리 테이블에 저장되므로, `INFORMATION_SCHEMA.EVENTS`가 이벤트 메타데이터에 대한 유일한 인터페이스가 됩니다. (Bug #21374010)
- 뷰가 뷰 정의의 제한을 평가하기 전에 사용자 정의 함수 또는 SQL 함수를 평가할 수 있었습니다. (Bug #20933307)
- [`-DENABLE_DTRACE=ON`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/source-configuration-options.html#option_cmake_enable_dtrace)을 사용할 때 **CMake**가 동작하는 DTrace 설치가 있는지 확인하지 않았습니다. 이제 이를 확인하고, DTrace를 찾을 수 없으면 중단합니다. (Bug #20671056)
- [`SHOW CREATE USER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-create-user.html)가 예상치 못한 결과를 반환했습니다. (Bug #20625566)
- [`--log-error`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_log-error) 옵션에 상대 경로 이름이 지정된 경우, **mysqld**가 `stdout` 및 `stderr`를 잘못된 위치로 보낼 수 있었습니다. (Bug #20609063)
- [`LEAST()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/comparison-operators.html#function_least) 및 [`GREATEST()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/comparison-operators.html#function_greatest)의 평가가 datetime 및 문자열 리터럴에 대해 너무 작은 정렬 버퍼를 사용할 수 있었으며, 이로 인해 어설션이 발생했습니다. (Bug #20565160)
- MySQL 8.0에서 새로 추가된 오류에 대한 오류 번호 범위는 3500부터 시작하도록 지정되었습니다. (Bug #20538173)
- Debian 패키징은 `my.cnf`에서 [`sql_mode`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_sql_mode) 시스템 변수를 설정하지 않도록 업데이트되었습니다. (Bug #20535729)
- [`PAD_CHAR_TO_FULL_LENGTH`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/sql-mode.html#sqlmode_pad_char_to_full_length) SQL 모드가 활성화된 경우, `mysql.event` 시스템 테이블에서 이벤트를 로드하는 작업이 실패할 수 있었습니다. (Bug #20073523, Bug #74947)

- 중복 레코드를 처리하기 위해 `REPLACE` 또는 `IGNORE` 키워드를 사용하는 [`INSERT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/insert.html) 및 [`LOAD DATA`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/load-data.html)와 같은 문장이 후속 작업에 영향을 줄 수 있었습니다. (Bug #20017428)
- 소스 테이블의 non-`BIT` 데이터가 대상 테이블의 `BIT` 컬럼으로 선택되는 `CREATE TABLE... SELECT`가 서버 종료를 유발할 수 있었습니다. (Bug #19930894)
- MySQL이 [`-DMYSQL_MAINTAINER_MODE=1`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_mysql_maintainer_mode)로 설정되고 clang/Xcode 6.0으로 컴파일될 때 OS X에서 컴파일이 실패했습니다. (Bug #19694515, Bug #74100)
- 일반 쿼리 로그에 기록되기 전에 비밀번호를 필터링하도록 다시 작성된 [`CHANGE MASTER TO`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/change-master-to.html) 문에서 `MASTER_AUTO_POSITION` 절이 손실되었습니다. (Bug #19622609)
- [`SELECT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/select.html) 절에서 [`VALUES()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/miscellaneous-functions.html#function_values) 함수를 사용하면 서버 종료가 발생할 수 있었습니다. (Bug #19601973)
- 테이블 이름 변경 코드의 잠재적인 null-pointer 역참조 및 메모리 누수가 수정되었습니다. (Bug #18194270)
- 문자 컬럼과 집계 함수를 비교하기 위해 `MATCH... AGAINST`를 사용하면 서버 종료가 발생할 수 있었습니다. (Bug #17865492)
- [`Connections`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-status-variables.html#statvar_Connections) 상태 변수, Performance Schema [`threads`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-threads-table.html) 및 [`global_status`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-status-variable-tables.html) 테이블, [`SHOW PROCESSLIST`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-processlist.html) 문과 같은 다양한 정보 소스에서 연결 수에 대해 약간 다른 값이 보고될 수 있었습니다. (Bug #17666696)

- set operation과 외부 참조가 포함된 서브쿼리가 있는 쿼리는 서버 종료를 일으킬 수 있었습니다. (Bug #17270896)
- 유효하지 않은 사용자의 비밀번호를 변경하기 위해 [`GRANT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/grant.html)를 사용하면 오류가 발생했지만, `mysql.user` 시스템 테이블도 업데이트되었습니다. (Bug #17180985)
- 공간 WKT 데이터의 Parser는 `0.23`과 같은 숫자는 허용했지만, 앞의 0이 없는 동등한 값인 `.23`은 허용하지 않았습니다. 이제 두 형식이 모두 허용됩니다. (Bug #17167633)
- 이전에는 클라이언트가 집계 크기가 [`performance_schema_session_connect_attrs_size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-system-variables.html#sysvar_performance_schema_session_connect_attrs_size) 시스템 변수의 값보다 큰 연결 속성 키/값 쌍을 전송하려고 하면, Performance Schema가 속성 데이터를 잘랐습니다. 또한 [`log_warnings`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-system-variables.html#sysvar_log_warnings) 시스템 변수가 0보다 큰 경우 Performance Schema는 이 메시지를 오류 로그에 기록했습니다:

  ```
  [Warning] Connection attributes of length N were truncated
  ```

  이 메시지는 DBA가 문제가 있는 클라이언트를 확인하려고 할 때 도움이 되지 않았으므로, 연결 속성 처리에 몇 가지 변경 사항이 적용되었습니다:

  - 과도한 데이터에 대해서는 연결 속성 잘림이 여전히 발생하지만, 로그 메시지가 더 유용한 정보를 제공합니다. 이 메시지에는 손실된 바이트 수, 연결 식별자, 클라이언트 사용자에 대한 정보가 포함됩니다. 추가 정보는 DBA가 속성 잘림이 발생한 클라이언트를 더 쉽게 식별할 수 있게 해야 합니다.
  - 잘림이 발생하면, 속성 버퍼에 충분한 공간이 있는 경우 손실된 바이트 수를 나타내는 값을 가진 `_truncated` 속성이 세션 속성에 추가됩니다. 이를 통해 Performance Schema는 연결 속성 테이블에서 연결별 잘림 정보를 노출할 수 있습니다.
  - 새 상태 변수 [`Performance_schema_session_connect_attrs_longest_seen`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-status-variables.html#statvar_Performance_schema_session_connect_attrs_longest_seen)는 서버가 확인한 64KB보다 작은 가장 긴 연결 속성 버퍼를 나타냅니다. 이 값이 [`performance_schema_session_connect_attrs_size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-system-variables.html#sysvar_performance_schema_session_connect_attrs_size)보다 크면 속성 잘림이 발생한 것이며, DBA는 후자의 값을 늘리거나, 또는 어떤 클라이언트가 많은 양의 속성 데이터를 전송하는지 조사할 수 있습니다.

    자세한 내용은 [Performance Schema Connection Attribute Tables](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-connection-attribute-tables.html)를 참조하십시오. (Bug #16576959)
- 데이터 딕셔너리 도입으로 여러 `INFORMATION_SCHEMA` 문제를 해결할 수 있습니다:

  - [`INFORMATION_SCHEMA.STATISTICS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-statistics-table.html)에 대한 쿼리는 select 목록의 컬럼 순서에 따라 다른 결과를 반환할 수 있었습니다.
  - 일부 `INFORMATION_SCHEMA` 테이블에는 최적이 아닌 컬럼 타입과 크기가 있었습니다. 이제 `mysql` 시스템 데이터베이스의 데이터 딕셔너리 테이블에 대한 뷰가 된 이러한 테이블에는 더 적절한 컬럼 정의가 있습니다.
  - 데이터베이스 또는 파일 이름을 확인하기 위해 디렉터리 스캔을 초래했던 `INFORMATION_SCHEMA` 테이블에 대한 쿼리는 더 이상 그렇게 하지 않고, 대신 데이터 딕셔너리에서 데이터베이스 및 테이블 이름을 읽습니다.
  - 테이블 메타데이터를 얻기 위해 `.frm` 파일을 열었던 `INFORMATION_SCHEMA` 테이블에 대한 쿼리는 더 이상 그렇게 하지 않고, 대신 데이터 딕셔너리에서 이 정보를 읽습니다.
  - `INFORMATION_SCHEMA` 쿼리에서 데이터베이스 또는 테이블 이름을 비교할 때, 특정 콜레이션을 강제하기 위해 `COLLATE`를 사용하는 것은 `INFORMATION_SCHEMA` 테이블 컬럼에 적용된 경우에만 작동했으며, 비교 값에 적용된 경우에는 작동하지 않았습니다.

    이러한 비교 수행에 대한 추가 정보는 [Using Collation in INFORMATION_SCHEMA Searches](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/charset-collation-information-schema.html)를 참조하십시오.

  (Bug #14017351, Bug #65121, Bug #17559183, Bug #70462, Bug #23259470, Bug #81347, Bug #20372562, Bug #75532, Bug #13878164, Bug #11756519, Bug #48445)

- Windows에서 서버가 비정상적으로 종료되는 경우, 이전에는 서버가 `module_name.dmp`라는 이름의 미니덤프 파일을 생성했으며, 여기서 *`module_name`*은 서버 실행 파일의 이름입니다. 이전 미니덤프 파일이 덮어써지는 것을 방지하기 위해, 이제 미니덤프 파일 이름에는 프로세스 ID가 포함되며 `module_name..piddmp` 형식을 가집니다. 예를 들어 `mysqld.exe.7296.dmp`입니다. (Bug #12779463)

- [`INFORMATION_SCHEMA`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema.html) 테이블에 대한 쿼리의 경우, 스키마 및 테이블 이름 비교는 기반 파일 시스템의 특성과 [`lower_case_table_names`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_lower_case_table_names) 시스템 변수 값에 따라 대소문자를 구분하거나 구분하지 않을 수 있었습니다. 또한 `COLLATE` 절이 무시되었기 때문에 비교 속성을 변경하기 위해 `COLLATE` 절을 제공해도 효과가 없었습니다. 이제 `COLLATE`가 더 이상 무시되지 않고 원하는 비교 속성을 얻는 데 사용할 수 있도록 변경되었습니다. (Bug #11748044, Bug #34921)
- `FLOOR(CEIL())`은 큰 `BIGINT UNSIGNED` 인수를 잘랐습니다. (Bug #80873, Bug #23013359)
- [`JSON_MERGE()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-modification-functions.html#function_json-merge) 함수가 반환한 값을 [`JSON_SET()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-modification-functions.html#function_json-set)을 사용하여 조작하면 때때로 잘못된 결과가 생성되었습니다. (Bug #80787, Bug #22961128)
- 사용자 정의 변수를 사용하여 geometry 인수가 제공된 경우 [`ST_AsGeoJSON()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-geojson-functions.html#function_st-asgeojson)가 실패했습니다. (Bug #80697, Bug #22912800)
- `CAST(expr AS BINARY(N))`은 *`N`*의 일부 유효한 값에 대해 예기치 않게 `NULL`을 반환했습니다. (Bug #80630, Bug #22885819)

- SRID 매개변수를 받는 Geometry import 함수는 경고나 오류 없이 이를 unsigned 32-bit integer로 캐스트했으므로, 음수 값이나 unsigned 32-bit integer 범위보다 큰 값은 범위 내의 숫자로 조용히 변환되었습니다. 이제 SRID를 매개변수로 받는 모든 geometry 함수는 해당 값이 unsigned 32-bit integer 범위 내에 있는지 확인하고, 그렇지 않으면 [`ER_DATA_OUT_OF_RANGE`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_data_out_of_range) 오류를 생성합니다. 이는 이전에 매개변수가 범위 내에 있는지 확인했지만 다른 오류 코드를 반환했던 GeoJSON 및 GeoHash 함수에도 적용됩니다. (Bug #80499, Bug #22819614)
- predicate 값을 저장하는 동안 rounding이 발생하면, range optimizer가 `<` 및 `<=` 연산자에 대해 올바른 결과를 반환하지 않을 수 있었습니다. (Bug #80244, Bug #22661012)
- `mf_iocache` unit test에 대해 누락된 `va_end()`를 추가하고, `my_end()`를 호출하여 메모리 누수를 수정하며, 해당 테스트의 target을 추가했습니다. 이러한 변경 사항의 기반이 된 패치를 제공한 Daniel Black에게 감사드립니다. (Bug #80085, Bug #22578670)
- `SELECT DISTINCT SUBSTR()`는 큰 position 또는 length 인수에 대해 값을 중복으로 잘못 폐기할 수 있었습니다. 동일한 문제는 [`LEFT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/string-functions.html#function_left) 및 [`RIGHT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/string-functions.html#function_right)에도 영향을 주었습니다. (Bug #80047, Bug #22565155)
- [`SUBSTRING_INDEX(str, delim, count)`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/string-functions.html#function_substring-index)는 32비트보다 큰 *`count`* 값을 올바르게 처리하지 않았습니다. (Bug #79978, Bug #22545429)
- [`CONVERT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/cast-functions.html#function_convert) 호출의 경우, literal string 인수가 실행 중 수정되어 잘못된 결과를 생성할 수 있었습니다. (Bug #79924, Bug #22531111)
- `REPLACE('a', BINARY 'b', NULL)`은 `NULL`이 아니라 `'a'`를 반환했습니다. (Bug #79912, Bug #22523836)

- 트랜잭션 상태 추적은 이제 비표준 캐릭터셋과의 향상된 호환성을 위해 8비트에 안전하지 않은 함수를 사용하지 않습니다. (Bug #79905, Bug #22523383)
- [`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)는 모든 정수 입력을 signed로 처리했습니다. (Bug #79902, Bug #22523685)
- 일반 쿼리 로그의 행에서 타임스탬프와 스레드 ID 사이의 탭이 누락되었습니다. 패치를 제공한 Tsubasa Tanaka에게 감사드립니다. (Bug #79868, Bug #22508563)
- unsigned 값과 음수 상한 사이의 일부 비교가 잘못된 결과를 반환할 수 있었습니다(예: `CAST(100 AS UNSIGNED) BETWEEN 1 AND -1`). (Bug #79857, Bug #22501606)
- [`REPEAT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/string-functions.html#function_repeat) 함수가 [`SUBSTR()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/string-functions.html#function_substr) 함수의 출력을 올바르게 처리하지 않았습니다. (Bug #79695, Bug #22391186)
- [`JSON_TYPE()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-attribute-functions.html#function_json-type) 함수는 이제 JSON으로 캐스트된 [`BIT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/bit-type.html) 리터럴의 타입을 `BIT`가 아니라 [`BLOB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/blob.html)로 표시합니다. (Bug #79308, Bug #22297987)
- [`-DWITH_UBSAN=ON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_with_ubsan) **CMake** 옵션으로 MySQL을 설정하면 완전하게 작동하지 않는 서버가 생성되었습니다. (Bug #79238, Bug #22194071)
- MySQL 배포판에 포함된 헤더 파일인 `sql_common.h`는 MySQL 배포판에 포함되지 않은 헤더 파일인 `hash.h`를 include했으므로 이에 의존했습니다. 이로 인해 컴파일 실패가 발생했습니다. 이 의존성을 제거하기 위해 `sql_common.h`가 더 이상 `hash.h`를 include하지 않도록 수정되었습니다. (Bug #79237, Bug #22187997, Bug #70672, Bug #17633467)

- 최대 문 실행 시간을 확인하는 데 사용되는 타이머가 서버가 [`--help`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_help) 옵션으로 시작된 경우에도 초기화되었습니다. [`--help`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_help)가 지정된 경우에는 더 이상 이 작업을 수행하지 않습니다. (Bug #79182, Bug #22172389)
- Optimizer가 `IF(true, '2015-01-01', '2015-01-01') IS NOT NULL` 형식의 표현식을 제거하도록 최적화하려고 할 때 실패했습니다. (Bug #79114, Bug #22148586)
- unsigned decimal의 뺄셈은 음수 값을 반환할 수 있었지만, `UNSIGNED BINARY`의 메타데이터 타입 정보를 사용했습니다. unsigned decimal 뺄셈의 뺄셈은 이제 unsigned integer와 동일한 방식으로 처리됩니다: 결과가 음수이면 [`NO_UNSIGNED_SUBTRACTION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/sql-mode.html#sqlmode_no_unsigned_subtraction) SQL 모드가 활성화된 경우를 제외하고 [`ER_DATA_OUT_OF_RANGE`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_data_out_of_range) 오류를 생성합니다. (Bug #78914, Bug #22083757)
- 264보다 큰 숫자에 대한 [`HEX()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/string-functions.html#function_hex) 함수의 처리가 개선되었습니다. (Bug #78828, Bug #22297983)

  참조: 이 문제는 다음 버그의 회귀입니다: Bug #9854.
- `-Wstrict-prototypes`로 컴파일할 때 경고를 피하기 위해 클라이언트 측 플러그인 deinitialization 함수 시그니처가 `int (*deinit)()`에서 `int (*deinit)(void)`로 변경되었습니다. (Bug #78177, Bug #21680094, Bug #81419, Bug #23282498)
- `DATA DIRECTORY` 또는 `INDEX DIRECTORY` 테이블 옵션에 매우 길거나 잘못된 경로 이름이 지정된 경우 [`CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html)이 잘못된 오류를 보고했습니다. 이제 이러한 경우에는 [`ER_PATH_LENGTH`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_path_length) 또는 [`ER_WRONG_VALUE`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_wrong_value)가 보고됩니다. (Bug #76635, Bug #20857556)

- 서버는 이제 다음 오류 코드에 대해 더 자세한 정보를 제공하는 메시지를 제공하려고 시도합니다: [`ER_CANT_CREATE_DB`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_cant_create_db), [`ER_CANT_CREATE_TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_cant_create_table), [`ER_DB_DROP_RMDIR`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_db_drop_rmdir), [`ER_ERROR_DURING_COMMIT`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_error_during_commit), [`ER_ERROR_DURING_ROLLBACK`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_error_during_rollback), [`ER_GET_ERRNO`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_get_errno). (Bug #76298, Bug #20694494)
- XA 트랜잭션 준비 실패의 일부 사례에서, 불완전한 트랜잭션 정리가 assertion을 발생시킬 수 있었습니다. (Bug #75809, Bug #20488921)
- **mysqld**가 유효하지 않은 소켓 파일 디스크립터를 닫으려고 시도할 수 있었습니다. 패치를 제공해 준 Zhai Weixiang에게 감사드립니다. (Bug #75778, Bug #20504513)
- 다음 형식의 문은 테이블 데이터를 `latin1`로 변환했지만, 테이블 기본 캐릭터셋도 `latin1`로 변경하고 `utf8` 절을 무시했습니다:

  ```
  ALTER TABLE tbl_name CHARACTER SET utf8, CONVERT TO CHARACTER SET latin1;
  ```

  패치를 제공해 준 Daniel Black에게 감사드립니다. (Bug #75320, Bug #20279241)
- `mysqld.cc`에서 `abort_loop` 변수는 `volatile`로 한정되어 있었으며, 일부 플랫폼에서는 이로 인해 다른 코어에서 실행 중인 스레드에서 변경 사항이 즉시 보이지 않을 수 있었습니다. 패치를 제공해 준 Stewart Smith에게 감사드립니다. (Bug #74846, Bug #20134637)
- 트리거에서 뷰를 생성하는 프로시저를 호출하거나, [`RENAME TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/rename-table.html)을 실행하는 프로시저를 호출하는 함수를 생성하면, 특정 상황에서 assertion이 발생할 수 있었습니다. (Bug #74740, Bug #19988193, Bug #21198646)

- 서버 측 프리페어드 스테이트먼트의 타임스탬프가 대응하는 비프리페어드 스테이트먼트의 타임스탬프보다 최대 1초 뒤처진 상태로 바이너리 로그에 기록될 수 있었으며, 이로 인해 마스터 서버와 슬레이브 서버 간에 시간 값 차이가 발생했습니다. (Bug #74550, Bug #19894382, Bug #25187670)
- 동적 스토리지 엔진 플러그인의 경우, `.frm` 파일에서 엔진을 잘못 확인했기 때문에 [`DROP TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-table.html), [`TRUNCATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/truncate-table.html), 및 [`RENAME TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/rename-table.html)이 작동하지 않았습니다. (Bug #74277, Bug #19902868)
- 실행된 프리페어드 스테이트먼트는 `?` 파라미터 마커가 데이터 값으로 대체되어 기록됩니다. 기록된 문자열을 구성하는 방식이 비효율적이었으며 개선되었습니다. (Bug #73056, Bug #20955496)
- 플러그인이 문자열 타입의 스레드 변수에 값을 할당할 때 메모리 누수가 발생할 수 있었습니다. (Bug #71759, Bug #19917521)
- 뷰를 사용한 그룹화에서, 베이스 테이블에서 선택할 때는 발생하지 않던 [`ER_INVALID_GROUP_FUNC_USE`](https://docs.oracle.com/cd/E17952_01/mysql-errors-8.0-en/server-error-reference.html#error_er_invalid_group_func_use) 오류(“Invalid use of group function”)가 발생할 수 있었습니다. (Bug #70220, Bug #17406425)
- 여러 `LIMIT` 절을 가진 쿼리가 항상 SQL 표준에 따라 해석되지는 않았습니다.

  예를 들어, 다음 각 쿼리는 이제 예상대로 두 개의 로우를 반환합니다:

  ```
  SELECT * FROM t LIMIT 2;

  (SELECT * FROM t LIMIT 2) LIMIT 4;

  ((SELECT * FROM t LIMIT 2) LIMIT 4) LIMIT 3;
  ```

  이는 또한 `FROM DUAL`을 사용하는 [`UNION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/union.html) 서브셀렉트 관련 문제도 수정합니다. 예를 들어, 다음 쿼리는 오류를 발생시켰습니다:

  ```
  SELECT 'A' AS `x` FROM DUAL
    UNION
  SELECT 'B' FROM DUAL
    UNION
  SELECT 'C' FROM DUAL
    ORDER BY `x` ASC;
  ```

  (Bug #50510, Bug #74251, Bug #11758322, Bug #19774083)

- 스토리지 엔진에 의존하지 않도록 의도되었지만 실제로는 특정 엔진을 사용하던 테스트 케이스가 수정되었습니다. (WL #7264)
