MySQL Innovation Release Note

8.1.0 변경 사항 (2023-07-18 Innovation Release)

Estimated reading: 8 minutes 41 views

공식 문서: Changes in MySQL 8.1.0 (2023-07-18, Innovation Release)

계정 관리 관련 사항

새로운 비밀번호 검증 시스템 변수는 사용자가 자신의 MySQL 계정 비밀번호를 변경할 때 변경해야 하는 최소 문자 수를 구성하고 적용할 수 있게 합니다. 이 새로운 검증 설정은 현재 비밀번호의 전체 문자 수에 대한 백분율로 설정됩니다. 예를 들어, validate_password.changed_characters_percentage 값이 50이면, 교체할 계정 비밀번호의 절반 이상의 문자가 현재 비밀번호에 존재하지 않아야 하며, 그렇지 않으면 비밀번호가 거부됩니다.
이 새로운 기능은 DB 관리자에게 비밀번호 관리를 보다 완전하게 제어할 수 있는 여러 기능 중 하나입니다. 자세한 내용은 비밀번호 관리를 참조하십시오. (WL #15751)

감사 로그 관련 사항

MySQL 8.0.33에서는 audit_log 플러그인이 JSON 필터 테이블을 저장할 데이터베이스를 선택하는 기능을 추가했습니다. 이제 플러그인 설치 스크립트를 실행할 때 기본 시스템 데이터베이스인 mysql 대신 다른 데이터베이스를 지정할 수 있습니다. 예를 들어, audit_log_database 서버 시스템 변수를 사용하거나, 커맨드 라인에서 -D database_name을 사용하여 대체 데이터베이스 이름을 지정할 수 있습니다:

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


감사 로그 플러그인 설치 스크립트 사용에 대한 추가 정보는 MySQL Enterprise Audit 설치 또는 제거를 참조하십시오. (버그 #35252268)

새로운 Audit_log_direct_writes 시스템 변수가 감사 파일에 대한 직접 쓰기 횟수를 계산하는 기능이 추가되었습니다.

MySQL Enterprise Audit는 로그 파일에 기록되는 단일 이벤트 데이터를 저장하기 위해 임시 버퍼를 할당합니다. 감사 플러그인은 감사 로그로 들어오는 모든 쿼리를 버퍼링합니다. 이 방법은 짧은 쿼리에는 효과적이지만, 서버가 긴 쿼리를 저장하기 위한 추가 메모리를 할당할 수 없는 경우도 있습니다. 이제 audit_log 플러그인은 JSON 형식의 로깅을 사용할 때 임시 버퍼를 사용하지 않도록 최적화되었습니다. (WL #15403)

MySQL Enterprise Audit는 이제 스케줄러 컴포넌트를 사용하여 메모리 캐시를 플러시하는 반복 작업을 구성하고 실행하는 기능을 지원합니다. 설정 방법은 감사 로그 플러시 작업 활성화를 참조하십시오. (WL #15567)

바이너리 로깅

이제 개발자가 MySQL 서버의 바이너리 로그에 접근할 수 있는 몇 가지 함수가 libmysqlclient.so 공유 라이브러리에 추가되었습니다: mysql_binlog_open(), mysql_binlog_fetch(), mysql_binlog_close().
Yura Sorokin에게 기여에 대해 감사드립니다. (버그 #110658, 버그 #35282154)

C API 관련 사항

새로운 mysql_reset_connection_nonblocking() C API 함수가 추가되었습니다. 이 함수는 서버와 비동기 통신을 필요로 하는 애플리케이션에서 사용하는 동기 함수 mysql_reset_connection()의 대응 함수입니다. Meta에 기여에 대해 감사드립니다. (버그 #32202058, WL #15633)

새로운 mysql_get_connect_nonblocking_stage() C API 함수는 애플리케이션이 비동기 연결의 진행 상황을 모니터링하여 진행 상황에 따라 적절한 조치를 취할 수 있게 합니다. Meta에 기여에 대해 감사드립니다. (버그 #32202053, WL #15651)

호출 함수에서 len은 0으로 초기화되며 net->vio가 null이면 변경되지 않습니다. 이번 수정에서는 vio를 참조하기 전에 net을 확인하는 검사를 추가했습니다.
Meta에 기여에 대해 감사드립니다. (버그 #30809590)

비동기 클라이언트에서 특정 코드 경로에서 변수가 초기화되지 않았습니다. 이제 해당 변수를 항상 초기화하여 수정했습니다.
Meta에 기여에 대해 감사드립니다. (버그 #30809590)

컴파일 관련 사항

Microsoft Windows: Windows에서 MSVC_CPPCHECK 지원이 개선되었으며, “maintainer” 모드와 유사한 MSVC 경고를 확인합니다. 예를 들어, 모든 서드파티 구성 완료 후 경고를 확인합니다. (버그 #35283401)
참조: 관련 사항: 버그 #34828882.

Microsoft Windows: Windows 빌드에서 WIN_DEBUG_NO_INLINE=1 지원이 개선되었습니다. 사용 시 라이브러리 한도인 65535 객체를 초과할 수 있습니다. (버그 #35259704)

번들된 robin-hood-hashing이 v3.8.1에서 v3.11.5로 업그레이드되었습니다. (버그 #35448980)

사용되지 않는 extra/libcbor/doc/ 디렉토리가 제거되었습니다. extra/libcbor/doc/source/requirements.txt는 GitHub에서 잘못된 풀 리퀘스트를 유발했습니다. (버그 #35433370)

번들된 ICU 파일이 icu-data-files 패키지의 69.1 버전에서 73 버전으로 업데이트되었습니다. (버그 #35353708)

소스 트리에 포함된 ZSTD 소스가 ZSTD 1.5.0에서 1.5.5로 업그레이드되었습니다. (버그 #35353698)

SUSE 기반 시스템의 기본 GCC 버전이 9에서 12로 변경되었습니다. 이 버전은 해당 플랫폼의 기본 컴파일러입니다. (버그 #35341000)

GCC 12로 MySQL이 올바르게 컴파일되지 않았습니다. (버그 #35327995)

MEM_ROOT 클래스 메모리를 TRASH 매크로를 사용해 내부적으로 초기화하여 MEM_ROOT에서 할당된 초기화되지 않은 메모리 읽기로 인한 버그를 재현하기 쉽게 만들었습니다. (버그 #35277644)

Bison이 생성한 여러 YYSTYPE 및 기타 심볼의 다른 인스턴스로 인해 발생한 ODR(One Definition Rule) 위반이 수정되었습니다. 여기에는 Bison 명령줄에서 --name-prefix 인수를 api.prefix 정의로 교체하는 등의 Bison 구현 변경 사항이 포함됩니다. (버그 #35232738)

스택 방향을 구성 시점이 아닌 실행 시점에 결정하도록 변경했습니다. (버그 #35181008)

OPTIMIZE_SANITIZER_BUILDS CMake 옵션이 추가되어, 이 옵션을 사용하면 -O1 -fno-inline이 삽입됩니다. 기본값은 ON입니다. (버그 #35158758)

최소 Bison 버전 요구 사항이 v2.1에서 v3.0.4로 변경되었습니다. macOS에서는 Homebrew와 같은 패키지 관리자를 통해 Bison을 설치해야 할 수 있습니다. (버그 #35154645, 버그 #35191333)

Windows에서 MSVC_CPPCHECK CMake 옵션의 기본값이 OFF에서 ON으로 변경되었습니다. (버그 #35067705)

MySQL은 readelf 실행 시 환경 변수에 LANG=C를 설정하여 비ASCII 출력으로 인한 문제를 방지합니다.
Kento Takeuchi에게 기여에 대해 감사드립니다. (버그 #111190, 버그 #35442825)

macOS에서 Homebrew를 통해 rapidjson이 설치된 경우 MySQL이 컴파일되지 않았습니다. 해결 방법은 brew unlink rapidjson이었습니다. (버그 #110736, 버그 #35311140)
참조: 이 문제는 버그 #35006191의 회귀(regression)입니다.

-DWITH_ZLIB=system으로 빌드 시 시스템 zlib 라이브러리를 찾았음에도 불구하고 이를 찾지 못했다는 오류가 발생했습니다. (버그 #110727, 버그 #110745, 버그 #35307674, 버그 #35312227)

컴포넌트 관련 사항

MySQL Enterprise Edition은 이제 component_telemetry 컴포넌트를 사용하여 OpenTelemetry 형식으로 서버 추적 데이터를 수집하는 기능을 지원합니다. 이 데이터는 구성 가능한 엔드포인트로 전달되며, OpenTelemetry 호환 시스템에서 사용할 수 있습니다.

참고
텔레메트리 추적은 Linux 플랫폼의 MySQL Enterprise Edition에서만 지원됩니다.

자세한 내용은 Telemetry를 참조하십시오. (WL #15198)

사용 중단 및 제거 관련 사항

중요 변경 사항: MySQL은 mysqldumpMySQL Shell Utilities와 같이 동일하거나 추가적인 기능을 제공하는 데이터베이스 덤프 및 백업 도구를 제공하고 있으므로, mysqlpump 클라이언트 유틸리티 프로그램은 중복된 도구가 되었으며 이제 사용 중단되었습니다. 이 프로그램을 호출하면 경고가 표시됩니다. mysqlpump는 향후 MySQL 버전에서 제거될 수 있으므로, 이에 의존하는 애플리케이션은 앞서 언급된 도구로 전환해야 합니다. (WL #15652)

복제: sync_relay_log_info 서버 시스템 변수가 이번 릴리즈에서 사용 중단되었습니다. 이 변수를 조회하거나 설정하는 경우, 또는 해당 시작 옵션 --sync-relay-log-info를 사용하는 경우 경고가 발생합니다.
이 변수는 향후 MySQL 버전에서 제거될 예정이므로, 이를 사용하는 애플리케이션은 제거되기 전에 해당 의존성을 없애도록 다시 작성해야 합니다. (버그 #35367005, WL #13968)

복제: binlog_format 서버 시스템 변수가 이제 사용 중단되었으며, 향후 MySQL 버전에서 제거될 예정입니다. 이 변수와 관련된 기능, 즉 바이너리 로그 형식을 변경하는 기능도 사용 중단되었습니다.
이 변경의 의미는 binlog_format이 제거되면 MySQL 서버에서 기본값인 행 기반 바이너리 로그만 지원된다는 것입니다. 따라서 새로운 설치에서는 행 기반 바이너리 로그만 사용해야 하며, 현재 문 기반 또는 혼합 로그 형식을 사용하는 시스템은 행 기반 형식으로 마이그레이션해야 합니다. 자세한 내용은 복제 형식을 참조하십시오.
log_bin_trust_function_creatorslog_statements_unsafe_for_binlog 시스템 변수도 문 기반 로깅과 관련된 기능이므로, 이 변수들도 사용 중단되었으며 향후 MySQL 릴리즈에서 제거될 예정입니다.
언급된 변수의 값을 설정하거나 선택할 경우 이제 경고가 발생합니다. (WL #13966, WL #15669)

그룹 복제: group_replication_recovery_complete_at 서버 시스템 변수가 이제 사용 중단되었으며, 이를 설정하면 경고가 발생합니다. 이 변수는 향후 MySQL 릴리즈에서 제거될 예정입니다. (WL #15460)

mysql_native_password 인증 플러그인이 이제 사용 중단되었으며, 향후 MySQL 버전에서 제거될 예정입니다. CREATE USER, ALTER USER, SET PASSWORD 작업 중 계정이 mysql_native_password를 인증 방법으로 사용하려고 하면 서버 오류 로그에 사용 중단 경고가 기록됩니다. (버그 #35336317)

이전에 audit_log 플러그인이 규칙 기반 필터링에 필요한 감사 테이블 및 함수 없이 설치된 경우, 플러그인은 레거시 필터링 모드에서 작동했습니다. 이제 레거시 필터링 모드는 사용 중단되었으며, 레거시 감사 로그 필터링 시스템 변수에 대한 새로운 사용 중단 경고가 발생합니다. 이러한 사용 중단된 변수들은 읽기 전용 또는 동적입니다.
(읽기 전용) audit_log_policy는 서버 시작 시 값이 기본값인 ALL이 아닐 때 경고 메시지를 MySQL 서버 오류 로그에 기록합니다.
(동적) audit_log_include_accounts, audit_log_exclude_accounts, audit_log_statement_policy, audit_log_connection_policy. 동적 변수는 사용에 따라 경고 메시지를 출력합니다:

  • MySQL 서버 시작 시 audit_log_include_accounts 또는 audit_log_exclude_accounts에 NULL이 아닌 값을 전달하면 서버 오류 로그에 경고 메시지가 기록됩니다.
  • MySQL 서버 시작 시 audit_log_statement_policy 또는 audit_log_connection_policy에 기본값이 아닌 값을 전달하면 서버 오류 로그에 경고 메시지가 기록됩니다. 두 변수의 기본값은 ALL입니다.
  • MySQL 클라이언트 세션 중 SET 문법을 사용하여 기존 값을 변경하면 클라이언트 로그에 경고 메시지가 기록됩니다.
  • MySQL 클라이언트 세션 중 SET PERSIST 문법을 사용하여 변수를 지속시키면 클라이언트 로그에 경고 메시지가 기록됩니다.

(WL #11248)

$ 문자를 미인용 식별자의 처음에 사용하는 것은 MySQL 8.0.32에서 사용 중단되었습니다. 이번 릴리즈에서는 $로 시작하고 추가로 하나 이상의 $ 문자를 포함하는 미인용 식별자를 사용할 경우 구문 오류가 발생합니다. 인용된 식별자와 $로 시작하지만 추가 $ 문자를 포함하지 않는 미인용 식별자는 이 변경의 영향을 받지 않습니다. $로 시작하는 미인용 식별자는 여전히 경고가 발생합니다.
자세한 내용은 스키마 객체 이름을 참조하십시오. (WL #15254)
참조: 관련 사항: 버그 #34684193.

MySQL은 서버 측 및 클라이언트 측에서 시스템 변수와 클라이언트 옵션을 통해 FIPS 모드를 제어할 수 있도록 합니다. 애플리케이션 프로그램은 MYSQL_OPT_SSL_FIPS_MODE 옵션을 사용하여 mysql_options()에서 클라이언트에서 FIPS 모드를 활성화할 수 있습니다. 또는 현재의 서버 측 시스템 변수와 클라이언트 측 옵션을 사용하지 않고 OpenSSL 구성 파일을 통해 FIPS 모드를 직접 처리할 수도 있습니다. MySQL이 OpenSSL 3.0을 사용하여 컴파일되고, 런타임 시 OpenSSL 라이브러리 및 FIPS 오브젝트 모듈이 제공되는 경우, 서버는 OpenSSL 구성 파일을 읽고 FIPS 프로바이더 사용 선호가 설정되어 있으면 이를 준수합니다. OpenSSL 3.0은 FIPS와 함께 사용할 수 있도록 인증되었습니다.
OpenSSL 대안을 선호하도록 ssl_fips_mode 서버 시스템 변수, --ssl-fips-mode 클라이언트 옵션 및 MYSQL_OPT_SSL_FIPS_MODE 옵션은 이제 더 이상 사용되지 않으며, MySQL의 향후 버전에서 제거될 수 있습니다. 애플리케이션이 MYSQL_OPT_SSL_FIPS_MODE 옵션을 사용하거나 클라이언트 사용자가 --ssl-fips-mode 옵션을 명령줄이나 옵션 파일을 통해 지정할 때 표준 오류 출력에 사용 중단 경고가 출력됩니다.
더 이상 사용되지 않기 전에 ssl_fips_mode 서버 측 시스템 변수는 동적으로 설정할 수 있었습니다. 이제는 읽기 전용 변수로 설정되어 (SET PERSIST_ONLY는 허용하지만, SET PERSIST 또는 SET GLOBAL은 허용하지 않음) 명령줄 또는 mysqld-auto.cnf 옵션 파일에서 지정되면 사용 중단 경고가 서버 오류 로그에 출력됩니다. (WL #15631)

mysql_ssl_rsa_setup 프로그램은 원래 시스템에 OpenSSL이 설치된 경우 커뮤니티 사용자가 인증서를 수동으로 생성할 수 있는 간단한 방법을 제공했습니다. 이제 mysql_ssl_rsa_setup은 MySQL 커뮤니티 에디션에서 더 이상 SSL 라이브러리로 yaSSL을 지원하지 않으며 소스 배포에 yaSSL이 포함되지 않기 때문에 사용 중단되었습니다. 대신 서버 시작 시 자동으로 누락된 SSL 및 RSA 파일을 생성하도록 MySQL 서버를 사용하십시오. (참조: 자동 SSL 및 RSA 파일 생성). (WL #15668)

keyring_filekeyring_encrypted_file 플러그인은 이제 사용 중단되었습니다. 이러한 키링 플러그인은 component_keyring_filecomponent_keyring_encrypted_file 컴포넌트로 대체되었습니다. 키링 컴포넌트와 플러그인 비교에 대한 간단한 내용은 키링 컴포넌트와 키링 플러그인 비교를 참조하십시오. (WL #15659)

이전에는 MySQL 서버가 특정 버전 주석을 처리할 때 해당 주석 내에 포함된 MySQL 버전 번호 뒤에 공백이 있는지 여부에 관계없이 처리했습니다. 예를 들어, 주석 /*!80034KEY_BLOCK_SIZE=1024*//*!80034 KEY_BLOCK_SIZE=1024*/는 동일하게 처리되었습니다. 이번 릴리스부터 이러한 주석의 버전 번호 다음에 오는 다음 문자가 공백 문자도 아니고 주석 끝도 아닌 경우, 서버는 경고를 발행합니다: 버전 주석을 버전 번호 바로 뒤에 시작하는 것은 더 이상 권장되지 않으며, 향후 릴리스에서 동작이 변경될 수 있습니다. 버전 번호 뒤에 공백 문자를 삽입하십시오.
향후 MySQL의 버전에서 특정 버전 주석에 대한 공백 요구 사항이 엄격하게 적용될 것으로 예상됩니다.
자세한 내용은 주석을 참조하십시오. (WL #15686)

MySQL 클라이언트 라이브러리는 현재 애플리케이션이 서버에 실행할 문을 보내려고 할 때 연결이 끊어진 경우 서버에 자동으로 재연결을 수행하는 기능을 지원합니다. 이제 이 기능은 사용 중단되었으며, MySQL의 향후 릴리스에서 제거될 예정입니다.
관련된 MYSQL_OPT_RECONNECT 옵션은 여전히 사용 가능하지만 이 또한 사용 중단되었습니다. C API 함수 mysql_get_option()mysql_options()이 애플리케이션이 MYSQL_OPT_RECONNECT를 지정할 때 표준 오류 출력에 사용 중단 경고를 작성합니다. (WL #15766)

로깅 관련 사항

서버 종료가 지나치게 오래 걸릴 경우 문제 해결에 도움을 주기 위해, 이번 릴리스에서는 종료 중 MySQL 오류 로그에 기록되는 여러 새로운 메시지가 도입되었습니다. 여기에는 다음과 같은 메시지가 포함됩니다:

  • MySQL 서버의 시작 및 종료 로그 메시지, --initialize 옵션으로 시작되었을 때도 포함
  • 플러그인에 대한 종료 단계의 시작과 종료를 나타내는 로그 메시지
  • 컴포넌트에 대한 종료 단계의 시작과 종료를 나타내는 로그 메시지
  • 연결 종료 단계의 시작 및 종료 로그 메시지
  • 강제로 연결이 끊어진 후에도 여전히 활성 상태로 남아 대기를 유발할 수 있는 스레드의 수 및 ID를 표시하는 로그 메시지

자세한 내용은 오류 로그를 참조하십시오. (WL #15369)

Performance Schema 관련 사항

성능 스키마 clone_status 테이블의 gtid_executed 열의 타입이 VARCHAR(4096)에서 LONGTEXT로 변경되었습니다. (버그 #109171, 버그 #34828542)

공간 데이터 지원

공간 계산을 위한 공간 참조 시스템 데이터를 포함하는 EPSG 데이터 세트가 버전 9.3에서 9.7로 업그레이드되었습니다. (버그 #28615740)

SQL 구문 관련 사항

JSON: 이 릴리스에서 추가된 구문 확장으로 EXPLAIN FORMAT=JSON 출력을 사용자 변수에 캡처할 수 있게 되었습니다. EXPLAIN FORMAT=JSON INTO _ar_name stmt 구문은 설명 가능한 임의의 문장 stmt 에서 출력을 사용자 변수 var_name 에 저장하며, 이후 분석에 사용하기 위해 저장된 출력을 불러올 수 있습니다. 이 값은 유효한 JSON 문서로, JSON_EXTRACT() 같은 MySQL JSON 함수를 사용하여 검사하고 조작할 수 있습니다. (JSON Functions 참조)
INTO 절은 FORMAT=JSON에서만 지원되며, 시스템 변수 explain_format 값은 이 요구 사항에 영향을 미치지 않습니다. 문장이 실행되지 않을 경우(예: 구문 오류로 인한 경우) 사용자 변수는 업데이트되지 않습니다.
INTOEXPLAIN ANALYZE 또는 EXPLAIN FOR CONNECTION에는 지원되지 않습니다.
추가 정보 및 예시는 Obtaining Execution Plan Information을 참조하십시오. (버그 #35362996, WL #15588, WL #15606)

CURRENT_USER()는 이제 CREATE TABLEALTER TABLE ... ADD COLUMN 문에서 VARCHARTEXT 열의 기본값으로 사용할 수 있습니다.
SESSION_USER(), USER(), 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 TABLESHOW COLUMNS의 출력에 포함되며, Information Schema COLUMNS 테이블의 COLUMN_DEFAULT 열에서 참조됩니다.
최대 길이의 값을 저장할 수 있도록 보장하려면 해당 열이 최소 288자를 수용할 수 있는지 확인해야 합니다(사용자 이름 255자, 호스트 이름 32자, 구분자 @ 1자). 이 때문에 이러한 함수 중 하나를 CHAR 열의 기본값으로 사용하는 것은 오류 또는 값 잘림의 위험이 있어 권장되지 않습니다. (버그 #17809, 버그 #11745618)

기능 추가 및 변경 사항

중요 변경 사항; 복제: CHANGE REPLICATION SOURCE TO 문장의 SOURCE_RETRY_COUNT 옵션의 기본값이 10으로 변경되었습니다. 즉, 기본값으로 설정된 경우 복제본은 60초마다 재연결을 시도하며, 10분 동안 재연결을 시도한 후 실패하게 됩니다.
이 변경은 --master-retry-count 서버 옵션의 기본값에도 적용됩니다. 이 옵션은 사용 중단되었으며, 향후 MySQL 릴리즈에서 제거될 수 있습니다. 대신 CHANGE REPLICATION SOURCE TOSOURCE_RETRY_COUNT를 사용하십시오.
자세한 내용은 CHANGE REPLICATION SOURCE TO 문장소스의 비동기 연결 장애 조치를 참조하십시오. (WL #15702)

중요 변경 사항: 번들된 OpenSSL 라이브러리를 사용하는 플랫폼에서 MySQL 서버에 연결된 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를 참조하십시오. (버그 #35475140, WL #15614)

중요 변경 사항: 버전 주석에서 사용되는 MySQL 버전 번호는 이제 한 자릿수 또는 두 자릿수의 주요 버전을 지원합니다(이전에는 한 자릿수만 지원됨). 버전별 주석 처리 방식에 대한 자세한 내용은 주석을 참조하십시오. (WL #15687)

중요 변경 사항: Enterprise Linux 6(및 관련 glibc 2.12 generic), SUSE 12, Debian 10, MacOS 12, Ubuntu 18.04 및 20.04, Windows 10 및 Server 2012R2에 대한 지원이 중단되었으며, 32비트 버전은 더 이상 빌드되지 않습니다.

복제: 디버그 모드에서 실행할 때, mysqlbinlog는 이제 모든 Rows_log_event 플래그(이전에는 STMT_END_F만)를 출력하며, 잘못된 플래그가 발생하면 UNKNOWN_FLAG(0x_N_)로 확인합니다.
Meta에게 기여에 대해 감사드립니다. (버그 #33172581)

그룹 복제: 시스템 상태 변수의 값을 가져오는 모든 문장은 모든 상태 변수를 가져오며, 이에 대해 읽기 잠금을 획득합니다. 여기에는 SHOW STATUS LIKE 'Uptime'SELECT * FROM performance_schema.global_status WHERE VARIABLE_NAME='Uptime'과 같은 문장이 포함됩니다. 또한 다음과 같은 작업은 모두 상태 변수에 대해 쓰기 잠금을 획득합니다:

이로 인해 앞서 나열된 작업 중 하나가 실행된 후에 시작된 SHOW STATUS 명령어는 해당 작업이 완료될 때까지 대기해야 했습니다.
이제 이러한 경우, 상태 변수를 가져오는 명령어는 대기하지 않고 즉시 캐시된 값을 반환합니다. (버그 #35373030)
참고: 버그 #35312441도 참조하십시오.

그룹 복제: group_replication_set_as_primary()가 새로운 기본(primary)을 선출하기 전에 모든 트랜잭션, 특히 현재 처리 중인 모든 DML 작업을 완료할 때까지 기다립니다. 이번 릴리즈에서는 이 함수가 진행 중인 모든 DDL 문장(예: ALTER TABLE)이 완료될 때까지도 기다리도록 변경되었습니다.
이제 group_replication_set_as_primary()가 DDL로 간주하는 모든 작업은 다음과 같습니다:

이 항목에는 열린 커서도 포함됩니다. (자세한 내용은 커서를 참조하십시오.)
자세한 내용은 MySQL 8.1 매뉴얼의 group_replication_set_as_primary() 설명을 참조하십시오. (버그 #34664197, WL #15497)

그룹 복제: 네트워크 불안정성에 대한 진단 및 문제 해결을 위해, 이번 릴리즈에서는 그룹 복제의 각 멤버에 대한 네트워크, 제어 메시지 및 데이터 메시지 통계를 제공하는 변수가 추가되었습니다. 이를 통해 그룹 복제 작업의 여러 단계에서 소요된 시간을 직접 관찰할 수 있습니다.
또한 그룹 복제는 성능 스키마 replication_group_communication_information 테이블에 새로운 MEMBER_FAILURE_SUSPICIONS_COUNT 열을 추가하여 각 그룹 멤버가 로컬 노드에서 의심받은 횟수를 보여줍니다. 예를 들어, 세 명의 멤버로 구성된 그룹에서는 이 열의 값이 다음과 같이 보일 수 있습니다:

{
  "d57da302-e404-4395-83b5-ff7cf9b7e055": 0,
  "6ace9d39-a093-4fe0-b24d-bacbaa34c339": 10,
  "9689c7c5-c71c-402a-a3a1-2f57bfc2ca62": 0
}

이러한 개선 사항은 사용자에 의해 시작된 작업이나 백그라운드 작업에 의해 소비된 시간 및 네트워크 자원을 직접 확인할 수 있게 하여 전체 성능과의 상관관계를 파악하는 데 도움을 줍니다.
자세한 내용은 그룹 복제 상태 변수를 참조하십시오. (WL #13849)
참조: 관련 사항: 버그 #34279841.

바이너리 패키지가 시스템 curl 라이브러리와 연결되지 않고 curl을 포함하는 경우, 이제 curl 8.1.2 버전으로 업그레이드되었습니다. (버그 #35329529)

MySQL은 이제 TLS 프로토콜의 확장인 클라이언트 측 서버 이름 표시(SNI)를 구현합니다. 클라이언트 애플리케이션은 새로운 MYSQL_OPT_TLS_SNI_SERVERNAME 옵션을 사용하여 libmysqlclient C API 라이브러리에 서버 이름을 전달할 수 있습니다. 또한 각 MySQL 클라이언트 프로그램에는 서버 이름을 전달하는 --tls-sni-servername 명령 옵션이 포함되었습니다. 새로운 Tls_sni_server_name 서버 상태 변수는 세션에 설정된 이름을 표시합니다. Meta에게 기여에 대해 감사드립니다. (버그 #33176362, WL #14839)

mysql 클라이언트에서 주석이 이제 기본적으로 활성화됩니다. 주석을 비활성화하려면 mysql--skip-comments 옵션과 함께 시작하십시오.
Daniël van Eeden에게 기여에 대해 감사드립니다. (버그 #109972, 버그 #35061087, WL #15597)

디버그 빌드에서 SELECT 문장의 JSON 형식의 구문 트리를 표시하기 위해 SHOW PARSE_TREE 문이 구현되었습니다. 이 문장은 릴리즈 빌드에서는 지원되지 않으며, 디버그 빌드에서만 사용 가능하거나 -DWITH_SHOW_PARSE_TREE를 사용하여 서버를 컴파일하여 사용할 수 있습니다. (WL #15426)

이전에는 잘못된 SSL 서버 및 CA 인증서가 서버가 시작된 후 또는 런타임에 잘못된 인증서를 로드한 후에야 문제가 있는 것으로 식별되었습니다. 이제 새로운 tls-certificates-enforced-validation 시스템 변수는 DBA가 서버 시작 시 또는 ALTER INSTANCE RELOAD TLS 문을 사용하여 런타임에 인증서를 다시 로드할 때 인증서 유효성 검사를 강제할 수 있도록 합니다. 유효성 검사를 활성화하면, 잘못된 인증서를 발견할 경우 서버 시작을 중단하고, 런타임에 잘못된 인증서 로드를 방지하며, 경고를 출력합니다. 자세한 내용은 인증서 유효성 검사 강제 구성을 참조하십시오. (WL #13470)

이제 새로운 서버 시스템 변수를 사용하여 LDAP 플러그인 인증을 사용하는 MySQL 계정이 LDAP 서버가 다운되었거나 응답하지 않는 경우 기다려야 하는 시간을 제어할 수 있습니다. 기본 타임아웃은 30초입니다. 해당 변수는 다음과 같습니다:

연결 및 응답 타임아웃은 Linux 플랫폼에서만 시스템 변수를 통해 구성할 수 있습니다. 자세한 내용은 LDAP 플러그인 인증 타임아웃 설정을 참조하십시오. (WL #14757)

이전에는 MySQL 서버가 플러그인 API를 통해 활동 모니터링 이벤트를 생성하고 내보냈습니다. 이제 서버는 구성 요소 API를 사용하여 이벤트를 내보냅니다. 동시에, audit_log, MYSQL_FIREWALL, CONNECTION_CONTROL, Rewriter와 같은 감사 플러그인 API를 사용하는 플러그인과의 하위 호환성을 제공하기 위해 서버는 플러그인 API를 통해 필요한 이벤트를 생성하는 중간 레이어도 구현합니다. 관련된 일부 오류 메시지에는 현재의 MYSQL_AUDIT_ 접두사 대신 EVENT_TRACKING_ 접두사가 붙을 수 있습니다. (WL #12652)

버그 수정

비호환 변경 사항; 복제: SQL NULL 값을 명령줄 옵션으로 서버 변수에 설정하는 것은 허용되지 않으며 지원되지 않습니다. 이번 릴리즈부터 이러한 변수에 NULL을 설정하는 것은 금지되며, 시도 시 오류로 거부됩니다.
이 제한에서 제외되는 변수는 다음과 같습니다: admin_ssl_ca, admin_ssl_capath, admin_ssl_cert, admin_ssl_cipher, admin_tls_ciphersuites, admin_ssl_key, admin_ssl_crl, admin_ssl_crlpath, basedir, character_sets_dir, ft_stopword_file, group_replication_recovery_tls_ciphersuites, init_file, lc_messages_dir, plugin_dir, relay_log, relay_log_info_file, replica_load_tmpdir, ssl_ca, ssl_capath, ssl_cert, ssl_cipher, ssl_crl, ssl_crlpath, ssl_key, socket, tls_ciphersuites, tmpdir.
자세한 내용은 서버 시스템 변수를 참조하십시오. (버그 #109387, 버그 #34897517)

중요 변경 사항: connection_memory_chunk_size 서버 시스템 변수의 기본값이 MySQL 8.0.28에 잘못 설정되었습니다. 이번 수정으로 기본값이 8912에서 원래 의도된 값인 8192로 변경되었습니다. (버그 #35218020)

NDB Cluster: 이전 문제의 수정으로 인해, Unicode 9.0 정렬을 사용하는 경우 서로 다른 문자열 값이 동일한 해시 키로 계산되어 서로 다른 문자열을 같은 값으로 비교하는 가능성이 생길 수 있었습니다. 이 문제가 수정되었습니다. (버그 #35168702)
참조: 관련 사항: 버그 #27522732. 이 문제는 버그 #30884622의 회귀입니다.

InnoDB: InnoDB 페이지 크기보다 큰 데이터를 대량으로 로드할 때 발생하는 오류가 수정되었습니다. (버그 #35332046, 버그 #110813)

InnoDB: 많은 수의 시스템 스레드를 정리하는 동안 발생할 수 있는 혼잡 문제가 수정되었습니다. (버그 #35289390, 버그 #110685)

InnoDB: innodb_thread_concurrency를 999로 설정할 때 발생하는 오류가 수정되었습니다. (버그 #34925101)

InnoDB: MySQL 8.0.30에서의 해시 함수 변경으로 인한 성능 저하 문제가 수정되었습니다. (버그 #34870256)

InnoDB: ucs2, utf16, utf32 캐릭터셋과 관련된 오류가 수정되었습니다. (버그 #34790366)

InnoDB: 리두 로그에서 항목을 집계하는 규칙이 수정되었습니다. (버그 #34752625, 버그 #108944)

InnoDB: 리두 로그가 비어 있지 않은 읽기 전용 모드에서 복구 중 모순된 경고 및 오류 메시지가 수정되었습니다. (버그 #34506094, 버그 #108177)

InnoDB: 테이블 스페이스 삭제 및 버퍼 풀과 관련된 여러 오류가 수정되었습니다. (버그 #34330475, 버그 #107689)

InnoDB: ibd2sdi의 곱셈으로 인해 발생한 오류가 수정되었습니다. (버그 #33172685, 버그 #104474)

InnoDB: 버퍼 풀 소진을 유발할 수 있는 오류가 수정되었습니다. (버그 #27238364)

패키징; 그룹 복제: 일부 플랫폼에서 Generic Linux 패키지의 그룹 복제 플러그인이 호환 가능한 tirpc 버전을 찾지 못해 로드되지 않는 문제가 수정되었습니다. (버그 #35323208)

복제: session_track_gtids의 변경 사항이 항상 제대로 전파되지 않는 문제가 수정되었습니다. (버그 #35401212)

복제: 설계상 모든 DDL 작업(바이너리 로그 삭제와 같은 바이너리 로그 작업 포함)은 BACKUP_LOCK 객체에 대한 공유 잠금을 획득하여 백업과 DDL 작업이 동시에 수행되는 것을 방지합니다. 바이너리 로그 작업의 경우 BACKUP_LOCK에 잠금이 존재하는지만 확인하고, 이러한 잠금 유형을 확인하지는 않았습니다. 이로 인해 바이너리 로그 작업은 BACKUP_LOCK 객체에 대해 배타 잠금이 걸려 있을 때만, 즉 실제 백업이 진행 중일 때만 방지되어야 하고, 바이너리 로그를 삭제할 때 백업이 방지되어야 한다는 점에서 문제가 발생했습니다.
이제 이러한 경우, BACKUP_LOCK 객체에 걸린 잠금을 확인하는 대신 바이너리 로그를 삭제할 때 BACKUP_LOCK에 대한 공유 잠금을 획득합니다. (버그 #35342521)

복제: mysqlbinlog이 이벤트를 읽는 중 오류가 발생했을 때, 활성 바이너리 로그 파일(또는 format_description_log_eventLOG_EVENT_BINLOG_IN_USE_F 플래그가 설정된 바이너리 로그) 한 경우를 제외하고는 오류 메시지를 기록하고 0이 아닌 종료 코드를 반환했습니다. 예외가 되는 경우에는 메시지를 기록하지 않고 종료 코드 0을 반환하여 오류가 숨겨졌습니다.
이제 mysqlbinlog은 잘린 이벤트와 관련된 오류만 억제하고, 이 경우 오류 메시지 대신 주석을 출력합니다. 이 수정으로 --force-if-open 옵션의 도움말 텍스트도 개선되었습니다. (버그 #35083373)

복제: 바이너리 로그 이벤트의 압축 처리 방식이 개선되었습니다. (버그 #33666652)

복제: 각 이벤트가 1GiB보다 작지만 총 크기가 1GiB를 초과하며 압축을 해도 1GiB 이하로 줄어들지 않는 트랜잭션은 여전히 1GiB보다 큰 단일 이벤트로 바이너리 로그에 기록되었습니다. 이로 인해 서버나 mysqlbinlog과 같은 다른 도구가 읽을 수 없게 되어 바이너리 로그가 손상된 것과 같은 문제가 발생했습니다.
이제 압축된 데이터의 크기가 1GiB를 초과하면 압축 없이 트랜잭션을 처리하도록 조정했습니다. (버그 #33588473)

복제: 다중 스레드 적용기(multi-threaded applier)가 오류 로그에 Multi-threaded slave: Coordinator has waited 312251 times hitting slave_pending_jobs_size_max; current event size = 8176와 같은 메시지를 기록했으나, 이는 오류 로그에 기록될 메시지가 아니었습니다. (버그 #32587480)

복제: 세션 트랜잭션 접근 모드를 READ ONLY로 설정한 후 FLUSH BINARY LOGS 또는 SET GLOBAL binlog_checksum = CRC32 명령문을 실행하면 계획되지 않은 서버 종료가 발생했습니다. 이들 명령문 실행은 바이너리 로그 회전을 발생시키며, 회전 전에 mysql.gtid_executed 테이블을 업데이트해야 하지만 세션 트랜잭션 접근 모드가 READ ONLY 상태로 인해 이를 거부했습니다.
이제 서버가 읽기 전용 모드 또는 슈퍼 읽기 전용 모드로 실행 중일 때와 같이 READ ONLY 접근 모드를 무시하여 바이너리 로그 회전이 진행될 수 있도록 수정했습니다. (버그 #109894, 버그 #35041573)

그룹 복제: 복제 그룹 설정에서 applier 채널 외에 트랜잭션 소스가 있을 때, 다음과 같은 이벤트 시퀀스가 발생할 수 있었습니다:

  1. 여러 트랜잭션이 이미 인증되었고, Ticket 2와 연결되어 있었지만 아직 커밋되지 않은 상태에서 로컬로 적용됨. 이 트랜잭션들은 로컬 또는 비로컬일 수 있음.
  2. Ticket 3과 함께 뷰가 생성되고, Ticket 2의 트랜잭션을 기다려야 함.
  3. VC1 뷰 변경이 GR applier 채널에 들어가고, 티켓이 3으로 변경되기를 기다림.
  4. Ticket 2의 트랜잭션이 완료되기 전에 다른 그룹 변경과 VC2 뷰 변경이 발생.

이로 인해 발생할 수 있는 문제는 Ticket 2의 마지막 트랜잭션이 실행 완료로 표시되었지만 티켓이 아직 처리되지 않았을 때 발생하며, 이 경우 VC2가 티켓을 처리했지만, 참가자에게 알리지 않았습니다. 결과적으로 VC1이 티켓 변경을 무한히 기다리는 문제가 발생하며, 해당 작업자는 종료될 수 없었습니다.
이번 수정으로 루프 조건이 변경될 때마다 응답하도록 루프 내에서 매초마다 확인하며, 종료 신호에 더 잘 응답하도록 새로운 단계를 등록했습니다. (버그 #35392640)
참조: 관련 사항: 버그 #35206392, 버그 #35374425.

그룹 복제: SET GLOBAL group_replication_force_members = host:portSHOW STATUS LIKE 'group_replication_primary_member'을 병렬로 실행하면 새로운 뷰를 기다리는 동안 시간이 초과되는 문제가 있었습니다. (버그 #35312441)

그룹 복제: Network_provider_manager::open_xcom_connection()에서 발견된 메모리 누수가 수정되었습니다. (버그 #34991101)

룹 복제: 그룹 작업이 그룹에 전송되고 연결이 코디네이터에서 종료되었을 때, 그룹 구성원들이 서로 다른 상태에 놓여 있어, 동작을 받은 구성원들은 이를 실행한 구성원을 기다리고 실행을 시작한 구성원은 처리할 작업이 없는 상황이 발생하여 그룹의 조정에 문제가 발생했습니다.
이제 이러한 경우 그룹 작업이 모든 구성원이 작업을 완료할 때까지 대기하도록 함으로써 이 문제를 방지합니다. (버그 #34815537)

그룹 복제: 그룹 복제에서 간접적으로 생성된 OpenSSL 연결이 항상 예상대로 정리되지 않았습니다. 이제 이러한 연결이 그룹 복제에 의해 생성될 때 언제든지 호출 가능한 정리 기능을 추가하여 이 문제를 해결했습니다. (버그 #34727136)

그룹 복제: 일부 경우에 MySQL 서버가 그룹 복제를 위한 연결을 여전히 허용하였으며, 이는 그룹 복제 플러그인이 셧다운을 시작한 이후에도 발생할 수 있었습니다. (버그 #34398622)

Microsoft Windows: Windows에서 MySQL 서버 구성을 돕기 위한 새로운 MySQL Configurator 애플리케이션이 추가되었습니다. 이는 이전 버전의 MySQL 제품 설치 및 구성을 담당했던 MySQL Installer 애플리케이션을 대체합니다. MySQL Configurator (mysql_configurator.exe)는 MSI와 Zip 아카이브 패키지 모두에 포함되어 있습니다. (버그 #35461041)

JSON: 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)을 반환합니다. (버그 #35206138)

JSON: 일부 JSON 스키마가 JSON_SCHEMA_VALID()에서 항상 올바르게 처리되지 않는 문제가 수정되었습니다. (버그 #109296, 버그 #34867398)

일부 정규 표현식 함수와 산술 함수의 조합이 항상 올바르게 평가되지 않는 문제가 있었습니다. (버그 #35462660)

드문 경우에 MySQL 서버가 예상되는 오류 메시지를 출력하지 않고 종료되는 문제가 있었습니다. (버그 #35442407)

MySQL 8.0.31에서 추가된 내부 리소스 그룹 개선 사항이 MySQL 8.0.32에서 리팩터링된 후 이번 릴리스에서 되돌려졌습니다. (버그 #35434219)
참조: 되돌린 패치: 버그 #34702833.

MySQL 5.7에서 MySQL 8.0으로 서버 재시작 없이 업그레이드한 후, 테이블에서 쿼리를 실행할 때 예기치 않은 오류가 발생할 수 있었습니다. 이번 수정으로 업그레이드와 쿼리 실행 사이에 서버를 재시작할 필요가 없어졌습니다. (버그 #35410528)

MySQL 8.0.33의 수정으로 인해 ORDER BY 항목이 이미 해결된 경우 다시 해결되지 않도록 처리했지만, ORDER BY 항목이 참조인 경우를 처리하지 못한 문제가 있었습니다. (버그 #35410465)
참조: 이 문제는 버그 #34890862의 회귀입니다.

session_track_gtids의 변경 사항이 항상 올바르게 처리되지 않는 문제가 있었습니다. (버그 #35401212)

SQL문 실행 후 일부 포인터가 항상 해제되지 않는 문제가 있었습니다. (버그 #35395965)

Item_func_min_max::cmp_datetimes()에서, 현재 항목이 실제로 nullable하지 않음에도 불구하고 null_value가 설정되는 문제가 있었습니다. (버그 #35380560, 버그 #35492532)

저장 루틴 내 일부 서브쿼리가 항상 올바르게 처리되지 않는 문제가 있었습니다. (버그 #35377192)

서버가 클라이언트로 전송한 네트워크 패킷 데이터를 파싱할 때의 강화를 통해 보안이 강화되었습니다. (버그 #35374491)

INTERSECT를 사용하는 일부 쿼리가 항상 올바르게 처리되지 않는 문제가 있었습니다. (버그 #35362424)

준비된 문장 내에서 SELECT 문장이 연속 실행 시 다른 결과를 반환하는 문제가 있었습니다. (버그 #35340987)
참조: 이 문제는 버그 #35060385의 회귀입니다.

암호화 향상을 통해 규정 준수가 강화되고 사용되지 않는 API의 사용이 제거되었습니다. (버그 #35339886)

테이블 이름과 열 이름으로 주어진 열 참조가 find_item_in_list() 함수에서 조회될 때, 아직 해결되지 않은 항목의 경우 테이블 이름이 없을 수 있음을 무시했던 문제가 수정되었습니다. 이번 수정으로 테이블 이름이 없는 항목에 대한 명시적 검사를 추가했습니다. (버그 #35338776)

사용 중단된 lz4_decompresszlib_decompress 명령줄 유틸리티가 사용 중단되었습니다. 이 유틸리티들은 사용 중단된 mysqlpump 명령줄 유틸리티를 지원하기 위해 존재했습니다. (버그 #35328235)

NULLIF()를 사용하는 일부 쿼리에서 어설션이 발생하는 문제가 있었습니다. 이 문제는 Item_func_nullif::resolve_type_inner() 함수에서 원래 데이터 유형이 시간 유형인 경우, 문자열 유형으로 조정되었으나 결과 유형이 일관되게 조정되지 않아 발생했습니다. 이번 수정으로 이러한 경우 결과 유형을 STRING_RESULT로 설정했습니다. (버그 #35323398)

Linux에서, mysql 클라이언트의 ssl_session_data_print 명령이 이제 파일 권한을 기본 0644 대신 절대 모드 0600으로 저장합니다. (버그 #35304195)

LIKE '%...%'를 사용하는 쿼리가 이전 버전의 MySQL보다 성능이 저하되는 문제가 있었습니다. (버그 #35296563)

MATERIALIZE 경로의 비용을 계산할 때, 자식 경로의 출력 행 수가 정의되지 않은 경우 해당 자식을 무시하도록 처리했으나, 암묵적 그룹화를 가진 AGGREGATE 경로에서 자식의 출력 행 수가 1로 설정될 수 있었습니다. 이번 수정으로 자식 경로의 비용이 실제로 정의되었는지 확인하고, 정의되지 않은 경우 이를 건너뛰도록 했습니다. (버그 #35240913)
참조: 관련 사항: 버그 #33834146, 버그 #34302461.

Bounded_queue::push()에서 Key_generator::make_sortkey()UINT_MAX를 반환하는 경우 키가 생성되지 않았으며, 이제 이 경우 내부 큐를 업데이트하지 않도록 수정했습니다.
이번 수정의 일환으로 push()는 오류 시 true를 반환합니다. (버그 #35237721)

authentication_oci 플러그인이 수정되어, 페더레이션 및 프로비저닝된 사용자가 OCI CLI를 통해 생성된 임시 키 쌍을 사용하여 프록시 사용자로 DB 시스템에 연결할 수 있게 되었습니다. (버그 #35232697)

공통 테이블 식을 사용하는 일부 쿼리가 항상 올바르게 처리되지 않는 문제가 있었습니다. (버그 #35231475)

내부 함수 compare_pair_for_nulls()가 항상 명시적인 반환 값을 설정하지 않는 문제가 있었습니다. (버그 #35217471)

MySQL 코딩 스타일과 충돌하는 clang-tidy 검사를 제거했습니다. (버그 #35208735)

EXISTS를 내부 및 외부 부분에 모두 사용하는 일부 서브쿼리가 올바르게 처리되지 않는 문제가 있었습니다. (버그 #35201901)

회전된 감사 로그 파일이 이제 이전 파일의 값 대신 북마크 ID 값을 0으로 재설정합니다. (버그 #35200070)

파일정렬로 정렬할 항목을 평가할 때 오류가 항상 올바르게 전파되지 않는 문제가 있었습니다. (버그 #35195181)
참조: 관련 사항: 버그 #35145246.

특정 경우에 UNIX_TIMESTAMP()가 미리 평가되는 문제가 있었습니다. (버그 #35174730)

스칼라 서브쿼리를 파생 테이블로 변환하려고 할 때, 최상위 쿼리가 암묵적으로 그룹화되어 있었기 때문에 그룹화를 첫 번째 파생 테이블로 이동시켰습니다. 이후 원래 변환이 수행되지 않으면, 초기 변환은 유효했어야 했으나, 서브쿼리에서 참조 필드를 대체할 때 조인 조건을 확인하지 않았습니다. 이러한 경우 파생 테이블 서브쿼리 외의 서브쿼리에는 하강하지 않았습니다. (버그 #35170671)

ROLLUP과 관련된 이전 문제의 수정이 디버그 빌드에서 서버 종료를 유발했습니다. (버그 #35168639)
참조: 이 문제는 버그 #33830659의 회귀입니다.

Item_func_make_set::val_str()의 구현을 단순화하여 입력 인수를 재사용하지 않고 항상 로컬 문자열 버퍼를 사용하도록 보장했습니다. (버그 #35154335, 버그 #35158340)

스칼라 서브쿼리를 파생 테이블과의 조인으로 변환할 때, 서브쿼리가 SELECT 목록에 있고 포함된 쿼리가 암묵적으로 그룹화된 경우에도 허용되어야 하지만, subquery_to_derived 최적화 스위치가 활성화된 경우 거부되었습니다. (버그 #35150438)

서브쿼리를 파생 테이블과의 조인으로 변환할 때, 포함된 쿼리가 그룹화된 경우, 그룹화를 수행할 추가 파생 테이블이 생성되었습니다. 이 과정에서 포함된 쿼리의 초기 선택 목록 항목이 추가 파생 테이블로 이동되었으며, 원래의 선택 목록 항목(서브쿼리를 제외하고, 서브쿼리는 자체 파생 테이블을 가짐)은 모두 추가 파생 테이블의 열로 대체되었습니다.
이 논리는 내부적으로 기본값이 모델링된 방식 때문에 DEFAULT를 올바르게 처리하지 못했습니다. 이번 수정으로 변환 중에 DEFAULT(expression)을 지원하게 되었습니다. 또한 이 수정은 선택 목록에 동일한 열이 두 번 발생할 때 항목 이름이 일치하지 않는 문제를 해결했습니다. (버그 #35150085, 버그 #35101169)

SELECT * FROM t1 WHERE (SELECT a FROM t2 WHERE t2.a=t1.a + ABS(t2.b)) > 0 형식의 쿼리는 서브쿼리가 1개 이상의 행을 반환할 때 Subquery returns more than 1 row 오류를 반환해야 하지만, subquery_to_derived 최적화가 활성화된 경우 변환이 잘못 적용되어 쿼리가 잘못된 결과를 반환했습니다. (버그 #35101630)

특정 GRANT 문과 관련된 잠재적인 충돌을 처리하는 방식이 개선되었습니다. (버그 #35089304)

MEMBER OF()ORDER BY DESC를 사용하는 쿼리가 JSON 열에 멀티 값 인덱스가 생성된 후 부분적인 결과 집합만 반환하는 문제가 있었습니다. 이 문제는 MySQL 8.0.30에서 수정된 유사한 문제와 유사하지만, 이번에는 쿼리에 ORDER BY DESC 절이 추가된 경우 발생했습니다. (버그 #35012146)
참조: 관련 사항: 버그 #106621, 버그 #33917625.

디버그 서버가 DECIMAL 값을 포함하는 특정 작업에서 어설션을 발생시키는 문제가 있었습니다. (버그 #34973932)

ANY 서브쿼리의 null 가능성이 잘못된 경우가 있었는데, 이는 좌변의 null 가능성을 고려하지 않았기 때문입니다. 이번 수정으로 좌변이 nullable인 경우 ANY 서브쿼리를 nullable로 표시하도록 했습니다. (버그 #34940790)

서브쿼리를 파생 테이블과 조인을 사용하도록 변환할 때 선택 목록에서 표현식을 추가 및 교체하는 모든 경우가 참조 카운트를 올바르게 유지하도록 변경되었습니다. (버그 #34927110)

항목 유형의 집계가 여러 인수에서 처리될 때 여러 내부 함수에서 처리해야 했던 부분이 단순화되어 이제 단일 함수에서만 수행됩니다. 이는 집합 연산 결과로 생성된 표현식과 관련된 CASE 연산자 (및 관련 함수 COALESCE()IF())뿐만 아니라 LEAD()LAG()를 사용하는 표현식의 처리 효율을 높이는 데 기여할 것으로 예상됩니다. (버그 #34847836)

인덱스 병합(자세한 내용은 인덱스 병합 최적화 참조)은 ROR-유니언(ROR-union) 계획을 정렬 유니언(sort-union) 계획보다 우선시해야 합니다. 이는 정렬 유니언은 추가로 RowID에 따라 행을 정렬해야 하지만, ROR-유니언은 그렇지 않기 때문입니다.
OR 조건을 포함한 WHERE 절의 각 부분에 대해 범위 최적화 도구는 가능한 최상의 범위 스캔을 선택하고 이들 범위 스캔을 사용하여 인덱스 병합 스캔(즉, 정렬 유니언 스캔)을 구축합니다. 모든 최상의 범위 스캔이 ROR 스캔인 경우 범위 최적화 도구는 항상 ROR-유니언 스캔을 제안하며, 이는 정렬 유니언 스캔보다 항상 비용이 저렴하기 때문입니다. 그러나 OR 조건의 일부에 대해 최상의 범위 스캔이 ROR 스캔이 아닐 때 문제가 발생했으며, 이 경우 범위 최적화 도구는 항상 정렬 유니언을 선택했습니다. 이러한 상황에서 ROR 스캔을 선택하는 것이 더 유리할 수 있는 경우에도, RowID별로 행을 정렬할 필요가 없어지기 때문입니다.
이제 이러한 경우 최상의 범위 스캔을 결정할 때, 범위 최적화 도구는 가능한 ROR 스캔이 있는지 여부를 감지하고, OR 조건의 각 부분에 가능한 ROR 스캔이 하나 이상 있는지 확인합니다. 조건이 충족되면 범위 최적화 도구를 다시 실행하여 OR 조건의 각 부분을 처리하기 위한 최상의 ROR 스캔을 얻고, ROR-유니언 경로를 만듭니다. 최종 계획을 제안할 때 이 비용을 정렬 유니언의 비용과 비교합니다. (버그 #34826692, 버그 #35302794)

뷰에서 선택할 때 collation_connection의 현재 세션 값과 일치하지 않는 테이블 또는 테이블의 뷰 정의에서 선택한 경우 Illegal mix of collations ... for operation '=' 오류가 발생할 수 있었습니다. (버그 #34801210)

뷰(v1)가 다른 뷰(v2)에 접근하고 v2가 재생성되면 SHOW COLUMNS FROM v1에서 잘못된 뷰 오류를 보고했습니다. 이는 사용자가 모든 리소스(*.*)에 대한 권한을 부여받았지만 테이블 또는 열 수준 권한이 없는 경우에 발생했습니다. 이 문제는 적절한 테이블 수준 검사를 생략하는 조건을 제거하여 해결되었습니다. (버그 #34467659)

DISTINCT를 사용하는 쿼리에서 0과 -0이 다르게 처리되었습니다. (버그 #34361437)

ANALYZE TABLE 명령어가 UPDATE HISTOGRAM 또는 DROP HISTOGRAM 옵션과 함께 사용되면 TABLE_SHARE가 무효화되어, 이후 쿼리는 실행 중인 모든 쿼리가 완료될 때까지 기다려야만 이전의 TABLE_SHARE가 해제되고 새로운 히스토그램 컬렉션이 초기화되었습니다. 이러한 과정은 TABLE_SHARE가 무효화된 후 실행된 쿼리들이 기존의 TABLE_SHARE를 참조하는 오래 실행되는 쿼리들이 종료될 때까지 기다리게 하여, 긴 대기 시간을 유발할 수 있었습니다.
이번 수정에서는 히스토그램 명령어의 동작을 변경하여 TABLE_SHARE의 무효화 대신 테이블을 재열기로 표시하도록 변경했습니다. 이제 단일 세트의 테이블 히스토그램을 TABLE_SHARE에 캐시하는 대신, TABLE_SHARE에서 참조 카운트된 테이블 히스토그램 세트를 유지 관리합니다. 특정 테이블의 히스토그램이 수정되면 해당 히스토그램 세트의 새로운 스냅샷을 TABLE_SHARE 컬렉션에 삽입하고 이를 현재 상태로 표시합니다. 테이블 객체가 열리면 현재 테이블 히스토그램 세트의 스냅샷에 대한 포인터를 획득하고, 테이블 객체가 닫힐 때 포인터를 다시 TABLE_SHARE에 반환합니다.
이러한 방식으로 테이블 히스토그램의 여러 참조 카운트된 버전을 사용함으로써, 히스토그램이 업데이트되거나 삭제될 때 TABLE_SHARE 재초기화와 관련하여 테이블의 모든 쿼리를 동기화할 필요가 없어졌습니다. (버그 #34288890, 버그 #35419418)

유효한 MySQL 명령어 (usestatus)와 C API 함수 (mysql_refresh, mysql_stat, mysql_dump_debug_info, mysql_ping, mysql_set_server_option, mysql_list_processes, mysql_reset_connection)는 명령어 실행이나 함수 호출에 오류가 발생하지 않았음에도 불구하고 감사 로그에 오류 메시지를 기록할 수 있었습니다. (버그 #33966181)

고정 배열의 최대 크기가 512에서 8192로 증가했습니다. 이로 인해 mysqladmin 확장 상태 요청 시 512개의 항목을 초과할 수 있는 문제를 해결했습니다.
Meta에 감사드립니다. (버그 #30810617)

mysqldump--column-statistics 옵션이 MySQL 8.0.2 이전 버전에서 information_schema.column_statistics 테이블을 선택하려고 시도했으나, 이제 서버에서 지원하지 않는 열 통계라는 경고가 생성되고 옵션이 false로 설정됩니다.
Meta에 감사드립니다. (버그 #28782417)

MySQL에서 디렉터리 이름의 길이를 가져오는 기능이 개선되었습니다. (버그 #28047376)

암시적 집계를 포함한 쿼리 실행은 HAVING 절로 행을 필터링하지 않는 한 정확히 하나의 행을 반환해야 하지만, FALSE로 평가되는 HAVING 절이 포함된 쿼리가 이를 무시하고 행을 반환하는 경우가 있었습니다. (버그 #14272020)

여러 공통 테이블 표현식을 사용하는 일부 복잡한 쿼리가 항상 올바르게 처리되지 않았습니다. (버그 #112021, 버그 #35284734, 버그 #35694546)
참고: 버그 #111994, 버그 #35686058도 참조하십시오. 이 문제는 버그 #34377854의 회귀입니다.

쿼리에 사용되지 않는 윈도우 함수가 포함되어 있고 제거될 수 있는 ORDER BY 절이 함께 있는 경우, 예상치 못한 서버 종료가 발생할 수 있었습니다. (버그 #111585, 버그 #35168639, 버그 #35204224, 버그 #35545377)
참고: 이 문제는 버그 #35118579의 회귀입니다.

ORDER BY RANDOM_BYTES()는 쿼리 출력에 영향을 주지 않았습니다. (버그 #111252, 버그 #35148945, 버그 #35457136)

mysql 클라이언트의 status 출력이 개선되어 이제 프로토콜 행에 압축 알고리즘과 zstd 수준이 포함됩니다.
Daniël van Eeden에게 감사드립니다. (버그 #110950, 버그 #35369870)

MySQL 소스 코드 문서에서 C API 프로토콜과 관련된 다음 정보가 누락되어 있었습니다: zstd_compression_levelCLIENT_ZSTD_COMPRESSION_ALGORITHM이 설정된 경우에만 전송됩니다.
Daniël van Eeden에게 감사드립니다. (버그 #110939, 버그 #35365351)

특정 경우 VALUES ROW()NULL로 평가되는 표현식을 올바르게 처리하지 못했습니다. (버그 #110925, 버그 #35363550)

QUOTE() 함수가 utf16 캐릭터셋을 가진 테이블의 열을 선택할 때 예상치 못한 결과를 반환했습니다. (버그 #110672, 버그 #35286970)

사용자 정의 함수를 로드할 때 발생할 수 있는 문제가 수정되었습니다. (버그 #110576, 버그 #35242734)

FLUSH STATUS, COM_CHANGE_USER, 및 SELECT FROM I_S.PROCESSLIST의 동시 실행이 교착 상태를 유발할 수 있었습니다. 비슷한 문제는 COM_STATISTICS, COM_CHANGE_USER, 및 SHOW PROCESSLIST의 동시 실행에서도 관찰되었습니다.
Dmitry Lenev에게 감사드립니다. (버그 #110494, 버그 #35218030)

mysqldump 유틸리티가 생성된 열에 대해 잘못된 INSERT 문을 생성할 수 있었습니다. (버그 #110462, 버그 #35208605)

mysqldump에서 함수 인덱스를 가진 테이블을 대상으로 사용했을 때 예상치 못하게 중단되는 문제가 있었습니다. (버그 #110452, 버그 #35205310)

불가능한 WHERE 조건인 WHERE int_col = 05687.3E-84과 유사한 구문이 항상 올바르게 처리되지 않았습니다. (버그 #110434, 버그 #35200367)

UCA 캐릭터셋의 로딩 및 언로딩이 초기화와 해제 과정에서 메모리 관리를 개선하도록 다시 작성되었습니다. (버그 #109540, 버그 #110836, 버그 #34969838, 버그 #35341006)

최적화 중에 범위 선택 트리 생성은 IN() 술어의 왼쪽 항목에 따라 서로 다른 논리를 사용합니다. 필드 항목인 경우 오른쪽 항목의 각 값이 OR 트리에 추가되어 필요한 표현식을 만듭니다. 행 항목 비교의 경우(WHERE (a,b) IN ((n1,m1), (n2, m2), ...)와 같은 예시)에는 논리적 정상형(DNF) 표현식이 필요합니다. DNF 표현식은 각 오른쪽 값 집합에 대해 열 값을 포함한 AND 트리를 OR 트리에 추가하여 생성해야 하지만, 대신 OR 트리가 AND 트리에 추가되어 트리 병합에 O(n^2) 실행 시간 복잡도로 인해 지수 시간이 소요되었습니다. (버그 #108963, 버그 #34758905)

SELECT 문을 사용하여 테이블을 생성하고 해당 문이 GEOMETRY 유형의 표현식을 포함할 때, MySQL이 기본적으로 빈 문자열을 열 값으로 생성할 수 있었습니다. 이 문제를 해결하기 위해 이제 이러한 상황에서는 GEOMETRY 유형의 열에 대해 기본 값을 생성하지 않습니다. Tencent에 감사드립니다. (버그 #107996, 버그 #34426943)

UNION 연산의 결과를 보유하는 임시 테이블에 대해 YEAR 유형의 필드를 생성할 때 발생하던 어설션이 제거되었습니다. (버그 #107826, 버그 #34370933, 버그 #35282236)

인덱스 건너뛰기 스캔의 경우, 첫 번째 범위 읽기는 첫 번째 범위의 끝을 나타내는 범위 종료 값을 설정했지만, 다음 범위 읽기에서는 이전의 범위 종료 값을 지우지 않아 이 오래된 값이 현재 범위에 적용되었습니다. 이전 범위 읽기에서 이미 범위 종료 경계를 초과했기 때문에 이는 읽기를 중단하여 결과에서 여러 행이 누락되는 결과를 초래했습니다.
이러한 경우 오래된 범위 종료 값이 지워지도록 수정했습니다. (버그 #107460, 버그 #34235624, 버그 #34982949)

Leave a Comment



이 문서 공유

8.1.0 변경 사항 (2023-07-18 Innovation Release)

링크 복사

CONTENTS