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

## 계정 관리 관련 사항

- [`CREATE USER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-user.html)는 이제 계정 기본 역할을 지정할 수 있게 하는 `DEFAULT ROLE` 절을 허용합니다.

  [`SHOW CREATE USER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-create-user.html)는 이제 기본값이 `NONE`이 아닌 경우 계정 기본 역할을 표시합니다. (Bug #24670738, Bug #82987)
- MySQL은 이제 암호 기록에 대한 정보를 유지하며, 이를 통해 이전 암호의 재사용에 대한 제한을 활성화할 수 있습니다. DBA는 일정 횟수의 암호 변경 또는 일정 기간 동안 새 암호가 이전 암호 중에서 선택되지 않도록 요구할 수 있습니다. [`password_history`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_password_history) 및 [`password_reuse_interval`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_password_reuse_interval) 시스템 변수를 사용하여 전역적으로, 그리고 [`CREATE USER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-user.html) 및 [`ALTER USER`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-user.html) 문을 사용하여 계정별로 암호 재사용 정책을 설정할 수 있습니다. 암호를 주기적으로 변경하도록 요구하는 기존 암호 만료 기능과 함께, 새 재사용 제한 기능은 DBA에게 암호 관리에 대한 더 완전한 제어를 제공합니다. 자세한 내용은 [암호 관리](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/password-management.html)를 참조하십시오.

  암호 재사용 제한 구현에는 `mysql.user` 시스템 테이블의 구조 변경과 새로운 `mysql.password_history` 시스템 테이블이 포함됩니다. 이전 버전에서 이 MySQL 릴리스로 업그레이드하는 경우, 이러한 시스템 데이터베이스 변경 사항을 통합하려면 **mysql_upgrade**를 실행하고 서버를 다시 시작해야 합니다. 이 작업이 완료될 때까지 *암호 변경은 불가능합니다.*

  (WL #6595)

## Atomic DDL 관련 사항

- MySQL은 이제 atomic 데이터 정의 문(*atomic DDL*)을 지원합니다. atomic DDL 문은 DDL 작업과 연결된 데이터 딕셔너리 업데이트, 스토리지 엔진 작업, 바이너리 로그 쓰기를 완전히 커밋되거나 롤백되는 단일 crash-safe 트랜잭션으로 결합합니다.

  테이블 DDL 문과 비테이블 DDL 문이 모두 지원됩니다. 테이블 관련 DDL 작업에는 스토리지 엔진 지원이 필요하지만, 비테이블 DDL 작업에는 필요하지 않습니다. 현재 `InnoDB` 스토리지 엔진은 atomic DDL을 지원합니다.

  - 지원되는 테이블 DDL 문에는 데이터베이스, 테이블스페이스, 테이블, 인덱스에 대한 `CREATE`, `ALTER`, `DROP` 문과 [`TRUNCATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/truncate-table.html) 문이 포함됩니다.
  - 지원되는 비테이블 DDL 문에는 다음이 포함됩니다:

    - 저장 프로그램, 트리거, 뷰, loadable 함수에 대한 `CREATE` 및 `DROP` 문과, 해당되는 경우 `ALTER` 문입니다. [`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)에 대한 atomic DDL 지원은 MySQL 8.0.0에서 추가되었습니다.
    - 계정 관리 문: 사용자 및 역할에 대한 `CREATE`, `ALTER`, `DROP` 문과, 해당되는 경우 `RENAME` 문, 그리고 [`GRANT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/grant.html) 및 [`REVOKE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/revoke.html) 문입니다. 계정 관리 문에 대한 atomic DDL 지원은 MySQL 8.0.1에서 추가되었습니다.

  테이블 관련 DDL 작업의 경우, `InnoDB`는 DDL 로그를 `mysql.innodb_ddl_log` 데이터 딕셔너리 테이블에 기록합니다. [`innodb_print_ddl_logs`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_print_ddl_logs) 설정 옵션을 활성화하면 DDL 복구 로그가 `stderr`에 출력됩니다.

  atomic DDL 기능은 일부 문의 동작을 변경합니다:

  - 명명된 뷰가 존재하지 않으면 [`DROP VIEW`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-view.html)는 오류와 함께 실패하며, 변경 사항은 적용되지 않습니다. 이전에는 해당 문이 존재하지 않는 뷰를 나타내는 오류를 반환했지만, 존재하는 뷰도 삭제했습니다.
  - 명명된 테이블이 존재하지 않으면 [`DROP TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-table.html)은 오류와 함께 실패하며, 변경 사항은 적용되지 않습니다. 이전에는 해당 문이 존재하지 않는 테이블을 나타내는 오류를 반환했지만, 존재하는 테이블도 삭제했습니다.
  - 명명된 모든 테이블이 atomic DDL을 지원하는 스토리지 엔진을 사용하는 경우 [`DROP TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-table.html)은 완전히 atomic합니다.
  - 모든 테이블이 atomic DDL을 지원하는 스토리지 엔진을 사용하는 경우 [`DROP DATABASE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-database.html)는 atomic합니다. 그러나 파일 시스템에서 데이터베이스 디렉터리를 제거하는 작업은 마지막에 발생하며 atomic 트랜잭션의 일부가 아닙니다. 파일 시스템 오류 또는 서버 중단으로 인해 데이터베이스 디렉터리 제거가 실패하는 경우, [`DROP DATABASE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-database.html) 트랜잭션은 롤백되지 않습니다.
  - atomic DDL을 지원하는 스토리지 엔진을 사용하는 테이블에서 중단된 DDL 작업은 더 이상 스토리지 엔진, 데이터 딕셔너리, 바이너리 로그 간의 불일치를 유발하거나 orphan 파일을 남기지 않습니다.
  - 계정 관리 문의 부분 실행은 더 이상 허용되지 않습니다. 계정 관리 문은 명명된 모든 사용자에 대해 성공하거나, 오류가 발생하는 경우 롤백되어 아무런 효과가 없습니다.

    [`DROP TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-table.html), [`DROP VIEW`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-view.html) 및 계정 관리 구문의 동작 변경은 버전 간 복제 설정에 영향을 미칩니다.

  자세한 내용은 [Atomic Data Definition Statement Support](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/atomic-ddl.html)를 참조하십시오. (Bug #24620918, WL #9173, WL #9536, WL #7896, WL #9045, WL #7743)

## C API 관련 사항

- MySQL C API는 이제 클라이언트가 결과 세트에 대한 메타데이터 전송이 선택 사항임을 지정할 수 있도록 합니다. 메타데이터 전송을 억제하면 성능이 향상될 수 있으며, 특히 각각 적은 수의 로우를 반환하는 많은 쿼리를 실행하는 세션에서 그렇습니다. 자세한 내용은 [Optional Result Set Metadata](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/c-api-optional-metadata.html)를 참조하십시오. (WL #8134)

## 캐릭터셋 지원

- MySQL은 이제 `utf8mb4` 유니코드 캐릭터셋에 대해 러시아어 콜레이션을 지원합니다:

  - `utf8mb4_ru_0900_ai_ci`는 accent insensitive 및 case insensitive입니다.
  - `utf8mb4_ru_0900_as_cs`는 accent sensitive 및 case sensitive입니다.

  (WL #10753)

## 컴파일 관련 사항

- 디버그 빌드의 경우 빌드에 `memcached` 플러그인이 포함되면 `SAFE_MUTEX` 컴파일 플래그가 비활성화되었습니다. 이제는 더 이상 이런 일이 발생하지 않으며, 디버그 빌드에서는 `SAFE_MUTEX`가 항상 활성화됩니다. 이 변경의 결과로 발견된 일부 코드 문제가 수정되었습니다. (Bug #26442367, Bug #87068)
- EL6 및 EL7의 바이너리 패키지는 이제 Devtoolset3 대신 Devtoolset 6을 사용하고, 4.9.2 대신 GCC 6.2.1을 사용하여 컴파일됩니다. (Bug #26436968, Bug #87061)
- 이제 MySQL은 Oracle Linux의 SPARC용으로 컴파일됩니다. (Bug #26306331, Bug #86745)
- Clang을 사용한 macOS의 MySQL 컴파일에는 이제 8.0과 다른 Clang 버전이 필요하며, 8.0에는 특정 인라인 구문에 문제가 있습니다. (Bug #26279510, Bug #86711)
- 소스 코드 베이스를 정리하는 작업이 수행되었으며, 여기에는 다음이 포함됩니다: 불필요한 **CMake** 검사를 제거하고, 소스 파일에서 사용되지 않는 매크로를 제거하고, 의존성 수를 줄이고 더 모듈화하기 위해 헤더 파일을 재구성하고, 정의가 없는 함수 선언을 제거하고, 로컬에서 작성된 함수를 업계 표준 라이브러리의 동등한 함수로 대체했습니다.

## 설정 관련 사항

- [`performance_schema_max_mutex_classes`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-system-variables.html#sysvar_performance_schema_max_mutex_classes) 시스템 변수의 기본값이 220에서 250으로 증가했습니다. [`performance_schema_max_thread_classes`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-system-variables.html#sysvar_performance_schema_max_thread_classes) 시스템 변수의 기본값이 50에서 100으로 증가했습니다. (Bug #26193630)
- 새로운 [`cte_max_recursion_depth`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_cte_max_recursion_depth) 시스템 변수는 공통 테이블 표현식(CTE)의 최대 재귀 깊이를 구현합니다. 서버는 이 변수의 값보다 더 많은 레벨로 재귀하는 모든 CTE의 실행을 종료합니다. 자세한 내용은 [공통 테이블 표현식 재귀 제한](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/with.html#common-table-expressions-recursion-limits)을 참조하십시오. (Bug #26136509, Bug #86444, WL #10972)
- [`back_log`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_back_log) 시스템 변수의 기본값은 이제 [`max_connections`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_max_connections)의 값이며, 이를 통해 허용되는 backlog가 허용되는 최대 연결 수에 맞게 조정될 수 있습니다. (WL #9704)
- Event Scheduler를 기본적으로 활성화하기 위해 [`event_scheduler`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_event_scheduler) 시스템 변수의 기본값이 `OFF`에서 `ON`으로 변경되었습니다. (WL #9644)
- [`max_allowed_packet`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_max_allowed_packet) 시스템 변수의 기본값이 4194304(4M)에서 67108864(64M)로 증가했습니다. (WL #8393)
- [`max_error_count`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_max_error_count) 시스템 변수의 기본 변수값이 64에서 1024로 증가했습니다. (WL #9686)

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

- 다음 `INFORMATION_SCHEMA` 테이블은 데이터 딕셔너리 테이블 위의 뷰로 다시 구현되었습니다:

  ```
  FILES
  PARTITIONS
  REFERENTIAL_CONSTRAINTS
  ```

  이러한 테이블에 대한 쿼리는 이제 더 느린 다른 방법이 아니라 데이터 딕셔너리 테이블에서 정보를 가져오기 때문에 더 효율적입니다. 예를 들어, 서버는 더 이상 `INFORMATION_SCHEMA` 테이블의 각 쿼리에 대해 임시 테이블을 생성할 필요가 없습니다.

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

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

- **Replication:** 다음의 오래된 **mysqlbinlog** 옵션은 이제 사용 중단되며 향후 MySQL 버전에서 제거됩니다:

  - `--short-form`: 테스트 목적으로 출력을 문장만으로 제한하는 데 사용할 수 있었습니다.
  - `--stop-never-slave-server-id`: [`--stop-never`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/mysqlbinlog.html#option_mysqlbinlog_stop-never) 옵션을 사용하는 연결에 대한 서버 ID를 제공했습니다. 이 기능이 필요한 경우 대신 [`--connection-server-id`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/mysqlbinlog.html#option_mysqlbinlog_connection-server-id) 옵션을 사용하십시오.

  이러한 옵션에 대한 사용 중단 경고는 표준 출력이 아니라 표준 오류로 전송되므로, **mysqlbinlog**의 출력을 사용하는 도구의 동작을 방해하지 않습니다. (WL #9632, WL #9633)
- **Replication:** [`sql_log_bin`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_sql_log_bin) 시스템 변수에 대해 사용 중단되었던 전역 범위가 제거되었습니다. 이제 `sql_log_bin`은 세션 범위만 가집니다. `@@GLOBAL.sql_log_bin`에 접근하는 데 의존하는 애플리케이션은 조정되어야 합니다. (WL #10922)
- 암호화와 관련된 다음 사용 중단 항목이 제거되었습니다:

  - [`ENCODE()`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/encryption-functions.html#function_encode) 및 [`DECODE()`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/encryption-functions.html#function_decode) 함수.
  - [`ENCRYPT()`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/encryption-functions.html#function_encrypt) 함수.
  - [`DES_ENCRYPT()`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/encryption-functions.html#function_des-encrypt) 및 [`DES_DECRYPT()`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/encryption-functions.html#function_des-decrypt) 함수, [`--des-key-file`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-options.html#option_mysqld_des-key-file) 옵션, [`have_crypt`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-system-variables.html#sysvar_have_crypt) 시스템 변수, [`FLUSH`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/flush.html) 문에 대한 `DES_KEY_FILE` 옵션, 그리고 `HAVE_CRYPT` **CMake** 옵션.

    제거된 암호화 함수 대신: [`ENCRYPT()`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/encryption-functions.html#function_encrypt)의 경우 단방향 해싱에는 대신 [`SHA2()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/encryption-functions.html#function_sha2)를 사용하는 것을 고려하십시오. 그 외의 함수에는 대신 [`AES_ENCRYPT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/encryption-functions.html#function_aes-encrypt) 및 [`AES_DECRYPT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/encryption-functions.html#function_aes-decrypt)를 사용하는 것을 고려하십시오. (Bug #26493987, WL #10788, WL #10789)
- 사용 중단된 [`tx_isolation`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-system-variables.html#sysvar_tx_isolation) 및 [`tx_read_only`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-system-variables.html#sysvar_tx_read_only) 시스템 변수가 제거되었습니다. 대신 [`transaction_isolation`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_transaction_isolation) 및 [`transaction_read_only`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_transaction_read_only)를 사용하십시오. (WL #9636)
- 사용 중단된 쿼리 캐시가 제거되었습니다. 제거에는 다음 항목이 포함됩니다:

  - `FLUSH QUERY CACHE` 및 `RESET QUERY CACHE` 문.
  - 다음 시스템 변수: [`query_cache_limit`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-system-variables.html#sysvar_query_cache_limit), [`query_cache_min_res_unit`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-system-variables.html#sysvar_query_cache_min_res_unit), [`query_cache_size`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-system-variables.html#sysvar_query_cache_size), [`query_cache_type`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-system-variables.html#sysvar_query_cache_type), [`query_cache_wlock_invalidate`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-system-variables.html#sysvar_query_cache_wlock_invalidate).
  - 다음 상태 변수: [`Qcache_free_blocks`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-status-variables.html#statvar_Qcache_free_blocks), [`Qcache_free_memory`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-status-variables.html#statvar_Qcache_free_memory), [`Qcache_hits`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-status-variables.html#statvar_Qcache_hits), [`Qcache_inserts`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-status-variables.html#statvar_Qcache_inserts), [`Qcache_lowmem_prunes`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-status-variables.html#statvar_Qcache_lowmem_prunes), [`Qcache_not_cached`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-status-variables.html#statvar_Qcache_not_cached), [`Qcache_queries_in_cache`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-status-variables.html#statvar_Qcache_queries_in_cache), [`Qcache_total_blocks`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/server-status-variables.html#statvar_Qcache_total_blocks).
  - 다음 스레드 상태: `checking privileges on cached query`, `checking query cache for query`, `invalidating query cache entries`, `sending cached result to client`, `storing result in query cache`, `Waiting for query cache lock`.
  - `SQL_CACHE` [`SELECT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/select.html) 수정자.

    이러한 사용 중단된 쿼리 캐시 항목은 사용 중단된 상태로 유지되지만, 효과가 없으며 향후 MySQL 버전에서 제거될 예정입니다:

  - `SQL_NO_CACHE` [`SELECT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/select.html) modifier.
  - `ndb_cache_check_time` 시스템 변수.

  [`have_query_cache`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_have_query_cache) 시스템 변수는 사용 중단된 상태로 유지되고, 항상 `NO` 값을 가지며, 향후 MySQL 버전에서 제거될 예정입니다. (WL #10824)
- [`EXPLAIN`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/explain.html) 문에 대해 사용 중단된 `EXTENDED` 및 `PARTITIONS` 키워드가 제거되었습니다. 이러한 키워드는 그 효과가 항상 활성화되어 있기 때문에 필요하지 않습니다. (WL #9678)
- 사용되지 않는 `date_format`, `datetime_format`, `time_format`, `max_tmp_tables` 시스템 변수가 제거되었습니다. (WL #9680)
- 사용 중단된 `multi_range_count` 시스템 변수가 제거되었습니다. (WL #10908)
- 사용 중단된 `log_warnings` 시스템 변수와 `--log-warnings` 서버 옵션이 제거되었습니다. 대신 [`log_error_verbosity`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_log_error_verbosity) 시스템 변수를 사용하십시오. (WL #9676)
- 사용 중단된 `secure_auth` 시스템 변수와 `--secure-auth` 클라이언트 옵션이 제거되었습니다. [`mysql_options()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-options.html) C API 함수에 대한 `MYSQL_SECURE_AUTH` 옵션이 제거되었습니다. (WL #9674)
- 사용 중단된 `ignore_builtin_innodb` 시스템 변수가 제거되었습니다. (WL #9675)

- MySQL 8.0.2에서는 슬레이브 상태 로그에 대한 시스템 변수인 [`master_info_repository`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-replica.html#sysvar_master_info_repository) 및 [`relay_log_info_repository`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-replica.html#sysvar_relay_log_info_repository)가 기본적으로 `FILE` 대신 `TABLE`로 설정되었습니다. MySQL 8.0.3에서는 이 두 시스템 변수에 대한 `FILE` 설정이 사용 중단되었으며, 이 설정을 사용하면 경고가 발생합니다. `FILE` 설정은 향후 MySQL 버전에서 제거됩니다.

  `TABLE` 설정은 복제 저장소 정보가 데이터 디렉터리의 파일이 아니라 InnoDB 테이블에 저장되도록 합니다. 테이블을 사용하면 복제가 예기치 않은 중단에 대해 복원력을 갖게 됩니다.

  파일로 저장될 때 슬레이브 상태 로그의 기본 이름은 `master.info` 및 `relay-log.info`였습니다. 이름은 각각 [`--master-info-file`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-replica.html#option_mysqld_master-info-file) 및 [`--relay-log-info-file`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-replica.html#sysvar_relay_log_info_file) 옵션을 사용하여 변경할 수 있었습니다. InnoDB 테이블로서 슬레이브 상태 로그의 이름은 `mysql.slave_master_info` 및 `mysql.slave_relay_log_info`입니다.

  슬레이브 상태 로그에 `FILE` 저장소를 사용하는 기존 복제 슬레이브를 `TABLE` 저장소를 사용하도록 수정하려면 다음 명령을 실행하여 기존 복제 저장소를 동적으로 변환하십시오:

  ```
  STOP SLAVE;
  SET GLOBAL master_info_repository = 'TABLE';
  SET GLOBAL relay_log_info_repository = 'TABLE';
  ```

  마스터 정보 로그 테이블 `mysql.slave_master_info`는 마스터에 연결하기 위한 비밀번호를 포함하므로 보호해야 합니다. 복제 슬레이브의 데이터를 백업할 때는 슬레이브 상태 로그를 포함하는 `mysql.slave_master_info` 및 `mysql.slave_relay_log_info` 테이블을 백업해야 합니다. 슬레이브에서 데이터를 복원한 후 복제를 재개하는 데 이 테이블이 필요하기 때문입니다. (WL #6959)

## InnoDB 관련 사항

- 외래 키 잠금에 대한 작업이 진행 중이므로, 부모 외래 키의 컬럼 이름 변경이 일시적으로 비활성화됩니다. 이 제한은 MySQL 8.0.4에서 해제됩니다. (Bug #26334071)

  참조: 함께 참조하십시오: Bug #26659110.

## 로깅 관련 사항

- 이제 바이너리 로그는 서버 시작 시 기본적으로 활성화됩니다. [`--log-bin`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#option_mysqld_log-bin) 옵션이 지정되지 않았더라도 [`log_bin`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_log_bin) 시스템 변수는 OFF 대신 기본적으로 ON으로 설정됩니다. 바이너리 로깅은 운영 설치에서 표준 관행이므로, 기본적으로 활성화하면 일반적으로 필요했던 설정 및 계획 단계가 제거됩니다.

  바이너리 로깅을 비활성화하려면 시작 시 [`--skip-log-bin`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#option_mysqld_log-bin) 또는 [`--disable-log-bin`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#option_mysqld_log-bin) 옵션을 지정할 수 있습니다.

  이제 [`server_id`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options.html#sysvar_server_id) 시스템 변수는 0 대신 기본적으로 1로 설정됩니다. 복제 토폴로지의 서버에 대해서는 각 복제 서버에 고유한 서버 ID를 지정하도록 이 설정을 계속 변경해야 합니다. 이전에는 서버 ID가 지정되지 않은 경우 서버가 [`log_bin=ON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_log_bin)으로 시작할 수 없었습니다. 이제 서버는 시작할 수 있지만, 명시적인 서버 ID를 설정하지 않은 경우 경고 메시지가 발생합니다. (MySQL 8.0.4부터 이 메시지는 정보 제공용일 뿐입니다.)

  서버에 대해 바이너리 로깅이 활성화되면 데이터를 변경하는 모든 명령문이 서버의 바이너리 로그에 기록되며, 이는 베이스 이름과 숫자 확장자를 가진 파일의 시퀀스입니다. 기본적으로 서버는 데이터 디렉터리에 바이너리 로그 파일과 인덱스 파일을 생성합니다. MySQL 8.0.3에서 이러한 파일의 기본 베이스 이름은 호스트 머신의 이름을 사용하는 `host_name-bin`입니다. MySQL 8.0.4부터 [`--log-bin`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#option_mysqld_log-bin) 옵션을 제공하지 않으면 기본 베이스 이름은 `binlog`이고, 문자열 없이 또는 빈 문자열로 옵션을 제공하면 `host_name-bin`입니다.

  [`--log-bin`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#option_mysqld_log-bin) 및 [`--log-bin-index`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#option_mysqld_log-bin-index) 옵션을 지정하여 바이너리 로그 파일과 인덱스 파일의 이름 및 위치를 선택할 수 있습니다. 호스트 이름이 변경되더라도 동일한 바이너리 로그 파일 이름을 계속 쉽게 사용할 수 있도록, 베이스 이름을 명시적으로 지정하는 것이 권장됩니다. [`log_bin_basename`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_log_bin_basename) 시스템 변수는 바이너리 로그 파일에 대한 베이스 이름과 지정된 경로를 보유합니다.

  복제 슬레이브의 릴레이 로그 및 릴레이 로그 인덱스는 [`--relay-log`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-replica.html#sysvar_relay_log) 및 [`--relay-log-index`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-replica.html#sysvar_relay_log_index) 옵션으로 이름이 지정되며, 바이너리 로그 및 바이너리 로그 인덱스와 동일한 이름을 지정할 수 없습니다. MySQL 8.0.3부터는 바이너리 로그와 릴레이 로그 파일 베이스 이름이 동일하게 될 경우 서버가 오류 메시지를 발생시키고 시작하지 않습니다.

  서버는 시작할 때마다 또는 로그를 플러시할 때마다 시리즈에 새 바이너리 로그 파일을 생성합니다. 또한 서버는 현재 파일의 크기가 [`max_binlog_size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_max_binlog_size)에 도달하면 새 바이너리 로그 파일을 자동으로 생성하며, 이 변수의 기본값은 허용되는 최대값인 1GB입니다. MySQL 8.0.3에서는 바이너리 로그 파일이 기본적으로 30일 후 만료되며, 이후 시작 시 또는 바이너리 로그가 플러시될 때 자동으로 제거될 수 있습니다. [`PURGE BINARY LOGS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/purge-binary-logs.html) 문을 사용하여 바이너리 로그 파일을 수동으로 제거하거나, [`binlog_expire_logs_seconds`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_expire_logs_seconds) 시스템 변수를 사용하여 다른 바이너리 로그 만료 기간을 지정할 수 있습니다.

  바이너리 로깅의 동작을 수정하기 위해 사용할 수 있는 다른 옵션이 많이 있습니다. 자세한 내용은 [The Binary Log](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/binary-log.html) 및 [Binary Logging Options and Variables](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html)를 참조하십시오. (WL #10470)

  참조: 함께 참조하십시오: Bug #26730000.

## Optimizer 관련 사항

- Optimizer는 이제 단일 문이 실행되는 동안 시스템 변수의 세션 값을 설정하는 [`SET_VAR`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/optimizer-hints.html#optimizer-hints-set-var) 힌트를 지원합니다. 예:

  ```
  SELECT /*+ SET_VAR(sort_buffer_size = 16M) */ name FROM people ORDER BY name;
  INSERT /*+ SET_VAR(foreign_key_checks=OFF) */ INTO t2 VALUES(2);
  ```

  자세한 내용은 [Optimizer Hints](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/optimizer-hints.html)를 참조하십시오. (Bug #22906815, WL #681)
- Optimizer는 이제 쿼리 실행 계획을 구성하기 위해 `column_statistics` 데이터 딕셔너리 테이블에 저장된 컬럼 값 히스토그램 통계를 사용합니다. 히스토그램 사용은 컬럼을 상수와 비교하는 조건자에 적용됩니다. [Optimizer Statistics](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/optimizer-statistics.html)를 참조하십시오. (WL #9223)
- 이전에는 [`eq_range_index_dive_limit`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_eq_range_index_dive_limit) 시스템 변수를 사용하는 경우를 제외하고, 인덱스 유용성을 추정하기 위한 인덱스 다이브 사용을 건너뛸 방법이 없었습니다. 이제 특정 쿼리 조건에서 단일 테이블 쿼리에 대해 인덱스 다이브 건너뛰기가 가능합니다([Range Optimization](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/range-optimization.html) 참조). (WL #6526)
- [`optimizer_switch`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_optimizer_switch) 시스템 변수에는 Optimizer가 쿼리 실행 계획 구성에 invisible 인덱스를 사용할지 여부를 제어하는 [`use_invisible_indexes`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/switchable-optimizations.html#optflag_use-invisible-indexes)라는 새 플래그가 있습니다. 플래그가 `off`(기본값)이면 Optimizer는 invisible 인덱스를 무시합니다(이 플래그가 도입되기 전과 동일한 동작). 플래그가 `on`이면 invisible 인덱스는 계속 invisible 상태로 남지만 Optimizer는 실행 계획 구성에 이를 고려합니다. (WL #10891)

## 패키징 관련 사항

- MySQL Server Docker 이미지에 **mysqlcheck**가 누락되어 **mysql_upgrade**가 실행되지 않았습니다. (Bug #26400146, Bug #86968)
- Debian의 경우 비디버그 바이너리가 `mysql-server` 패키지에서 `mysql-server-core` 패키지로 이동되었습니다. (Bug #26382333, Bug #86899)
- Debian/Ubuntu `mysql-community-source` 패키지는 더 이상 생성되지 않습니다. 이 패키지에 포함되어 있던 MySQL 소스 tarball은 `dev.mysql.com`의 다른 패키지에서 제공되기 때문입니다. (Bug #26201482)
- MySQL에 번들로 제공되는 zlib 라이브러리가 버전 1.2.3에서 버전 1.2.11로 업그레이드되었습니다. MySQL은 zlib 라이브러리의 도움을 받아 압축을 구현합니다.

  zlib 1.2.11의 zlib `compressBound()` 함수는 지정된 길이의 바이트를 압축하는 데 필요한 버퍼 크기에 대해 zlib 버전 1.2.3에서보다 약간 더 높은 추정값을 반환합니다. `compressBound()` 함수는 압축된 `InnoDB` 테이블을 생성하거나 압축된 `InnoDB` 테이블에 로우를 삽입하고 업데이트할 때 허용되는 최대 로우 크기를 결정하는 `InnoDB` 함수에서 호출됩니다. 그 결과, 이전 릴리스에서 성공했던 최대 로우 크기에 매우 가까운 로우 크기의 [`CREATE TABLE... ROW_FORMAT=COMPRESSED`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html), [`INSERT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/insert.html), 및 [`UPDATE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/update.html) 작업이 이제 실패할 수 있습니다. 이 문제를 방지하려면 업그레이드하기 전에 큰 로우가 있는 압축된 `InnoDB` 테이블에 대한 [`CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html) 문을 MySQL 8.0 테스트 인스턴스에서 테스트하십시오. (WL #10551)

## Performance Schema 관련 사항

- MySQL 8.0.2부터 Performance Schema 테이블 정의는 서버 내부에서 유지 관리됩니다. 이 변경의 결과로, Performance Schema 테이블에 대해 [`CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html) 및 [`DROP TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-table.html)을 더 이상 사용할 수 없습니다. (Bug #26136994)
- 이제 [`events_statements_summary_by_digest`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-statement-summary-tables.html) 테이블은 각 로우에 대해 해당 로우의 digest 값을 생성하는 샘플 구문을 제공합니다. 애플리케이션은 이 정보를 `xxx_history_long` 테이블을 조사하는 것과 같은 대안보다 더 효율적인 구문 샘플 캡처 수단으로 사용할 수 있습니다. 후자의 접근 방식은 해당 `xxx_history_long` 컨슈머를 활성화해야 하며, 이는 그렇지 않으면 해당 테이블이 필요하지 않은 애플리케이션에 추가 오버헤드가 됩니다. 자세한 내용은 [Performance Schema Statement Digests and Sampling](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-statement-digests.html) 및 [Statement Summary Tables](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-statement-summary-tables.html)를 참조하십시오.

  또한 이제 [`events_statements_summary_by_digest`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-statement-summary-tables.html) 테이블의 `FIRST_SEEN` 및 `LAST_SEEN` 타임스탬프 컬럼은 소수 초 부분을 가집니다. (WL #9830)
- 이제 Performance Schema [`setup_instruments`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-setup-instruments-table.html) 테이블에는 인스트루먼트 메타데이터를 위한 컬럼이 있습니다: 인스트루먼트 속성, 인스트루먼트 변동성, 인스트루먼트 목적을 설명하는 문서 문자열입니다. 또한 이제 `TIMED` 컬럼은 `NULL`일 수 있으며, 이는 인스트루먼트가 타이밍을 지원하지 않음을 나타냅니다. [The setup_instruments Table](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-setup-instruments-table.html)을 참조하십시오.

  새로운 Performance Schema [`setup_threads`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-setup-threads-table.html) 테이블은 인스트루먼트 처리된 스레드 클래스 이름과 속성을 노출합니다. [The setup_threads Table](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-setup-threads-table.html)을 참조하십시오. (WL #7801)

## 플러그인 관련 사항

- 새로운 `get_sysvar_source` 플러그인 서비스는 플러그인이 시스템 변수 설정의 소스를 검색할 수 있도록 합니다.

  이 작업의 일부로, 여러 `MyISAM` 키 캐시를 참조하는 데 사용되는 compound-part 구조화 변수 문법은 사용 중단됩니다. [Multiple Key Caches](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/multiple-key-caches.html)를 참조하십시오.

  (WL #9424)

## 보안 관련 사항

- 새로운 `caching_sha2_password` 인증 플러그인을 사용할 수 있습니다. `sha256_password` 플러그인과 마찬가지로, `caching_sha2_password`는 SHA-256 패스워드 해싱을 구현하지만, 연결 시점의 지연 시간 문제를 해결하기 위해 캐싱을 사용합니다. 또한 더 많은 연결 프로토콜을 지원하며 RSA 패스워드 교환 기능을 위해 OpenSSL에 링크할 필요가 없습니다. [Caching SHA-2 Pluggable Authentication](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/caching-sha2-pluggable-authentication.html)을 참조하십시오. (WL #9591)
- [`--skip-grant-tables`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_skip-grant-tables)를 사용하여 서버를 시작하면 인증 검사가 비활성화되므로, 이 경우 서버는 [`skip_networking`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_skip_networking)을 활성화하여 원격 연결도 비활성화합니다. (WL #4321)

## 서버 관리

- MySQL은 이제 리소스 그룹의 생성 및 관리를 지원하며, 서버 내에서 실행 중인 스레드를 특정 그룹에 할당하여 스레드가 해당 그룹에서 사용할 수 있는 리소스에 따라 실행되도록 허용합니다. 그룹 속성을 통해 해당 리소스에 대한 제어가 가능하며, 그룹 내 스레드의 리소스 소비를 활성화하거나 제한할 수 있습니다. DBA는 서로 다른 워크로드에 적절하도록 이러한 속성을 수정할 수 있습니다. 현재 CPU 시간은 관리 가능한 리소스이며, CPU 코어, 하이퍼스레드, 하드웨어 스레드 등을 포함하는 용어로서 “가상 CPU”라는 개념으로 표현됩니다. 서버는 시작 시 사용할 수 있는 가상 CPU 수를 결정하며, 적절한 권한을 가진 데이터베이스 관리자는 이러한 CPU를 리소스 그룹과 연결하고 스레드를 그룹에 할당할 수 있습니다. 자세한 내용은 [Resource Groups](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/resource-groups.html)를 참조하십시오. (WL #9467)

## 공간 데이터 지원

- **호환되지 않는 변경:** 이전에는 기하 객체 관계를 테스트하는 다음 함수가 Cartesian 공간 참조 시스템(SRS)만 지원했습니다: [`ST_Contains()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-object-shapes.html#function_st-contains), [`ST_Crosses()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-object-shapes.html#function_st-crosses), [`ST_Disjoint()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-object-shapes.html#function_st-disjoint), [`ST_Equals()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-object-shapes.html#function_st-equals), [`ST_Intersects()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-object-shapes.html#function_st-intersects), [`ST_Overlaps()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-object-shapes.html#function_st-overlaps), [`ST_Touches()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-object-shapes.html#function_st-touches), [`ST_Within()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-object-shapes.html#function_st-within), [`MBRContains()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-mbr.html#function_mbrcontains), [`MBRCoveredBy()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-mbr.html#function_mbrcoveredby), [`MBRCovers()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-mbr.html#function_mbrcovers), [`MBRDisjoint()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-mbr.html#function_mbrdisjoint), [`MBREquals()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-mbr.html#function_mbrequals), [`MBRIntersects()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-mbr.html#function_mbrintersects), [`MBROverlaps()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-mbr.html#function_mbroverlaps), [`MBRTouches()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-mbr.html#function_mbrtouches), [`MBRWithin()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-mbr.html#function_mbrwithin).

  이 함수들은 이제 지리 SRS의 geometry 인수를 감지하고 지리 결과를 반환합니다. 투영 SRS 및 SRID 0에 대한 계산은 동일하게 유지됩니다. 자세한 내용은 [객체 형태를 사용하는 공간 관계 함수](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-object-shapes.html) 및 [최소 경계 사각형을 사용하는 공간 관계 함수](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-relation-functions-mbr.html)를 참조하십시오.

  공간 데이터에 지리 공간 참조 시스템을 참조하는 SRID 값이 포함되어 있는 경우, 이러한 함수를 사용하는 기존 쿼리는 이전 MySQL 버전과 비교하여 다른 결과를 반환합니다.

  (WL #10827)

- **InnoDB:** `InnoDB` 공간 인덱스에 대해 공간 참조 식별자(SRID) 지원이 추가되었습니다. (WL #10439)
- 공간 데이터 타입은 이제 컬럼에 저장된 값에 대한 공간 참조 시스템(SRS)을 명시적으로 나타내기 위해 `SRID` 속성을 허용합니다. [공간 데이터 타입](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-type-overview.html)을 참조하십시오.

  각 컬럼의 `SRID` 속성 값이 있는 경우 이를 나타내기 위해, [`INFORMATION_SCHEMA.COLUMNS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-columns-table.html) 테이블에는 이제 `SRS_ID` 컬럼이 있습니다.

  명시적 `SRID` 속성이 있는 공간 컬럼은 SRID 제한이 적용됩니다: 컬럼은 해당 ID를 가진 값만 받으며, 컬럼의 `SPATIAL` 인덱스는 Optimizer가 사용할 수 있는 대상이 됩니다. Optimizer는 `SRID` 속성이 없는 공간 컬럼의 `SPATIAL` 인덱스를 무시합니다. [SPATIAL 인덱스 최적화](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-index-optimization.html)를 참조하십시오. (WL #8592)

## SQL 문법 관련 사항

- [`ALTER TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html)은 이제 `RENAME COLUMN old_name TO new_name` 문법을 사용하여 더 쉬운 컬럼 이름 변경을 지원합니다. [ALTER TABLE Statement](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html)를 참조하십시오. 컬럼 이름을 변경하지만 그 정의는 변경하지 않는 경우, 현재 컬럼 정의를 다시 지정해야 하는 `CHANGE`보다 `RENAME COLUMN`이 더 편리합니다. `CHANGE`를 사용하는 경우 정의를 알지 못하면 해당 정의를 찾아보아야 하며, 이를 정확히 다시 지정하지 않으면 데이터 변경 또는 손실 가능성이 있습니다. (Bug #11746522, Bug #26949, Bug #11747473, Bug #32497, Bug #11765084, Bug #58006, Bug #14031617, WL #10761)

## X 플러그인 관련 사항

- 서버가 `--skip-grant-tables` 옵션으로 시작된 경우 X Plugin을 설치할 수 없었습니다. (Bug #26516678)
- X Plugin 소켓 연결이 올바르게 작동하지 않았습니다. (Bug #26427112, Bug #87019)
- 소스에서 MySQL을 컴파일할 때, 자주 사용되지 않는 특정 **CMake** 인수가 X Plugin 빌드에 문제를 일으켰습니다. (Bug #26141933)
- X Protocol을 사용하는 `Mysqlx.Connection.CapabilitiesGet` 요청이 사용 가능한 인증 메커니즘의 전체 목록을 반환하지 않았습니다. (Bug #26044113)
- 대소문자가 혼합되었거나 대문자인 스키마 이름의 경우, `list_objects` 문이 컬렉션을 테이블로 잘못 보고할 수 있었습니다. (Bug #25769683)
- 테스트 데이터 디렉터리 권한에 포함할 플러그인 목록에서 X Plugin이 누락되었습니다. (Bug #24823999)

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

- **InnoDB:** 새로운 [`--innodb-dedicated-server`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#option_mysqld_innodb-dedicated-server) 서버 옵션은 `InnoDB`가 서버에서 감지된 메모리 양에 따라 다음 옵션을 자동으로 설정하도록 하는 데 사용할 수 있습니다:

  - [`innodb_buffer_pool_size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_buffer_pool_size)
  - [`innodb_log_files_in_group`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_log_files_in_group)
  - [`innodb_flush_method`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_flush_method)

  이 옵션은 전용 서버에서 실행되는 MySQL 서버 인스턴스를 위한 것입니다. 자세한 내용은 [Enabling Automatic InnoDB Configuration for a Dedicated MySQL Server](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-dedicated-server.html)를 참조하십시오. (WL #9193)
- **InnoDB:** 이제 [`ALTER TABLESPACE... RENAME TO`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-tablespace.html) 문법으로 일반 테이블스페이스 이름 변경이 지원됩니다.

  [`ALTER TABLESPACE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-tablespace.html) 및 [`DROP TABLESPACE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-tablespace.html)의 `ENGINE` 절은 사용 중단되었으며 향후 MySQL 버전에서 제거될 예정입니다. (WL #8972)
- **InnoDB:** 더 이상 사용되지 않는 `InnoDB` 시스템 테이블과 관련된 코드가 제거되었습니다. `InnoDB` 시스템 테이블을 기반으로 하는 [`INFORMATION_SCHEMA`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema.html) 뷰가 데이터 딕셔너리 테이블의 내부 시스템 뷰로 대체되었습니다. 영향을 받는 `InnoDB` [`INFORMATION_SCHEMA`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema.html) 뷰의 이름이 변경되었습니다:

  **표 1 이름이 변경된 InnoDB Information Schema 뷰. 첫 번째 컬럼은 이전 이름을 보여줍니다. 두 번째 컬럼은 새 이름을 보여줍니다.**

  | 이전 이름 | 새 이름 |
  | --- | --- |
  | INNODB_SYS_COLUMNS | INNODB_COLUMNS |
  | INNODB_SYS_DATAFILES | INNODB_DATAFILES |
  | INNODB_SYS_FIELDS | INNODB_FIELDS |
  | INNODB_SYS_FOREIGN | INNODB_FOREIGN |
  | INNODB_SYS_FOREIGN_COLS | INNODB_FOREIGN_COLS |
  | INNODB_SYS_INDEXES | INNODB_INDEXES |
  | INNODB_SYS_TABLES | INNODB_TABLES |
  | INNODB_SYS_TABLESPACES | INNODB_TABLESPACES |
  | INNODB_SYS_TABLESTATS | INNODB_TABLESTATS |
  | INNODB_SYS_VIRTUAL | INNODB_VIRTUAL |

  MySQL 8.0.3 이상으로 업그레이드한 후에는 이전 `InnoDB` [`INFORMATION_SCHEMA`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema.html) 뷰 이름을 참조하는 모든 스크립트를 업데이트하십시오.

  새로운 [`INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-innodb-tablespaces-brief-table.html) 뷰는 `InnoDB` 테이블스페이스에 대한 space, name, path, flag, space type 데이터를 제공합니다. (WL #9535)
- **InnoDB:** `InnoDB`가 전역 데이터 딕셔너리와 통합되었을 때, 데이터 딕셔너리의 file-per-table 테이블스페이스 이름은 innodb_file_per_table_*`x`* 형식으로 생성되었으며, 여기서 *`x`*는 `InnoDB` 테이블스페이스 ID입니다. 사용 편의를 위해 데이터 딕셔너리의 file-per-table 테이블스페이스 이름은 다시 테이블 이름과 동일합니다.

  MySQL 5.7에서 MySQL 8.0으로 업그레이드하면 데이터 딕셔너리의 MySQL 5.7 `innodb_table_stats` 및 `innodb_index_stats` 테이블스페이스 이름에 “`_backup57`”이 추가되어 MySQL 8.0의 대응 항목과 구분됩니다. (WL #10436)
- **InnoDB:** 기본 [`innodb_autoinc_lock_mode`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_autoinc_lock_mode) 설정이 1(연속)에서 2(인터리브)로 변경되었습니다. 인터리브 잠금 모드는 다중 로우 삽입을 병렬로 실행할 수 있게 하여 동시성과 확장성을 향상시킵니다. 새로운 [`innodb_autoinc_lock_mode`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_autoinc_lock_mode) 기본 설정은 MySQL 5.7에서 기본 복제 유형이 statement-based replication에서 row based replication으로 변경된 것을 반영합니다. Statement-based replication은 주어진 SQL 문 시퀀스에 대해 자동 증가 값이 예측 가능하고 반복 가능한 순서로 할당되도록 보장하기 위해 연속 자동 증가 잠금 모드가 필요한 반면, row-based replication은 SQL 문의 실행 순서에 민감하지 않습니다. 자세한 내용은 [InnoDB AUTO_INCREMENT Lock Modes](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-auto-increment-handling.html#innodb-auto-increment-lock-modes)를 참조하십시오.

  Statement-based replication을 사용하는 시스템의 경우 새로운 [`innodb_autoinc_lock_mode`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_autoinc_lock_mode) 기본 설정은 순차적인 자동 증가 값에 의존하는 애플리케이션을 중단시킬 수 있습니다. 이전 기본값을 복원하려면 [`innodb_autoinc_lock_mode`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_autoinc_lock_mode)를 1로 설정하십시오. (WL #9699)

- **InnoDB:** 직렬화된 딕셔너리 정보(SDI)가 이제 임시 테이블스페이스 및 undo 테이블스페이스 파일을 제외한 모든 `InnoDB` 테이블스페이스 파일에 존재합니다. SDI는 테이블 및 테이블스페이스 객체에 대한 직렬화된 메타데이터입니다. SDI 데이터가 존재하면 메타데이터 중복성이 제공됩니다. 예를 들어 데이터 딕셔너리를 사용할 수 없게 되는 경우 테이블스페이스 파일에서 딕셔너리 객체 메타데이터를 추출할 수 있습니다. SDI 추출은 **ibd2sdi** 도구를 사용하여 수행됩니다. SDI 데이터는 `JSON` 형식으로 저장됩니다.

  테이블스페이스 파일에 SDI 데이터가 포함되면 테이블스페이스 파일 크기가 증가합니다. SDI 레코드에는 단일 인덱스 페이지가 필요하며, 기본적으로 크기는 16KB입니다. 그러나 SDI 데이터는 스토리지 공간 사용량을 줄이기 위해 저장될 때 압축됩니다. (WL #9538)
- **InnoDB:** [`innodb_flush_neighbors`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_flush_neighbors) 기본값이 1에서 0으로 변경되어 버퍼 풀에서 인접 페이지를 플러시하는 기능이 비활성화되었습니다. 0 설정은 탐색 시간이 중요한 요소가 아닌 비회전식 스토리지(SSD) 장치에 최적입니다. 회전식 스토리지(HDD)를 사용하는 시스템의 경우 설정을 이전 기본값인 1로 다시 변경하는 것이 권장됩니다. (WL #9631)
- **InnoDB:** 버퍼 풀 사전 플러시 및 플러시 동작에 영향을 주는 설정 옵션의 기본값이 수정되었습니다:

  - [`innodb_max_dirty_pages_pct_lwm`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_max_dirty_pages_pct_lwm) 기본값이 10으로 변경되었습니다. 이전 기본값 0은 버퍼 풀 사전 플러시를 비활성화합니다. 값 10은 버퍼 풀의 더티 페이지 비율이 10%를 초과할 때 사전 플러시를 활성화합니다. 사전 플러시를 활성화하면 성능 일관성이 향상됩니다.
  - [`innodb_max_dirty_pages_pct`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_max_dirty_pages_pct) 기본값이 75에서 90으로 변경되었습니다. `InnoDB`는 더티 페이지 비율이 이 값을 초과하지 않도록 버퍼 풀에서 데이터를 플러시하려고 시도합니다. 증가된 기본값은 버퍼 풀에서 더 높은 비율의 더티 페이지를 허용합니다.

  (WL #9707, WL #9630)

- **InnoDB:** 최소 [`innodb_undo_tablespaces`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_undo_tablespaces) 값이 0에서 2로 변경되었습니다. 이전 릴리스에서는 [`innodb_undo_tablespaces`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_undo_tablespaces)가 0으로 설정된 경우 시스템 테이블스페이스가 롤백 세그먼트에 사용됩니다. 최소값 2는 롤백 세그먼트가 시스템 테이블스페이스 대신 undo 테이블스페이스에 생성되도록 보장합니다. 자세한 내용은 [Undo Tablespaces](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-undo-tablespaces.html)를 참조하십시오. (WL #10583)
- **Replication; JSON:** [`binlog_row_value_options`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_row_value_options) 시스템 변수가 추가되었습니다. 현재 이 변수는 설정 해제될 수 있거나, `PARTIAL_JSON` 값으로 설정될 수 있습니다. 이렇게 하면 MySQL의 로우 기반 복제가 JSON 문서의 작은 부분만 수정하고 [`JSON_SET()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-modification-functions.html#function_json-set), [`JSON_REPLACE()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-modification-functions.html#function_json-replace), [`JSON_REMOVE()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-modification-functions.html#function_json-remove)의 임의 조합을 사용하는 각 업데이트에 대해 간결한 바이너리 로그 형식을 사용하게 됩니다. 간결한 형식은 바이너리 로그에서 업데이트에 사용되는 after-image에 전체 문서가 아니라 JSON 문서의 수정된 부분만 포함합니다. 수정에 전체 문서보다 더 많은 공간이 필요하거나 부분 업데이트를 생성할 수 없는 경우에는 대신 전체 문서가 사용됩니다.

  자세한 내용은 변수 설명 및 [Partial Updates of JSON Values](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json.html#json-partial-updates)를 참조하십시오. (WL #2955)

- **Replication:** GTID 기반 복제([`gtid_mode=ON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-gtids.html#sysvar_gtid_mode))를 사용할 때 [`CHANGE MASTER TO`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/change-master-to.html) 문의 `IGNORE_SERVER_IDS` 옵션은 이제 사용 중단되었습니다. GTID를 사용하면 이미 적용된 트랜잭션은 자동으로 무시되므로 이 기능은 필요하지 않습니다.

  GTID 기반 복제를 시작하기 전에, 관련된 서버에 이전에 설정된 무시된 서버 ID 목록을 모두 확인하고 지우십시오. 개별 채널에 대해 실행할 수 있는 [`SHOW_SLAVE_STATUS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-slave-status.html) 문은 무시된 서버 ID 목록이 있으면 이를 표시합니다. 목록이 없으면 `Replicate_Ignore_Server_Ids` 필드는 비어 있습니다.

  서버에 [`gtid_mode=ON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-gtids.html#sysvar_gtid_mode)이 설정된 경우, [`CHANGE MASTER TO`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/change-master-to.html) 문에 `IGNORE_SERVER_IDS` 옵션을 포함하면 이제 사용 중단 경고가 발생합니다. 또한 어떤 채널에든 `IGNORE_SERVER_IDS`로 설정된 기존 서버 ID가 있는 상태에서 `SET GTID_MODE=ON` 문을 실행해도 사용 중단 경고가 발생합니다. 사용 중단 경고를 받은 경우에도, [`gtid_mode=ON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-gtids.html#sysvar_gtid_mode)이 설정된 후 빈 목록과 함께 `IGNORE_SERVER_IDS` 옵션을 포함하는 [`CHANGE MASTER TO`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/change-master-to.html) 문을 실행하여 목록을 지울 수 있습니다. (WL #10963)
- **Replication:** [`log_slave_updates`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_log_slave_updates) 시스템 변수는 이제 기본적으로 ON으로 설정되므로, 복제 슬레이브를 시작할 때 [`--log-slave-updates`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_log_slave_updates)를 명시적으로 지정할 필요가 없습니다.

  [`log_slave_updates`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_log_slave_updates) 시스템 변수는 읽기 전용입니다. 복제 슬레이브가 해당 SQL 스레드에서 수행한 업데이트를 자체 바이너리 로그에 기록하지 못하도록 해야 하는 경우, 슬레이브 서버 시작 시 [`--log-slave-updates=OFF`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_log_slave_updates)를 지정하십시오. (WL #10479)

- **Group Replication:** 이 릴리스에는 [`group_replication_communication_debug_options`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_communication_debug_options) 서버 시스템 변수가 추가되어, Group Replication 컴포넌트별로 디버깅 및 추적 메시지를 동적으로 필터링할 수 있습니다. (WL #10200)
- **Group Replication:** 이제 Group Replication 스레드 상태가 MySQL Performance Schema에 표시됩니다. (WL #10622)
- **JSON:** [`JSON_MERGE()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-modification-functions.html#function_json-merge) 함수의 이름이 [`JSON_MERGE_PRESERVE()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-modification-functions.html#function_json-merge-preserve)로 변경되었습니다.

  이 릴리스에는 `JSON_MERGE_PRESERVE()`의 RFC 7396 준수 버전인 [`JSON_MERGE_PATCH()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-modification-functions.html#function_json-merge-patch) 함수도 추가되며, 이 함수의 동작은 다음 두 가지 예외를 제외하고 `JSON_MERGE_PRESERVE()`의 동작과 동일합니다:

  - 두 번째 객체에서 일치하는 키와 연결된 값이 JSON `null`이 아닌 경우, `JSON_MERGE_PATCH()`는 첫 번째 객체에서 두 번째 객체의 키와 일치하는 키를 가진 모든 멤버를 제거합니다.
  - 두 번째 객체에 첫 번째 객체의 멤버와 일치하는 키를 가진 멤버가 있는 경우, `JSON_MERGE_PATCH()`는 첫 번째 객체의 값을 두 번째 객체의 값으로 *대체*하는 반면, `JSON_MERGE_PRESERVE()`는 두 번째 값을 첫 번째 값에 *추가*합니다.

  이 예시는 각각 일치하는 키 `"a"`를 가진 동일한 3개의 JSON 객체를 이러한 각 함수로 병합한 결과를 비교합니다:

  ```
  mysql> SET @x = '{ "a": 1, "b": 2 }',
       >     @y = '{ "a": 3, "c": 4 }',
       >     @z = '{ "a": 5, "d": 6 }';

  mysql> SELECT  JSON_MERGE_PATCH(@x, @y, @z)    AS Patch,
      ->         JSON_MERGE_PRESERVE(@x, @y, @z) AS Preserve\G
  *************************** 1. row ***************************
     Patch: {"a": 5, "b": 2, "c": 4, "d": 6}
  Preserve: {"a": [1, 3, 5], "b": 2, "c": 4, "d": 6}
  ```

  `JSON_MERGE()`는 여전히 `JSON_MERGE_PRESERVE()`의 별칭으로 지원되지만, 이제 사용 중단되었으며 향후 MySQL 버전에서 제거될 수 있습니다.

    자세한 내용은 [JSON 값을 수정하는 함수](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-modification-functions.html)를 참조하십시오. (Bug #81283, Bug #23255346, WL #9692)
- `InnoDB`는 이제 시스템 부하가 높은 경우 트랜잭션 잠금 해제를 스케줄링하는 데 Variance-Aware Transaction Scheduling (VATS)을 사용하며, 이는 lock sys wait mutex 경합을 줄이는 데 도움이 됩니다. 잠금 스케줄링은 lock wait queue에서 >= 32개의 스레드가 일시 중단된 경우 VATS를 사용합니다.

  VATS에 대한 자세한 내용은 [Identifying the Major Sources of Variance in Transaction Latencies: Towards More Predictable Databases](https://arxiv.org/pdf/1602.01871.pdf)를 참조하십시오.

  기여해 주신 Jiamin Huang에게 감사드립니다. (Bug #25290971, Bug #84266, WL #10793)
- MySQL은 이제 필요에 따라 외래 키 제약 조건으로 관련된 테이블까지 메타데이터 잠금을 확장합니다. 메타데이터 잠금을 확장하면 관련 테이블에서 충돌하는 DML 및 DDL 작업이 동시에 실행되는 것을 방지합니다. 이 기능은 또한 부모 테이블이 수정될 때 외래 키 메타데이터를 업데이트할 수 있게 합니다. 이전에는 자식 테이블이 소유하는 외래 키 메타데이터를 안전하게 업데이트할 수 없었습니다.

  테이블이 [`LOCK TABLES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/lock-tables.html)로 명시적으로 잠긴 경우, 외래 키 제약 조건으로 관련된 모든 테이블은 이제 암시적으로 열리고 잠깁니다. 외래 키 검사에서는 관련 테이블에 대해 공유 읽기 전용 잠금([`LOCK TABLES READ`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/lock-tables.html))이 설정됩니다. cascading 업데이트에서는 작업에 관련된 테이블에 대해 shared-nothing 쓰기 잠금([`LOCK TABLES WRITE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/lock-tables.html))이 설정됩니다.

  외래 키 관계에 있는 테이블에 대해 [`LOCK TABLES`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/lock-tables.html)가 활성 상태인 경우, 해당 테이블에는 [`ALTER TABLE... RENAME`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html)이 허용되지 않습니다. 이는 임시 제한 사항이며, MySQL 8.0.4에서 Bug #26647340에 대한 패치로 해제되었습니다. (WL #6049)

- 바이너리 로그 만료 기간을 일 단위로 지정하는 [`expire_logs_days`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_expire_logs_days) 시스템 변수는 이제 사용 중단되었으며 향후 MySQL 버전에서 제거될 예정입니다. [`expire_logs_days`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_expire_logs_days)는 바이너리 로그 만료 기간을 정의하는 데 충분한 유연성을 제공하지 않습니다.

  [`binlog_expire_logs_seconds`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_expire_logs_seconds)를 사용하여 바이너리 로그 만료 기간을 초 단위로 설정할 수 있습니다. MySQL 8.0.3에서는 두 변수의 효과가 현재 누적됩니다. 예를 들어 [`expire_logs_days`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_expire_logs_days)가 1이고 [`binlog_expire_logs_seconds`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_expire_logs_seconds)가 43200이면, 바이너리 로그는 1.5일마다 제거됩니다. 이는 [`binlog_expire_logs_seconds`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_expire_logs_seconds)를 129600으로 설정하고 [`expire_logs_days`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_expire_logs_days)를 0으로 설정하는 것과 동일한 결과를 생성합니다. [`expire_logs_days`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_expire_logs_days)를 지정하지 않으면 기본 [`expire_logs_days`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_expire_logs_days) 설정인 30일이 현재 바이너리 로그 만료 기간에 추가된다는 점에 유의하십시오. [`binlog_expire_logs_seconds`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_expire_logs_seconds)만 사용하려면 [`expire_logs_days=0`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_expire_logs_days)을 명시적으로 설정하십시오.

  바이너리 로그의 자동 제거를 비활성화하려면 [`expire_logs_days`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_expire_logs_days)와 [`binlog_expire_logs_seconds`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_expire_logs_seconds)를 모두 명시적으로 0으로 설정해야 합니다. (WL #10924)

  참조: 다음도 참조하십시오: Bug #26483363.
- 새로운 유형의 백업 잠금은 온라인 백업 중 DML을 허용하는 동시에 일관되지 않은 스냅샷이 발생할 수 있는 작업을 방지합니다. 새 백업 잠금은 [`LOCK INSTANCE FOR BACKUP`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/lock-instance-for-backup.html) 및 [`UNLOCK INSTANCE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/lock-instance-for-backup.html) 문법에서 지원됩니다. 이러한 구문을 사용하려면 [`BACKUP_ADMIN`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/privileges-provided.html#priv_backup-admin) 권한이 필요합니다. (WL #9451)

## 수정된 버그

- **호환되지 않는 변경; JSON:** JSON 객체에 동일한 키 이름을 가진 멤버가 여러 개 포함된 경우, MySQL은 첫 번째 멤버를 유지하고 나머지는 버렸습니다. 이는 중복 키 이름을 여기 나열된 방법 중 하나로 처리할 수 있다고 제안하는 RFC 7159와 모순됩니다:

  - 오류를 보고합니다(또는 그 밖의 방식으로 객체 파싱에 실패합니다).
  - 중복을 포함하여 모든 이름-값 쌍을 보고합니다.
  - 마지막 이름-값 쌍만 보고합니다.

  JSON 텍스트가 JavaScript에서 평가될 때 동일한 이름을 가진 쌍이 여러 개 지정되면 마지막 이름-값 쌍이 유지됩니다. 이제 MySQL도 동일하게 동작하며, 다음과 같이 방금 나열한 세 가지 옵션 중 마지막 옵션을 구현합니다:

  ```
  mysql> CREATE TABLE t1 (c1 JSON);

  mysql> INSERT INTO t1 VALUES ('{"x": 17, "x": "red", "x": [3, 5, 7]}');

  mysql> SELECT c1 FROM t1;
  +------------------+
  | c1               |
  +------------------+
  | {"x": [3, 5, 7]} |
  +------------------+
  ```

  이 문제에 대한 수정은 또한 MySQL 8.0 서버에서 여러 동일한 키의 값으로 JSON 배열을 포함하는 데이터를 JSON 컬럼에 삽입하지 못하던 실패도 바로잡습니다. (Bug #86620, Bug #86866, Bug #26238736, Bug #26369555)

- **Performance; JSON:** JSON 문자열의 표현을 생성할 때 이제 가장 일반적인 경우, 즉 처리할 문자열에 이스케이프해야 하는 특수 문자가 없는 경우에 맞게 최적화하여, 문자열에서 첫 번째 특수 문자를 스캔하고, 이전처럼 각 문자를 차례로 검사하여 이스케이프해야 하는지 확인하고, 해당하는 경우 이스케이프한 다음 하나씩 복사하는 대신, 이스케이프가 필요 없는 각 문자 시퀀스를 단일 `memcpy()` 호출로 복사합니다.

  이 수정 사항은 제어 문자 `\u001f`, 즉 단위 구분자 문자를 이스케이프하지 못하던 문제도 수정합니다. (Bug #86898, Bug #26388690, Bug #87722, Bug #26780307)

  참조: 다음도 참조하십시오: Bug #25977595.
- **InnoDB:** `ON UPDATE` 및 `ON DELETE` 외래 키 절의 기본값이 `RESTRICT`에서 `NO ACTION`으로 변경되었습니다. `NO ACTION`은 MySQL에서 `RESTRICT` 키워드와 동등한 표준 SQL 키워드입니다. (Bug #30186407, Bug #96466)

  ," I think I can go with "외래 키 레코드." Then for "file-per-table tablespaces," "file
  -per-table 테이블스페이스" seems fitting. The term "in-place upgrade" can be translated as
 "인플레이스 업그레이드." Lastly, "precision type mismatch" should be fine as it is. I want
 to make sure everything is formal and accurate!**Translating technical terms**

- **InnoDB:** 내부 부모 및 자식 테이블 이름의 파일 이름 인코딩으로 인해 이름이 허용된 길이를 초과하여, [`INFORMATION_SCHEMA.INNODB_SYS_FOREIGN`](https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/information-schema-innodb-sys-foreign-table.html) 테이블에서 외래 키 레코드가 누락되었습니다. (Bug #27020089)
- **InnoDB:** `ALTER TABLE`, `DROP TABLE`, `DROP DATABASE` 작업을 실행할 때 긴 세마포어 대기가 발생했습니다. (Bug #26779650)
- **InnoDB:** 테이블스페이스 가져오기와 관련된 함수에서 유효하지 않은 오류 처리 코드가 제거되었습니다. (Bug #26595476)
- **InnoDB:** MySQL 5.6 이전에 생성된 file-per-table 테이블스페이스가 MySQL 8.0.2로의 인플레이스 업그레이드 중 실패를 발생시켰습니다. 해당 테이블스페이스는 요구되는 대로 `InnoDB` `SYS_TABLESPACES` 시스템 테이블에 등록되지 않았습니다.

  MySQL 5.5 이전에 생성된 decimal 컬럼이 있는 테이블도 정밀도 타입 불일치로 인해 MySQL 8.0.2로의 인플레이스 업그레이드 중 실패를 발생시켰습니다. (Bug #26542296, Bug #87229)
- **InnoDB:** MySQL 설치 중 외래 키 제약 조건 시스템 테이블 생성에 관한 불필요한 경고가 보고되었습니다. (Bug #26483335)

- **InnoDB:** 동시 [`ALTER TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 작업 중 보조 인덱스 항목 수 불일치로 인해 쿼리가 중단되었습니다. (Bug #26381213)
- **InnoDB:** strict 모드가 비활성화된 상태에서 충돌하는 `TABLESPACE` 및 `COMPRESSION` 속성을 포함하도록 변경된 테이블을 열려고 시도할 때 segmentation fault가 발생했습니다. (Bug #26375851)
- **InnoDB:** TempTable 스토리지 엔진을 사용한 DML 작업 중 segmentation fault가 발생했습니다. (Bug #26363837)
- **InnoDB:** [`ALTER TABLE... REORGANIZE PARTITION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 작업 중 암시적 로우 형식 변환에서 유효하지 않은 assertion이 발생했습니다. (Bug #26326611)
- **InnoDB:** 암호화된 테이블을 다시 빌드한 [`ALTER TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 작업이 암호화 속성을 올바르게 설정하지 않았습니다. (Bug #26243264)
- **InnoDB:** 인메모리 내부 임시 테이블에 `TempTable` 스토리지 엔진을 사용할 때 Windows에서 메모리 누수가 발생했습니다. (Bug #26237680)

- **InnoDB:** Valgrind 테스트가 활성화되지 않은 서버 빌드에서 Valgrind 테스트를 실행할 때 오해의 소지가 있는 오류가 생성되었습니다. (Bug #26037206)
- **InnoDB:** 고아 전체 텍스트 검색 테이블을 삭제하는 것과 관련된 문제가 있는 코드로 인해 시작 시 잘못된 객체 ID assertion 실패가 발생했습니다. (Bug #25998362)
- **InnoDB:** DML 작업 중 삭제된 파티션에 대한 검사가 첫 번째 파티션만 검사했습니다. 삭제된 다른 파티션을 검사하지 못해 assertion 실패가 발생했습니다. (Bug #25942592)
- **InnoDB:** 할당된 메모리가 파일에 기록되기 전에 초기화되지 않아 Valgrind 오류가 발생했습니다. (Bug #25913151, Bug #85986)
- **InnoDB:** 동일한 문에서 가상 컬럼과 인덱스를 추가하면 오류가 발생했습니다. (Bug #25899959)
- **InnoDB:** 많은 파티션이 있는 테이블에서 대규모 업데이트 작업 중 슬레이브 인스턴스에서 복제 지연이 발생했습니다. (Bug #25687813, Bug #85352)
- **InnoDB:** 끝 범위 비교 중 실패가 발생했습니다. (Bug #25669686)

- **InnoDB:** 읽기 전용 모드에서 [`innodb_buffer_pool_load_now`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_buffer_pool_load_now) 설정을 활성화하지 못했습니다. 버퍼 풀 로드 스레드에 신호를 보내는 이벤트가 초기화되지 않았습니다. (Bug #25586766)
- **InnoDB:** 다중 버전 동시성 제어 로우 검색 함수의 커서 위치 검사가 어설션을 발생시켰습니다. (Bug #25377592)
- **InnoDB:** 잘못된 변수가 `row_mysql_handle_errors` 루틴에 전달되어 어설션 실패가 발생했습니다. (Bug #25183130)
- **InnoDB:** 전체 텍스트 검색 동기화 작업이 보유한 딕셔너리 작업 잠금을 오래 기다리면서 서버 종료가 발생했습니다. (Bug #24938374, Bug #26376681, Bug #26376239)
- **InnoDB:** 한 트랜잭션이 커밋 작업 전에 동일한 레코드에서 암시적 잠금을 명시적 잠금으로 변환하는 동안, 다른 트랜잭션이 해당 레코드에 대한 명시적 잠금을 획득하려고 시도할 가능성을 고려하도록 어설션 코드가 수정되었습니다. (Bug #24344131)

- **InnoDB:** 암호화되었거나 페이지 압축된 테이블에 대한 [`FLUSH TABLES... FOR EXPORT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/flush.html#flush-tables-for-export-with-list) 작업에서 assertion이 발생했습니다. (Bug #22916982)
- **InnoDB:** [`innodb_force_recovery`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_force_recovery) 설정이 0보다 큰 경우 [`DROP TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-table.html) 작업이 허용되지 않았습니다. (Bug #22392152)
- **InnoDB:** 새로 생성된 테이블이 트랜잭션이 커밋되기 전에 삭제된 경우 [`CREATE TABLE... SELECT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html) 작업에서 assertion failure가 발생했습니다. (Bug #22154768)

- **InnoDB:** 테이블을 다시 빌드하고 외래 키 제약 조건 이름을 지정하지 않고 외래 키를 추가한 in-place [`ALTER TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html) 작업이 중복 제약 조건 이름으로 인해 실패했습니다. `InnoDB`는 기존 외래 키 제약 조건 이름을 고려하지 않았습니다. 이 문제는 외래 키 메타데이터가 데이터 딕셔너리로 이동되고 외래 키 제약 조건 이름 생성이 SQL 레이어로 이동된 MySQL 8.0.3에서 해결되었습니다. (Bug #18199504, Bug #71616)
- **InnoDB:** 외래 키 검사 중 `InnoDB` 데이터 딕셔너리를 잠그는 잘못 배치된 함수 호출이 제거되었습니다. (Bug #12917178, Bug #62221)
- **InnoDB:** 기존 외래 키 제약 조건 이름을 사용하려고 시도할 때 보고되는 에러 메시지가 일관되지 않았으며 항상 충분한 정보를 제공하지 않았습니다. (Bug #11925430, Bug #60633)
- **Partitioning:** 특정 경우 힙 레코드를 가져올 때 파티션 ID가 0으로 설정될 수 있었습니다. (Bug #86255, Bug #26034430)

- **파티셔닝:** 파티셔닝된 [`InnoDB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-storage-engine.html) 테이블을 생성하지 못한 [`CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html) 문이 올바르게 롤백되지 않을 수 있었습니다. 이는 외래 키 정보 검사를 수행하는 동안 불필요한 커밋이 이루어졌기 때문입니다. 파티셔닝된 테이블은 현재 외래 키를 지원하지 않으므로, 이 검사는 불필요하며 따라서 이러한 경우 더 이상 수행되지 않습니다. (Bug #85299, Bug #25667278)
- **파티셔닝:** `LIST`로 파티셔닝된 테이블에서 `NULL`을 포함하는 쿼리가 항상 올바르게 처리되지는 않았습니다. (Bug #76418, Bug #20748521)

  참조: 다음도 참조하십시오: Bug #86255, Bug #26034430.

- **Replication; Group Replication:** Group Replication과 비동기 복제가 동시에 실행 중인 멤버에서, 비동기 복제가 [`InnoDB`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-storage-engine.html) 스토리지 엔진만 사용해야 하는 요구 사항, 테이블에 프라이머리 키가 필요하다는 요구 사항 등 Group Replication이 부과하는 제한을 준수하지 않았습니다. 이는 해당 멤버에 대해 **mysqlbinlog**를 실행할 때도 발생할 수 있었습니다. 이제 Group Replication과 비동기 복제를 실행하는 멤버는 Group Replication 요구 사항이 위반되는 것을 허용하지 않습니다. (Bug #85164, Bug #25609945)

  참조: 다음도 참조하십시오: Bug #85781, Bug #25828806.
- **Replication:** 멀티스레드 슬레이브에서 릴레이 로그가 사용하는 디스크 공간 레코드에 대한 업데이트 타이밍으로 인해 데드락 상태가 발생할 수 있었습니다. 이제 데드락이 발생할 수 없도록 업데이트 타이밍이 변경되었습니다. (Bug #26729635)

- **Replication:** [`slave_preserve_commit_order=1`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-replica.html#sysvar_slave_preserve_commit_order)이 설정된 경우, 테이블에 대한 공유 쓰기 잠금을 보유한 트랜잭션과 커밋 순서에서 더 앞에 있으면서 공유 쓰기 잠금도 필요로 하는 트랜잭션 사이에 데드락이 발생할 수 있었습니다. (Bug #26666609)
- **Replication:** 사용되지 않는 변수 `opt_reckless_slave`가 제거되었습니다. (Bug #26500285)
- **Replication:** [`FLUSH LOGS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/flush.html#flush-logs)는 커밋 단계 중에 이미 오류 응답을 보낸 후 OK 메시지 전송을 시도했습니다. 패치를 제공해 준 Laurynas Biveinis에게 감사드립니다. (Bug #26272158, Bug #25363745, Bug #84437)
- **Replication:** 인시던트 로그 이벤트에 대해 생성된 GTID가 있는 경우, MySQL 오류 코드 1590(ER_SLAVE_INCIDENT)을 복제 슬레이브에서 `--slave-skip-errors=1590` 시작 옵션을 사용하여 건너뛸 수 없었습니다. (Bug #26266758)

- **Replication:** 복구 중인 멤버에서 [`group_replication_recovery_complete_at="transactions_certified"`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_recovery_complete_at)인 경우 `COUNT_TRANSACTIONS_REMOTE_IN_APPLIER_QUEUE`가 잘못된 값으로 설정되었습니다. (Bug #26180350)
- **Replication:** 인덱스가 있는 파티셔닝된 테이블을 복제할 때, [`slave_rows_search_algorithms`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-replica.html#sysvar_slave_rows_search_algorithms) 설정의 일부로 `HASH_SCAN`이 지정된 복제 슬레이브에서 슬레이브 I/O 스레드가 때때로 `HA_ERR_KEY_NOT_FOUND` 오류와 함께 중지되었습니다. (Bug #26137159)
- **Replication:** 내부 서버 사용을 위한 시스템 변수 [`pseudo_slave_mode`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_pseudo_slave_mode)는 트랜잭션 내부에서 변경될 때 때때로 assertion을 발생시켰습니다. 서버는 더 이상 트랜잭션 내부에서 이 변수를 변경하지 않습니다. (Bug #26034192, Bug #86250)

- **Replication:** 복제 슬레이브가 병렬화를 위해 write set을 사용하는 경우(`binlog_transaction_dependency_tracking` 시스템 변수로 지정됨), 이제 빈 트랜잭션이 무시되며 relay log rotation 처리가 최적화되었습니다. (Bug #25982097)
- **Replication:** Performance Schema [`replication_applier_status_by_worker`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-replication-applier-status-by-worker-table.html) 테이블은 worker 스레드가 중지되기 전에 테이블이 채워지고 있었기 때문에, 비활성 worker에 대해 APPLYING_TRANSACTION 값을 잘못 표시하는 경우가 있었습니다. (Bug #25896166, Bug #85951)
- **Replication:** [`START GROUP_REPLICATION`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/start-group-replication.html)이 실행되는 동안 플러그인 제거를 시도하면 예기치 않은 동작이 발생할 수 있었습니다. (Bug #25423650, Bug #91042, Bug #28088177)

- **Replication:** 여러 슬레이브 applier worker 스레드를 생성하는 동안 실패가 발생한 경우, 일부 스레드가 고아 상태로 남고 해당 리소스가 수거되지 않았습니다. 이 버그 수정에 기여해 주신 Laurynas Biveinis에게 감사드립니다. (Bug #24679056, Bug #82980)
- **Replication:** [`binlog_checksum`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_checksum) 옵션은 트랜잭션 내에서 변경할 수 없습니다. MySQL은 요청된 함수가 바이너리 로그에서 수행되는 동안, 트랜잭션 내부에서 요구되는 것처럼 이 구문을 로그에 기록할 수 없습니다. (Bug #22914463)

- **Replication:** [`group_replication_force_members`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_force_members)는 그룹이 정상적으로 작동하는 상황, 즉 과반수에 도달할 수 있는 상황에서 사용될 수 있었습니다. 이러한 잘못된 사용은 그룹의 불안정을 유발할 수 있었습니다. 따라서 이 변수의 사용은 생성 목적에 해당하는 시나리오, 즉 구성원의 과반수에 도달할 수 없을 때 이전 그룹 멤버십의 하위 집합으로부터 새 멤버십을 구성하는 경우로 제한되었습니다. (Bug #86359, Bug #26093967)
- **Replication:** 더 낮은 버전을 실행하는 구성원을 더 높은 버전을 실행하는 그룹에 조인하면, 더 높은 버전을 실행하는 구성원에 도달할 수 없게 되었습니다. (Bug #85026, Bug #25568493)
- **Group Replication:** 이제 Group Replication 흐름 제어 변수는 그룹 내 일부 구성원이 흐름 제어 메커니즘의 최소 처리량에 영향을 주지 않도록 올바르게 허용하며, 해당 구성원이 차단되는 경우 실질적으로 해당 구성원을 무시합니다. (Bug #26537497)

- **Group Replication:** Group Replication 플러그인의 지연 초기화 스레드가 사용할 수 없는 리소스로 인해 시작되지 못했을 때, 잠긴 mutex가 남아 있었습니다. 이제 이 스레드가 시작되지 않을 때 이 mutex가 잠금 해제되도록 보장합니다. (Bug #26394678)
- **Group Replication:** single-primary 모드로 배포된 Group Replication 플러그인의 지연 초기화의 경우, secondary가 비동기 복제 채널을 통해 쓰기를 받을 수 있었으며, 이는 Group Replication 플러그인의 일반 초기화에서는 허용되지 않습니다. (Bug #26314756)
- **Group Replication:** 옵션 파일에 Group Replication 관련 설정이 포함된 경우 서버가 시작 시 예기치 않게 중지될 수 있었습니다. (Bug #26314472)

- **Group Replication:** [`group_replication_recovery_use_ssl`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_recovery_use_ssl) 및 [`group_replication_recovery_ssl_verify_server_cert`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_recovery_ssl_verify_server_cert)의 값이 Group Replication 복구 채널에 대해 설정되었을 때 업데이트되지 않았습니다. (Bug #26142801)

- **Group Replication:** [`server_uuid`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options.html#sysvar_server_uuid)를 [`group_replication_group_name`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_group_name)과 같은 값으로 설정할 수 있었으며, 이로 인해 GTID가 UUID로 식별되므로 예기치 않은 동작이 발생했습니다. 이 문제를 수정하기 위해 [`server_uuid`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options.html#sysvar_server_uuid)를 [`group_replication_group_name`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/group-replication-system-variables.html#sysvar_group_replication_group_name)과 같은 값으로 설정하는 것은 더 이상 허용되지 않습니다. (Bug #26035931)
- **Group Replication:** Group Replication 흐름 제어 옵션에 유효하지 않은 값을 사용하여 서버를 시작할 수 있었습니다. 이제 `--group-replication-flow-control-min-quota`, `--group-replication-flow-control-max-quota`, `--group-replication-flow-control-min-recovery-quota` 옵션은 서버 시작 시 검증됩니다. (Bug #87206, Bug #26531899)

- **Group Replication:** Group Replication 멤버에 대해 호스트 이름 해석이 작동하지 않은 경우, 연결을 시도할 때 반환되는 오해의 소지가 있는 오류가 호스트 이름 해석의 실제 문제가 아니라 자격 증명을 언급했습니다. (Bug #86858, Bug #26368004)
- **Group Replication:** Group Replication 플러그인은 단일 프라이머리 모드가 활성 상태일 때 더 이상 [`auto_increment_increment`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-source.html#sysvar_auto_increment_increment) 및 [`auto_increment_offset`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-source.html#sysvar_auto_increment_offset)을 설정하지 않습니다. (Bug #86669, Bug #26263155)
- **Group Replication:** Group Replication 파티션 스레드가 Performance Schema에 표시되지 않았습니다. (Bug #86626, Bug #26241008)
- **JSON:** JSON 객체 및 배열의 내부 표현(`Json_object` 및 `Json_array`)에 있는 컨테이너가 `Json_dom`에 대한 원시 포인터가 아니라 스마트 포인터를 사용하도록 변경되어, 이제 고아 DOM 객체가 자동으로 삭제됩니다. (Bug #26161264)

- **JSON:** JSON 문서가 문자열로 포맷될 때(예: `CAST('"\u001f"' AS JSON`에 의해) JSON 문서 내 문자열 리터럴의 ASCII 문자 31(`\u001f`, 단위 구분자)이 따옴표 처리되지 않았습니다. (Bug #25977959)
- **JSON:** *`path_expression`*이 배열이 아닌 값을 식별할 때, [`JSON_INSERT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-modification-functions.html#function_json-insert) 및 [`JSON_ARRAY_INSERT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-modification-functions.html#function_json-array-insert) 함수가 *`path_expression`*[0]을 *`path_expression`*과 같은 것으로 평가하지 못했습니다. (Bug #86213, Bug #26022576)
- **JSON:** 와일드카드를 사용한 [`JSON_EXTRACT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-search-functions.html#function_json-extract) 검색에 과도한 시간이 걸렸습니다. (Bug #84523, Bug #25418534)

  참조: 다음도 참조하십시오: Bug #83959, Bug #25151440.
- 부하가 높은 상황에서 Performance Schema 버퍼 컨테이너 코드에서 무한 루프가 발생했습니다. (Bug #26666274)

- `mysql.h` 헤더 파일이 포함된 경우, `uchar` 및 `my_bool` 같은 MySQL 특정 typedef가 클라이언트 네임스페이스에 의도치 않게 다시 도입되었습니다. (Bug #26588846, Bug #26582752, Bug #87337)
- `uint8korr()` 및 관련 매크로가 x86에서도 명시적으로 정렬되지 않은 접근을 수행하도록 수정되었습니다. (Bug #26568748, Bug #87298)
- `main.mysql_upgrade_grant,``main.roles-upgrade` 및 `auth_sec.secure_file_priv_warnings` 테스트 케이스가 에러 로그를 잘못 처리했습니다. `sys_vars.innodb_redo_log_encrypt_basic` 테스트 케이스 출력이 불안정했습니다. 패치를 제공해 준 Laurynas Biveinis에게 감사드립니다. (Bug #26562401, Bug #87279, Bug #26575150, Bug #87313, Bug #26575142, Bug #87314, Bug #26582158, Bug #87303)
- 디버그 빌드에서 [`sql_buffer_result`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_sql_buffer_result)가 활성화된 경우, 재귀 공통 테이블 표현식이 서버 종료를 유발했습니다. (Bug #26556025)
- 윈도우 함수가 상수 함수로 잘못 해석되면 서버 종료가 발생할 수 있었습니다. (Bug #26500442)
- 윈도우 함수의 경우, `GROUP BY... WITH ROLLUP` 사용이 서버 종료를 유발할 수 있었습니다. (Bug #26497353, Bug #26497247)

- 윈도우 함수의 경우 [`JSON`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json.html) 컬럼에서 assertion이 발생했습니다. (Bug #26496733)
- 윈도우 함수의 경우 `RANGE` 프레임의 인수보다 작은 값으로 인해 서버가 종료되었습니다. (Bug #26496645)
- `-DWITHOUT_SERVER=1`로 컴파일하면 `my_dir.h`에 대한 `#include`가 누락되어 `my_symlink.c` 컴파일 실패가 발생했습니다. 패치를 제공해 준 Christian Hesse에게 감사드립니다. (Bug #26495816, Bug #87137)
- [`-DWITH_SSL=system`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_with_ssl) [`-DWITH_ZLIB=system`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_with_zlib)로 컴파일하면 시스템 **openssl zlib** 명령을 사용할 수 있다고 가정했지만, 그렇지 않을 수 있었습니다. 이제 해당 명령의 사용 가능 여부를 확인하며, 사용할 수 없으면 **zlib_decompress** 유틸리티가 빌드됩니다. (Bug #26494495, Bug #87123)
- yaSSL이 TLS 암호화 스위트 협상을 잘못 수행할 수 있었습니다. (Bug #26482173)

- 일부 [`thread_stack`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_thread_stack) 설정은 서버 종료를 초래할 수 있었습니다. (Bug #26438067)
- 윈도우 함수의 경우, `ROW` 프레임이 로우 개수에 대해 정수가 아닌 인수를 허용했습니다. (Bug #26411055, Bug #86990)
- `REPLACE(UUID(),...)` 표현식이 캐시되어(부적절하게) 결과 세트의 각 로우에 대해 동일한 값을 반환할 수 있었습니다. (Bug #26395601)
- 소스 트리 내에서 MySQL을 빌드할 때 **make install**이 일부 `CMake` 파일을 트리 내의 `mysql-test` 디렉터리에 설치했습니다. (Bug #26385175, Bug #86905)
- Performance Schema [`session_connect_attrs`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-session-connect-attrs-table.html) 및 [`session_account_connect_attrs`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-session-account-connect-attrs-table.html) 테이블의 `PROCESS_ID` 컬럼은 더 큰 프로세스 ID 값을 수용하기 위해 `INT`에서 `BIGINT UNSIGNED`로 변경되었습니다. 패치를 제공해 주신 Daniël van Eeden에게 감사드립니다. (Bug #26357806, Bug #86835)

- [`JSON_EXTRACT()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-search-functions.html#function_json-extract)에서 값이 생성된 생성 컬럼의 인덱스가 사용되어야 하는 경우에도 optimizer에서 때때로 사용되지 않았습니다. (Bug #26352119)
- [`log_error_services`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_log_error_services) 시스템 변수를 `NULL`로 설정하면 서버가 종료되었습니다. (Bug #26331795)
- **tar** 파일 패키지의 경우 일부 테스트 스위트 공유 라이브러리가 테스트 패키지가 아니라 서버 패키지에 설치되었습니다. (Bug #26329850)
- 유효한 뷰에 대한 [`SHOW COLUMNS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-columns.html)가 실패할 수 있었습니다. (Bug #26322203, Bug #86778)
- 히스토그램 통계의 이름 변경 또는 제거를 일으키는 작업이 서버 종료를 유발할 수 있었습니다. (Bug #26303972)
- `VARCHAR` 컬럼의 경우 명시적 콜레이션(`ORDER BY col_name COLLATE collation_name`)을 사용한 정렬이 암시적 콜레이션(`COLLATE` 절 없음)을 사용한 경우보다 훨씬 느렸으며, 명시적 콜레이션이 암시적 콜레이션과 동일한 경우에도 그러했습니다. (Bug #26286790, Bug #86710)

- `SET binlog_format = ROW`는 `ROW`가 이제 예약어이기 때문에 문법 오류를 생성했습니다. 이 문법은 이제 하위 호환성을 유지하기 위해 특별히 인식됩니다. (Bug #26269280)
- `SET PERSIST_ONLY`는 `SYSTEM_VARIABLES_ADMIN` 및 `PERSIST_RO_VARIABLES_ADMIN` 권한을 가진 사용자에게만 허용되어야 하지만, `SUPER` 권한을 가진 사용자에게도 잘못 허용되었습니다. (Bug #26247864)
- MySQL 8.0.0에서 도입된 `information_schema_stats` 설정 옵션이 제거되고 [`information_schema_stats_expiry`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_information_schema_stats_expiry)로 대체되었습니다.

  [`information_schema_stats_expiry`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_information_schema_stats_expiry)는 캐시된 [`INFORMATION_SCHEMA`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema.html) 테이블 통계에 대한 만료 설정을 정의합니다. 자세한 내용은 [INFORMATION_SCHEMA 쿼리 최적화](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-optimization.html)를 참조하십시오.

  `TABLES_DYNAMIC` 및 `STATISTICS_DYNAMIC` 내부 시스템 뷰가 제거되었습니다. (Bug #26203731, Bug #83957)

- Debian 플랫폼용 소스 패키지에 미리 빌드된 디버그 바이너리가 포함되어 있어, 해당 바이너리가 빌드된 아키텍처가 아닌 다른 아키텍처에서 빌드 실패가 발생했습니다. (Bug #26186911)
- 로드 가능한 함수 등록 서비스는 서버 시작 중에 사용되는 경우 작동하지 않았습니다. (Bug #26173244)
- Performance Schema [`setup_objects`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-setup-objects-table.html) 테이블 변경으로 테이블 인스트루멘테이션을 비활성화하면 인덱스 통계에서 잘못된 인덱스 이름이 발생할 수 있었습니다. (Bug #26162562)
- 존재하지 않는 테이블스페이스 파일을 삭제하려고 할 때 오해의 소지가 있는 오류 메시지가 반환되었습니다. (Bug #26133507, Bug #86438)
- [`--read-from-remote-server`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/mysqlbinlog.html#option_mysqlbinlog_read-from-remote-server) 옵션을 사용하여 **mysqlbinlog**를 실행할 때, [`--rewrite-db`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/mysqlbinlog.html#option_mysqlbinlog_rewrite-db) 옵션을 사용하여 지정된 재작성 규칙이 무시되어 데이터가 대상 데이터베이스에 기록되지 않았습니다. (Bug #26117735, Bug #86288)

- DDL 작업 중 데이터 딕셔너리 캐시에서 복사된 타임스탬프 데이터가 더 이상 유효하지 않은 `time_zone` 값을 사용하여 변환되었습니다. 그 결과 타임스탬프 데이터가 올바르지 않았으며, 릴리스 빌드에서는 오류가 발생하고 디버그 빌드에서는 assertion 실패가 발생했습니다. (Bug #26091333, Bug #86290)
- 데이터 딕셔너리 업데이트는 성공했지만 바이너리 로그 이벤트 쓰기에 실패하면 일관성 없는 상태가 발생할 수 있었습니다. (Bug #26037355)
- 이제 **mysqlbinlog**는 이벤트 타입 `Table_map_log_event`에 대한 전체 메타데이터를 출력합니다. (Bug #26020990)
- [`ALTER EVENT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-event.html) 문에서 일부 문자열 함수가 서버 종료를 유발할 수 있었습니다. (Bug #25942505)
- `daemon_memcached` 플러그인을 제거하면 심각한 오류가 발생했습니다. (Bug #25909540)
- common table expression과 많은 `?` 파라미터를 사용하는 prepared statement가 느릴 수 있었습니다. (Bug #25903274, Bug #85933)

- `ORDER BY... LIMIT` 절이 있는 [`UPDATE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/update.html) 또는 [`DELETE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/delete.html) 문에서 Optimizer가 `filesort`보다 비용이 낮은 정렬 방법을 식별하지 못하는 경우가 있었습니다. (Bug #25899921)
- `rpl_diff.inc` 테스트 케이스 파일이 서버 간 데이터 차이를 찾지 못했습니다. 패치를 제공해 주신 Yura Sorokin에게 감사드립니다. (Bug #25860138, Bug #85838)
- ngram fulltext parser 검색 쿼리가 잘못된 결과를 반환하고 assertion을 발생시켰습니다. (Bug #25851975)
- 인덱스 virtual generated column, 외래 키, 트리거의 조합으로 인해 assertion이 발생할 수 있었습니다. (Bug #25817660, Bug #85757)
- 뷰에서 선택할 때 materialization이 활성화된 경우와 materialization이 비활성화된 경우 서로 다른 결과가 생성될 수 있었습니다. (Bug #25782811, Bug #85622)

- [`SET PERSIST`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/set-variable.html)를 사용하여 [`event_scheduler`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_event_scheduler) 시스템 변수를 설정한 후, [`--skip-grant-tables`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-options.html#option_mysqld_skip-grant-tables) 옵션으로 시작한 경우 서버가 다시 시작되지 않았습니다. (Bug #25776940)
- 디버그 빌드의 경우, 외래 키 관계가 있는 테이블에 인덱스를 추가하면 어설션이 발생할 수 있었습니다. (Bug #25739983)
- 시스템 테이블에 대한 [`MIN()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/aggregate-functions.html#function_min)/[`MAX()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/aggregate-functions.html#function_max) 액세스에서 어설션이 발생할 수 있었습니다. (Bug #25738624)
- [`INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-referential-constraints-table.html) 테이블이 데이터 딕셔너리 대신 `InnoDB` 스토리지 엔진에서 외래 키 정보를 요청했습니다. (Bug #25730513)

- 실패한 [`DROP VIEW`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/drop-view.html)가 바이너리 로그에 기록될 수 있었습니다. (Bug #25680097)
- [`SHOW CREATE VIEW`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-create-view.html)는 원래 뷰 정의에 없던 데이터베이스 이름 접두사를 테이블 이름에 추가하는 경우가 있었습니다. (Bug #25634576, Bug #85176)
- Performance Schema [`variables_info`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-variables-info-table.html) 테이블은 `!include` 또는 `!includedir` 지시문으로 지정된 옵션 파일 내에서 설정된 변수에 대해 잘못된 `VARIABLE_SOURCE` 및 `VARIABLE_PATH` 값을 표시했습니다. (Bug #25563891)
- UCA 기반 콜레이션에 대해 상수 문자열 전파가 실패할 수 있었습니다. (Bug #25503965, Bug #84837)
- **mysqlpump**는 덤프된 테이블 수에 대한 잘못된 진행 정보를 표시했습니다. (Bug #25432850)
- UCA 9.0.0 콜레이션에 대한 계산은 contraction 문자가 포함된 tailoring 규칙에 대해 비효율적이었습니다. (Bug #25426632, Bug #84577, Bug #25426632, Bug #84577)

- [`DECIMAL`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/fixed-point-types.html) 값에 대한 `GROUP BY DESC`가 `NULL`을 non-`NULL` 값과 함께 잘못 그룹화할 수 있었습니다. (Bug #25407964, Bug #84537)
- 일부 **mysqldump** 경고가 표준 에러 출력이 아니라 표준 출력으로 이동하여 결과적으로 덤프 파일에 기록되었습니다. (Bug #25380000, Bug #82992)
- `GROUP BY.. WITH ROLLUP` 절이 있는 뷰에서 prepared statement를 실행할 때, `WITH ROLLUP`의 결과로 생성된 `NULL` 값이 이전 로우의 값으로 대체되었습니다. (Bug #25174118)
- 전체 텍스트 검색 결과가 [`innodb_ft_result_cache_limit`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_ft_result_cache_limit) 설정을 초과할 때 서버 에러가 발생했습니다. 이 버그에 대한 패치는 관련 패치도 백포트합니다(Bug #21140111). (Bug #25033538)
- MySQL 8.0.1의 파서 리팩터링으로 인해 일부 `INSERT... ON DUPLICATE KEY UPDATE` 문이 잘못 처리되었습니다. 이러한 문제는 수정되었습니다. (Bug #24716127, Bug #25526439, Bug #25071305)

- 디버그 빌드에서, 16진수 형식의 기본값을 가지는 [`VARBINARY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/binary-varbinary.html) 또는 [`BINARY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/binary-varbinary.html) 컬럼이 포함된 [`CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html) 문은 서버 종료를 발생시켰습니다. (Bug #24679166, Bug #83020)
- 스토어드 함수가 optimizer에 의해 상수로 간주된 경우, `WHERE` 절의 `NOT IN` 조건에서 해당 함수를 서브쿼리로부터 호출하면 서버 종료가 발생할 수 있었습니다. (Bug #23577867)
- **mysqldump** 메모리 누수가 수정되었습니다. 패치를 제공한 Yura Sorokin에게 감사드립니다. (Bug #23531150, Bug #81714)
- 쿼리가 Batched Key Access 최적화를 사용하고 가상 생성 컬럼이 조인 버퍼의 일부인 경우, 잘못된 결과 또는 서버 종료가 발생할 수 있었습니다. (Bug #23169112)
- 세션이 savepoint로 롤백한 다음 종료된 경우, savepoint 지점까지의 문이 커밋될 수 있었습니다. (Bug #22350047, Bug #79596)

- MySQL은 외부 쿼리 블록에 정의된 집계 표현식의 별칭에 대한 참조를, 해당 참조가 의미 없는 GROUP BY 서브쿼리 내에서 발생한 경우에도 허용했습니다. (Bug #21974346, Bug #78785)
- Connector/Python을 사용하고 `sha256_password` 플러그인을 사용해 인증한 클라이언트의 경우, 서버가 연결을 잘못 처리할 수 있었습니다. (Bug #21421642)
- `GROUP BY`가 포함된 일부 `SELECT DISTINCT` 쿼리가 잘못된 결과를 반환할 수 있었습니다. (Bug #20692219, Bug #76283)
