MySQL 8.0 Release Note

8.0.16 변경 사항 (2019-04-25 GA)

Estimated reading: 9 minutes 82 views

공식 문서: Changes in MySQL 8.0.16 (2019-04-25, General Availability)

계정 관리 관련 사항

이전에는 DROP ROLE 권한을 가진 사용자가 잠긴 계정이든 잠기지 않은 계정이든 DROP ROLE 문을 사용하여 계정을 삭제할 수 있었습니다. 이제는 DROP ROLE 권한을 가진 사용자가 DROP ROLE 문을 사용하여 잠긴 계정만 삭제할 수 있습니다(잠기지 않은 계정은 일반적으로 서버에 로그인하는 데 사용되는 사용자 계정으로 간주됨). CREATE USER 권한을 가진 사용자는 잠긴 계정이든 잠기지 않은 계정이든 DROP ROLE 문을 사용하여 계정을 삭제할 수 있습니다. (버그 #28953158, 버그 #93263)

MySQL 계정 관리 기능에 몇 가지 변경 사항이 있었습니다:MySQL은 이제 사용자 계정 범주의 개념을 도입하여, 새로 추가된 SYSTEM_USER 권한을 기준으로 시스템 사용자와 일반 사용자를 구분합니다:

  • 시스템 사용자는 SYSTEM_USER 권한을 소유한 사용자입니다. 시스템 사용자는 시스템 계정과 일반 계정 모두에 대해 작업을 수행할 수 있습니다.
  • 일반 사용자는 SYSTEM_USER 권한이 없는 일반 사용자입니다. 일반 사용자는 일반 계정에 대해서만 작업을 수행할 수 있으며, 시스템 계정에는 작업을 수행할 수 없습니다.

사용자가 일반 계정에 대해 작업을 수행할 적절한 권한을 가지고 있는 경우, SYSTEM_USER 권한은 시스템 계정에서도 해당 작업을 수행할 수 있도록 허용합니다. SYSTEM_USER 권한은 다른 권한을 암시하지 않으므로, 특정 계정 작업을 수행할 수 있는 능력은 여전히 필요한 다른 권한의 소유 여부에 따라 달라집니다. 예를 들어, 사용자가 일반 계정에 대해 SELECTUPDATE 권한을 부여할 수 있는 경우, SYSTEM_USER 권한이 있으면 시스템 계정에도 SELECTUPDATE 권한을 부여할 수 있습니다.

시스템 계정과 일반 계정의 구분은 시스템 계정에 SYSTEM_USER 권한을 부여하지 않은 계정으로부터 보호함으로써 특정 계정 관리 문제를 더 잘 제어할 수 있게 해줍니다. 예를 들어, CREATE USER 권한은 새로운 계정을 생성할 수 있을 뿐만 아니라 기존 계정을 수정하고 삭제할 수 있게 해줍니다. 시스템 사용자 개념이 없으면, CREATE USER 권한을 가진 사용자는 root 계정을 포함한 모든 계정을 수정하거나 삭제할 수 있습니다. 시스템 사용자 개념은 root 계정(자체가 시스템 계정) 수정 권한을 시스템 사용자만 수행할 수 있도록 제한합니다. CREATE USER 권한을 가진 일반 사용자는 여전히 기존 계정을 수정하거나 삭제할 수 있지만, 일반 계정에 한해서만 가능합니다.

SYSTEM_USER 권한의 기타 운영적 의미:

  • SYSTEM_USER 권한을 가진 세션은 다른 필수 권한 외에 SYSTEM_USER 권한을 가진 사용자만 종료할 수 있습니다.
  • SYSTEM_USER 권한이 있는 계정은 다른 필수 권한 외에 SYSTEM_USER 권한을 가진 사용자만 해당 계정을 저장된 객체의 DEFINER로 지정할 수 있습니다.
  • SYSTEM_USER 권한이 있는 역할은 mandatory_roles 시스템 변수의 값에 포함될 수 없습니다.

자세한 내용은 계정 범주를 참조하십시오.

이전에는 특정 스키마를 제외하고 전역적으로 적용되는 권한을 부여할 수 없었습니다. 이제 새로운 partial_revokes 시스템 변수가 활성화된 경우, 특정 스키마를 제외하고 전역적으로 권한을 부여하는 것이 가능합니다. 예를 들어, 다음 문은 계정이 mysql 시스템 스키마를 제외한 모든 테이블에 대해 선택하거나 삽입할 수 있도록 허용합니다:

SET PERSIST partial_revokes = ON;
GRANT SELECT, INSERT ON *.* TO u1;
REVOKE SELECT, INSERT ON mysql.* FROM u1;

서버는 mysql.user 시스템 테이블의 User_attributes 열에 Restrictions 속성을 추가하여 부분 취소를 기록합니다. SHOW GRANTS 출력에 REVOKE 문이 포함되어 부분 취소를 나타냅니다.

참고
partial_revokes를 활성화하면 MySQL은 스키마 이름에서 이스케이프되지 않은 _ 및 % SQL 와일드카드 문자를 마치 \_ 및 \%로 이스케이프된 것처럼 리터럴 문자로 처리합니다. 이는 권한 할당 해석을 변경하므로, partial_revokes가 활성화될 수 있는 MySQL 설치에서는 이스케이프되지 않은 와일드카드 문자를 스키마 권한 할당에 사용하지 않는 것이 좋습니다.

자세한 내용은 부분 취소를 사용한 권한 제한을 참조하십시오.

GRANT 문에는 새로운 AS user [WITH ROLE] 절이 추가되어 문 실행에 사용할 권한 컨텍스트에 대한 추가 정보를 지정합니다. 이 구문은 SQL 레벨에서 보이지만, 기본 목적은 부분 취소에 의해 부과된 권한 제한을 이진 로그에 나타내어 모든 노드에서 동일하게 복제되도록 하는 것입니다.
자세한 내용은 GRANT 문을 참조하십시오.

(WL #12098, WL #12364, WL #12820)

C API 관련 사항

MySQL C API는 이제 MySQL 서버와의 논블로킹 통신을 위한 비동기 함수를 지원합니다:

각 함수는 동일한 이름의 _nonblocking 접미사가 없는 동기 함수의 비동기 대응 함수입니다. 동기 함수는 서버 연결에서 읽기 또는 쓰기 작업을 기다려야 할 경우 블로킹됩니다. 비동기 함수는 애플리케이션이 서버 연결 작업이 진행할 준비가 되었는지 확인할 수 있게 해주며, 준비되지 않은 경우 애플리케이션은 나중에 다시 확인하기 전에 다른 작업을 수행할 수 있습니다. 자세한 내용은 C API 비동기 인터페이스를 참조하십시오. (WL #11381)

캐릭터셋 지원

MySQL은 이제 utf8mb4 유니코드 캐릭터셋에 대해 새로운 중국어 정렬인 utf8mb4_zh_0900_as_cs를 지원합니다. utf8mb4_zh_0900_as_cs는 MySQL에서 유니코드에 대해 제공되는 최초의 중국어 전용 정렬입니다. 이 정렬은 악센트 구분 및 대소문자 구분이 있습니다. 이 정렬의 특성은 utf8mb4_0900_as_cs와 유사하지만, 해당하는 경우 언어별 규칙이 우선됩니다. 자세한 내용은 유니코드 캐릭터셋을 참조하십시오. (WL #11825)

컴파일 관련 사항

CMake는 이제 Clang을 사용할 때 llvm lld 링커가 사용 가능하고 명시적으로 비활성화되지 않은 경우 이를 사용하도록 빌드 프로세스를 설정합니다. 이 링커의 사용을 비활성화하려면 -DUSE_LD_LLD=OFF 옵션을 지정하십시오. (버그 #29264211)

이제 EL6 및 EL7에서 빌드할 때 devtoolset-7 대신 devtoolset-8의 컴파일러를 사용하려고 시도합니다. (버그 #29198846)

서버 빌드를 위한 Boost 라이브러리의 최소 버전이 이제 1.69.0입니다. (버그 #29114233)

Visual Studio 2017에 대한 구성 시 확인이 충분히 구체적이지 않았습니다. 이제 MySQL 컴파일을 위해 최소 Visual Studio 15.8 업데이트, 즉 버전 번호 1915 이상이 필요합니다. (버그 #28970895)

이제 MySQL은 C++14를 사용하여 컴파일할 수 있습니다. 컴파일러 지원을 위한 다음 최소 버전 요구 사항이 적용됩니다:

  • GCC 5.3 (Linux)
  • Clang 4.0 (FreeBSD)
  • XCode 9 (macOS)
  • Developer Studio 12.6 (Solaris)
  • Visual Studio 2017 (Windows)

(WL #12424)

구성 관련 사항

이제 MySQL 구성을 위해 최소 CMake 버전 3.4.3이 필요합니다. 이로 인해 일부 Red Hat 및 Oracle Linux 플랫폼에서는 cmake 대신 cmake3을 사용해야 합니다. (버그 #29246216)

WITH_LZMA CMake 옵션이 제거되었습니다. (버그 #29153932, 버그 #93755)

이제 CMake 구성에서 EXCLUDE_FROM_ALL 옵션이 적절하게 사용되어 라이브러리가 실제로 어떤 실행 파일에서 사용될 때만 빌드됩니다. (버그 #29052599)

새로운 WITH_JEMALLOC CMake 옵션은 -ljemalloc로 링크할지 여부를 나타냅니다. 활성화된 경우, 내장된 malloc(), calloc(), realloc(), free() 루틴이 비활성화됩니다. 기본값은 OFF입니다. (버그 #29027974)

새로운 WITH_LSAN CMake 옵션은 AddressSanitizer 없이 LeakSanitizer를 실행할지 여부를 나타냅니다. 기본값은 OFF입니다. (버그 #28936574)

새로운 WITH_ROUTER CMake 옵션은 MySQL Router를 빌드할지 여부를 나타냅니다. 기본값은 ON입니다. (버그 #28759234)

MySQL 서버는 이제 --validate-config 옵션을 지원하여 서버를 정상적인 운영 모드로 실행하지 않고도 시작 구성의 문제를 확인할 수 있습니다. 자세한 내용은 서버 구성 유효성 검사를 참조하십시오. (WL #12360)

사용 중단 및 제거 관련 사항

이제 TempTable 스토리지 엔진은 디스크에서 내부 임시 테이블을 관리할 때 항상 InnoDB를 사용하며, 이를 위해 사용하는 스토리지 엔진을 더 이상 사용자가 구성할 수 없습니다. internal_tmp_disk_storage_engine 시스템 변수가 제거되었습니다. (버그 #91377, 버그 #28234637, WL #11974)
참고: 버그 #28081038, 버그 #82556, 버그 #27408352도 참조하십시오.

설치 관련 사항

이전에는 MySQL의 새로운 버전을 설치한 후, MySQL 서버가 다음 시작 시 데이터 사전 테이블을 자동으로 업그레이드한 후, DBA가 수동으로 mysql_upgrade를 실행하여 mysql 스키마의 시스템 테이블 및 sys 스키마와 사용자 스키마와 같은 다른 스키마의 객체를 업그레이드해야 했습니다.
이제 서버가 이전에 mysql_upgrade가 처리하던 작업을 수행합니다. MySQL의 새로운 버전을 설치한 후, 서버는 다음 시작 시 필요한 모든 업그레이드 작업을 자동으로 수행하며, DBA가 mysql_upgrade를 호출할 필요가 없습니다. 또한, 서버는 도움말 테이블의 내용을 업데이트합니다(이는 mysql_upgrade가 하지 않던 작업입니다). 새로운 --upgrade 서버 옵션을 사용하면 서버가 데이터 사전 및 서버 업그레이드 작업을 자동으로 수행하는 방식을 제어할 수 있습니다. 자세한 내용은 MySQL 업그레이드를 참조하십시오.
이 업그레이드 절차 변경으로 인해 몇 가지 사용 중단이 발생합니다:

  • mysql_upgrade는 더 이상 필요하지 않기 때문에 사용 중단되었습니다.
  • --no-dd-upgrade 서버 옵션은 --upgrade 옵션이 이를 대체했기 때문에 사용 중단되었습니다.

mysql_upgrade--no-dd-upgrade 옵션은 향후 MySQL 버전에서 제거될 예정입니다. (버그 #28146052, 버그 #28162609, 버그 #91205, 버그 #29185739, 버그 #27740692, 버그 #28547424, 버그 #91961, WL #12413, WL #12918)

패키징 관련 사항

MySQL Cluster 8.0에 대한 Docker 이미지가 이제 다운로드 가능합니다. (버그 #30010921, 버그 #96084)

curl을 포함하는 바이너리 패키지가 이제 시스템 curl 라이브러리 대신 curl 7.64.0을 사용합니다. (버그 #29357198)

Henry Spencer 정규 표현식 라이브러리(extra/regex)는 이제 MySQL 8.0에서 더 이상 사용되지 않으며, 소스 배포판에서도 제거되었습니다. (버그 #29192306)

RPM 패키지는 이제 glibc의 최신 버전이 Sun RPC를 포함하지 않기 때문에 libtirpcrpcgen에 대한 의존성을 갖습니다. (버그 #28995257)

support-files/magic 파일이 MySQL 소스 트리에서 제거되었습니다. 대부분의 MySQL 파일 형식은 운영 체제 파일 유형 기능에 의해 처리됩니다. (버그 #18335080, 버그 #71898)

MySQL은 이제 MySQL 서버 및 테스트 스위트를 위한 “Minimal Install” 리눅스 일반 바이너리 다운로드 패키지를 제공합니다. Minimal Install 패키지는 디버그 바이너리를 제외하고 디버그 심볼이 제거되어 일반 리눅스 일반 바이너리 패키지보다 훨씬 작습니다. 다운로드는 https://dev.mysql.com/downloads/에서 가능합니다.

MySQL Enterprise Edition에 대한 Docker 이미지가 이제 My Oracle Support에서 다운로드할 수 있습니다.

구문 분석기 관련 사항

구문 분석기가 더 이상 문서화되지 않았으며 비표준적인 테이블 별칭을 지정하는 = alias_name 구문을 허용하지 않습니다. (버그 #29205289)

구문 분석기가 이제 이전에는 사용이 제한되었던 여러 추가 비예약 키워드를 저장된 프로그램 내 레이블로 사용할 수 있습니다: ACCOUNT, ALWAYS, BACKUP, CLOSE, FORMAT, GROUP_REPLICATION, HOST, INVISIBLE, OPEN, OPTIONS, OWNER, PARSER, PORT, REMOVE, RESTORE, ROLE, SECONDARY, SECONDARY_ENGINE, SECONDARY_LOAD, SECONDARY_UNLOAD, SECURITY, SERVER, SOCKET, SONAME, UPGRADE, VISIBLE, WRAPPER. (버그 #29033659)

구문 분석기는 ODBC 외부 조인 구문({ OJ outer_join })을 허용했지만, OJ 외의 식별자도 허용했습니다. 이제 구문 분석기는 OJ만을 허용합니다.

참고OJ는 이제 비예약 키워드입니다.

(버그 #22320942)

Performance Schema 관련 사항

새로운 퍼포먼스 스키마 keyring_keys 테이블은 MySQL 키링에 있는 키의 메타데이터를 노출합니다. 키 메타데이터에는 키 ID, 키 소유자 및 백엔드 키 ID가 포함됩니다. keyring_keys 테이블은 키의 내용과 같은 민감한 키링 데이터를 노출하지 않습니다. 자세한 내용은 keyring_keys 테이블을 참조하십시오. (WL #11543)

플러그인 관련 사항

MySQL은 이제 서버가 CREATE TABLE 문을 구문 분석하고 실행하기 전에 이를 수정하는 ddl_rewriter 플러그인을 포함합니다. 이 플러그인은 ENCRYPTION, DATA DIRECTORY, INDEX DIRECTORY 절을 제거하며, 이는 암호화된 데이터베이스나 데이터 디렉터리 외부에 테이블이 저장된 데이터베이스에서 생성된 SQL 덤프 파일을 복원할 때 유용할 수 있습니다. 예를 들어, 이 플러그인은 이러한 덤프 파일을 암호화되지 않은 인스턴스나 데이터 디렉터리 외부 경로에 접근할 수 없는 환경에서 복원하는 데 도움을 줄 수 있습니다. 설치되면, ddl_rewriter는 플러그인의 메모리 사용을 추적하기 위해 퍼포먼스 스키마의 memory/rewriter/ddl_rewriter 계측기를 노출합니다. 자세한 내용은 ddl_rewriter 플러그인을 참조하십시오. (WL #12668)

보안 관련 사항

이전에는 권한 부여 테이블이 손상된 경우, MySQL 서버가 오류 로그에 메시지를 작성했지만, --skip-grant-tables 옵션이 지정된 것처럼 계속 실행되었습니다. 이는 서버가 예상치 못한 상태에서 동작하게 만들었으며, 실제로 --skip-grant-tables 옵션이 지정되지 않은 경우에도 발생했습니다. 이제 서버는 오류 로그에 메시지를 기록한 후, --skip-grant-tables 옵션이 지정되지 않은 한 중지됩니다. (서버를 이 옵션으로 시작하면 진단 작업을 수행하기 위해 연결할 수 있습니다.) (버그 #29394501, 버그 #94394, WL #12971)

일부 플랫폼(Windows, macOS 및 Generic Linux)에서 MySQL과 함께 번들로 제공되는 OpenSSL 라이브러리가 버전 1.0.2r로 업그레이드되었습니다. 다른 모든 플랫폼에서는 시스템에 설치된 OpenSSL을 사용합니다. 새로운 OpenSSL 버전에서 수정된 문제는 http://www.openssl.org/news/vulnerabilities.html에 설명되어 있습니다. (버그 #28988091)

익명 사용자에게 역할을 부여하는 것이 더 이상 지원되지 않습니다. 이는 문제를 일으킬 수 있는 동작을 유발했기 때문입니다. (버그 #28910120)

OpenSSL 1.1.1은 암호화된 연결을 위한 TLS v1.3 프로토콜을 지원하며, MySQL은 이제 서버와 클라이언트가 모두 OpenSSL 1.1.1 이상으로 컴파일된 경우 TLS v1.3을 지원합니다:

  • 일부 TLSv1.3 암호 모음이 기본적으로 활성화됩니다. tls_ciphersuites 시스템 변수는 서버가 허용하는 TLSv1.3 암호 모음을 명시적으로 지정할 수 있도록 합니다.
  • --tls-ciphersuites 클라이언트 옵션은 클라이언트가 허용하는 TLSv1.3 암호 모음을 지정합니다. 이 옵션은 다음 프로그램에 적용됩니다: mysql, mysqladmin, mysqlbinlog, mysqlcheck, mysqldump, mysqlimport, mysqlpump, mysqlshow, mysqlslap, mysqltest, mysql_secure_installation, mysql_upgrade.
  • mysql_options() C API 함수에는 클라이언트 라이브러리 내에서 클라이언트 프로그램이 허용하는 TLSv1.3 암호 모음을 지정하는 새로운 MYSQL_OPT_TLS_CIPHERSUITES 옵션이 추가되었습니다.

자세한 내용은 암호화된 연결 TLS 프로토콜 및 암호를 참조하십시오.

참고
그룹 복제는 TLSv1.3을 지원하지 않습니다.

(WL #12361)

서버가 새로운 연결에 사용하는 TLS 컨텍스트는 이제 런타임에 재구성할 수 있습니다. 이 기능은 예를 들어, 서버를 다시 시작하지 않고도 SSL 인증서가 만료된 MySQL 서버를 계속 실행할 수 있도록 합니다. 동적 SSL 재구성 가능성은 다음과 같은 변경 사항을 기반으로 합니다:

자세한 내용은 암호화된 연결의 서버 측 런타임 구성 및 모니터링을 참조하십시오.
이와 유사한 기능에 대해 코드를 제출해 준 Facebook에 감사드립니다(그러나 코드는 사용되지 않았습니다). (WL #11541)
참고: 버그 #27980097도 참조하십시오.

MySQL 8.0에서 기본 인증 플러그인이 mysql_native_password에서 caching_sha2_password로 변경되었습니다. caching_sha2_passwordsha256_password 인증 플러그인의 기능을 포괄하므로, sha256_password는 이제 사용 중단되었으며 향후 MySQL 버전에서 제거될 예정입니다. sha256_password를 사용하는 MySQL 계정은 caching_sha2_password로 마이그레이션해야 합니다. (WL #12694)

공간 데이터 지원

이제 ST_Length() 함수는 선택적 두 번째 인수를 받아 반환 값의 단위를 지정할 수 있습니다. 허용되는 단위는 새로운 INFORMATION_SCHEMA ST_UNITS_OF_MEASURE 테이블에 나열된 단위입니다. 자세한 내용은 LineString 및 MultiLineString 속성 함수INFORMATION_SCHEMA ST_UNITS_OF_MEASURE 테이블을 참조하십시오. (WL #12657)

SQL 구문 관련 사항

비호환 변경: MySQL 5.7에서는 InnoDB 테이블에 대해 FOREIGN KEY 정의를 CONSTRAINT _symbol_절 없이 지정하거나, CONSTRAINT 키워드를 symbol 없이 지정하면 InnoDB는 생성된 제약 조건 이름을 사용했습니다. 그러나 MySQL 8.0에서는 InnoDB가 생성된 이름 대신FOREIGN KEY index_name“ 값을 사용하도록 변경되었습니다. 제약 조건 이름은 스키마(데이터베이스)당 고유해야 하기 때문에, 이 변경으로 인해 스키마당 고유하지 않은 외래 키 인덱스 이름으로 인해 오류가 발생했습니다. 이러한 오류를 피하기 위해, 새로운 제약 조건 명명 방식이 원래대로 되돌아갔으며, InnoDB는 다시 생성된 제약 조건 이름을 사용합니다.
InnoDB와의 일관성을 위해, NDB 스토리지 엔진도 이제 CONSTRAINT symbol 절을 지정하지 않거나, CONSTRAINT 키워드를 symbol 없이 지정한 경우 생성된 제약 조건 이름을 사용합니다. MySQL 5.7 및 이전 MySQL 8.0 릴리스 기반의 NDB에서는 FOREIGN KEY index_name 값을 사용했습니다.
위에서 설명한 변경 사항은 이전 외래 키 제약 조건 명명 방식에 의존하는 애플리케이션에 비호환성을 일으킬 수 있습니다. (버그 #29173134)

이전에는 MySQL이 제한된 형식의 CHECK 제약 조건 구문을 허용했으나, 이를 구문 분석하고 무시했습니다. 이제 MySQL은 모든 스토리지 엔진에 대해 테이블 및 열 CHECK 제약 조건의 핵심 기능을 구현합니다. 제약 조건은 CREATE TABLEALTER TABLE 문을 사용하여 정의됩니다. 새로운 INFORMATION_SCHEMA.CHECK_CONSTRAINTS 테이블은 테이블에 정의된 CHECK 제약 조건에 대한 정보를 제공합니다. 자세한 내용은 CHECK 제약 조건을 참조하십시오. (버그 #11744849, 버그 #3464, 버그 #3465, 버그 #11746042, 버그 #22759, WL #929)

sys 스키마 관련 사항

MySQL은 이제 퍼포먼스 스키마 데이터를 형식화하거나 검색하는 내장 SQL 함수를 포함하며, 이는 기존 sys 스키마 저장 함수와 동일한 기능을 수행할 수 있습니다:

내장 함수는 모든 스키마에서 호출할 수 있으며 sys 함수와 달리 수식어가 필요하지 않습니다. sys 함수는 sys. 스키마 수식어나 sys를 현재 스키마로 설정해야 합니다.
내장 함수는 해당 sys 함수의 기능을 대체하며, sys 함수는 이제 사용 중단되었으며 향후 MySQL 버전에서 제거될 예정입니다. sys 함수를 사용하는 애플리케이션은 해당 내장 함수를 사용하도록 조정해야 하며, sys 함수와 내장 함수 간에 약간의 차이가 있음을 염두에 두어야 합니다. 자세한 내용은 퍼포먼스 스키마 함수를 참조하십시오. (WL #7803)

테스트 스위트 관련 사항

mysql-test-run.pl은 이제 환경 변수를 지원하며, 이 변수는 여러 동시 mysql-test-run.pl 인스턴스가 포트 번호 예약 시 충돌을 피하기 위해 모든 chroot 환경에 공통 위치로 사용할 고유 ID 디렉터리를 지정할 수 있습니다. Facebook의 기여에 감사드립니다. (버그 #29221085, 버그 #93950)

my_safe_process 프로그램이 mysqltest_safe_process로 이름이 변경되었으며, 이제 테스트 스위트 파일이 아닌 mysqltest와 같은 다른 바이너리와 함께 설치됩니다. (버그 #29198969)

all_persisted_variables 테스트에 다음 변경 사항이 구현되었습니다:

  • 하드코딩된 값의 수를 줄이기 위해 이를 로컬 변수에 저장합니다. 이후에 새로운 패치가 추가되어 시스템 변수를 추가할 때, 기존 테스트 케이스의 많은 줄을 변경할 필요가 없어 리베이스 과정이 더 쉬워집니다.
  • 수정된 버그 항목을 제거하고, 열리지 않은 버그로 인해 테스트되지 않은 시스템 변수를 포함하도록 쿼리를 수정했습니다.

기여해주신 Facebook 팀에 감사드립니다. (버그 #29013375, 버그 #93478)

X Plugin 관련 사항

X 플러그인은 이전에 쿼리 정리 작업이 끝나고 세션이 비활성화된 후에 StmtExecuteOk 메시지를 클라이언트로 반환했습니다. 이제 결과가 확인되면 쿼리 정리 작업 전에 메시지가 반환되어 성능이 눈에 띄게 향상되었습니다. (버그 #28997370)

X 플러그인은 I/O 인터페이스 준비 실패로 인해 사용자 연결이 불가능할 때도 “X Plugin ready for connections” 시스템 메시지를 기록했습니다. (버그 #28906360)

X 플러그인 코드의 일부 항목이 기본적으로 퍼포먼스 스키마에 계측되지 않았습니다. (버그 #28898155)

X 프로토콜은 이제 세션 상태를 재인증하거나 연결을 종료하지 않고 재설정할 수 있는 COM_RESET_CONNECTION 유틸리티 명령을 지원합니다. (버그 #28732455)

X 플러그인은 MySQL 서버 소스 코드가 Clang 8 컴파일러로 빌드될 때 컴파일 경고를 발생시켰습니다. (버그 #28732158)

기능 추가 및 변경 사항

InnoDB: TempTable 스토리지 엔진이 메모리 맵 임시 파일로 내부 메모리 내 임시 테이블의 공간을 할당하는 동작은 이제 temptable_use_mmap 변수를 통해 제어됩니다. 이 변수를 비활성화하면 TempTable 스토리지 엔진이 InnoDB 온디스크 내부 임시 테이블을 대신 사용하게 할 수 있습니다. 자세한 내용은 MySQL에서 내부 임시 테이블 사용을 참조하십시오. (버그 #28944457)

InnoDB: undopurge 하위 시스템 카운터가 추가되어 undo 로그 잘림과 관련된 백그라운드 작업을 모니터링할 수 있게 되었습니다. 카운터 이름과 설명을 보려면 INFORMATION_SCHEMA.INNODB_METRICS 테이블을 쿼리하십시오.

SELECT NAME, SUBSYSTEM, COMMENT FROM INFORMATION_SCHEMA.INNODB_METRICS WHERE NAME LIKE '%truncate%';

카운터 활성화 및 카운터 데이터 쿼리에 대한 자세한 내용은 InnoDB INFORMATION_SCHEMA Metrics Table을 참조하십시오. (버그 #28813526, WL #12600)

InnoDB: 새로운 innodb_spin_wait_pause_multiplier 변수는 스핀 락 폴링 지연 시간을 더 세밀하게 제어할 수 있도록 합니다. 이는 스레드가 mutex 또는 rw-lock을 획득하기 위해 대기할 때 발생하는 지연 시간에 대해 프로세서 아키텍처별로 다른 PAUSE 명령어의 지속 시간을 고려하여 조정할 수 있습니다. 자세한 내용은 스핀 락 폴링 구성을 참조하십시오. (WL #12616)

InnoDB: 수정된 페이지 추적을 지원하기 위한 내부 서비스 인터페이스가 추가되었습니다. (WL #11082)

InnoDB: InnoDB 데이터 비사용 암호화 기능이 이제 mysql 시스템 테이블스페이스의 암호화를 지원합니다. mysql 시스템 테이블스페이스는 mysql 시스템 데이터베이스와 MySQL 데이터 사전 테이블을 포함합니다. (WL #12063)

그룹 복제: 그룹 통신 엔진(XCom)은 합의 프로토콜의 일부로 그룹 구성원 간에 교환되는 메시지와 메타데이터를 위한 캐시를 포함합니다. 이 메시지 캐시는 복구를 위해 사용되며, 다른 그룹 구성원과 통신할 수 없는 상태에 있던 구성원이 다시 그룹에 복귀할 때 사용됩니다.
이전에는 메시지 캐시의 크기 제한이 1GB로 고정되어 있었고, 캐시에 저장되는 메시지의 최대 개수도 고정되어 있었습니다. 이제 group_replication_member_expel_timeout 시스템 변수가 최대 1시간 동안 구성원이 그룹으로 복귀할 수 있도록 설정될 수 있기 때문에, 캐시 크기 제한이 고정되어 있으면 메시지를 복구하지 못할 수 있습니다.
이를 해결하기 위해, XCom 메시지 캐시는 이제 메시지 수에 대해 고정된 제한이 없으며, 사용 가능한 메모리 양으로만 제한됩니다. 캐시 크기 제한은 새로운 group_replication_message_cache_size 시스템 변수를 사용하여 설정할 수 있으며, 기본값과 최소값은 이전 버전에서 사용된 1GB로 설정됩니다. 캐시 크기 제한에 도달하면 XCom은 결정되고 전달된 가장 오래된 항목을 제거합니다. 캐시 크기 제한은 런타임에 동적으로 증가하거나 감소할 수 있습니다. 캐시 크기 제한을 줄이면 XCom은 제한에 도달할 때까지 결정되고 전달된 가장 오래된 항목을 제거합니다. 그룹 복제 그룹 통신 시스템(GCS)은 현재 접근할 수 없는 구성원이 복구에 필요할 가능성이 있는 메시지가 메시지 캐시에서 제거될 때 경고를 발행합니다. (버그 #26482507, WL #11615)

그룹 복제: 그룹 복제 그룹 구성원 간에 전송되는 큰 메시지는 이제 사용자 정의 임계값을 초과할 경우 여러 개의 메시지로 분할될 수 있습니다. 비정상적으로 큰 메시지를 보내면 일부 그룹 구성원이 실패로 보고되고 그룹에서 추방될 수 있습니다. 이는 그룹 통신 엔진(XCom)이 단일 스레드를 사용하여 메시지를 처리하는 동안 다른 구성원이 수신자를 실패로 보고할 수 있기 때문입니다.
새로운 시스템 변수 group_replication_communication_max_message_size는 그룹 복제 통신에서 메시지의 최대 크기를 지정합니다. 이 크기를 초과하는 메시지는 자동으로 여러 개의 조각으로 나뉘며, 수신자가 이를 개별적으로 수신한 후 다시 조립합니다. 분할된 메시지의 모든 조각을 그룹 구성원이 모두 수신하고 재조립할 때 메시지 전달이 완료된 것으로 간주됩니다. 메시지 분할은 기본적으로 적용되며, 시스템 변수에 0 값을 지정하여 비활성화할 수 있습니다.
이전 MySQL 서버 릴리스는 메시지 분할을 지원하지 않으므로, 그룹 복제는 이제 그룹의 통신 프로토콜 개념을 도입했습니다. 통신 프로토콜 버전은 그룹이 지원할 수 있는 가장 오래된 MySQL 서버 버전에 맞춰 설정됩니다. 버전 X의 MySQL 서버는 통신 프로토콜 버전이 X 이하인 경우에만 복제 그룹에 가입하고 ONLINE 상태에 도달할 수 있습니다.
새로운 group_replication_get_communication_protocol() 함수를 사용하여 그룹에서 사용하는 통신 프로토콜을 확인할 수 있으며, 이는 그룹이 지원하는 가장 오래된 MySQL 서버 버전을 반환합니다. 새 구성원이 복제 그룹에 가입할 때 기존 구성원이 발표한 통신 프로토콜 버전을 확인합니다. 가입하는 구성원이 해당 버전을 지원하면 그룹에 가입하고 해당 통신 프로토콜을 사용합니다. 지원하지 않으면 그룹에서 추방됩니다.
이전 릴리스의 구성원이 그룹에 가입할 수 있도록 통신 프로토콜 버전을 변경하려면 새로운 group_replication_set_communication_protocol() 함수를 사용하여 가장 오래된 구성원의 MySQL 서버 버전을 지정하십시오. 모든 구성원을 최신 MySQL 서버 릴리스로 업그레이드하면 통신 프로토콜 버전이 자동으로 업그레이드되지 않습니다. 더 이상 이전 릴리스의 구성원을 지원할 필요가 없는 경우, group_replication_set_communication_protocol() 함수를 사용하여 구성원을 업그레이드한 새 MySQL 서버 버전에 맞춰 통신 프로토콜 버전을 설정하십시오. (버그 #26438884, 버그 #23240361, 버그 #28474580, 버그 #91830, 버그 #28642504, 버그 #26941977, 버그 #29240931, WL #11610)

그룹 복제: 새로운 시스템 변수 group_replication_autorejoin_tries를 통해 멤버가 그룹에서 추방되거나, group_replication_unreachable_majority_timeout 설정에 도달하기 전에 그룹의 과반수와 연결할 수 없을 때 자동으로 그룹에 다시 합류하려는 시도를 몇 번 할지 지정할 수 있습니다. 기본값인 0은 멤버가 재합류를 시도하지 않으며, 대신 group_replication_exit_state_action 시스템 변수에서 지정한 동작을 진행함을 의미합니다.
자동 재합류 기능을 활성화하면 오래된 읽기 가능성을 감수하고 수동 개입을 최소화할 수 있으며, 특히 네트워크 문제로 인해 구성원이 종종 추방되는 환경에서 유용할 수 있습니다. 재합류 시도 횟수를 지정하면 멤버가 추방되거나 다수의 연결 불가 시간 초과에 도달하면 재합류를 시도하며, 이후 지정된 횟수만큼 재합류 시도를 계속합니다. 재합류 시도가 실패할 경우, 멤버는 다음 시도까지 5분 동안 대기합니다. 자동 재합류 중에는 멤버가 슈퍼 읽기 전용 모드로 유지되며, 복제 그룹에서 ERROR 상태를 표시합니다. 언제든지 수동으로 STOP GROUP_REPLICATION 문을 사용하거나 서버를 종료하여 멤버를 중지할 수 있습니다. 지정된 재합류 시도 횟수가 소진되면 멤버는 group_replication_exit_state_action에서 지정한 동작을 진행합니다. (버그 #25673350, 버그 #84784, 버그 #28732174, WL #11284)

그룹 복제: group_replication_exit_state_action의 기본값이 ABORT_SERVER에서 READ_ONLY로 변경되었습니다. (WL #12659)

일부 InnoDB 메모리 할당 함수가 이전에는 런타임에 평가되었지만, 이제는 컴파일 시간에 평가되어 성능이 향상되었습니다. (버그 #29370811, 버그 #94380)

IN 서브쿼리에 대한 세미조인 최적화가 EXISTS 서브쿼리에도 확장되어, 이제 첫 번째 일치, 물질화, 중복 제거, 느슨한 인덱스 스캔과 같은 세미조인 전략을 사용할 수 있습니다.
또한, 옵티마이저는 서브쿼리에 연결된 WHERE 조건에서 자명하게 상관관계가 있는 등가 조건을 비상관관계로 변환하여 IN 서브쿼리 내 표현식과 유사하게 처리할 수 있게 합니다. 이 비상관관계 처리는 이제 IN 서브쿼리뿐만 아니라 EXISTS 서브쿼리에도 적용됩니다.
세미조인 작업으로 변환된 IN 서브쿼리에 적용 가능한 모든 힌트 및 옵티마이저 스위치는 변환된 EXISTS 서브쿼리에도 적용됩니다. IN 서브쿼리 최적화에 적용되는 모든 제한 사항은 변환된 EXISTS 서브쿼리에도 적용되므로, 예를 들어 집계 EXISTS 서브쿼리는 변환될 수 없습니다.
자세한 내용은 세미조인 변환으로 IN 및 EXISTS 서브쿼리 최적화를 참조하십시오. (버그 #28805105, 버그 #28857990, WL #4389)

SQL 표준 및 다른 RDBMS와의 일관성을 위해, 단일 테이블 및 다중 테이블 DELETE 문에서 테이블 별칭이 지원됩니다. (버그 #27455809)

WHERE 조건에서 상수와 열 값 간의 비교에서 상수 값이 열 유형에 대해 범위를 벗어나거나 잘못된 유형인 경우, 이제 실행 중이 아닌 최적화 중에 처리됩니다. 예를 들어, TINYINT UNSIGNED 유형의 열 c가 있는 테이블 t가 주어졌을 때, 쿼리 SELECT * FROM t WHERE c < 256256이 이 열 유형에 대해 범위를 벗어나므로 SELECT * FROM t WHERE TRUE로 접을 수 있습니다. NULL 열과의 비교도 최적화할 수 있으며, 열 c가 널 허용일 경우 동일한 쿼리는 SELECT * FROM t WHERE c IS NOT NULL로 최적화될 수 있습니다.
이 방식으로 처리될 수 있는 비교 연산자는 >, >=, <, <=, =, <>/!=, <=>입니다. (BETWEENIN은 현재 지원되지 않습니다.) 비교가 범위와 유형을 기준으로 접을 수 있는 유형에는 정수형, 부동 소수점 및 고정 소수점 숫자형이 포함됩니다. BIT은 이 최적화를 지원하지 않으며, 날짜 및 시간 유형 열도 지원되지 않습니다.
자세한 내용은 상수 폴딩 최적화를 참조하십시오. (버그 #90100, 버그 #25484743, 버그 #29048682, 버그 #27703371, WL #11935)
참고: 버그 #28172538, 버그 #29699347도 참조하십시오.

EXPLAIN 출력에 대한 실험적 트리 형식이 추가되어 생성된 반복자 트리를 출력합니다. 이 기능은 사용자가 실행이 실제로 어떻게 설정되었는지 이해하는 데 도움을 주기 위한 것이며, EXPLAIN FORMAT=TREE는 현재 프로덕션에서 지원되지 않으며 그 구문과 출력은 MySQL의 향후 버전에서 변경될 수 있습니다. (WL #12074)

MySQL 서버에서 바이너리 로그와 릴레이 로그 암호화를 사용할 때(binlog_encryption=ON), 서버가 실행 중인 동안 언제든지 ALTER INSTANCE ROTATE BINLOG MASTER KEY 문을 발행하여 바이너리 로그 마스터 키를 회전할 수 있습니다. 이는 보안 정책을 준수하거나 현재 또는 이전 바이너리 로그 마스터 키가 손상되었을 가능성이 있는 경우에 유용합니다.
바이너리 로그 마스터 키를 회전하면 새 마스터 키가 새로운 바이너리 로그와 릴레이 로그 파일의 파일 암호를 암호화하는 데 사용되며, 이후 키가 다시 변경될 때까지 사용됩니다. 서버에 있는 기존 암호화된 바이너리 로그 파일과 릴레이 로그 파일의 파일 암호도 새 바이너리 로그 마스터 키를 사용하여 차례대로 다시 암호화되며, 가장 최근 파일부터 시작됩니다. 암호화되지 않은 파일은 건너뜁니다. 마지막으로, 더 이상 보유된 바이너리 로그 파일 또는 릴레이 로그 파일에 적용되지 않는 모든 바이너리 로그 암호화 키는 키링에서 정리됩니다. (WL #12080)

테이블 암호화는 이제 전역적으로 관리될 수 있으며, 암호화 기본값을 정의하고 강제할 수 있습니다. default_table_encryption 변수는 새로 생성된 스키마와 일반 테이블스페이스에 대한 암호화 기본값을 정의합니다. 스키마의 암호화 기본값은 스키마를 생성할 때 DEFAULT ENCRYPTION 절을 사용하여 정의할 수도 있습니다. 기본적으로, 테이블은 생성된 스키마나 일반 테이블스페이스의 암호화를 상속받습니다.
암호화 기본값은 table_encryption_privilege_check 변수를 활성화하여 강제할 수 있습니다. 이 권한 검사는 스키마 또는 일반 테이블스페이스를 default_table_encryption 설정과 다른 암호화 설정으로 생성하거나 변경할 때, 또는 스키마의 기본 암호화 설정과 다른 암호화 설정으로 테이블을 생성하거나 변경할 때 발생합니다.
TABLE_ENCRYPTION_ADMIN 권한은 table_encryption_privilege_check가 활성화된 상태에서 기본 암호화 설정을 무시할 수 있습니다.
자세한 내용은 스키마 및 일반 테이블스페이스에 대한 암호화 기본값 정의를 참조하십시오. (WL #12261)

분할된 테이블에 삽입, 삭제 또는 업데이트가 발생할 때, 바이너리 로그는 이제 행 이벤트가 발생한 파티션 및 (있는 경우) 서브파티션에 대한 정보를 기록합니다. 다른 파티션 또는 서브파티션에서 수정이 발생할 경우, 해당 테이블이 동일하더라도 새로운 행 이벤트가 생성됩니다. 예를 들어, 트랜잭션이 3개의 파티션 또는 서브파티션에 영향을 미치면 3개의 행 이벤트가 생성됩니다. 업데이트 이벤트의 경우, 파티션 정보는 “이전” 이미지와 “이후” 이미지 모두에 대해 기록됩니다. mysqlbinlog을 사용하여 바이너리 로그를 볼 때 -v 또는 --verbose 옵션을 지정하면 파티션 정보가 표시됩니다. 파티션 정보는 행 기반 로깅(binlog_format=ROW)이 사용될 때만 기록됩니다. (WL #12168)

버그 수정

NDB Cluster: 테이블 액세스 유형 eq_ref로 실행된 쿼리에 대한 EXPLAIN 결과에서, 푸시다운이 지원되지 않는 쿼리임에도 불구하고 조건 푸시다운이 표시될 수 있었습니다. 이제 NDB가 조건을 푸시다운 최적화에 사용할 수 있는지 확인하기 전에 액세스 유형을 먼저 확인합니다.
이 수정은 푸시된 조인의 일부인 테이블의 처리를 변경하지 않으며, 이 경우 NDB는 여전히 이전과 동일하게 푸시된 조건을 지원합니다. (버그 #27429615)
참고: 버그 #27397802, 버그 #27808758, 버그 #90301도 참조하십시오.

InnoDB: 시작 시 undo 테이블스페이스 암호화를 활성화한 후에도 undo 테이블스페이스가 암호화되지 않은 상태로 남아 있었습니다. (버그 #29477795)

InnoDB: MySQL 8.0.14에 도입된 undo 테이블스페이스 DDL 지원과 관련된 문제 있는 매크로가 수정되었습니다. (버그 #29324132, 버그 #94243)

InnoDB: 잘못된 범위에서 정의된 정적 스레드 로컬 변수가 스레드 종료 시 해제되지 않았습니다. (버그 #29305186)

InnoDB: performance_schema.data_locks 테이블의 LOCK_DATA 열은 고유 보조 인덱스에 대한 잠금이 있는 경우 잠긴 레코드의 보조 인덱스 값만 표시했는데, 이는 고유 레코드를 식별하기에 충분하지 않았습니다. 이제 잠긴 레코드의 클러스터링 인덱스 열 값이 추가로 포함됩니다. (버그 #29296645)

InnoDB: XA 트랜잭션 복구를 위한 롤백 세그먼트를 사용하는 트랜잭션 수의 잘못된 계산으로 인해 undo 테이블스페이스 잘림 작업이 진행되지 못하고 purge 스레드가 테이블스페이스가 비워지기를 계속해서 확인하는 문제가 발생했습니다. (버그 #29273194)
참고: 이 문제는 버그 #29273194의 회귀 문제입니다.

InnoDB: 테이블스페이스 ID를 검색하지 못한 후 잘못된 assertion이 시작 시 발생했습니다. 잘못된 assertion 코드를 제거했습니다. (버그 #29221385, 버그 #93760)

InnoDB: 최적화된 InnoDB 내부 임시 테이블이 제자리 UPDATE 작업을 지원하지 않아 삭제 표시된 레코드 수가 지속적으로 증가했습니다. 이로 인해 쿼리 실행 시간이 예상보다 길어질 수 있었습니다. (버그 #29207450)

InnoDB: Contention-Aware Transaction Scheduling(CATS) 알고리즘에서 std::sort 함수가 std::stable_sort 함수로 교체되어 동일한 가중치를 가진 트랜잭션의 원래 FIFO 순서를 유지할 수 있게 되었습니다. (버그 #29058967)

InnoDB: 잘못 초기화된 변수로 인해 예상대로 선행 기록이 작동하지 않았습니다.
기여해주신 Yuhui Wang에게 감사드립니다. (버그 #29028838, 버그 #93442)

InnoDB: 생성된 열의 기본 열 정보가 저장되지 않았습니다. (버그 #29021730)

InnoDB: 암시적 잠금 확인에서 보조 인덱스의 열을 불필요하게 정렬 규칙을 사용해 비교했습니다. (버그 #29010725)

InnoDB: innodb_flush_method O_DIRECT_NO_FSYNC 설정과 관련된 assertion 코드가 최근 수정 사항으로 인해 유효하지 않게 되었습니다. assertion 코드를 수정했습니다. (버그 #29007731)
참고: 버그 #27309336도 참조하십시오.

InnoDB: undo 로그 암호화를 활성화한 상태로 서버를 시작할 때, 새로 생성된 undo 테이블스페이스에 대한 마스터 키가 서버 UUID 없이 생성되었습니다. 서버 UUID가 아직 생성되지 않은 경우 undo 테이블스페이스는 DefaultMasterKey를 사용해야 합니다. (버그 #29006275)

InnoDB: 데이터 사전 코드가 반환된 데이터 사전 객체를 확인하지 않아 null 포인터 접근으로 서버가 종료될 가능성이 있었습니다. (버그 #28977444, 버그 #93362)

InnoDB: 실패한 CREATE UNDO TABLESPACE 작업으로 인해 undo 테이블스페이스 파일이 남아 있었습니다. (버그 #28966457)

InnoDB: 파일 이름에 잘못된 문자가 포함되어 있어 Windows에서 CREATE UNDO TABLESPACE 문이 실패했습니다. 실패로 인해 undo 테이블스페이스 파일을 생성하는 호출에서 OS_FILE_ON_ERROR_NO_EXIT 속성이 누락되어 서버가 중단되었습니다. (버그 #28955676)

InnoDB: innodb_undo_log_encrypt 변수의 값을 수정하는 작업이 블로킹 작업이 아니어서, 작업이 성공적으로 완료된 것처럼 보인 후 백그라운드 스레드에 의해 수정이 되돌아갈 수 있었습니다. (버그 #28952870)

InnoDB: temptable::Handler::primary_key_is_clustered 함수에서 잘못된 디버그 assertion이 제거되었습니다. (버그 #28949332)

InnoDB: ALTER TABLE ... EXCHANGE PARTITION 작업이 데이터 사전에서 열 table_id 값을 제대로 업데이트하지 않았습니다. (버그 #28927005)

InnoDB: innochecksum 유틸리티에서 발견된 메모리 누수가 제거되었습니다. (버그 #28917614, 버그 #93164)

InnoDB: 가상 열에 인덱스를 생성하려는 실패 시도가 있은 후 수행된 DDL 작업이 assertion 오류를 발생시켰습니다. (버그 #28825718)

InnoDB: 128KB 이하의 압축된 BLOB에 대한 부분 업데이트 작업에서 성능 저하가 발생했습니다. (버그 #28784301)

InnoDB: 집계된 쿼리를 실행할 때 Valgrind 경고가 발생했습니다. (버그 #28711717)

InnoDB: CHECK TABLE 작업이 assertion 실패를 발생시켰습니다. 로컬 호출 스택 변수에 대한 포인터가 함수 종료 전에 다시 null로 설정되지 않았습니다. (버그 #28525110)

InnoDB: DDL 로그 함수가 ER_TOO_MANY_CONCURRENT_TRXS 오류를 처리하도록 수정되었습니다. (버그 #28523127, 버그 #92071)

InnoDB: purge 스레드가 LOB 데이터 페이지를 해제하지 못했습니다. (버그 #28510599)

InnoDB: 일부 DDL 로그 테이블 트랜잭션이 DDL 로그 복구 전에 롤백되지 않았습니다. (버그 #28494969)

InnoDB: 테이블 이름을 검색하는 SHOW CREATE TRIGGER 처리 중 호출된 함수가 예상한 소문자 변환을 수행하지 않았습니다. (버그 #28351038)

InnoDB: INFORMATION_SCHEMA.INNODB_FOREIGN 테이블의 TYPE 열이 잘못된 값을 보고했습니다. (버그 #28315651, 버그 #91577)

InnoDB: Linux AIO 핸들러 함수가 완료된 I/O 이벤트가 성공했는지 여부를 확인하지 않았습니다. Wei Zhao의 기여에 감사드립니다. (버그 #27850600, 버그 #90402)

InnoDB: 가상 열이 포함된 보조 인덱스의 열을 변경하지 않는 트랜잭션이 암시적 잠금을 보유한 것으로 잘못 판단되어, 보조 인덱스에 대한 암시적 잠금 여부를 확인하는 과정에서 assertion 오류가 발생했습니다. (버그 #27491839)

InnoDB: CREATE TABLE 스레드에서 호출된 함수가 백그라운드 스레드에 의해 해제된 테이블 객체에 접근하려고 했습니다.
Yan Huang의 패치에 감사드립니다. (버그 #27373959, 버그 #89126)

InnoDB: 두 세션이 동시에 INSERT ... ON DUPLICATE KEY UPDATE 작업을 실행할 때 교착 상태가 발생했습니다. 튜플의 부분 롤백 중에 다른 세션이 해당 튜플을 업데이트할 수 있었습니다. 이 버그 수정으로 인해 버그 #11758237, 버그 #17604730, 버그 #20040791의 수정 사항이 되돌려졌습니다. (버그 #25966845)

InnoDB: 조인된 테이블에 대한 접근 방식이 const일 때, InnoDB가 일치하는 행을 여러 번 잠금 해제하려고 시도했습니다. (버그 #20939184)

InnoDB: INFORMATION_SCHEMA.TABLESINDEX_LENGTH 값이 인덱스를 추가할 때 업데이트되지 않았습니다. (버그 #19811005)

파티셔닝: 잘못된 테이블 식별자를 사용한 이름 유효성 검사로 인해 일부 파티셔닝 DDL 문이 부적절하게 거부되었습니다. (버그 #29317007)

파티셔닝: ALTER TABLE ... COALESCE PARTITION을 롤백하는 동안, 서버가 이 문으로 인해 삭제된 파티션을 잠그고 닫으려고 시도하는 경우가 있었습니다. (버그 #28517446)

파티셔닝: ALGORITHM=INPLACE를 사용하여 ALTER TABLE 문으로 파티셔닝된 테이블에 AUTO_INCREMENT 키를 추가하면 각 파티션에서 자동 증가 값이 다시 시작되었습니다. (버그 #92241, 버그 #28573894)

복제: WAIT_FOR_EXECUTED_GTID_SET() 함수가 소수점을 포함한 제한 시간 값(예: 1.5)으로 사용될 때, 캐스팅 논리 오류로 인해 제한 시간이 가장 가까운 정수로 내림 처리되었으며, 1초 미만의 값(예: 0.1)은 0으로 처리되었습니다. 캐스팅 논리가 수정되어 제한 시간 값이 소수점까지 반영되도록 했습니다. Dirkjan Bussink의 기여에 감사드립니다. (버그 #29324564, 버그 #94247)

복제: 시스템 변수 group_replication_consistency의 일관성 수준 AFTERBEFORE_ON_PRIMARY_FAILOVER에서 제공하는 일관성 보장을 포함하지 않았습니다. 이제 AFTERBEFOREBEFORE_AND_AFTER 일관성 수준에서 이미 암묵적으로 존재하는 이러한 보장을 포함합니다. (버그 #29315752, 버그 #94213)

복제: Debian 기반 플랫폼(예: Ubuntu)에서 호스트 이름이 127.0.1.1로 해석될 경우 기본 설정을 사용하여 클러스터를 생성할 수 없었습니다. 이제 이러한 상황에서 클러스터를 생성하고 인스턴스를 추가하기 전에 인스턴스에 대한 적절한 검증이 수행됩니다. (버그 #29246110)

복제: 그룹이 차단된 상태에서 group_replication_force_members에 잘못된 값을 설정하고 STOP GROUP_REPLICATION을 발행하면 서버가 예기치 않게 중지될 수 있었습니다. (버그 #29119961)

복제: MySQL 서버의 mysql.gtid_executed 테이블에 액세스할 수 없을 때 MySQL 서버의 동작이 리팩터링되어 적절한 오류 응답과 조치를 제공하게 되었습니다. 이제 서버는 읽기 전용 또는 슈퍼 읽기 전용 모드일 때도 mysql.gtid_executed 테이블에 대한 쓰기를 허용하여 바이너리 로그 파일을 계속해서 회전할 수 있습니다. mysql.gtid_executed 테이블에 쓰기 액세스할 수 없고, 바이너리 로그 파일이 최대 파일 크기(max_binlog_size)에 도달하지 않은 다른 이유로 인해 회전되면, 현재 바이너리 로그 파일이 계속 사용되고, 로그 회전을 요청한 클라이언트에는 오류 메시지가 반환되며 서버에는 경고가 기록됩니다. mysql.gtid_executed 테이블에 대한 쓰기 액세스가 불가능하고 max_binlog_size에 도달하면, 서버는 binlog_error_action 설정에 따라 응답합니다. IGNORE_ERROR로 설정된 경우 서버에 오류가 기록되고 바이너리 로깅이 중지되며, ABORT_SERVER로 설정된 경우 서버가 종료됩니다. (버그 #29111514)

복제: 멤버가 과반수 상실 여부를 평가하려고 할 때 STOP GROUP_REPLICATION을 실행하면 서버가 예기치 않게 중지될 수 있었습니다. (버그 #29053128)

복제: RESET MASTER TO 문을 사용하여 바이너리 로그 파일의 시작 인덱스 번호를 지정할 때, 지정할 수 있는 최대 값이 최대 정수 값에서 2000000000으로 줄어들었습니다. 최대 정수 값이 지정된 경우, 추가적인 바이너리 로그 파일을 생성할 수 없어 서버가 시작되지 않았습니다. 이 상황에서 서버는 세그먼트 오류도 발생했습니다. (버그 #28980788, 버그 #28995220)

복제: GTID를 사용하는 복제 슬레이브에서 바이너리 로깅이 비활성화된 상태에서 테이블 필터에 의해 DDL 문이 필터링되면 디버그 모드에서 assertion이 발생했습니다. (버그 #28965972)

복제: 바이너리 로그에서 문 기반 복제 이벤트의 역직렬화와 관련된 두 가지 문제가 수정되었습니다. (버그 #28889181, 버그 #29028491)

복제: 테이블을 여는 중에 적용 스레드가 중지되면 오류가 설정되지 않아, 빌드 유형에 따라 세그먼트 오류 또는 assertion이 발생할 수 있었습니다. 이제 이 상황에서 올바르게 오류 처리가 활성화됩니다. (버그 #28864557)

복제: 서버에서 GTID를 사용할 때, 복제 슬레이브의 마스터 정보 로그가 자동 건너뛰기 기능을 사용하여 트랜잭션을 건너뛸 때마다 동기화되었습니다. 프로세스는 슬레이브에 전송된 더미 하트비트로 끝나며, 이로 인해 로그에 강제 플러시가 발생해 슬레이브에서 쓰기 부하가 커질 수 있었습니다. 동일한 문제가 순환 복제 토폴로지에서도 발생할 수 있었으며, 이 경우 동일한 서버에서 발생한 이벤트는 무시되었지만, 슬레이브는 이 이벤트에 대해 로그에 강제 플러시를 수행했습니다. 이제 슬레이브 처리 코드는 하트비트 이벤트와 순환 복제를 통해 수신된 무시된 이벤트에 대해 강제 플러시를 제거하여, CHANGE MASTER 문이 발행되거나 바이너리 로그가 회전될 때 등 적절한 상황에서만 마스터 정보 로그가 동기화되도록 변경되었습니다. (버그 #28815555, 버그 #85158)

복제: DEFAULT 절을 사용하여 새 열에 대해 표현식 기본값을 지정하는 ALTER TABLE 문에서, 표현식 기본값이 비결정론적 함수에 의존하는 경우, 이 문은 문 기반 복제에 대해 안전하지 않습니다. 이전에는 이러한 문이 GTID 일관성 측면에서 평가되었으나, 이는 적절한 검사가 아니었습니다. 이제 이러한 문은 바이너리 로깅에 대해서만 평가되며, 사용 중인 바이너리 로깅 형식에 따라 처리됩니다. binlog_formatSTATEMENT로 설정된 경우, 문은 로그에 기록되지만 경고 메시지가 오류 로그에 작성됩니다. binlog_formatMIXED 또는 ROW로 설정된 경우, 문은 실행되지 않고 오류 메시지가 오류 로그에 기록됩니다. (버그 #28799939)

복제: 단일 주 노드 모드로 구성된 복제 그룹(group_replication_single_primary_mode=ON, 기본값)에서 네트워크 지연이 심한 경우, 주 노드와 보조 노드가 트랜잭션에 대해 다른 결정을 내릴 수 있어, 멤버 간 gtid_executed 세트의 불일치가 발생할 수 있었습니다. 이제 이 문제가 해결되었습니다. (버그 #28768550, 버그 #28966455, 버그 #92690)

복제: group_replication_force_members 시스템 변수를 사용하여 그룹에 대한 새로운 구성을 강제 적용할 때, 그룹 통신 엔진(XCom)이 현재 접근할 수 없는 그룹 멤버가 포함되지 않았는지 확인합니다. 포함된 경우 재구성이 허용되지 않으며 오류가 반환됩니다. (버그 #28678845)

복제: 바이너리 로그에 기록된 GRANT 문이 일부 경우 잘못 기록되어, 마스터에서 성공적으로 실행된 GRANT 문이 복제 슬레이브에서 오류를 발생시킬 수 있었습니다. (버그 #28643405, 버그 #29155451, 버그 #93750)

복제: 스토리지 엔진이 STATEMENT 형식으로는 기록할 수 있지만 ROW 형식으로는 기록할 수 없는 경우, binlog_formatSTATEMENT로 설정되었을 때 안전하지 않은 SQL 문은 로그에 기록되고 경고 메시지가 오류 로그에 작성되어야 합니다. 그러나 이러한 문은 실행되지 않고 오류 메시지가 오류 로그에 작성되는 문제가 발생했습니다. 이 문제는 이제 수정되어, binlog_formatSTATEMENT로 설정된 경우 예상대로 경고와 함께 기록됩니다. (버그 #28429993, 버그 #73936)

복제: 복제 그룹 멤버가 잠시 오프라인 상태였다가 그룹이 장애를 감지하고 멤버를 제거하기 전에 다시 복제 그룹에 합류하려고 할 때, 이전에는 재합류하는 멤버가 충돌 전 인스턴스를 대상으로 하는 메시지를 수신하고 처리하면 XCom의 합의 프로토콜에 참여할 수 있었습니다. 이로 인해 XCom이 동일한 합의 라운드에 대해 다른 값을 전달할 수 있었습니다. 이제 재합류하는 멤버는 충돌 전 인스턴스를 대상으로 하는 메시지를 무시합니다. (버그 #27383487)

복제: 서버가 과부하 상태일 때 멤버가 그룹에 합류하면 그 지점을 표시하는 VIEW_CHANGE_LOG_EVENT 이벤트가 올바른 위치에 기록되지 않을 가능성이 있었습니다. 이로 인해 새로 합류하는 서버로의 데이터 전송에 오류가 발생하고 데이터 불일치가 발생할 수 있었습니다. 이제 VIEW_CHANGE_LOG_EVENT 이벤트가 바이너리 로그의 올바른 위치에 기록되며, 이벤트 기록 지연에 대한 경고도 로그에 기록됩니다. (버그 #93347, 버그 #28971594)

복제: 서버 시작 시 멤버가 그룹에 합류하려고 할 때, 예를 들어 서버가 그룹과 호환되지 않아 합류에 실패한 경우, 오프라인 상태의 멤버가 다른 멤버를 온라인 상태로 볼 수 있는 가능성이 있었습니다. 이제 이러한 상황에서는 로컬 멤버가 OFFLINE 상태일 때 performance_schema.replication_group_members 테이블에 표시되는 정보가 로컬 멤버로만 제한됩니다. (버그 #92110, 버그 #28533993)

복제: 복구 채널이 실패할 경우 처리되지 않은 릴레이 로그가 삭제되었습니다. (버그 #90671, 버그 #27940732)

그룹 복제: START GROUP REPLICATION 명령이 멤버의 로컬 주소에 지정된 포트가 사용 중일 때 제대로 작동하지 않았습니다. (버그 #29347285)

그룹 복제: Group Replication에서 IP 주소 화이트리스트(group_replication_ip_whitelist)에 호스트 이름이 지정되었을 때, IPv4 주소가 사용 가능한 경우에도 IPv6 주소가 이름 확인 및 화이트리스트 비교에 사용되었습니다. 이제 호스트 이름이 IPv4 주소로 해석되면 IPv6 주소는 비교에 사용되지 않습니다. (버그 #28841543)

그룹 복제: 이전에는 group_replication_applier 채널에서 FLUSH RELAY LOGS 명령을 사용하여 릴레이 로그를 수동으로 회전시킬 수 없었습니다. 이 제한으로 인해 바이너리 로그 파일과 릴레이 로그 파일에 대한 암호화를 사용한 후(binlog_encryption=ON) 암호화를 비활성화했을 때 즉시 릴레이 로그 파일을 회전할 수 없었습니다. 이제 이 제한이 제거되었으며, group_replication_applier 채널에서 다른 채널과 동일하게 FLUSH RELAY LOGS 명령을 사용할 수 있습니다. 단, 트랜잭션이 적용되는 동안 요청이 수신되면 트랜잭션이 종료된 후 회전이 수행됩니다. 요청자는 트랜잭션이 완료되고 회전이 완료될 때까지 대기해야 합니다. 이 동작은 그룹 복제에서 트랜잭션이 분할되는 것을 방지합니다. (버그 #28684376)

그룹 복제: 다수 상실로 인해 그룹에서 추방된 후 복제 그룹 멤버가 로컬 뷰를 트리거할 수 있었습니다. 이로 인해 멤버가 추방된 후 정상적인 작업을 재개했다는 잘못된 메시지가 표시되었습니다. 이제 Group Replication은 로컬 뷰를 제공하기 전에 멤버가 추방되지 않았는지 확인합니다. (버그 #27349236)

그룹 복제: group_replication_communication_debug_options에 잘못된 값이 지정된 경우, Group Communication System은 해당 내부 변수를 GCS_DEBUG_NONE으로 설정하고 서버는 SHOW VARIABLES 쿼리에서 잘못된 값을 반환했습니다. 이제 서버 초기화 중에 이 시스템 변수의 값이 확인되며, 잘못된 값이 지정된 경우 오류 메시지가 기록되고 Group Replication은 자동으로 시작되지 않습니다. (버그 #26729404)

macOS: Xcode를 사용하여 빌드할 경우 CMake 3.12.4 이상이 필요하며, 이는 UseModernBuildSystem = NO를 강제 적용합니다. (버그 #28893131)

Microsoft Windows: named_pipe_full_access_group 시스템 변수의 유효성 테스트가 NULL 값을 고려하지 않았습니다. (버그 #29256690)

Microsoft Windows: 동일한 호스트에서 동일한 사용자가 --no-monitor 옵션을 사용하여 여러 mysqld 인스턴스를 시작했을 때, SHUTDOWN 명령이 잘못된 서버 프로세스를 종료할 수 있었습니다. 이제 프로세스 ID를 추가하여 고유한 종료 이벤트 이름을 생성합니다. (버그 #28723675)

JSON: JSON 경로 파서가 다른 MySQL 서버 구성 요소처럼 오류를 전파하도록 수정되었으며, 오류가 발생하면 true를 반환하고 성공 시 false를 반환합니다. (버그 #28851426)

JSON: Json_wrapper::get_datetime()에서 불필요한 유형 조회가 제거되었습니다. (버그 #28851324)

authentication_ldap_simple 플러그인이 인증을 잘못 처리할 수 있었습니다. (버그 #29637712)

RPM 패키지 업데이트가 EL8에서 MariaDB에서 MySQL로의 업그레이드를 성공적으로 수행할 수 있도록 변경되었습니다. (버그 #29413354)

외부 조인의 결과가 NULL 확장된 행이 예상되는 경우에도 NULL이 아닌 행을 포함할 수 있었습니다. (버그 #29402481)
참고: 이 문제는 버그 #27808758의 회귀 문제입니다.

SET PASSWORD FOR ...가 준비된 문으로 실행되지 않았습니다. (버그 #29387041, 버그 #94416)

Visual Studio에서 MySQL Router 라이브러리를 빌드하는 동안 빌드가 실패할 수 있었습니다. (버그 #29382197)
참고: 이 문제는 버그 #29361890의 회귀 문제입니다.

참조된 테이블보다 먼저 정의된 외래 키가 작동하지 않았습니다. (버그 #29379078, 버그 #94400)
참고: 이 문제는 버그 #28493257의 회귀 문제입니다.

LIKE 표현식의 ESCAPE 절을 해결하는 동안 오류가 발생했을 때, 오류 상태가 호출자에게 전파되지 않았습니다. (버그 #29368521)

MySQL 5.7에서 MySQL 8.0으로 업그레이드한 후, innodb_table_stats_backupinnodb_index_stats_backup 메타데이터 백업 테이블에 대한 테이블스페이스 파일이 제거되지 않았습니다. (버그 #29365552)

서브쿼리를 평탄화하는 동안, 항상 거짓인 조건자가 존재하면 MySQL 옵티마이저가 변환을 수행하지 않아 서브쿼리가 준비되지 않고 나중에 실행될 때 assertion이 발생했습니다. 이를 해결하기 위해, 서브쿼리에 이러한 조건자가 포함된 경우 서브쿼리의 쿼리 표현식이 쿼리 블록에서 분리됩니다. (버그 #29356132)

MySQL 8.0.11, 8.0.12 또는 8.0.13에서 MySQL 8.0.14 또는 8.0.15로 업그레이드할 때, ALLOW_INVALID_DATES SQL 모드로 정의된 이벤트, 루틴 또는 트리거가 있으면 업그레이드가 실패했습니다. MySQL 8.0.14에서 데이터 사전의 SQL 모드 식별자가 변경되어 마이그레이션이 실패했습니다. (버그 #29350955)

RPM 빌드는 WITH_SSL 구성 설정을 무시했습니다. (버그 #29347534)

TO_SECONDS() 함수에 대한 길이 메타데이터가 항상 정확하게 계산되지 않았습니다. (버그 #29321387)

항상 참이거나 거짓인 창 함수 조건이 제대로 처리되지 않았습니다. (버그 #29320484)

SET ROLE 문이 메모리 누수를 일으킬 수 있었습니다. (버그 #29304583)

Windows에서 MySQL 5.7에서 MySQL 8.0으로 업그레이드하는 동안 “Error 197 from SE while migrating tablespaces” 오류가 발생했습니다. 이 오류는 테이블스페이스 파일을 열려고 할 때 액세스 공유 위반으로 인해 발생했습니다. (버그 #29292860)
참고: 이 문제는 버그 #28642608의 회귀 문제입니다.

RPM 패키지에서 COMPILATION_COMMENT_SERVER 값이 잘못될 수 있었습니다. (버그 #29284651)

sql_require_primary_key 시스템 변수가 활성화된 상태에서 기본 키 없이 새로운 테이블 정의를 시도할 경우, CREATE TABLE IF NOT EXISTS 명령이 기존 테이블이 있는 경우에도 실패했습니다. (버그 #29283055, 버그 #94134)

모든 파티션이 제거된 파티셔닝된 테이블에서 삭제가 항상 올바르게 처리되지 않았습니다. (버그 #29280186)

CMake의 GNU gold 링커 확인이 Clang과 함께 실패할 수 있었습니다. (버그 #29278244)

MySQL 8.0.16 릴리스에서 데이터 사전 버전이 증가했습니다. (버그 #29278241)

DISTINCT와 함께 사용된 함수에 잘못된 유형의 인수가 있는 경우 항상 올바르게 처리되지 않았습니다. (버그 #29277571)

QUOTE() 함수에 대한 길이 메타데이터가 항상 정확하게 계산되지 않았습니다. (버그 #29276074)

GREATEST() 또는 LEAST() 함수를 평가할 때, MySQL이 NULL 여부를 확인하기 전에 반환 값의 부호 여부를 확인했습니다. (버그 #29275835)

엄격한 SQL 모드가 적용되지 않았을 때, 결과가 max_allowed_packet을 초과하는 문자열 함수는 일관되지 않게 처리되어 잘못된 정렬 출력이나 다른 문제를 발생시킬 수 있었습니다. (버그 #29272683)
참고: 버그 #97301, 버그 #29133127도 참조하십시오.

업그레이드가 특정 서버 버전으로 지원되는지 확인하는 논리가 서버 버전으로의 업그레이드를 지원하지 않는지 확인하도록 변경되었습니다. (버그 #29270297)

이벤트 생성이 잘못된 반복 간격을 저장할 수 있었습니다. (버그 #29269819, 버그 #94085)

뷰 참조 또는 변환에 의해 생성된 항목을 포함하는 WHERE 조건이 항상 올바르게 처리되지 않았습니다. (버그 #29268867, 버그 #29268698, 버그 #28723669, 버그 #29244238)

mysql_ssl_rsa_setup이 GCC 9를 사용하여 컴파일되지 않았습니다. (버그 #29245251)

CMake가 MySQL이 사용하기에 너무 오래된 libtirpc 라이브러리를 찾으면, 대신 glibc의 Sun RPC를 사용하도록 시도합니다. (버그 #29240701)

서버가 잘못된 쿼리 실행 시간 계산으로 인해 느린 쿼리 로그에 쿼리를 기록하지 못할 수 있었습니다. (버그 #29232684, 버그 #93963)

위치를 사용하는 MySQL 정규 표현식 함수가 코드포인트 위치가 아닌 16비트 청크 기반의 내부 인덱스를 사용했습니다. (버그 #29231490)

Windows에서 MySQL MSI 설치 관리자가 Visual Studio 2015 Redistributable의 설치 여부를 제대로 감지하지 못할 수 있었습니다. (버그 #29227209)

SDI JSON 파일에 Index_impl 객체의 m_hidden 필드가 포함되지 않았습니다. 이는 InnoDB가 숨겨진 인덱스를 추가하기 때문에 테이블에 대한 CREATE 문을 재생성하기 어렵게 만들었습니다. 이제 SDI JSONm_hidden 필드가 포함됩니다. 이로 인해 SDI 형식이 변경되었으며, SDI 버전 번호가 현재 서버 버전 번호로 증가했습니다. (버그 #29210646, 버그 #93914)

범위 프레임의 마지막 행에 대한 위치 힌트가 실제 마지막 행보다 한 행 더 지나치게 업데이트되었습니다. (버그 #29201831)

열 정의에서 첫 번째가 CHECK 제약 조건인 경우 여러 제약 조건 정의가 허용되지 않았습니다. (버그 #29191994)

서버가 업그레이드를 수행할 때 오류 로그 정보가 너무 오래 버퍼링될 수 있었습니다. (버그 #29189532)

nullable 열에 대해 열이 NULL일 때를 제외하고 항상 참인 표현식을 찾은 경우, 해당 표현식이 column IS NOT NULL로 축약되었습니다. 이러한 표현식이 중첩된 경우, NULL 행이 잘못 선택되었습니다. 이를 방지하기 위해, 중첩된 경우 해당 표현식이 IF(column IS NULL, NULL, TRUE)로 축약됩니다. (버그 #29179604)

PERIOD_ADD()가 Windows 플랫폼에서 32비트를 초과하는 길이의 period 인수를 올바르게 처리하지 못했습니다. (버그 #29175262)

sql_auto_is_null이 활성화된 경우, WHERE auto_increment_col IS NULL 형태의 WHERE 절이 WHERE auto_increment_col = LAST_INSERT_ID()로 다시 작성되었습니다. 이 변환은 자동 증가 값당 한 번만 수행되어, 변환이 수행될지 여부를 사전에 알기 어려웠습니다. 이제 sql_auto_is_null이 활성화된 경우 변환이 무조건 수행됩니다.
또한, LAST_INSERT_ID()에서 반환되는 값이 이제 부호 없는 값으로 처리되어, 부호 있는 BIGINT 범위를 벗어난 자동 증가 값과 일치하지 않는 문제가 해결되었습니다. (버그 #29171668)

Debian 및 Ubuntu에서 비대화형 모드로 설치 작업을 수행할 때 root 암호가 무시되어, 기본적으로 auth_socket 인증 플러그인이 설치되었습니다. (버그 #29165407)

harness_plugin_eventlog 선언으로 인해 일부 빌드 환경에서 컴파일 오류가 발생했습니다. (버그 #29160214)

상수 접기 중 소수 자릿수를 원하는 숫자로 자르거나 확장하는 논리가 부족했습니다. 소수 부분에 여분의 0이 있으면, 0이 아닌 소수 자릿수 대신 전체 소수 자릿수를 기준으로 확장하려는 시도로 인해 내부 함수 widen_fraction()에서 assertion이 발생할 수 있었습니다. 이제 여분의 0을 잘라낼 수 있는 경우를 식별하여 문제를 해결했습니다. (버그 #29155439)

Windows에서 내부 함수 get_mysql_time_from_str_no_warn()가 항상 적절한 오류 검사를 수행하지 않았습니다. (버그 #29155126)
참고: 버그 #29175262도 참조하십시오.

특정 조건에서 동일한 테이블을 여러 번 이름을 변경하는 RENAME TABLE 문이 assertion을 발생시키거나 서버 종료를 유발할 수 있었습니다. (버그 #29140407)

디버그 빌드에서, --event-scheduler=DISABLED로 서버를 시작하면 특정 이벤트에서 assertion이 발생할 수 있었습니다. (버그 #29140298, 버그 #93719)

디버그 빌드에서, 엄격한 SQL 모드가 적용되지 않았을 때 CONCAT()CONCAT_WS() 함수가 결과가 max_allowed_packet보다 길 경우 assertion을 발생시켰습니다. (버그 #29133127)

범위를 벗어난 소수 부분이 SET SESSION timestamp 문에서 잘못된 타임스탬프를 생성할 수 있었습니다. (버그 #29120569, 버그 #93600)

mysql_service_component_sys_variable 서비스가 컴포넌트 시스템 변수를 액세스할 수 있었지만 서버 또는 플러그인 시스템 변수를 액세스할 수 없었습니다. (버그 #29113463)

ALTER TABLE ... CONVERT TO CHARACTER SET이 메모리 접근 오류를 발생시킬 수 있었습니다. (버그 #29058369, 버그 #93603)

mysql.tablespaces.name 열의 제한이 259바이트로, 허용된 식별자 길이에 필요한 길이보다 적었습니다. 이제 열 제한이 268바이트로 증가했습니다. (버그 #29053560, 버그 #93587)

디버그 빌드에서 공간 계산이 assertion을 발생시켰을 때, 파티션 처리 코드가 오류를 무시하여 서버가 종료되었습니다. (버그 #29047811)

외부에 저장된 길이가 0인 LOB가 assertion 실패를 유발했습니다. (버그 #29047795)

COMPILE_DEFINITIONSCOMPILE_FLAGS CMake 옵션 처리가 교차 컴파일 실패를 방지하도록 조정되었습니다. (버그 #29041100)

서버가 max_error_count 시스템 변수가 0으로 설정된 경우에도 첫 번째 진단 영역 메시지를 읽으려고 시도하여 메모리 접근 오류가 발생할 수 있었습니다. (버그 #29031684)

DATE 값을 상수 문자열과 비교할 때 MySQL은 먼저 문자열을 DATE로 변환한 다음 비교를 수행합니다. 변환이 실패하면 MySQL은 DATE를 문자열로 취급하여 비교를 실행하여 예측할 수 없는 동작이 발생할 수 있었습니다. 이제 문자열을 DATE로 변환하는 데 실패하면, 비교가 ER_WRONG_VALUE 오류로 처리됩니다. (버그 #29025656)
참고: 버그 #95466, 버그 #29812087도 참조하십시오.

--users 옵션을 사용하면, mysqlpumpCREATE USERGRANT 문을 출력에 기록했지만, 덤프에서 생성된 다른 객체에 적용하기에는 너무 늦었습니다. 이제 mysqlpump가 덤프 파일에 사용자 계정을 다른 객체보다 먼저 기록합니다. (버그 #29023216)

WITH 키워드 위치에서 구문 오류가 발생했을 때, 파서 오류 메시지가 잘못된 위치에 문제를 식별했습니다. (버그 #29022263)

MySQL이 최근 버전의 International Components for Unicode (ICU)를 사용하여 빌드되었을 때, 잘못된 정규 표현식에 대해 더 일반적인 ER_REGEXP_ERROR 대신 ER_REGEXP_ILLEGAL_ARGUMENT 오류를 반환합니다. (버그 #29016798)

Windows에서 파일 시스템이 대소문자를 구분할 경우 LDAP 라이브러리를 찾을 수 없었습니다. (버그 #29016220)

INFORMATION_SCHEMA.TABLES 테이블의 TABLE_COMMENT 열에서 선택된 값이 잘릴 수 있었습니다. (버그 #29014272, 버그 #93451)

ASAN 및 Valgrind 빌드에서 해제되지 않은 스키마와 관련된 데이터 계층 메모리 누수가 발견되었습니다. (버그 #29008688)

GROUP BY 쿼리에서 ROLLUPORDER BY 절이 함께 사용될 때, 표현식을 포함하는 ORDER BY 절로 인해 ER_WRONG_FIELD_WITH_GROUP 오류가 발생할 수 있었습니다.
이 문제는 함수에서 ORDER BY가 사용된 GROUP BY 쿼리 결과의 잘못된 정렬을 유발할 수도 있었습니다. (버그 #29006668, 버그 #29054096)

파서가 생성된 열 정의에서 여러 COLLATE 절을 허용했습니다. 이제 파서는 하나의 COLLATE 절만 허용합니다. (버그 #28997518)

INSERT ... ON DUPLICATE KEY UPDATE가 잘못된 업데이트를 수행할 수 있었습니다. (버그 #28995498, 버그 #93410)
참고: 이 문제는 버그 #26188578의 회귀 문제입니다.

손상된 mysql.user 테이블이 서버 종료를 유발할 수 있었습니다. (버그 #28986737)

퍼포먼스 스키마 data_locks 또는 data_lock_waits 테이블에서 행을 읽는 동안 스캔 중에 행 수를 제한하지 않아 과도한 메모리 할당으로 서버가 종료될 수 있었습니다. 이제 이 상황에서 오류가 발생합니다. (버그 #28977428, 버그 #87748)

빈 테이블에서 LATERAL 조인의 실물화 비용을 계산하는 과정에서 assertion이 발생했습니다. 이제 이러한 경우 쿼리 비용은 0으로 보고됩니다. (버그 #28976533)

디버그 빌드에서, CREATE 또는 ALTER DDL 문에서 열 유형의 주석 문자열에 잘못된 utf8 문자가 있으면 assertion이 발생했습니다. (버그 #28972424, 버그 #93321)

CMaketirpc 헤더 확인이 이제 더 많은 Linux 플랫폼에서 헤더를 찾기 위해 pkgconfig를 사용하도록 대체됩니다. 이를 위해 pkgconfig가 설치되어 있어야 합니다. (버그 #28970313, 버그 #93341, 버그 #28997093)

서브쿼리의 WHERE 절에 있는 컴포넌트가 비결정적일 때 mysqld가 예기치 않게 종료될 수 있었습니다. 이 문제는 동일한 문에서 사용자 변수를 참조하면서도 설정된 경우였습니다. 이제 비결정적인 컴포넌트를 가진 조건자는 무시됩니다.
또한, 일반적으로 비결정적인 서브쿼리는 외부 행당 평가되어야 하므로, 이러한 서브쿼리는 실물화 전략의 대상으로 선택되지 않습니다. 비결정적 조건자의 decorrelation도 방지됩니다. 가능한 경우, 비-semijoin 및 비결정적 서브쿼리에 대해 동일한 전략 선택이 적용됩니다. (버그 #28970261)

사용자 수준 잠금 및 명시적 테이블 잠금이 이전에 획득된 경우, 테이블 스토리지 엔진을 변경하는 ALTER TABLE 문이 중단될 수 있었습니다. (버그 #28966941)

LIMIT ... OFFSET이 있는 COUNT()가 동일한 절에서 사용된 다른 집계 함수와 다른 결과를 반환했습니다. (버그 #28961843)

MYSQL_HOME 환경 변수의 값을 추출하면 환경에서 MYSQL_HOME 다음에 저장된 변수의 값이 변경될 수 있었습니다. (버그 #28960613)

Item_subselect::walk_body()가 이제 FROM 절을 처리합니다. (버그 #28955358)

다음과 같은 두 개의 IN 서브쿼리가 있는 쿼리 계획에서 문제가 발견되었습니다:

  • 최상위 쿼리에 대한 외부 참조를 포함하는 유도된 테이블을 가진 서브쿼리
  • 유도된 테이블을 가진 서브쿼리로, 외부 상관관계가 없고, 세미조인되었으며, LATERAL이 아닙니다.

두 번째 서브쿼리에서: 의존성 맵의 계산이 관련이 없는 LATERAL 테이블을 제외하지 못했고, 첫 번째 서브쿼리의 유도된 테이블에 대한 의존성을 잘못 포함시켰습니다. (버그 #28954838)

특정 GROUP BY 쿼리에서 상수 표현식을 평가할 때 발생한 오류가 적시에 확인되지 않았습니다. (버그 #28949452)

DATE 또는 DATETIME 값을 문자열과 비교할 때 MySQL은 먼저 문자열을 동일한 형식(DATE 또는 DATETIME)으로 변환한 후 해당 형식의 값으로 두 값을 비교하려고 시도합니다. 이 변환이 실패하면 MySQL은 Incorrect date value 경고를 발생시키고, 값들을 문자열로 비교하는 방식으로 돌아갑니다. 그러나 일부 경우 변환된 문자열이 유효한 DATE 또는 DATETIME 값을 반영하지 않더라도 경고가 발생하지 않아 해당 값이 DATE 또는 DATETIME 값으로 비교되는 문제가 있었습니다. 이제는 명시적으로 ALLOW_INVALID_DATES 서버 SQL 모드가 설정되지 않는 한, 변환된 문자열이 DATE 또는 DATETIME으로 비교되기 전에 항상 유효성 검사를 거치도록 했습니다. (버그 #28940878)

긴 클라이언트 호스트 이름이 서버의 예기치 않은 동작을 유발할 수 있었습니다. (버그 #28936359)

하나의 준비된 문에서 대량의 매개변수를 대체하면 과도하고 불필요한 메모리 재할당이 발생할 수 있었습니다. 이제 String::replace()String::append()와 동일하게 지수적으로 버퍼를 확장하도록 수정되었습니다. (버그 #28929977)

트랜잭션 관련 작업의 결과를 확인하지 않아 데이터 사전 캐시가 데이터 사전 내용과 동기화되지 않을 수 있었습니다. (버그 #28923782, 버그 #93196)

mysqld 프로세스에 사용할 수 있는 온라인 CPU 수를 더 정확하게 결정할 수 있게 되었습니다. Daniel Black에게 감사드립니다. (버그 #28907677, 버그 #93144)

INFORMATION_SCHEMA.TABLES TABLE_COMMENT 열이 잘못된 오류 메시지를 보고했습니다. (버그 #28901919)

업그레이드 후 여러 sys 스키마 뷰에 대해 “view_name 뷰가 유효하지 않은 테이블, 열 또는 함수에 참조되었거나, 뷰의 정의자/호출자가 이를 사용할 권한이 부족합니다”라는 오류 메시지가 나타났습니다. 업그레이드 프로세스가 참조된 뷰 상태를 업데이트하지 않았습니다. (버그 #28901821)

많은 고유한 열 값을 가진 대형 테이블(수백만 개의 행)에 대한 히스토그램 생성을 처리하는 데 과도한 시간이 소요되었습니다.
수정 사항은 고유한 값이 적은 데이터 세트에서는 약간 느려지고 약간 더 많은 메모리를 사용하게 되었지만, 고유한 값이 많은 대형 데이터 세트에서는 훨씬 더 빠릅니다. (버그 #28888936)

InnoDB 4K 페이지 크기를 사용하는 인스턴스에서 MySQL 5.7에서 MySQL 8.0으로 업그레이드하는 과정에서 억제되어야 하는 키 길이 오류로 인해 업그레이드가 실패했습니다. (버그 #28884503)

잘못 구성된 keyring 플러그인이 서버 종료를 유발할 수 있었습니다. (버그 #28876033)

COUNT() 함수 사용과 관련된 두 가지 문제가 발견되었습니다:

  • COUNT()에 전달된 인수가 null 가능 표현식일 때 함수가 잘못된 결과를 반환할 수 있었습니다.
  • COUNT()EXISTS 서브쿼리를 함께 사용하는 쿼리가 잘못된 결과를 반환했습니다.

(버그 #28857990, 버그 #29240516)

MySQL 빌드 중 ccache를 호출하는 명령이 잘못 생성되었습니다. (버그 #28841612, 버그 #92927)

INSERT 문에서 삽입 열 이름이 여러 번 나열된 경우, 이제는 모든 중복된 이름이 보고됩니다. (버그 #28836669)

ROLLUP을 사용할 때 GROUP BY의 일부 행에서 NULL이 발생할 수 있습니다. 이러한 행을 참조하는 표현식은 NULL을 잃어버려 잘못된 결과를 생성할 수 있었습니다. (버그 #28836345)

테이블을 열려고 시도하다가 실패한 후, 저장 엔진에서 테이블을 검색하려는 시도에서 오류 반환을 확인하지 않아 오류가 발생하면 서버가 중단될 수 있었습니다. (버그 #28828450)

특정 역할이 부여된 사용자를 삭제하려고 하면 서버가 종료될 수 있었습니다. (버그 #28817441)

MySQL이 -DWITH_MYSQLX=0로 구성된 경우 MySQL Router 컴파일이 실패했습니다. (버그 #28811356)

데이터 사전 업그레이드 중에 호출된 함수가 avoid_temporal_upgrade 매개변수를 일시적으로 수정하여 이전의 시간 유형에 대한 검사가 항상 수행되도록 했습니다. 여러 스레드가 동시에 이 함수를 호출할 수 있으므로 데이터 사전 업그레이드 중에 매개변수 값을 안전하게 수정할 수 있는지 확인하는 검사를 추가했습니다. (버그 #28805429)

EXISTS 서브쿼리가 세미조인 작업으로 변환되었습니다. 옵티마이저는 이 세미조인에 대해 실물화 조회 전략을 선택하지만, 서브쿼리가 외부 쿼리 블록과 상관되지 않아서 조회할 키가 없어 상위 쿼리가 실패할 수 있었습니다. 이를 해결하기 위해 두 개의 상수 항목을 키로 사용하여 실물화된 쿼리가 상수를 키로 가져오도록 했습니다. (버그 #28805105)

Last_query_cost 상태 변수는 이제 서브쿼리나 유니언을 포함한 여러 블록이 포함된 쿼리의 비용을 보여줍니다. (이전에는 단일 쿼리 블록으로 구성된 간단한 쿼리에 대해서만 이 변수가 설정되었습니다.) (버그 #28786951)

치명적인 신호가 발생했을 때 mysqld에 의해 표시되는 메시지가 단순화되고 더 유용하게 변경되었습니다. 또한 메모리 사용량 계산이 더 이상 정확하지 않아 표시되지 않도록 수정되었습니다. (버그 #28773322, 버그 #92731)

skip_name_resolve 시스템 변수를 SET PERSIST_ONLY를 사용하여 비활성화할 수 없었습니다. 이제는 비활성화할 수 있도록 수정되었습니다. (버그 #28749668)

반복적인 조건 푸시다운 처리의 필요성을 제거하여, 단일 테이블 업데이트 및 삭제 쿼리의 경우를 제외하고는 더 이상 처리하지 않도록 수정되었습니다. (버그 #28745859)

IS NOT NULL 술어가 옵티마이저에 의해 참조 접근의 초기 NULL 필터링의 일부로 추가됩니다. 별표 조인 토폴로지를 가진 쿼리의 경우, 이러한 술어의 중복이 추가되어 관련된 WHERE 조건 평가가 비효율적으로 이루어졌습니다. (버그 #28727717)

CMake가 시스템 라이브러리의 번들 버전을 사용하도록 MySQL을 구성할 때 시스템 포함 순서를 잘못 생성할 수 있었습니다. (버그 #28727631, 버그 #92615)

double에서 long long으로의 변환을 포함하는 일부 숫자 연산이 Windows와 Linux에서 다른 결과를 반환할 수 있었습니다. (버그 #28706832)

준비된 문 실행 중에 null 포인터에 접근하려고 시도할 수 있었습니다. (버그 #28692136)

FROM_UNIXTIME()가 전달된 인수가 반올림되어 epoch 값을 초과할 때 범위를 벗어난 값을 반환했습니다. 이제는 다른 범위를 벗어난 값처럼 NULL을 반환합니다. (버그 #28671811, 버그 #92501)

복제: slave_parallel_workers 시스템 변수가 설정된 서버에서 복제된 DDL 작업이 복구 중 ‘primary key 중복’ 오류를 발생시킬 수 있었습니다. (버그 #28670843)

계정에서 빈 호스트 이름이 서버의 오작동을 유발할 수 있었습니다. (버그 #28653104)

MySQL 5.7에서 MySQL 8.0으로 업그레이드하는 과정에서 테이블스페이스 파일의 존재를 확인하지 않아 데이터 사전 불일치가 발생할 수 있었습니다. (버그 #28642608)

ENUM 형식의 타입 캐스팅이 서브쿼리 안팎에서 다르게 동작했습니다. (버그 #28547906, 버그 #92173)

부동소수점 값이 잘리는 명령문이 STRICT_TRANS_TABLES SQL 모드를 포함한 경우에도 준비된 문으로 실행될 수 있었습니다. 또한, 바이너리 로그 모드가 MIXED로 설정된 경우 이러한 명령문이 슬레이브로 전달되어 오류를 일으킬 수 있었습니다. (버그 #28546855)

실행 중에 thread_cache_size 값을 줄여도 스레드 캐시 크기가 줄어들지 않았습니다. (버그 #28508923, 버그 #92024)

일부 오류 메시지가 제거된 PASSWORD() 함수에 여전히 참조되었습니다. (버그 #28498714)

thread_pool 플러그인이 연결을 관리하는 경우, 실패한 연결 시도에 대해 Aborted_connects 상태 변수가 증가하지 않았습니다. (버그 #28490126)

mysqladmin shutdownmysqld가 종료될 때까지 대기하지 않았습니다. (버그 #28466137, 버그 #91803)
참조: 이 문제는 버그 #25364806의 회귀 문제입니다.

CURRENT_USER를 사용자로 지정한 GRANT 명령문이 실패할 수 있었습니다. (버그 #28454014)

단락 평가를 실행하는 쿼리를 실행한 저장 프로시저를 반복 호출할 때 항상 제대로 처리되지 않았습니다. (버그 #28379655)

키링 마이그레이션은 소스 키링에 대한 읽기 권한만 필요해야 하지만, 사용자에게 쓰기 권한이 없으면 실패했습니다. (버그 #28339014)

키링 파일에 대한 쓰기 권한이 없는 사용자가 키링 마이그레이션을 수행할 때 마이그레이션이 실패했지만 최종 오류 로그 메시지에서는 성공으로 보고되었습니다. (버그 #28330922)

FLUSH STATUS 실행 중에 퍼포먼스 스키마가 불필요하게 세션 상태를 글로벌 상태로 집계하여 일부 상태 변수가 두 번 계산되었습니다. (버그 #28291258, 버그 #91541)

mysql_secure_installation이 더 이상 .mysql_secret 파일에서 비밀번호를 읽으려고 시도하지 않습니다. 이 파일은 제거된 mysql_install_db 프로그램에 의해 생성되었습니다. (버그 #28235716, 버그 #91270)

일부 상태 변수 값이 일시적으로 증가한 후 원래 값으로 돌아갈 수 있었습니다. (버그 #27839644, 버그 #90351)

FIPS 모드를 설정할 수 없을 때 --ssl-fips-mode 옵션을 지정하면 클라이언트 프로그램이 종료되지 않았습니다. (버그 #27809371)

ALTER INSTANCE ROTATE INNODB MASTER KEY 실행 및 keyring_file 플러그인에서 keyring_encrypted_file 플러그인으로 키를 마이그레이션하는 과정에서 암호화된 테이블을 사용할 수 없게 될 수 있었습니다. (버그 #27760952)

MySQL Community에서 Commercial로 업그레이드할 때 데이터 디렉터리가 존재해도 root 비밀번호 프롬프트가 표시되었습니다. (버그 #27741998)

클라이언트/서버 프로토콜에서 준비된 문에 대한 잘못된 패킷이 감지되지 않고 단언이 발생할 수 있었습니다. (버그 #27627731)

X Plugin을 사용할 때 쿼리 처리량을 높이기 위해 스레드의 세션 연결 및 연결 해제 처리 방식이 변경되었습니다. 이전에는 각 명령에 대해 세션(Srv_session)이 현재 스레드에 연결 및 분리되었으나, 이제는 현재 세션을 분리하거나 현재 스레드와 연결된 스레드가 다른 플러그인에 속할 때만 이 스레드 전환이 이루어집니다. (버그 #27463277)

PERSISTPERSIST_ONLY 키워드가 실수로 예약어로 지정되었습니다. 이제는 비예약어로 변경되었습니다. (버그 #25220656)

플러그인을 설치 및 제거하는 동안 클라이언트 연결 활동이 동시에 이루어지면 서버가 종료될 수 있었습니다. (버그 #22980441)

LOAD_FILE() 함수가 /proc 아래의 파일처럼 stat()이 참고용으로만 사용되는 파일에서 실패할 수 있었습니다. (버그 #18394503, 버그 #72027)

암시적 전체 텍스트 인덱스가 있는 테이블에서 쿼리된 ORDER BY 절을 사용하는 쿼리가 정렬된 키를 저장하기 위한 정렬 버퍼가 충분하지 않을 때 실패했습니다. (버그 #93241, 버그 #28940361)

문자열 값을 반환하는 로드 가능한 함수가 이제 명시적인 반환 유형을 설정합니다. 함수에 전달된 인수에 따라 반환 유형이 VARCHAR, MEDIUMBLOB, 또는 LONGBLOB 중 하나로 설정됩니다. (버그 #92890, 버그 #28828169)

내부 메서드 Item_result::item_cmp_type()에서 비교 작업이 더 효율적으로 이루어지도록 개선되었습니다. Daniel Black에게 감사드립니다. (버그 #92784, 버그 #28796107)

산술 표현식에서 사용된 윈도잉 함수가 DISTINCT를 사용하는 쿼리에서 잘못된 결과를 생성했습니다. (버그 #92503, 버그 #28672483)

복잡한 조인을 포함하는 일부 쿼리에서 파일 핸들이 누출되었습니다. (버그 #90902, 버그 #28039829)

Fedora 패키징은 이제 Fedora 30을 지원합니다.

Ubuntu 14.04 및 SLES 11은 지원 종료(EOL)되었으며 더 이상 지원되지 않습니다.

Leave a Comment



이 문서 공유

8.0.16 변경 사항 (2019-04-25 GA)

링크 복사

CONTENTS