---
title: "MySQL 8.0.34 릴리스 노트"
description: "MySQL 8.0.34 Community Server 릴리스 노트를 한국어로 번역하고, DBA가 참고해야 할 핵심 내용을 함께 정리하였습니다."
tags: [ MySQL, 릴리스노트 ]
image: "mysql-release-note.png"
author: "Oracle"
published: "2023-07-18"
updated: ""
source_url: "https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-34.html"
---

## DBA를 위한 핵심 내용

MySQL 8.0.34는 8.0 계열이 Innovation/LTS 분리 이후 버그 수정 중심으로 가는 구간의 릴리스로, DBA에게는 OpenSSL 3.0 전환, 대규모 deprecation, 복제/Group Replication/binlog 안정성 수정이 핵심입니다. Percona는 `mysqlpump`, `binlog_format`, `sync_relay_log_info` 등 여러 운영 관행의 사용 중단을 주요 변화로 요약했고, Jepsen은 MySQL 8.0.34의 `REPEATABLE READ` 및 AWS RDS MySQL 클러스터 격리 동작에 대해 별도 일관성 리스크를 제기했습니다. ([Percona](https://www.percona.com/blog/a-quick-peek-at-mysql-8-0-34-and-mysql-8-1-0/), [Jepsen](https://jepsen.io/blog/2023-12-19-mysql-8.0.34))

1. OpenSSL이 1.1.1에서 3.0.9로 전환되었습니다. TLS/FIPS 설정, 인증서 자동 생성, 오래된 암호군, 외부 커넥터 호환성에 영향이 있을 수 있으므로 운영과 동일한 TLS 정책으로 접속 테스트를 수행하십시오.
2. `mysqlpump`, `binlog_format`, `sync_relay_log_info`, `mysql_native_password`, keyring 플러그인, legacy audit filter, FIPS 관련 MySQL 옵션, C API 자동 재연결이 사용 중단되었습니다. 백업·복제·인증·키관리 자동화에서 경고 발생 여부와 대체 경로를 점검해야 합니다.
3. statement/mixed binary logging에서 row-based logging으로의 장기 전환을 준비하십시오. `binlog_format` 자체가 사용 중단되므로 신규 구성은 ROW 기준으로 표준화하고, 저장 함수·트리거·레거시 애플리케이션의 binlog 의존성을 검토하십시오.
4. 5.7에서 8.0.32/8.0.33으로 업그레이드할 때 deprecated redo log 변수 때문에 실패하던 문제가 다뤄졌습니다. 5.7 → 8.0 업그레이드 경로에서는 `innodb_redo_log_capacity` 전환과 중간 버전 절차를 명확히 문서화하십시오.
5. 압축 binlog가 1GiB 초과 이벤트를 만들어 binlog를 읽을 수 없게 되는 문제, `mysqlbinlog` 오류 은폐, `BACKUP_LOCK`과 binlog purge 상호작용, Group Replication view change 대기/kill 불응 문제가 수정되었습니다. 대용량 트랜잭션·온라인 백업·GR 환경은 반드시 복제 지연과 복구 리허설을 포함해야 합니다.
6. `connection_memory_chunk_size` 기본값이 8912에서 8192로 수정되고, AHI 해시 성능 악화, `LIKE '%...%'` 성능 저하, CTE/서브쿼리/window/JSON/Index Skip Scan의 오답·누락·서버 종료 문제가 다수 수정되었습니다. 쿼리 플랜 안정성이 중요한 서비스는 대표 SQL의 결과 일치성과 실행계획을 업그레이드 전후로 비교하십시오.

## 계정 관리 관련 사항

- 이제 새 password-validation 시스템 변수를 통해 사용자가 자신의 MySQL 계정 비밀번호를 교체하려고 할 때 변경해야 하는 최소 문자 수를 설정하고 적용할 수 있습니다. 이 새 검증 설정은 현재 비밀번호에 있는 전체 문자 수의 백분율입니다. 예를 들어, [`validate_password.changed_characters_percentage`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/validate-password-options-variables.html#sysvar_validate_password.changed_characters_percentage)의 값이 50이면, 교체 계정 비밀번호에 있는 문자 중 최소 절반은 현재 비밀번호에 없어야 하며, 그렇지 않으면 비밀번호가 거부됩니다.

  이 새 기능은 DBA가 비밀번호 관리를 더 완전하게 제어할 수 있도록 제공되는 여러 기능 중 하나입니다. 자세한 내용은 [Password Management](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/password-management.html)을 참조하십시오. (WL #15751)

## Audit Log 관련 사항

- MySQL 8.0.33에서 `audit_log` 플러그인은 JSON 필터 테이블을 저장하는 데 사용할 데이터베이스를 선택하는 지원을 추가했습니다. 이제 플러그인 설치 스크립트를 실행할 때 기본 시스템 데이터베이스인 `mysql`의 대안을 지정할 수 있습니다. 예를 들어, 명령줄에서 대체 데이터베이스 이름과 함께 [`audit_log_database`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/audit-log-reference.html#sysvar_audit_log_database) 서버 시스템 변수(또는 `-D database_name`)를 사용하십시오:

  ```
  $> mysql -u root -D database_name -p < audit_log_filter_linux_install.sql
  ```

  `audit_log` 플러그인 설치 스크립트 사용에 대한 추가 정보는 [Installing or Uninstalling MySQL Enterprise Audit](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/audit-log-installation.html)를 참조하십시오. (Bug #35252268)
- MySQL Enterprise Audit은 이제 scheduler 컴포넌트를 사용하여 인메모리 캐시를 플러시하는 반복 작업을 설정하고 실행하는 기능을 지원합니다. 설정 지침은 [Enabling the Audit Log Flush Task](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/audit-log-logging-configuration.html#audit-log-flush-task)를 참조하십시오. (WL #15567)

## Binary Logging

- 이제 개발자가 MySQL 서버 바이너리 로그에 액세스할 수 있도록 하는 여러 함수가 `libmysqlclient.so` 공유 라이브러리에 추가되었습니다: [`mysql_binlog_open()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-binlog-open.html), [`mysql_binlog_fetch()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-binlog-fetch.html), 및 [`mysql_binlog_close()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-binlog-close.html).

  기여해 주신 Yura Sorokin에게 감사드립니다. (Bug #110658, Bug #35282154)

## C API 관련 사항

- 호출 함수에서 `len`은 0으로 초기화되며, `net->vio`가 null이면 변경되지 않았습니다. 이 수정은 `vio`를 역참조하기 전에 `net` 검사를 추가합니다.

  기여해 주신 Meta에 감사드립니다. (Bug #30809590)
- `async` 클라이언트의 변수가 특정 코드 경로에서 초기화되지 않았습니다. 이 문제는 해당 변수를 항상 초기화하도록 하여 수정되었습니다.

  기여해 주신 Meta에 감사드립니다. (Bug #30809568)

## 컴파일 관련 사항

- **Microsoft Windows:** Windows의 경우 [`MSVC_CPPCHECK`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_msvc_cppcheck) 지원을 개선했으며, "maintainer" 모드와 유사하게 MSVC 경고를 확인합니다. 예를 들어, 모든 타사 설정이 완료된 후 확인합니다. (Bug #35283401)

  참조: 다음도 참조하십시오: Bug #34828882.
- **Microsoft Windows:** Windows 빌드의 경우 WIN_DEBUG_NO_INLINE=1 지원을 개선했습니다. 사용 시 라이브러리 제한인 65535개 객체를 초과했습니다. (Bug #35259704)
- 번들된 robin-hood-hashing을 v3.8.1에서 v3.11.5로 업그레이드했습니다. (Bug #35448980)
- `extra/libcbor/doc/source/requirements.txt`가 GitHub에서 잘못된 pull request를 유발했기 때문에 사용되지 않는 `extra/libcbor/doc/` 디렉터리를 제거했습니다. (Bug #35433370)
- `icu-data-files` 패키지에 대해 번들된 ICU 파일을 버전 69.1에서 버전 73으로 업데이트했습니다. (Bug #35353708)
- 소스 트리에 번들된 ZSTD 소스를 ZSTD 1.5.0에서 ZSTD 1.5.5로 업그레이드했습니다. (Bug #35353698)
- MEM_ROOT에서 할당된 초기화된 메모리를 읽어서 발생하는 버그를 더 쉽게 재현할 수 있도록, TRASH 매크로를 사용해 내부 `MEM_ROOT` 클래스 메모리를 garbage로 초기화합니다. (Bug #35277644)
- 이제 스택 방향을 설정 시점이 아니라 런타임에 결정합니다. (Bug #35181008)
- sanitizer 빌드에 `-O1 -fno-inline`을 추가하는 [`OPTIMIZE_SANITIZER_BUILDS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/source-configuration-options.html#option_cmake_optimize_sanitizer_builds) CMake 옵션을 추가했습니다. 이 옵션의 기본값은 ON입니다. (Bug #35158758)
- 최소 Bison 버전 요구 사항을 v2.1에서 v3.0.4로 변경했습니다. macOS의 경우 Homebrew와 같은 패키지 관리자를 통해 Bison을 설치해야 할 수 있습니다. (Bug #35154645, Bug #35191333)
- 이제 MySQL은 비ASCII 출력 문제를 피하기 위해 `readelf`를 실행할 때 환경에서 LANG=C를 설정합니다.

  기여해 주신 Kento Takeuchi에게 감사드립니다. (Bug #111190, Bug #35442825)
- macOS에서 rapidjson이 Homebrew를 통해 설치된 경우 MySQL이 컴파일되지 않았습니다. 우회 방법은 `brew unlink rapidjson`을 실행하는 것이었습니다. (Bug #110736, Bug #35311140)

  참조: 이 문제는 다음의 회귀입니다: Bug #35006191.
- MySQL은 `-DWITH_ZLIB=system`으로 빌드되지 않았습니다. 시스템 zlib 라이브러리를 찾았음에도 찾지 못했다고 오류를 보고했습니다. (Bug #110727, Bug #110745, Bug #35307674, Bug #35312227)

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

- **중요한 변경 사항:** MySQL은 **mysqldump** 및 [MySQL Shell Utilities](https://docs.oracle.com/cd/E17952_01/mysql-shell-8.0-en/mysql-shell-utilities.html)를 포함하여 동일하거나 추가 기능을 갖춘 데이터베이스 덤프 및 백업을 수행하는 다른 수단을 제공하므로, **mysqlpump** 클라이언트 유틸리티 프로그램은 중복되었으며 이제 사용 중단됩니다. 이제 이 프로그램을 호출하면 경고가 생성됩니다. **mysqlpump**는 MySQL의 향후 버전에서 제거될 수 있음을 염두에 두어야 하며, 이에 의존하는 애플리케이션을 앞서 언급한 것과 같은 다른 솔루션으로 이전해야 합니다. (WL #15652)
- **복제:** [`sync_relay_log_info`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-replica.html#sysvar_sync_relay_log_info) 서버 시스템 변수는 이 릴리스에서 사용 중단되며, 이 변수 또는 이에 해당하는 시작 옵션 [`--sync-relay-log-info`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-replica.html#sysvar_sync_relay_log_info)를 가져오거나 설정하면 이제 경고가 발생합니다.

  이 변수는 MySQL의 향후 버전에서 제거될 예정입니다. 이 변수를 사용하는 애플리케이션은 그 전에 이 변수에 의존하지 않도록 다시 작성해야 합니다. (Bug #35367005, WL #13968)
- **복제:** [`binlog_format`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_binlog_format) 서버 시스템 변수는 이제 사용 중단되며, MySQL의 향후 버전에서 제거될 수 있습니다. 이 변수와 관련된 기능, 즉 바이너리 로깅 형식을 변경하는 기능도 사용 중단됩니다.

  이 변경의 의미는 `binlog_format`이 제거되면 MySQL 8.0에서 이미 기본값인 로우 기반 바이너리 로깅만 MySQL 서버에서 지원된다는 것입니다. 이러한 이유로, 신규 설치에서는 로우 기반 바이너리 로깅만 사용해야 하며, 구문 기반 또는 혼합 로깅 형식을 사용하는 기존 설치는 로우 기반 형식으로 마이그레이션해야 합니다. 자세한 내용은 [Replication Formats](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-formats.html)를 참조하십시오.

  구문 기반 로깅의 맥락에서만 유용한 시스템 변수 [`log_bin_trust_function_creators`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_log_bin_trust_function_creators) 및 [`log_statements_unsafe_for_binlog`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/replication-options-binary-log.html#sysvar_log_statements_unsafe_for_binlog)도 이제 사용 중단되며, 따라서 MySQL의 향후 릴리스에서 제거될 수 있습니다.

  방금 언급한 변수 중 어느 것이든 값을 설정하거나 선택하면 이제 경고가 발생합니다. (WL #13966, WL #15669)
- **Group Replication:** `group_replication_recovery_complete_at` 서버 시스템 변수는 이제 사용 중단되었으며, 이를 설정하면 경고가 생성됩니다. 이 변수는 MySQL의 향후 릴리스에서 제거될 수 있음을 예상해야 합니다. (WL #15460)
- `mysql_native_password` 인증 플러그인은 이제 사용 중단되었으며 MySQL의 향후 버전에서 제거될 수 있습니다. 계정이 인증 방법으로 `mysql_native_password`를 사용하여 인증을 시도하는 경우, [`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), 및 [`SET PASSWORD`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/set-password.html) 작업은 이제 서버 오류 로그에 사용 중단 경고를 삽입합니다. (Bug #35336317)
- 이전에는 규칙 기반 필터링에 필요한 동반 감사 테이블 및 함수 없이 `audit_log` 플러그인이 설치된 경우, 플러그인은 레거시 필터링 모드로 동작했습니다. 이제 레거시 필터링 모드는 사용 중단되었습니다. 레거시 감사 로그 필터링 시스템 변수에 대해 새로운 사용 중단 경고가 발생합니다. 이러한 사용 중단된 변수는 읽기 전용이거나 동적입니다.

  (읽기 전용) [`audit_log_policy`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/audit-log-reference.html#sysvar_audit_log_policy)는 이제 값이 `ALL`(기본값)이 아닐 때 서버 시작 중 MySQL 서버 오류 로그에 경고 메시지를 씁니다.

  (동적) [`audit_log_include_accounts`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/audit-log-reference.html#sysvar_audit_log_include_accounts), [`audit_log_exclude_accounts`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/audit-log-reference.html#sysvar_audit_log_exclude_accounts), [`audit_log_statement_policy`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/audit-log-reference.html#sysvar_audit_log_statement_policy), 및 [`audit_log_connection_policy`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/audit-log-reference.html#sysvar_audit_log_connection_policy)입니다. 동적 변수는 사용 방식에 따라 경고 메시지를 출력합니다:

  - MySQL 서버 시작 중 [`audit_log_include_accounts`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/audit-log-reference.html#sysvar_audit_log_include_accounts) 또는 [`audit_log_exclude_accounts`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/audit-log-reference.html#sysvar_audit_log_exclude_accounts)에 non-NULL 값을 전달하면 이제 서버 오류 로그에 경고 메시지를 씁니다.
  - MySQL 서버 시작 중 [`audit_log_statement_policy`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/audit-log-reference.html#sysvar_audit_log_statement_policy) 또는 [`audit_log_connection_policy`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/audit-log-reference.html#sysvar_audit_log_connection_policy)에 기본값이 아닌 값을 전달하면 이제 서버 오류 로그에 경고 메시지를 씁니다. `ALL`은 두 변수 모두의 기본값입니다.
  - MySQL 클라이언트 세션 중 [`SET`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/set.html) 문법을 사용하여 기존 값을 변경하면 이제 클라이언트 로그에 경고 메시지를 씁니다.
  - MySQL 클라이언트 세션 중 [`SET PERSIST`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/set-variable.html) 문법을 사용하여 변수를 지속하면 이제 클라이언트 로그에 경고 메시지를 씁니다.

    (WL #11248)

- MySQL은 시스템 변수와 클라이언트 옵션을 사용하여 서버 측과 클라이언트 측에서 FIPS 모드를 제어할 수 있도록 합니다. 애플리케이션 프로그램은 [`mysql_options()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-options.html)에 `MYSQL_OPT_SSL_FIPS_MODE` 옵션을 사용하여 클라이언트에서 FIPS 모드를 활성화할 수 있습니다. 또는 현재 서버 측 시스템 변수와 클라이언트 측 옵션을 사용하는 대신 OpenSSL 설정 파일을 통해 FIPS 모드를 직접 처리할 수 있습니다. MySQL이 OpenSSL 3.0을 사용하여 컴파일되고, OpenSSL 라이브러리와 FIPS Object Module을 런타임에 사용할 수 있는 경우, 서버는 OpenSSL 설정 파일을 읽고 FIPS 프로바이더를 사용하도록 설정된 기본 설정이 있으면 이를 따릅니다. OpenSSL 3.0은 FIPS와 함께 사용하도록 인증되었습니다.

  OpenSSL 대안을 우선하기 위해, [`ssl_fips_mode`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_ssl_fips_mode) 서버 시스템 변수, [`--ssl-fips-mode`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/connection-options.html#option_general_ssl-fips-mode) 클라이언트 옵션 및 `MYSQL_OPT_SSL_FIPS_MODE` 옵션은 이제 사용 중단되었으며 MySQL의 향후 버전에서 제거될 수 있습니다. 애플리케이션이 `MYSQL_OPT_SSL_FIPS_MODE` 옵션을 사용하거나 클라이언트 사용자가 명령줄, 옵션 파일 또는 둘 모두를 통해 [`--ssl-fips-mode`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/connection-options.html#option_general_ssl-fips-mode) 옵션을 지정하면 사용 중단 경고가 표준 오류 출력에 출력됩니다.

  사용 중단되기 전에는 [`ssl_fips_mode`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_ssl_fips_mode) 서버 측 시스템 변수를 동적으로 설정할 수 있었습니다. 이제 이 변수는 읽기 전용 변수입니다(`SET PERSIST_ONLY`는 허용하지만, `SET PERSIST` 또는 `SET GLOBAL`은 허용하지 않습니다). 명령줄 또는 `mysqld-auto.cnf` 옵션 파일에서(`SET PERSIST_ONLY` 사용) 지정하면 사용 중단 경고가 서버 오류 로그에 출력됩니다. (WL #15631)

- **mysql_ssl_rsa_setup** 프로그램은 원래 OpenSSL이 시스템에 설치되어 있는 경우 커뮤니티 사용자가 인증서를 수동으로 생성하는 간단한 방법을 제공했습니다. 이제 MySQL Community Edition이 더 이상 yaSSL을 SSL 라이브러리로 사용하는 것을 지원하지 않고, 소스 배포판에도 더 이상 yaSSL이 포함되지 않으므로 **mysql_ssl_rsa_setup**은 사용 중단되었습니다. 대신 MySQL 서버를 사용하여 시작 시 누락된 SSL 및 RSA 파일을 자동으로 생성하십시오([Automatic SSL and RSA File Generation](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/creating-ssl-rsa-files-using-mysql.html#creating-ssl-rsa-files-using-mysql-automatic) 참조). (WL #15668)
- `keyring_file` 및 `keyring_encrypted_file` 플러그인은 이제 사용 중단되었습니다. 이러한 keyring 플러그인은 `component_keyring_file` 및 `component_keyring_encrypted_file` 컴포넌트로 대체됩니다. keyring 컴포넌트와 플러그인의 간결한 비교는 [Keyring Components Versus Keyring Plugins](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/keyring-component-plugin-comparison.html)를 참조하십시오. (WL #15659)
- 이전에는 MySQL 서버가 그 안에 포함된 MySQL 버전 번호 뒤에 공백이 오는지 여부와 관계없이 버전별 주석을 처리했습니다. 예를 들어 `/*!80034KEY_BLOCK_SIZE=1024*/` 및 `/*!80034 KEY_BLOCK_SIZE=1024*/` 주석은 동일하게 처리되었습니다. 이 릴리스부터는 이러한 주석에서 버전 번호 뒤의 다음 문자가 공백 문자도 아니고 주석의 끝도 아닌 경우 서버가 경고를 발생시킵니다: 버전 번호 바로 뒤에서 버전 주석을 시작하는 것은 사용 중단되었으며 향후 릴리스에서 동작이 변경될 수 있습니다. 버전 번호 뒤에 공백 문자를 삽입하십시오.

  향후 MySQL 버전에서는 버전별 주석에 대한 공백 요구 사항이 엄격하게 적용될 것으로 예상해야 합니다.

  자세한 내용은 [Comments](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/comments.html)를 참조하십시오. (WL #15686)
- MySQL 클라이언트 라이브러리는 현재 연결이 끊어진 것을 발견하고 애플리케이션이 실행할 명령문을 서버로 보내려고 시도하는 경우 서버에 대한 자동 재연결 수행을 지원합니다. 이제 이 기능은 사용 중단되었으며 향후 MySQL 릴리스에서 제거될 수 있습니다.

  관련 `MYSQL_OPT_RECONNECT` 옵션은 여전히 사용할 수 있지만 이 옵션도 사용 중단되었습니다. C API 함수 [`mysql_get_option()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-get-option.html) 및 [`mysql_options()`](https://docs.oracle.com/cd/E17952_01/c-api-8.0-en/mysql-options.html)는 이제 애플리케이션이 `MYSQL_OPT_RECONNECT`를 지정하면 표준 오류 출력에 사용 중단 경고를 기록합니다. (WL #15766)

## Performance Schema 관련 사항

- Performance Schema [`clone_status`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/performance-schema-clone-status-table.html) 테이블의 `gtid_executed` 컬럼에 사용되는 타입이 [`VARCHAR(4096)`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/char.html)에서 [`LONGTEXT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/blob.html)로 변경되었습니다. (Bug #109171, Bug #34828542)

## SQL 문법 관련 사항

- [`CURRENT_USER()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-functions.html#function_current-user)는 이제 [`CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/create-table.html) 및 [`ALTER TABLE... ADD COLUMN`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/alter-table.html#alter-table-add-drop-column) 문에서 [`VARCHAR`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/char.html) 및 [`TEXT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/blob.html) 컬럼의 기본값으로 사용할 수 있습니다.

  방금 언급한 모든 경우에 함수 [`SESSION_USER()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-functions.html#function_session-user), [`USER()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-functions.html#function_user), [`SYSTEM_USER()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-functions.html#function_system-user)도 지원됩니다. 예를 들어, 다음 문 시퀀스는 이제 여기에 표시된 것과 유사하게 작동하며, 정확한 출력은 사용자 환경에 따라 달라집니다:

  ```
  mysql> SELECT CURRENT_USER();
  +-------------------+
  | CURRENT_USER()    |
  +-------------------+
  |  sakila@localhost |
  +-------------------+
  1 row in set (0.00 sec)

  mysql> CREATE TABLE t (
       >  c1 VARCHAR(288) DEFAULT (USER()),
       >  c2 VARCHAR(288) DEFAULT (CURRENT_USER()),
       >  c3 VARCHAR(288) DEFAULT (SESSION_USER()), 
       >  c4 VARCHAR(288) DEFAULT (SYSTEM_USER())
       > );
  Query OK, 0 rows affected (0.04 sec)

  mysql> INSERT INTO t VALUES ROW();
  Query OK, 1 row affected (0.01 sec)

  mysql> TABLE t;
  +-------------------+-------------------+-------------------+-------------------+
  | c1                | c2                | c3                | c4                |
  +-------------------+-------------------+-------------------+-------------------+
  |  sakila@localhost |  sakila@localhost |  sakila@localhost |  sakila@localhost |
  +-------------------+-------------------+-------------------+-------------------+
  1 row in set (0.00 sec)
  ```

  이러한 방식으로 사용될 때, 이 함수들은 [`SHOW CREATE TABLE`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-create-table.html) 및 [`SHOW COLUMNS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/show-columns.html)의 출력에도 포함되며, 해당되는 경우 Information Schema [`COLUMNS`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-columns-table.html) 테이블의 `COLUMN_DEFAULT` 컬럼에서 참조됩니다.

  그러한 컬럼에 가능한 최대 길이를 가진 값을 저장할 수 있도록 보장해야 하는 경우, 컬럼이 최소 288자(사용자 이름 255자와 호스트 이름 32자, 그리고 구분자 `@` 1자)를 수용할 수 있는지 확인해야 합니다. 이러한 이유로, 이러한 함수 중 하나를 [`CHAR`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/char.html) 컬럼의 기본값으로 사용하는 것은 가능하지만, 오류 또는 값 잘림의 위험 때문에 권장되지 않습니다. (Bug #17809, Bug #11745618)

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

- **중요한 변경:** OpenSSL 라이브러리가 번들로 제공되는 플랫폼의 경우, MySQL Server에 링크된 OpenSSL 라이브러리가 OpenSSL 1.1.1에서 OpenSSL 3.0으로 업데이트되었습니다. 정확한 버전은 이제 3.0.9입니다. 1.1.1에서 3.0으로의 변경 사항에 대한 자세한 정보는 [https://www.openssl.org/docs/man3.0/man7/migration_guide.html](https://www.openssl.org/docs/man3.0/man7/migration_guide.html)에서 확인할 수 있습니다. (Bug #35475140, WL #15614)
- **패키징:** 이 릴리스부터 이전에 `-el7-x86_64.tar` 및 `-el7-x86_64.tar.gz`를 사용하여 이름이 지정되었던 바이너리 아카이브 패키지는 이제 각각 `-linux-glibc2.17-x86_64.tar` 및 `-linux-glibc2.17-x86_64.tar.gz`를 사용하여 이름이 지정됩니다. 예를 들어 `mysql-8.0.33-el7-x86_64.tar`를 사용하여 MySQL 8.0.33을 설치하거나 업그레이드했다면, MySQL 8.0.34를 설치하거나 업그레이드할 때는 `mysql-8.0.34-linux-glibc2.17-x86_64.tar`를 사용해야 합니다.

  이름 변경은 이러한 바이너리가 `glibc2.17` 이상을 사용하는 모든 Linux 시스템과 호환되도록 의도되었다는 사실을 반영합니다. 여기에는 Enterprise Linux 7, EL8 및 EL9가 포함됩니다.
- 시스템 curl 라이브러리에 링크하는 대신 curl을 포함하는 바이너리 패키지는 curl 8.1.2를 사용하도록 업그레이드되었습니다. (Bug #35329529)

## 수정된 버그

- **중요한 변경 사항:** MySQL 8.0.28에서 도입되었을 때 [`connection_memory_chunk_size`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_connection_memory_chunk_size) 서버 시스템 변수의 기본값이 실수로 8912로 설정되었습니다. 이 수정은 기본값을 원래 의도했던 값인 8192로 변경합니다. (Bug #35218020)
- **NDB Cluster:** 이전 문제에 대한 수정으로 인해 Unicode 9.0 콜레이션이 사용 중이고 콜레이션 해시 메서드가 서로 다른 두 문자열에 대해 동일한 해시 키를 계산하는 경우, 서로 같지 않은 문자열 값이 같다고 비교될 약간의 가능성이 도입되었습니다. (Bug #35168702)

  참조: 함께 참조하십시오: Bug #27522732. 이 문제는 다음의 회귀입니다: Bug #30884622.
- **InnoDB:** 많은 수의 시스템 스레드를 제거하면 때때로 혼잡이 발생했습니다. (Bug #35289390, Bug #110685)
- **InnoDB:** 이제 `ddl::Aligned_buffer()`는 커널 메모리 관리 대신 표준 메모리 할당자를 사용합니다. (Bug #35194732, Bug #110411)

- **InnoDB:** MySQL 5.7에서 MySQL 8.0.32 또는 8.0.33으로의 업그레이드가 더 이상 사용되지 않는 시스템 변수 `innodb_log_file_size`, `innodb_log_files_in_group` 또는 둘 모두의 사용으로 인해 때때로 실패했습니다. MySQL 8.0.34로 업그레이드하기 전에 이 문제를 우회하려면 [`--innodb-redo-log-capacity=206158430208`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html#sysvar_innodb_redo_log_capacity)로 서버를 시작하십시오. (Bug #35155280)
- **InnoDB:** MySQL 8.0.30에서 적용된 해싱 함수 변경 사항이 성능에 악영향을 주었습니다. (Bug #34870256)
- **InnoDB:** redo 로그의 항목을 집계하는 데 사용되는 규칙이 개선되었습니다. (Bug #34752625, Bug #108944)
- **InnoDB:** 일부 경우에는 테이블스페이스 삭제가 버퍼 풀에 문제를 일으켰습니다. (Bug #34330475, Bug #107689)
- **Packaging; Group Replication:** Generic Linux 패키지의 group replication 플러그인이 호환되는 `tirpc` 버전이 없는 일부 플랫폼에서 로드되지 않았습니다. (Bug #35323208)
- **Replication:** [`session_track_gtids`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_session_track_gtids)의 변경 사항이 항상 올바르게 전파되지는 않았습니다. (Bug #35401212)

- **Replication:** 설계상 모든 DDL 작업(바이너리 로그 제거와 같은 바이너리 로그 작업 포함)은 `BACKUP_LOCK` 객체에 대한 공유 잠금을 획득하며, 이는 동시 백업 및 DDL 작업을 방지하는 데 도움이 됩니다. 바이너리 로그 작업의 경우 `BACKUP_LOCK`에 잠금이 있는지 여부를 확인했지만, 그러한 잠금의 유형은 확인하지 않았습니다. 이로 인해 바이너리 로그 작업은 `BACKUP_LOCK` 객체에 배타적 잠금이 보유된 경우, 즉 백업이 실제로 진행 중인 경우에만 방지되어야 하며, 바이너리 로그를 제거할 때는 백업이 방지되어야 한다는 사실 때문에 문제가 발생했습니다.

  이제 이러한 경우에는 `BACKUP_LOCK` 객체에 보유된 잠금을 확인하는 대신, 바이너리 로그를 제거하는 동안 `BACKUP_LOCK`에 대한 공유 잠금을 획득합니다. (Bug #35342521)
- **Replication:** 하나의 경우를 제외한 모든 경우에, **mysqlbinlog**가 이벤트를 읽는 동안 오류가 발생하면 오류 메시지를 작성하고 0이 아닌 종료 코드를 반환했습니다. 예외는 활성 바이너리 로그 파일(또는 format_description_log_event에 `LOG_EVENT_BINLOG_IN_USE_F` 플래그가 설정된 모든 바이너리 로그)의 경우였으며, 이 경우에는 메시지를 작성하지 않고 종료 코드 0을 반환하여 오류를 숨겼습니다.

  이제 **mysqlbinlog**는 잘린 이벤트와 관련된 오류만 억제하며, 그렇게 할 때 오류 메시지 대신 주석을 출력합니다. 이 수정 사항은 또한 [`--force-if-open`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/mysqlbinlog.html#option_mysqlbinlog_force-if-open) 옵션의 도움말 텍스트도 개선합니다. (Bug #35083373)

- **Replication:** 압축된 바이너리 로그 이벤트 처리가 개선되었습니다. (Bug #33666652)
- **Replication:** 각각 1 GiB보다 작은 이벤트로 구성되었지만 전체 크기가 1 GiB보다 크고, 압축해도 1 GiB보다 작아지지 않는 트랜잭션이 여전히 1 GiB보다 큰 하나의 이벤트로 바이너리 로그에 기록되었습니다. 이로 인해 바이너리 로그를 사용할 수 없게 되었으며, 실제로 서버와 **mysqlbinlog** 같은 다른 도구가 이를 읽을 수 없었기 때문에 손상된 상태였습니다.

  이제 압축된 데이터가 1 GiB보다 커지면 압축 없이 트랜잭션을 처리하는 방식으로 되돌아갑니다. (Bug #33588473)
- **Group Replication:** group replication 설정에서 applier 채널 이외의 트랜잭션 소스가 있을 때, 다음과 같은 이벤트 순서가 발생할 수 있었습니다:

  - 로컬에서 적용 중인 여러 트랜잭션이 이미 인증되었으므로 여기서는 Ticket 2라고 하는 티켓과 연결되었지만, 아직 커밋되지 않았습니다. 이러한 트랜잭션은 로컬 또는 비로컬 트랜잭션일 수 있습니다.
  - Ticket 3으로 뷰가 생성되며, Ticket 2의 트랜잭션을 기다려야 합니다.
  - 뷰 변경(VC1)이 GR applier 채널 applier에 들어가고 티켓이 3으로 변경되기를 기다렸습니다.
  - Ticket 2의 트랜잭션이 아직 완료되는 동안 또 다른 그룹 변경과 또 다른 뷰 변경(VC2)이 발생했습니다.

  이로 인해 다음 문제가 발생했습니다: Ticket 2의 마지막 트랜잭션이 이미 자신을 실행된 것으로 표시했지만 아직 티켓을 팝하지 않은 시간이 있었으며, VC2가 대신 티켓을 팝했지만 참여자에게 알리지 않았습니다. 이는 VC1이 티켓이 변경되기를 무기한 계속 기다렸고, 추가적인 영향으로 worker를 종료할 수 없었음을 의미했습니다.

    if “break” could be translated as “중단 필요 여부?” for clarity, and if “stage” should
 stay as “stage.” I also need to consider how to address kill signals and references
    . It's crucial to preserve the indentation in the format. I’ll ensure everything aligns
 well!**Translating instructions carefully**

    각 초마다 중단해야 할 필요가 있는지 확인하여 이 루프가 루프 조건의 변경에 응답하도록 하고, 또한 새 stage를 등록하여 루프가 kill 신호에 더 응답하도록 함으로써 이 문제를 수정합니다. (Bug #35392640)

  참조: 다음도 참조하십시오: Bug #35206392, Bug #35374425.
- **Group Replication:** `Network_provider_manager::open_xcom_connection()`에서 발견된 메모리 누수를 제거했습니다. (Bug #34991101)
- **Group Replication:** 그룹 작업이 그룹에 전송되고 coordinator에서 연결이 kill되었을 때, 그룹 멤버는 서로 다른 상태에 있었으며, 조정된 작업을 수신한 멤버는 이를 실행한 멤버를 기다리고, 실행을 시작한 멤버는 처리할 것이 없어 그룹 조정에 문제가 발생했습니다.

  이제 이러한 경우에는 그룹 작업이 모든 멤버가 해당 작업을 완료할 때까지 기다리도록 하여 이 문제가 발생하지 않도록 합니다. (Bug #34815537)
- **Group Replication:** Group Replication에 의해 간접적으로 생성된 OpenSSL 연결에서 사용된 리소스 정리가 항상 예상대로 수행되지 않았습니다. Group Replication에 의해 이러한 연결이 생성될 때 언제든지 호출할 수 있는 정리 기능을 추가하여 이 문제를 수정합니다. (Bug #34727136)

- **JSON:** [`JSON_VALUE()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-search-functions.html#function_json-value)의 결과가 빈 문자열이고 사용자 변수에 할당되었을 때, 다음과 같이 사용자 변수가 일부 경우에 대신 `NULL`로 설정될 수 있었습니다:

  ```
  mysql> SELECT JSON_VALUE('{"fname": "Joe", "lname": ""}', '$.lname') INTO @myvar;
  Query OK, 1 row affected (0.01 sec)

  mysql> SELECT @myvar = '', @myvar IS NULL;
  +-------------+----------------+
  | @myvar = '' | @myvar IS NULL |
  +-------------+----------------+
  |        NULL |              1 |
  +-------------+----------------+
  1 row in set (0.00 sec)
  ```

  이 수정으로, 방금 표시한 쿼리는 이제 예상대로 `(1, 0)`을 반환합니다. (Bug #35206138)
- **JSON:** 일부 JSON 스키마가 [`JSON_SCHEMA_VALID()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-validation-functions.html#function_json-schema-valid)에 의해 항상 올바르게 처리되지는 않았습니다. (Bug #109296, Bug #34867398)
- 드문 경우에 MySQL 서버가 예상대로 오류 메시지를 내보내는 대신 종료될 수 있었습니다. (Bug #35442407)
- MySQL 8.0.31에서 추가되고 MySQL 8.0.32에서 리팩터링된 내부 resource-group 개선 사항이 이제 되돌려졌습니다. (Bug #35434219)

  참조: 되돌려진 패치: Bug #34702833.

- 서버 재시작 없이 MySQL 5.7에서 MySQL 8.0으로 in-place 업그레이드하면 테이블에서 쿼리를 실행할 때 예기치 않은 오류가 발생할 수 있었습니다. 이 수정으로 업그레이드와 쿼리 사이에 서버를 재시작할 필요가 없어졌습니다. (Bug #35410528)
- MySQL 8.0.33의 수정은 이미 해석된 `ORDER BY` 항목을 다시 해석하지 않도록 변경했습니다(파생 테이블이 병합될 때 일반적으로 그런 경우와 같습니다). 그러나 이는 `ORDER BY` 항목 자체가 참조인 경우를 처리하지 않았습니다. (Bug #35410465)

  참조: 이 문제는 다음의 회귀입니다: Bug #34890862.
- [`session_track_gtids`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_session_track_gtids)의 변경 사항이 항상 올바르게 처리되지는 않았습니다. (Bug #35401212)
- 일부 포인터가 명령문 실행 후 항상 해제되지는 않았습니다. (Bug #35395965)
- 저장 루틴 내 서브쿼리의 일부 인스턴스가 항상 올바르게 처리되지는 않았습니다. (Bug #35377192)
- 서버가 클라이언트로 보내는 네트워크 패킷 데이터의 파싱을 강화했습니다. (Bug #35374491)
- 암호화 개선 사항은 이제 준수를 강화하고 사용 중단된 API의 사용을 제거합니다. (Bug #35339886)

- 테이블 이름과 컬럼 이름으로 지정된 컬럼 참조가 `find_item_in_list()` 함수에서 조회될 때, 검색 대상 항목이 아직 해석되지 않았기 때문에 테이블 이름을 가지지 않을 수 있다는 점이 무시되었습니다. 검색 대상 항목에서 null 테이블 이름을 명시적으로 확인하도록 하여 이 문제를 수정했습니다. (Bug #35338776)
- 더 이상 사용되지 않는 **mysqlpump** 명령줄 유틸리티를 지원하기 위해 존재하는 **lz4_decompress** 및 **zlib_decompress** 명령줄 유틸리티를 더 이상 사용되지 않도록 했습니다. (Bug #35328235)
- `LIKE '%...%'`를 사용하는 쿼리가 이전 MySQL 버전보다 더 느리게 실행되었습니다. (Bug #35296563)
- `Bounded_queue::push()`에서 `Key_generator::make_sortkey()`가 `UINT_MAX`(오류)를 반환하면 키가 생성되지 않은 것입니다. 이제 이러한 상황이 발생하면 내부 큐를 더 이상 업데이트하지 않습니다.

  이 수정의 일부로, 이제 `push()`는 오류 시 true를 반환합니다. (Bug #35237721)
- `authentication_oci` 플러그인은 OCI CLI를 통해 생성된 임시 키 쌍을 사용하여 페더레이션 및 프로비저닝된 사용자가 매핑된 Proxy User로 DB System에 연결할 수 있도록 수정되었습니다. (Bug #35232697)
- 공통 테이블 표현식을 사용하는 일부 쿼리가 항상 올바르게 처리되지는 않았습니다. (Bug #35231475)
- 내부 함수 `compare_pair_for_nulls()`가 항상 명시적인 반환 값을 설정하지는 않았습니다. (Bug #35217471)
- MySQL 코딩 스타일과 충돌하는 clang-tidy 검사를 제거했습니다. (Bug #35208735)

- 쿼리의 내부 및 외부 부분 모두에서 `EXISTS`를 사용하는 일부 서브쿼리가 올바르게 처리되지 않았습니다. (Bug #35201901)
- 회전된 audit log 파일은 이제 이전 파일의 값에서 계속 이어가지 않고, bookmark의 ID 값을 항상 0으로 재설정합니다. (Bug #35200070)
- filesort로 정렬할 항목을 평가할 때 오류가 항상 올바르게 전파되지는 않았습니다. (Bug #35195181)

  참조: 다음도 참조하십시오: Bug #35145246.
- `ROLLUP`과 관련된 이전 문제의 수정으로 인해 디버그 빌드에서 서버가 조기 종료되었습니다. (Bug #35168639)

  참조: 이 문제는 다음의 회귀입니다: Bug #33830659.
- 입력 인수 중 어떤 것도 재사용하려고 시도하지 않고, 대신 항상 로컬 문자열 버퍼를 사용하도록 보장하기 위해 `Item_func_make_set::val_str()` 구현을 단순화했습니다. (Bug #35154335, Bug #35158340)
- 서브쿼리를 파생 테이블과의 조인으로 변환할 때, 포함하는 쿼리가 그룹화되어 있으면 그룹화를 수행할 추가 파생 테이블을 생성했습니다. 이 프로세스는 포함하는 쿼리의 초기 select list 항목을 추가 파생 테이블로 이동하고, 원래 select list 항목 전체(자체 파생 테이블을 갖는 서브쿼리는 제외)를 추가 파생 테이블의 컬럼으로 대체했습니다.

  이 로직은 기본값이 내부적으로 모델링된 방식 때문에 `DEFAULT`를 올바르게 처리하지 못했습니다. 이 수정은 앞서 언급한 변환을 거치는 쿼리에서 `DEFAULT(expression)`에 대한 지원을 추가합니다. 이 수정은 또한 동일한 변환의 결과로 select list에 있는 동일한 컬럼의 두 발생에 동일한 항목 이름이 부여되던 메타데이터의 항목 이름 관련 문제도 해결합니다. (Bug #35150085, Bug #35101169)

- `SELECT * FROM t1 WHERE (SELECT a FROM t2 WHERE t2.a=t1.a + ABS(t2.b)) > 0` 형식의 쿼리는 Subquery returns more than 1 row 오류와 함께 거부되어야 하지만, [`subquery_to_derived`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/switchable-optimizations.html#optflag_subquery-to-derived) 최적화가 활성화된 경우 변환이 잘못 적용되어 쿼리가 올바르지 않은 결과를 반환했습니다. (Bug #35101630)
- 잠재적으로 충돌할 수 있는 특정 [`GRANT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/grant.html) 문 처리 방식이 개선되었습니다. (Bug #35089304)
- [`MEMBER OF()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/json-search-functions.html#operator_member-of)와 `ORDER BY DESC`를 모두 사용하는 쿼리는 JSON 컬럼에 다중 값 인덱스를 생성한 후 부분 결과 집합만 반환했습니다. 이는 MySQL 8.0.30에서 수정된 문제와 유사하지만, 문제가 있는 쿼리에 `ORDER BY DESC` 절이 추가된 경우입니다. (Bug #35012146)

  References: 함께 참조하십시오: Bug #106621, Bug #33917625.
- 디버그 서버는 [`DECIMAL`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/fixed-point-types.html) 값을 포함하는 특정 작업에서 어설션이 발생했습니다. (Bug #34973932)

- 서브쿼리가 파생 테이블과 조인을 사용하도록 변환될 때 select list에서 식을 추가하고 교체하는 모든 인스턴스는 해당 참조 카운트가 적절히 유지되도록 변경되었습니다. (Bug #34927110)
- Index Merge([Index Merge Optimization](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/index-merge-optimization.html) 참조)는 비용이 비슷한 경우 sort-union 계획보다 ROR-union 계획(즉, RowID Ordered Retrieval 사용)을 선호해야 합니다. 이는 sort-union은 추가로 로우를 로우 ID 기준으로 정렬해야 하는 반면 ROR-union은 그렇지 않기 때문입니다.

  `OR` 조건을 포함하는 `WHERE` 절의 각 부분에 대해, range optimizer는 가능한 최상의 range scan을 가져오고 이러한 모든 range scan을 사용하여 index merge scan(즉, sort-union scan)을 빌드합니다. 최상의 range scan이 모두 ROR-scan이기도 하다는 것을 발견하면, range optimizer는 ROR-union scan이 sort-union scan보다 항상 더 저렴하기 때문에 항상 ROR-union scan을 제안합니다. `OR` 조건의 어느 한 부분에 대한 최상의 range scan이 ROR-scan이 아닌 경우 문제가 발생했으며, 이 경우 range optimizer는 항상 sort-union을 선택했습니다. OR 조건의 한 부분을 처리하는 데 최상의 range scan이 아닐 수 있더라도 ROR-scan을 선택하는 것이 유리할 수 있는 경우에도 이는 사실이었으며, 이는 로우를 로우 ID 기준으로 정렬할 필요를 제거하기 때문입니다.

  이제 이러한 경우, 최상의 range scan을 결정할 때 range optimizer는 가능한 ROR-scan이 있는지도 감지하고, 이 정보를 사용하여 `OR` 조건의 각 부분에 가능한 ROR-scan이 하나 이상 있는지 확인합니다. 그렇다면 `OR` 조건의 각 부분을 처리하기 위한 최상의 ROR-scan을 얻고 ROR-union 경로를 만들기 위해 range optimizer를 다시 실행합니다. 그런 다음 최종 계획을 제안할 때 이 비용을 sort-union의 비용과 비교합니다. (Bug #34826692, Bug #35302794)

- 뷰 정의가 선택한 테이블에서 사용된 콜레이션이 현재 세션의 [`collation_connection`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/server-system-variables.html#sysvar_collation_connection) 값과 일치하지 않을 때, 뷰에서 선택하면 때때로 Illegal mix of collations... for operation '=' 오류가 발생했습니다. (Bug #34801210)
- 유효한 MySQL 명령(`use` 및 `status`)과 C API 함수(`mysql_refresh`, `mysql_stat`, `mysql_dump_debug_info`, `mysql_ping`, `mysql_set_server_option`, `mysql_list_processes`, `mysql_reset_connection`)는 명령을 실행하거나 함수를 호출해도 그러한 오류가 발생하지 않았음에도, Audit Log에 오류 메시지를 쓸 수 있었습니다. (Bug #33966181)
- 최대 고정 배열 크기를 512 대신 8192로 늘렸습니다. 이는 512개 항목을 초과할 수 있는 **mysqladmin** extended status 요청의 문제를 수정합니다.

  기여해 주신 Meta에 감사드립니다. (Bug #30810617)
- **mysqldump** `--column-statistics` 옵션은 8.0.2 이전 MySQL 버전에 대해 [`information_schema.column_statistics`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/information-schema-column-statistics-table.html)에서 선택하려고 시도했지만, 이제 column statistics not supported by the server 경고를 생성하고 옵션을 false로 설정합니다.

  기여해 주신 Meta에 감사드립니다. (Bug #28782417)

- MySQL에서 디렉터리 이름의 길이를 가져오는 데 사용하는 함수가 개선되었습니다. (Bug #28047376)
- 암시적 집계를 사용하는 쿼리는 해당 로우를 필터링하는 `HAVING` 절이 없는 한 정확히 하나의 로우를 반환해야 하지만, `FALSE`로 평가되는 `HAVING` 절이 있는 쿼리가 이를 무시하고 관계없이 로우를 반환하는 경우가 있었습니다. (Bug #14272020)
- 쿼리에서 사용되지 않는 윈도우 함수가 존재하고, 제거될 수 있었던 `ORDER BY`가 함께 있으면 계획되지 않은 서버 종료가 발생했습니다. (Bug #111585, Bug #35168639, Bug #35204224, Bug #35545377)

  참조: 이 문제는 다음의 회귀입니다: Bug #35118579.
- `ORDER BY` [`RANDOM_BYTES()`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/encryption-functions.html#function_random-bytes)는 쿼리 출력에 영향을 주지 않았습니다. (Bug #111252, Bug #35148945, Bug #35457136)
- 사용자 정의 함수를 로드할 때 발생할 수 있었던 문제가 수정되었습니다. (Bug #110576, Bug #35242734)
- `FLUSH STATUS`, `COM_CHANGE_USER`, `SELECT FROM I_S.PROCESSLIST`를 동시에 실행하면 데드락이 발생할 수 있었습니다. `COM_STATISTICS`, `COM_CHANGE_USER`, `SHOW PROCESSLIST`를 동시에 실행하는 경우에도 유사한 문제가 관찰되었습니다.

  기여해 주신 Dmitry Lenev에게 감사드립니다. (Bug #110494, Bug #35218030)
- **mysqldump** 유틸리티가 생성 컬럼에 대해 유효하지 않은 INSERT 문을 생성할 수 있었습니다. (Bug #110462, Bug #35208605)

- 최적화 중에 range-select 트리 생성은 `IN()` 조건자의 왼쪽 피연산자를 기준으로 달라지는 로직을 사용합니다. 필드 항목의 경우 오른쪽 피연산자의 각 값이 필요한 식을 만들기 위해 OR 트리에 추가됩니다. 로우 항목 비교의 경우(예: `WHERE (a,b) IN ((n1,m1), (n2, m2),...)`) disjunctive normal form (DNF)의 식이 필요합니다. DNF 식은 각 RHS 값 집합에 대해 컬럼 값을 포함하는 `AND` 트리를 `OR` 트리에 추가하여 생성되지만, 대신 `OR` 트리가 `AND` 트리에 추가되어 O(n2) 런타임 복잡성으로 인해 트리 병합에 지수 시간이 필요하게 되었습니다. (Bug #108963, Bug #34758905)
- [`SELECT`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/select.html)를 사용하여 테이블을 생성할 때 명령문에 [`GEOMETRY`](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/spatial-type-overview.html) 타입의 식이 있으면 MySQL이 기본적으로 빈 문자열을 컬럼 값으로 생성할 수 있었습니다. 이 문제를 해결하기 위해 MySQL은 이러한 상황에서 더 이상 `GEOMETRY` 타입 컬럼의 기본값을 생성하지 않습니다. 기여해 주신 Tencent에 감사드립니다. (Bug #107996, Bug #34426943)

- 인덱스 스킵 스캔의 경우, 첫 번째 범위 읽기는 첫 번째 범위의 끝을 나타내기 위해 범위 끝 값을 설정했지만, 다음 범위 읽기는 오래된 범위 끝 값을 지우지 않고 이 오래된 값을 현재 범위에 적용했습니다. 표시된 범위 끝 경계는 이전 범위 읽기에서 이미 지나쳤으므로, 이로 인해 읽기가 중지되어 결과에서 여러 로우가 누락되었습니다.

  이러한 경우 이전 범위 끝 값이 지워지도록 보장하여 이 문제를 수정했습니다. (Bug #107460, Bug #34235624, Bug #34982949)
