MySQL 8.0 Release Note

8.0.34 변경 사항 (2023-07-18 GA)

Estimated reading: 5 minutes 119 views

공식 문서: Changes in MySQL 8.0.34 (2023-07-18, General Availability)

계정 관리 관련 사항

새로운 비밀번호 검증 시스템 변수를 통해, 사용자가 자신의 MySQL 계정 비밀번호를 변경하려고 할 때 변경해야 하는 최소 문자 수를 설정하고 강제할 수 있게 되었습니다. 이 새로운 검증 설정은 현재 비밀번호의 총 문자 수에 대한 비율입니다. 예를 들어, validate_password.changed_characters_percentage 값이 50인 경우, 변경할 계정 비밀번호의 문자 중 최소 절반은 현재 비밀번호에 존재해서는 안 됩니다. 그렇지 않으면 비밀번호는 거부됩니다.

이 새로운 기능은 DBA가 비밀번호 관리를 더욱 완벽하게 제어할 수 있도록 하는 기능 중 하나입니다.  Password Management부분 참고바랍니다. (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

audit_log 플러그인 설치 스크립트와 관련된 추가 정보는, Installing or Uninstalling MySQL Enterprise Audit 부분 참고바랍니다. (버그 #35252268)

MySQL Enterprise Audit에서는 스케줄러 컴포넌트를 사용하여 메모리 내 캐시를 플러시하는 반복 작업을 설정하고 실행할 수 있도록 지원하게 되었습니다. 설치 과정은 Enabling the Audit Log Flush Task 부분 참고바랍니다. (WL #15567)

바이너리 로깅

개발자가 MySQL 서버의 바이너리 로그에 접근할 수 있도록 하는 몇 가지 함수(mysql_binlog_open(), mysql_binlog_fetch(), mysql_binlog_close())가 libmysqlclient.so 공유 라이브러리에 추가되었습니다.

기여해 주신 유라 소로킨에게 감사드립니다. (버그 #110658, 버그 #35282154)

C API 관련 사항

호출 함수에서 len은 0으로 초기화되며, net->vio가 null일 경우 절대 변경되지 않습니다. 이번 수정에서는 vio를 역참조하기 전에 net을 체크하도록 추가했습니다.
Meta 팀의 기여에 감사드립니다. (버그 #30809590)

특정 코드 경로에서 async 클라이언트의 변수가 초기화되지 않은 상태였습니다. 이제 변수를 항상 초기화하도록 수정했습니다.
Meta 팀의 기여에 감사드립니다. (버그 #30809568)

컴파일 관련 사항

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/source/requirements.txt가 GitHub의 가짜 풀 리퀘스트에 영향을 주었기 때문에, 사용되지 않는 extra/libcbor/doc/ 디렉토리를 삭제했습니다. (버그 #35433370)

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

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

TRASH 매크로를 사용하여 내부 MEM_ROOT 클래스의 메모리를 가비지로 초기화하여, MEM_ROOT에서 할당된 초기화된 메모리를 읽음으로써 발생하는 버그를 재현하기 쉽게 했습니다. (버그 #35277644)

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

-O1 -fno-inline을 sanitizer 빌드에 추가하는 OPTIMIZE_SANITIZER_BUILDS CMake 옵션을 추가했습니다. 기본값은 켜짐입니다. (버그 #35158758)

Bison의 최소 버전 요구 사항이 v2.1에서 v3.0.4로 변경되었습니다. macOS의 경우, Homebrew 등의 패키지 매니저를 통해 Bison을 설치해야 할 수 있습니다. (버그 #35154645, 버그 #35191333)

MySQL은 비ASCII 출력 문제를 회피하기 위해, readelf를 실행할 때 환경 변수에 LANG=C를 설정하도록 변경되었습니다.
기여해 주신 다케우치 켄토에게 감사의 말씀을 전합니다. (버그 #111190, 버그 #35442825)

macOS에서는 rapidjson이 Homebrew를 통해 설치된 경우, MySQL은 컴파일되지 않습니다. 해결 방법은 brew unlink rapidjson을 실행하는 것이었습니다. (버그 #110736, 버그 #35311140)
참고: 이 문제는 버그 #35006191의 리그레션입니다.

MySQL은 -DWITH_ZLIB=system으로는 빌드되지 않습니다. 이는 시스템의 zlib 라이브러리를 찾았음에도 불구하고, 찾을 수 없다고 에러를 표시합니다. (버그 #110727, 버그 #110745, 버그 #35307674, 버그 #35312227)

사용 중단 및 제거 관련 사항

중요한 변경 사항: MySQL은 데이터베이스 덤프와 백업을 수행하가 위해 mysqldumpMySQL Shell 유틸리티를 포함하여 동일하거나 더 나은 기능을 제공하는 다른 수단을 제공하므로, mysqlpump 클라이언트 유틸리티 프로그램은 더 이상 필요하지 않으며 현재는 비추천 상태입니다. 이 프로그램을 호출하면 이제 경고가 생성됩니다. mysqlpump는 향후 MySQL 버전에서 제거될 수 있으므로, 이에 의존하는 애플리케이션은 앞서 언급한 대체 솔루션으로 이동해야 합니다. (WL #15652)

복제: sync_relay_log_info 서버 시스템 변수는 이번 릴리스에서 비추천되었으며, 이 변수를 가져오거나 설정하거나, 동등한 시작 옵션 --sync-relay-log-info를 사용할 때 경고가 발생합니다.
이 변수는 향후 MySQL 버전에서 제거될 예정입니다. 이를 사용하는 애플리케이션은 그 전에 의존하지 않도록 다시 작성해야 합니다. (버그 #35367005, WL #13968)

복제: binlog_format 서버 시스템 변수는 현재 비추천 상태이며, 향후 MySQL 버전에서 제거될 수 있습니다. 이 변수와 관련된 기능, 즉 바이너리 로그 형식을 변경하는 기능도 비추천됩니다.
이 변경의 의미는 binlog_format이 제거되면, 이미 MySQL 8.0의 기본값인 행 기반 바이너리 로깅만이 MySQL 서버에서 유일하게 지원된다는 것입니다. 이러한 이유로, 신규 설치에서는 행 기반 바이너리 로깅만 사용해야 하며, 스테이트먼트 기반 또는 혼합 로그 형식을 사용하는 기존 설치본은 행 기반 형식으로 이전해야 합니다. Replication Formats 부분도 참고바랍니다.
스테이트먼트 기반 로깅의 컨텍스트에서만 유용한 시스템 변수 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_accountsaudit_log_exclude_accountsaudit_log_statement_policyaudit_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에서는 시스템 변수와 클라이언트 옵션을 사용하여 서버 측과 클라이언트 측에서 FIPS 모드를 제어할 수 있습니다. 애플리케이션 프로그램은 mysql_options()MYSQL_OPT_SSL_FIPS_MODE 옵션을 사용하여 클라이언트에서 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 옵션 파일 (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부분도 참고바랍니다.)(WL #15668)

keyring_file 플러그인과 keyring_encrypted_file 플러그인은 비추천되었습니다. 이러한 키링 플러그인은 component_keyring_file 컴포넌트와 component_keyring_encrypted_file 컴포넌트로 대체됩니다. (WL #15659)

이전에는 MySQL 서버가 그 안에 포함된 MySQL 버전 번호 뒤에 공백이 오는지 여부에 관계없이 버전 특유의 주석을 처리했습니다. 예를 들어, 주석 /*!80034KEY_BLOCK_SIZE=1024*//*!80034 KEY_BLOCK_SIZE=1024*/는 동일하게 처리되었습니다. 이번 릴리스부터, 이러한 주석 내의 버전 번호 뒤에 오는 다음 문자가 공백 문자도 아니고 주석의 끝도 아닌 경우, 서버는 경고를 발행합니다.(warning: Immediately starting the version comment after the version number is deprecated and may change behavior in a future release. Please insert a whitespace character after the version number.) (=경고: 버전 번호 바로 다음에 버전 주석을 시작하는 것은 비추천되며, 향후 릴리스에서 동작이 변경될 수 있습니다. 버전 번호 뒤에 공백 문자를 삽입하십시오.)
향후 MySQL 버전에서는 버전 특유의 주석에 대한 공백 요구 사항이 엄격히 적용될 것으로 예상해야 합니다.
Comments부분도 참고바랍니다. (WL #15686)

MySQL 클라이언트 라이브러리는 현재, 연결이 끊어진 것으로 판명되고 애플리케이션이 실행한 스테이트먼트를 서버에 전송하려고 할 때, 서버에 대한 자동 재연결을 수행하는 것을 지원합니다. 현재 이 기능은 비추천되었으며, 향후 MySQL 릴리스에서 제거될 수 있습니다.
관련된 MYSQL_OPT_RECONNECT 옵션은 계속 사용할 수 있지만, 이것도 비추천됩니다. C API 함수 mysql_get_option()mysql_options()는 애플리케이션이 MYSQL_OPT_RECONNECT를 지정한 경우, 비추천 경고를 표준 오류 출력에 기록하게 되었습니다. (WL #15766)

Performance Schema 관련 사항

Performance Schema의 clone_status 테이블의 gtid_executed 열에 사용되는 타입이 VARCHAR(4096)에서 LONGTEXT로 변경되었습니다. (버그 #109171, 버그 #34828542)

SQL 구문 관련 사항

CURRENT_USER()CREATE TABLEALTER TABLE ... ADD COLUMN 문에서 VARCHAR 열 및 TEXT 열의 기본값으로 사용할 수 있게 되었습니다.
함수 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의 출력에도 포함되며, 해당되는 경우 정보 스키마의 COLUMNS 테이블의 COLUMN_DEFAULT 열에서도 참조됩니다.
해당 열에 가능한 최대 길이의 값을 저장할 수 있도록 해야 하는 경우, 열이 최소 288자를 수용할 수 있는지 확인해야 합니다(사용자 이름은 255자, 호스트 이름은 32자, 구분 기호 @는 1자). 이러한 이유로, 이러한 함수 중 하나를 CHAR 열의 기본값으로 사용하는 것은 가능하지만, 오류나 값의 잘림 위험이 있으므로 권장되지 않습니다. (버그 #17809, 버그 #11745618)

추가 및 변경된 기능

중요한 변경 사항: 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)

패키징: 이번 릴리스부터, 이전에 -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을 설치하거나 업그레이드할 때 mysql-8.0.33-el7-x86_64.tar를 사용했다면, 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.1을 사용하도록 업그레이드되었습니다. (버그 #35329529)

버그 수정

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

NDB Cluster: 이전 문제의 수정으로 인해 Unicode 9.0 콜레이션이 사용되고, 콜레이션 해시 메서드가 두 개의 다른 문자열에 대해 동일한 해시 키를 계산하는 경우, 다른 문자열 값이 동일한 것으로 비교될 가능성이 약간 있었습니다. (버그 #35168702)
참고: 버그 #27522732도 참조하십시오. 이 문제는 버그 #30884622의 리그레션입니다.

InnoDB: 다수의 시스템 스레드 정리에 의해 발생할 수 있는 혼잡이 수정되었습니다. (버그 #35289390, 버그 #110685)

InnoDB: ddl::Aligned_buffer가 커널 메모리 관리가 아닌 표준 메모리 할당자를 사용하도록 변경되었습니다. (버그 #35194732, 버그 #110411)

InnoDB: MySQL 5.7에서 MySQL 8.0.32나 MySQL 8.0.33으로 업그레이드할 때, 사용되지 않는 설정 파라미터 innodb_log_file_size 또는 innodb_log_files_in_group 때문에 실패할 수 있는 문제가 수정되었습니다. 해결 방법은 --innodb-redo-log-capacity=206158430208을 지정하여 MySQL 8.0.34를 시작하는 것입니다. (버그 #35155280)
[원문 그대로 번역하면 버전 번호가 위와 같은데, 8.0.32, 8.0.33, 8.0.34에서 똑같이 발생하는 버그 같고, 32든 33이든 34든 해결 방법도 똑같을 것으로 보임]

InnoDB: MySQL 8.0.30의 해싱 함수 변경으로 인해 성능에 부정적인 영향을 미쳤습니다. (버그 #34870256)

InnoDB: REDO 로그 내의 엔트리를 집계하는 규칙이 수정되었습니다. (버그 #34752625, 버그 #108944)

InnoDB: 테이블스페이스 삭제와 버퍼 풀로 인해 발생하는 몇 가지 오류가 수정되었습니다. (버그 #34330475, 버그 #107689)

패키징; 그룹 복제: 일반적인 Linux 패키지의 그룹 복제 플러그인은 호환되는 버전의 tirpc가 없는 일부 플랫폼에서 로드되지 않았습니다. (버그 #35323208)

복제: session_track_gtids의 변경 사항이 항상 올바르게 전파되지 않았습니다. (버그 #35401212)

복제: 설계상, 모든 DDL 작업(바이너리 로그의 정리와 같은 바이너리 로그 작업 포함)은 BACKUP_LOCK 객체의 공유 잠금을 획득합니다. 이를 통해 백업과 DDL 작업의 동시 실행을 방지합니다. 바이너리 로그 작업의 경우, BACKUP_LOCK에 잠금이 존재하는지 확인했지만, 해당 잠금 유형은 확인하지 않았습니다. 이는 백업이 실제로 진행 중인 경우에만 바이너리 로그 작업이 방지되어야 하며, 백업이 진행되지 않는 경우 바이너리 로그를 정리할 때 백업이 방지될 필요가 없기 때문에 문제가 되었습니다.
이러한 경우, BACKUP_LOCK 객체에 보유된 잠금을 확인하는 대신, 바이너리 로그를 정리할 때 BACKUP_LOCK의 공유 잠금을 획득하도록 수정했습니다. (버그 #35342521)

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

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

복제: 각각 1GiB보다 작은 이벤트로 구성된 트랜잭션이 총 크기가 1GiB를 초과하고 압축으로 1GiB보다 작아지지 않는 경우, 하나의 1GiB보다 큰 이벤트로 바이너리 로그에 기록되었습니다. 이는 바이너리 로그를 사용할 수 없게 만들었습니다. 실제로 서버나 mysqlbinlog 등의 다른 도구에서도 읽을 수 없었기 때문에 손상되었습니다.
이제 압축된 데이터가 1GiB를 초과하면 압축 없이 트랜잭션을 처리하도록 변경되었습니다. (버그 #33588473)

그룹 복제: 그룹 복제 설정에서, 적용기 채널 이외의 트랜잭션 소스가 존재하는 경우 다음과 같은 일련의 이벤트가 발생할 수 있었습니다:

  1. 로컬에서 적용되고 이미 인증된 몇몇 트랜잭션이 티켓(이를 티켓 2라고 부름)에 연결되었지만 아직 커밋되지 않았습니다. 이는 로컬 트랜잭션이거나 비로컬 트랜잭션일 수 있습니다.
  2. 티켓 3에서 뷰가 생성되어 티켓 2의 트랜잭션을 기다려야 합니다.
  3. 뷰 변경(VC1)이 GR 적용기 채널 적용기에 들어와 티켓이 3으로 변경되기를 기다렸습니다.
  4. 티켓 2의 트랜잭션이 아직 완료되지 않은 동안 또 다른 그룹 변경과 또 다른 뷰 변경(VC2)이 발생했습니다.

이는 다음과 같은 문제를 일으켰습니다: 티켓 2의 마지막 트랜잭션이 이미 실행 중으로 표시되었지만, 티켓이 아직 팝되지 않은 상태였습니다. VC2는 대신 티켓을 팝했지만 참가자들에게 알리지 않았습니다. 이는 VC1이 티켓이 변경될 때까지 무기한 대기하게 만들었으며, 워커를 강제로 종료할 수 없게 만드는 추가적인 영향을 주었습니다.
이 루프가 조건 변화에 응답할 수 있도록, 매 초마다 중단할지 여부를 확인하여 문제를 수정했습니다. 또한 새로운 단계를 등록하여 루프가 종료 신호에 더 잘 응답할 수 있도록 했습니다. (버그 #35392640)
참고: 버그 #35206392, 버그 #35374425도 참조하십시오.

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

그룹 복제: 그룹 액션이 그룹에 전송되고 조정기에서 연결이 끊어지면, 그룹의 멤버들은 다양한 상태에 있게 되어, 조정된 액션을 받은 멤버들은 그것을 실행할 멤버를 기다리고, 실행을 시작한 멤버들은 처리할 것이 없어 그룹 조정에 문제가 발생했습니다.
이러한 경우, 모든 멤버가 액션을 완료할 때까지 그룹 액션을 기다리게 하여 문제가 발생하는 것을 방지했습니다. (버그 #34815537)

그룹 복제: 그룹 복제에 의해 간접적으로 생성된 OpenSSL 연결에서 사용되는 리소스의 정리가 항상 기대한 대로 수행되지 않았습니다. 이 문제는 그룹 복제에 의해 그러한 연결이 생성될 때마다 호출할 수 있는 정리 함수를 추가하여 수정되었습니다. (버그 #34727136)

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)

드물게, 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)

일부 포인터가 명령문 실행 후 항상 해제되지 않았습니다. (버그 #35395965)

스토어드 루틴 내의 서브쿼리의 일부 인스턴스가 항상 올바르게 처리되지 않았습니다. (버그 #35377192)

서버에서 클라이언트로 전송되는 네트워크 패킷 데이터의 향상된 분석이 이루어졌습니다. (버그 #35374491)

암호화 강화로 인해 규정 준수가 향상되고, 비추천된 API의 사용이 제거되었습니다. (버그 #35339886)

테이블명과 컬럼명으로 지정된 컬럼 참조를 함수 find_item_in_list()에서 검색할 때, 검색된 항목에 테이블명이 없을 수 있다는 점이 아직 해결되지 않아 무시되었습니다. 이 문제는 요청된 항목 내의 NULL 테이블명을 명시적으로 확인하여 수정됩니다. (버그 #35338776)

비추천된 mysqlpump 커맨드라인 유틸리티를 지원하기 위해 존재하던 lz4_decompresszlib_decompress 커맨드라인 유틸리티가 비추천되었습니다. (버그 #35328235)

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

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

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

일반 테이블 식(CTE)을 사용하는 일부 쿼리가 항상 올바르게 처리되지 않았습니다. (버그 #35231475)

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

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

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

회전된 감사 로그 파일이 이전 파일의 값을 계속하지 않고, 항상 북마크 ID 값을 0으로 재설정하게 되었습니다. (버그 #35200070)

파일 정렬로 정렬되는 항목을 평가할 때, 오류가 항상 올바르게 전파되지 않았습니다. (버그 #35195181)
참고: 버그 #35145246도 참조하십시오.

ROLLUP에 관한 이전 문제의 수정으로 인해, 디버그 빌드에서 서버의 조기 종료가 발생했습니다. (버그 #35168639)
참고: 이 문제는 버그 #33830659의 회귀입니다.

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

서브쿼리를 파생 테이블과의 조인으로 변환하고 포함된 쿼리를 그룹화하는 경우, 그룹화를 수행하기 위한 추가적인 파생 테이블을 생성했습니다. 이 과정에서, 첫 번째 선택 목록 항목을 포함 쿼리에서 추가된 파생 테이블로 이동하고, 원래의 모든 선택 목록 항목(자신만의 파생 테이블을 얻는 서브쿼리는 제외)을 추가된 파생 테이블의 열로 대체합니다.
이 로직은 기본값이 내부적으로 모델링되는 방식 때문에 DEFAULT를 올바르게 처리하지 못했습니다. 이번 수정으로 앞서 언급한 변환을 받는 쿼리에서 DEFAULT(expression)의 지원이 추가됩니다. 이 수정으로 인해 동일한 변환의 결과로 선택 목록 내 동일한 열의 두 개의 발생에 동일한 항목 이름이 부여되는 메타데이터 내 항목 이름 문제도 해결됩니다. (버그 #35150085, 버그 #35101169)

SELECT * FROM t1 WHERE (SELECT a FROM t2 WHERE t2.a=t1.a + ABS(t2.b)) > 0 형태의 쿼리는 서브쿼리가 여러 행을 반환하지만, subquery_to_derived 최적화가 활성화된 경우 변환이 잘못 적용되어 쿼리가 잘못된 결과를 반환했습니다. (버그 #35101630)

충돌 가능성이 있는 특정 GRANT 문에 대한 처리가 개선되었습니다. (버그 #35089304)

MEMBER OF()ORDER BY DESC를 모두 사용하는 쿼리가 JSON 열에 다중 값 인덱스를 생성한 후, 부분적인 결과 집합만 반환했습니다. 이는 MySQL 8.0.30에서 수정된 문제와 유사하지만, 문제의 쿼리에 ORDER BY DESC 절이 추가되어 있습니다. (버그 #35012146)
참고: 버그 #106621, 버그 #33917625도 참조하십시오.

디버그 서버가 DECIMAL 값을 포함하는 특정 작업에서 어설션 오류를 발생시켰습니다. (버그 #34973932)

서브쿼리를 파생 테이블과의 조인으로 변환할 때, 선택 목록 내의 식을 추가 및 대체하는 모든 인스턴스는 참조 카운트가 적절히 유지되도록 변경되었습니다. (버그 #34927110)

인덱스 머지(Index Merge Optimization참고)의 경우, 비용이 유사하다면, 소트 유니온 플랜보다 ROR 유니온 플랜(즉, RowID Ordered Retrieval 사용)을 우선해야 합니다. 이는 소트 유니온에서는 행 ID로 행을 추가로 정렬해야 하지만, ROR 유니온에서는 필요하지 않기 때문입니다.
OR 조건을 포함하는 WHERE 절의 각 부분에 대해, 범위 최적화기는 가능한 최적의 범위 스캔을 얻고, 이 모든 범위 스캔을 사용하여 인덱스 병합 스캔(즉, 소트 유니온 스캔)을 구축합니다. 모든 최상의 범위 스캔이 ROR 스캔이기도 한 경우, 범위 최적화기는 항상 ROR 유니온 스캔을 제안합니다. 이는 ROR 유니온 스캔이 항상 소트 유니온 스캔보다 저렴하기 때문입니다. OR 조건의 일부에 대해 최적의 범위 스캔이 ROR 스캔이 아닌 경우, 문제가 발생했습니다. 이 경우 범위 최적화기는 항상 소트 유니온을 선택했습니다. 이는 ROR 스캔을 선택하는 것이 이득인 경우에도 해당합니다(OR 조건의 일부를 처리하는 데 최적의 범위 스캔이 아닌 경우에도). 이는 행 ID로 행을 정렬할 필요가 없게 되기 때문입니다.
이러한 경우, 최적의 범위 스캔을 결정할 때 범위 최적화기는 가능한 ROR 스캔이 있는지 감지하고, 이 정보를 사용하여 OR 조건의 각 부분에 적어도 하나의 가능한 ROR 스캔이 있는지 확인합니다. 그렇다면, 범위 최적화기를 다시 실행하여 OR 조건의 각 부분을 처리하기 위한 최적의 ROR 스캔을 얻고, ROR 유니온 패스를 생성합니다. 그런 다음 최종 계획을 제안할 때 이 비용을 소트 유니온의 비용과 비교합니다. (버그 #34826692, 버그 #35302794)

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

유효한 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로 늘렸습니다. 이를 통해 512개 이상의 항목이 있을 수 있는 mysqladmin 확장 상태 요청의 문제가 수정됩니다.
기여해 주신 메타에게 감사드립니다. (버그 #30810617)

mysqldump --column-statistics 옵션은 8.0.2 이전의 MySQL 버전에 대해 information_schema.column_statistics에서 선택하려고 시도했는데, 이는 서버에서 지원되지 않는 열 통계에 대한 경고를 생성하고 옵션을 false로 설정합니다.
기여해 주신 메타에게 감사드립니다. (버그 #28782417)

MySQL이 디렉터리 이름의 길이를 얻는 데 사용하는 함수가 강화되었습니다. (버그 #28047376)

암묵적 집계를 사용하여 쿼리를 실행하면, 행을 필터링하여 제외하는 HAVING 절이 쿼리에 포함되지 않는 한 정확히 1개의 행이 반환되어야 합니다. 그러나 FALSE로 평가되는 HAVING 절을 포함하는 쿼리에서는 이것이 무시되어, 관계없이 행이 반환되는 경우가 있었습니다. (버그 #14272020)

조건 내의 열이 대체되어야 하는 파생 조건 푸시다운을 포함하는 쿼리의 경우, 대체 항목이 ROLLUP으로 래핑되어 일치하는 항목이 존재하지 않을 때, 일치하는 항목이 존재함을 알고 있어도 일치하는 항목을 찾을 수 없었습니다. (버그 #111665, 버그 #35570065)참고: 이 문제는 버그 #33349994의 회귀입니다.

삭제할 수 있었던 ORDER BY와 함께 쿼리 내에 사용되지 않는 윈도우 함수가 존재하면, 예기치 않은 서버 종료가 발생했습니다. (버그 #111585, 버그 #35168639, 버그 #35204224, 버그 #35545377)
참고: 이 문제는 버그 #35118579의 회귀입니다.

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

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

FLUSH STATUS, COM_CHANGE_USER, 그리고 SELECT FROM I_S.PROCESSLIST를 동시에 실행하면 데드락이 발생할 수 있었습니다. COM_STATISTICS, COM_CHANGE_USER, SHOW PROCESSLIST의 동시 실행에서도 유사한 문제가 관찰되었습니다.
기여해 주신 드미트리 레네브에게 감사드립니다. (버그 #110494, 버그 #35218030)

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

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

SELECT를 사용하여 테이블을 생성하고, 문에 GEOMETRY 타입의 식이 포함된 경우, MySQL은 기본적으로 빈 문자열을 열 값으로 생성할 수 있었습니다. 이 문제를 해결하기 위해, MySQL은 이러한 상황에서 GEOMETRY 타입의 열의 기본값을 생성하지 않게 되었습니다. (버그 #107996, 버그 #34426943)

인덱스 스킵 스캔의 경우, 첫 번째 범위 읽기에서는 첫 번째 범위의 끝을 나타내는 범위 끝 값이 설정되지만, 다음 범위 읽기에서는 이전 범위 끝 값이 지워지지 않아 이 이전 값이 현재 범위에 적용됩니다. 지정된 범위 끝 경계는 이전 범위 읽기에서 이미 넘어섰기 때문에, 읽기가 중단되고 결과에서 여러 행이 누락됩니다.
이러한 경우, 이전 범위 끝 값을 확실히 지우도록 하여 이 문제를 수정합니다. (버그 #107460, 버그 #34235624, 버그 #34982949)

Leave a Comment



이 문서 공유

8.0.34 변경 사항 (2023-07-18 GA)

링크 복사

CONTENTS