MySQL 8.0 Release Note

8.0.23 변경 사항 (2021-01-18 GA)

Estimated reading: 6 minutes 69 views

공식 문서: Changes in MySQL 8.0.23 (2021-01-18, General Availability)

계정 관리 관련 사항

RELOAD 권한을 부여하면 사용자가 다양한 작업을 수행할 수 있습니다. 일부 경우에는 사용자가 이러한 작업 중 일부만 수행할 수 있도록 하는 것이 바람직할 수 있습니다. DBA가 RELOAD 권한을 부여하지 않도록 하고 사용자 권한을 더 세분화하여 허용된 작업에 맞추기 위해 다음과 같은 제한된 범위의 새로운 권한이 제공됩니다:

이러한 새로운 권한은 글로벌 레벨에서만 적용됩니다. 자세한 내용은 MySQL에서 제공하는 권한FLUSH 명령어를 참조하십시오.
mysql_refresh() C API 함수는 다양한 FLUSH 명령어와 유사한 작업을 수행하지만, 이 변경 사항의 영향을 받지 않습니다. 여전히 어떤 작업을 호출하든 RELOAD 권한이 필요합니다. (WL #14303)

C API 관련 사항

일부 애플리케이션에서는 쿼리별 메타데이터를 정의하는 것이 유용할 수 있습니다. 예를 들어, 쿼리를 생성한 페이지의 URL이나 감사 플러그인 또는 쿼리 재작성 플러그인과 같은 플러그인에서 사용할 추가 처리 정보를 쿼리와 함께 전달할 수 있습니다. MySQL은 이제 쿼리 문자열에 특별히 형식화된 주석을 포함하는 등의 우회 방법 없이 이 기능을 지원합니다:

  • 클라이언트 측에서는 mysql_bind_param() C API 함수를 사용하여 쿼리 속성을 정의할 수 있습니다. 이러한 속성은 서버에 실행을 위해 전송된 다음 SQL 문에 적용됩니다. 또한 mysqlmysqltest 클라이언트는 쿼리 속성을 정의할 수 있는 query_attributes 명령을 가지고 있습니다.
  • 서버 측에서는 컴포넌트 서비스가 쿼리 속성에 접근할 수 있도록 합니다. query_attributes라는 컴포넌트는 이 서비스를 사용하여 SQL 문 내에서 속성 값을 얻을 수 있는 mysql_query_attribute_string() 로드 가능 함수를 구현합니다. query_attributes 컴포넌트는 선택 사항이지만, 해당 기능을 사용하려면 설치해야 합니다.

자세한 내용은 쿼리 속성을 참조하십시오.
아이디어를 제안해 주신 Facebook에 감사합니다(코드를 기여해 주셨지만, 사용되지는 않았습니다). (버그 #27855905, 버그 #28686334, WL #12542)

컴파일 관련 사항

aarch64(ARM64)에서 MySQL을 컴파일하기 위한 패치를 기여해 주신 Tzachi Zidenberg에게 감사드립니다. (버그 #31815236, 버그 #100664)

연결 관리 관련 사항

TCP 클라이언트 연결을 일치시키는 계정 선택은 계정 생성 순서에 영향을 받을 수 있었습니다. 매칭 알고리즘을 더욱 결정론적으로 만들기 위해 이제 호스트 이름 부분과 일치하는 계정을 확인할 때 호스트 이름으로 지정된 계정을 일치시키기 전에 호스트 IP 주소로 지정된 계정을 특정 순서로 확인합니다. 호스트 이름 매칭은 변경되지 않았습니다. 자세한 내용은 접근 제어, 1단계: 연결 검증을 참조하십시오. (WL #14074)

사용 중단 및 제거 관련 사항

MySQL 8.0.23부터 CHANGE MASTER TO 명령어는 사용 중단됩니다. 대신 CHANGE REPLICATION SOURCE TO 별칭을 사용해야 합니다. 이 명령어의 매개변수도 MASTER라는 용어를 SOURCE로 대체한 별칭이 있습니다. 예를 들어, MASTER_HOSTMASTER_PORT는 이제 SOURCE_HOSTSOURCE_PORT로 입력할 수 있습니다. START REPLICA | SLAVE 명령어의 매개변수 MASTER_LOG_POSMASTER_LOG_FILE도 이제 SOURCE_LOG_POSSOURCE_LOG_FILE이라는 별칭을 가집니다. 이러한 명령어는 이전과 동일한 방식으로 작동하며, 단지 명령어에 사용된 용어만 변경되었습니다. 이전 버전을 사용할 경우 사용 중단 경고가 표시됩니다.
새로운 상태 변수 Com_change_replication_sourceCom_change_master 상태 변수의 별칭으로 추가되었습니다. 이전 및 새로운 버전의 명령어는 두 상태 변수 모두를 업데이트합니다.
서버는 CHANGE MASTER TO 명령어를 쿼리 로그에서 CHANGE REPLICATION SOURCE TO 명령어로 다시 작성합니다. START SLAVE, STOP SLAVE, SHOW SLAVE STATUS, SHOW SLAVE HOSTS, RESET SLAVE 명령어도 동일하게 처리됩니다. CHANGE MASTER TO 명령어의 이벤트 이름은 명령어 기록 테이블에서 statement/sql/change_replication_source로 설정됩니다. (버그 #32145023, WL #14189)

gen_blacklist() 사용자 정의 함수는 사용 중단되었습니다. 동일한 용어 대체 작업을 수행하는 gen_blocklist()를 대신 사용하십시오. (WL #14176)

시스템 변수 master_info_repositoryrelay_log_info_repository의 사용은 이제 사용 중단되었으며, 이를 설정하거나 값을 읽으려고 할 때 경고 메시지가 표시됩니다. 이 시스템 변수는 MySQL의 향후 버전에서 제거될 예정입니다. 이러한 시스템 변수는 복제본의 연결 메타데이터 저장소 및 적용기 메타데이터 저장소가 mysql 시스템 데이터베이스의 InnoDB 테이블에 기록될지, 아니면 데이터 디렉토리의 파일에 기록될지를 지정하는 데 사용되었습니다. FILE 설정은 이전 릴리스에서 이미 사용 중단되었으며, 테이블은 MySQL 8.0에서 복제 메타데이터 저장소의 기본값입니다. (WL #13958)

호스트 캐시 플러싱은 다음 방법 중 하나를 사용하여 수행할 수 있습니다:

  • 퍼포먼스 스키마 host_cache 테이블을 자르는 TRUNCATE TABLE 명령어를 실행합니다. 이를 위해 테이블에 대한 DROP 권한이 필요합니다.
  • FLUSH HOSTS 명령어를 실행합니다. 이를 위해 RELOAD 권한이 필요합니다.
  • mysqladmin flush-hosts 명령어를 실행합니다. 이를 위해 RELOAD 권한이 필요합니다.

이러한 방법은 동일한 효과를 가지지만, RELOAD 권한을 부여하면 호스트 캐시 플러싱 외에도 여러 작업이 허용되므로 보안 측면에서 바람직하지 않습니다. host_cache 테이블에 대한 DROP 권한을 부여하는 것이 더 제한된 범위를 가지므로 더 바람직합니다. 따라서 FLUSH HOSTS 명령어는 사용 중단되며, 향후 MySQL 버전에서 제거될 예정입니다. 대신 host_cache 테이블을 자르십시오.
mysqladmin flush-hosts는 이전에는 FLUSH HOSTS 명령어를 실행했습니다. 이제는 host_cache 테이블을 자르려고 시도하며, 자르기 작업이 실패할 경우에만 FLUSH HOSTS로 대체됩니다. (WL #14329)

방화벽 관련 사항

관리자는 허용된 명령문 세트(허용 목록)를 지정하는 프로필을 등록하여 MySQL Enterprise 방화벽을 관리합니다. 이전에는 프로필을 개별 계정과만 연결할 수 있었으므로, 여러 계정 프로필에 동일한 허용 목록을 적용하려면 각 프로필에 대해 규칙 세트를 복제해야 했습니다. 더 쉬운 관리와 유연성을 제공하기 위해 방화벽은 이제 그룹 프로필 기능을 제공합니다:

  • 이름이 지정된 그룹 프로필을 생성할 수 있습니다. 그룹 프로필에는 여러 계정을 구성원으로 포함할 수 있으며, 하나의 계정이 여러 그룹 프로필의 구성원이 될 수 있습니다.
  • 각 그룹 프로필은 고유한 허용 목록을 가지고 있습니다. 프로필 허용 목록은 모든 구성원 계정에 적용되며, 여러 계정 프로필에 중복할 필요가 없습니다.

자세한 내용은 MySQL Enterprise 방화벽을 참조하십시오. (WL #11740)

옵티마이저 관련 사항

해시 조인을 위해 사용된 해시 테이블을 unordered multimap에서 multimap 어댑터를 사용한 unordered flat map으로 전환했습니다. 이 변경으로 다음과 같은 개선이 이루어졌습니다:

  • 더 빠른 해시 테이블 성능
  • 해시 테이블 오버헤드 감소, 정렬 및 키/값 길이에 필요한 공간 감소, 동일한 키가 많은 경우의 메모리 사용 최적화로 인해 메모리 사용량 감소. 이로 인해 디스크로 데이터를 넘기는 빈도도 줄어듭니다.
  • 허용된 조인 버퍼 크기에 더 가깝게 접근하여 메모리 제어를 개선하고, 기존에는 join_buffer_size의 약 2/3에 제한되던 것을 개선하며, 해시 테이블이 커질 때 이전 메모리를 해제할 수 있는 기능을 추가함.

(버그 #99933, 버그 #31516149, WL #13459)

Performance Schema 관련 사항

이전에는 동적 호출로 확장되었던 퍼포먼스 스키마 매크로가 이제 가능한 경우 정적 호출로 확장되어 처리 오버헤드를 줄였습니다. (버그 #32028160)

타이머 코드의 성능 오버헤드가 감소했습니다. 이는 퍼포먼스 스키마를 사용하는 높은 동시성의 워크로드에 가장 큰 도움이 될 것입니다. 기여해 주신 Georgy Kirichenko에게 감사드립니다. (버그 #31960377, 버그 #101018)

플러거블 인증

MySQL Enterprise Edition SASL LDAP 인증 플러그인은 이제 MySQL 클라이언트 및 서버에 대한 인증 방법으로 SCRAM-SHA-256을 지원합니다. SCRAM-SHA-256SCRAM-SHA-1과 유사하지만 더 안전합니다. SCRAM-SHA-256의 사용은 Cyrus SASL 2.1.27 이상을 사용하여 빌드된 OpenLDAP 서버를 요구합니다. 자세한 내용은 LDAP 인증 방법을 참조하십시오. (WL #14180)

보안 관련 사항

OpenSSL 라이브러리가 번들로 제공되는 플랫폼의 경우, MySQL 서버에 연결된 OpenSSL 라이브러리가 1.1.1i 버전으로 업데이트되었습니다. 새로운 OpenSSL 버전에서 수정된 문제는 https://www.openssl.org/news/cl111.txthttps://www.openssl.org/news/vulnerabilities.html에서 확인할 수 있습니다. (버그 #32260610)

공간 데이터 지원

새로운 ST_HausdorffDistance()ST_FrechetDistance() 함수는 두 지오메트리 간의 이산 프레셰 거리 및 하우스도르프 거리를 반환하여 지오메트리의 유사성을 반영합니다. 자세한 내용은 객체 모양을 사용하는 공간 관계 함수를 참조하십시오. (WL #14128, WL #14129)

SQL 구문 관련 사항

MySQL은 이제 쿼리에서 일반적으로 숨겨지지만 명시적으로 참조할 경우 접근할 수 있는 숨겨진 컬럼을 지원합니다. 자세한 내용은 숨겨진 컬럼을 참조하십시오. (WL #10905)

X Plugin 관련 사항

MYSQL41 인증 방법을 사용하는 X 프로토콜 연결에서, 서버가 보낸 nonce가 20바이트보다 짧으면 연결 로직이 이를 제대로 처리하지 못했습니다. (버그 #32036194)

결과 집합을 작성 중인 쿼리가 종료되면 X 플러그인은 서버 세션이 종료된 것으로 해석하고 연결을 끊었습니다. 이제 쿼리 상태는 서버 세션 상태와 별도로 확인됩니다. (버그 #31954296)

X 프로토콜 세션이 X 플러그인 상태 변수나 설정을 표시하려고 할 때 다른 X 프로토콜 세션이 해제 및 재설정되는 경우 교착 상태가 발생할 수 있었습니다. 이제 이 상황이 적절하게 처리됩니다. (버그 #31931873)

서버에 연결된 X 프로토콜 클라이언트가 대기 시간(읽기, 쓰기 또는 대기 시간 제한) 설정 이상으로 유휴 상태일 경우, X 플러그인은 연결을 종료합니다. 읽기 시간 초과의 경우, 플러그인은 클라이언트 애플리케이션에 ER_IO_READ_ERROR 오류 코드와 함께 경고 알림을 반환합니다.
MySQL 8.0.23부터는 서버 종료로 인해 연결이 강제로 종료되거나 다른 클라이언트 세션에서 연결이 종료된 경우에도 X 플러그인은 경고 알림을 보냅니다. 서버 종료의 경우, 인증된 모든 X 프로토콜 클라이언트에 ER_SERVER_SHUTDOWN 오류 코드와 함께 경고 알림이 전송됩니다. 연결이 강제로 종료된 경우, 해당 클라이언트에 ER_SESSION_WAS_KILLED 오류 코드와 함께 경고 알림이 전송되며, SQL 실행 중에 연결이 종료된 경우에는 ER_QUERY_INTERRUPTED 오류 코드와 함께 치명적인 오류가 반환됩니다.
클라이언트 애플리케이션은 이러한 경고 알림을 사용하여 사용자에게 알리거나, 연결 해제 이유를 분석하여 동일한 서버에 다시 연결할지, 또는 다른 서버에 연결할지 결정할 수 있습니다. (WL #14166)

고전적인 MySQL 프로토콜의 경우, SQL 쿼리가 메타데이터 잠금 또는 sleep 함수를 사용하는 경우, 서버와의 연결이 여전히 활성 상태인지 주기적으로 확인합니다. 활성 상태가 아닐 경우, 쿼리가 리소스를 계속 소비하지 않도록 중지할 수 있습니다. 이전에는 X 프로토콜이 이러한 확인을 수행하지 않고 연결이 여전히 활성 상태라고 가정했습니다. 이제 X 프로토콜에서도 이 확인이 추가되었습니다. (WL #14167)

추가 및 변경된 기능

InnoDB: 다음 작업의 성능이 향상되었습니다:

  • 큰 버퍼 풀(>32GB)을 사용하는 MySQL 인스턴스에서 대규모 테이블스페이스를 삭제할 때.적응형 해시 인덱스에서 참조된 페이지가 많은 테이블스페이스를 삭제할 때.임시 테이블스페이스를 잘라낼 때.

삭제되거나 잘라낸 테이블스페이스의 페이지 및 관련된 AHI 항목은 이제 일반 작업 중에 페이지가 발생할 때 패시브 방식으로 버퍼 풀에서 제거됩니다. 이전에는 테이블스페이스를 삭제하거나 잘라낼 때 버퍼 풀에서 페이지를 즉시 제거하기 위해 전체 목록을 스캔했으며, 이는 성능에 부정적인 영향을 미쳤습니다. (버그 #31008942, 버그 #98869, WL #14100)

InnoDB:AUTOEXTEND_SIZE 옵션은 테이블스페이스가 가득 찼을 때 InnoDB가 테이블스페이스 크기를 확장하는 양을 정의하여 더 큰 증가분으로 테이블스페이스 크기를 확장할 수 있도록 합니다. 공간을 더 큰 증가분으로 할당하면 단편화를 방지하고 대량의 데이터를 더 원활하게 수집할 수 있습니다. AUTOEXTEND_SIZE 옵션은 CREATE TABLE, ALTER TABLE, CREATE TABLESPACE, ALTER TABLESPACE 명령어에서 지원됩니다. 자세한 내용은 테이블스페이스 AUTOEXTEND_SIZE 구성을 참조하십시오.
AUTOEXTEND_SIZE 크기 열이 INFORMATION_SCHEMA.INNODB_TABLESPACES 테이블에 추가되었습니다. (WL #13895)

InnoDB: 이제 InnoDB는 암호화된 테이블스페이스에 속하는 더블라이트 파일 페이지의 암호화를 지원합니다. 페이지는 관련 테이블스페이스의 암호화 키를 사용하여 암호화됩니다. 자세한 내용은 InnoDB 데이터 암호화를 참조하십시오. (WL #13775)

InnoDB: InnoDB 원자 코드는 C++ std::atomic을 사용하도록 수정되었습니다. (WL #14235)

그룹 복제: MySQL 서버 비동기 연결 페일오버 메커니즘은 이제 그룹 복제 토폴로지를 지원하며, 그룹 멤버십 변경 사항을 자동으로 모니터링하고 기본(primary) 서버와 보조(secondary) 서버를 구분합니다. 그룹 멤버를 소스 목록에 추가하고 이를 관리 그룹의 일부로 정의하면, 비동기 연결 페일오버 메커니즘이 소스 목록을 그룹 멤버십 변경 사항에 맞추어 업데이트하여 그룹 멤버가 자동으로 추가되거나 제거됩니다. 새 asynchronous_connection_failover_add_managed()asynchronous_connection_failover_delete_managed() 함수는 관리되는 소스를 추가하고 제거하는 데 사용됩니다.
다음 상황에서 연결이 다른 그룹 멤버로 페일오버됩니다:

  • 현재 연결된 소스가 오프라인 상태이거나 그룹을 떠난 경우.
  • 현재 연결된 소스가 다수에 속하지 않는 경우.
  • 현재 연결된 소스가 그룹에서 가장 높은 가중 우선순위를 가지지 않는 경우.

관리되는 그룹에서는 소스의 가중치는 기본(primary) 또는 보조(secondary) 서버인지에 따라 할당됩니다. 따라서 관리 그룹을 기본 서버에 더 높은 가중치를 부여하고 보조 서버에 더 낮은 가중치를 부여하도록 설정한 경우, 기본 서버가 변경되면 새로운 기본 서버에 더 높은 가중치가 할당되므로 복제본은 해당 서버로 연결을 변경합니다. 이 규칙은 단일(비관리) 서버에도 적용되며, 단일 서버의 경우에도 더 높은 가중 우선순위를 가진 다른 소스 서버가 있을 경우 연결이 페일오버됩니다. (WL #14019)

mysqldump--all-databases 옵션으로 호출되면 이제 mysql 데이터베이스를 먼저 덤프합니다. 이렇게 하면 덤프 파일을 다시 로드할 때 다른 객체의 DEFINER 절에 명명된 계정이 이미 생성됩니다. (버그 #32141046)

비활성화된 퍼포먼스 스키마 및 LOCK_ORDER 도구 계측의 일부 오버헤드가 식별되어 제거되었습니다. (버그 #32105698)

기본값 표현이 있는 BLOBTEXT 열의 경우, INFORMATION_SCHEMA.COLUMNS 테이블 및 SHOW COLUMNS 명령어에 표현이 표시됩니다. (버그 #31856459)

멀티스레드 복제본(즉, slave_parallel_workers이 0보다 큰 경우)에서 slave_preserve_commit_order=1 설정은 복제본의 릴레이 로그에 나타나는 순서대로 트랜잭션이 복제본에서 실행 및 커밋되도록 보장합니다. 각 실행 중인 작업자 스레드는 이전의 모든 트랜잭션이 커밋될 때까지 대기한 후 커밋을 수행합니다. 작업자 스레드가 교착 상태가 감지되었거나 트랜잭션 실행 시간이 관련 대기 시간 제한을 초과하여 트랜잭션을 실행하지 못하면, 오류가 발생하기 전에 slave_transaction_retries에서 지정된 횟수만큼 자동으로 재시도됩니다. 일시적이지 않은 오류가 있는 트랜잭션은 재시도되지 않습니다.
멀티스레드 복제본의 복제 적용기는 스토리지 엔진에서 식별한 데이터 접근 교착 상태를 항상 처리해 왔습니다. 그러나 접근 제어 목록(ACL) 또는 메타데이터 잠금(예: FLUSH TABLES WITH READ LOCK 명령어)과 관련된 기타 유형의 잠금은 복제 적용기가 감지하지 못했습니다. 이는 커밋 순서 잠금과 함께 세 가지 액터가 관련된 교착 상태를 유발할 수 있으며, 복제 적용기가 이를 해결할 수 없어서 복제가 무기한으로 중단될 수 있습니다. MySQL 8.0.23부터는 커밋 순서를 유지하는 멀티스레드 복제본에서 이러한 유형의 교착 상태를 완화하기 위해 교착 상태 처리가 개선되었습니다. 교착 상태는 복제 적용기에 의해 구체적으로 해결되지는 않지만, 적용기가 이를 인지하고 트랜잭션에 대해 자동 재시도를 시작하여 중단되지 않도록 합니다. 재시도가 모두 소진되면 복제는 제어된 방식으로 중지되어 교착 상태를 수동으로 해결할 수 있습니다. (버그 #107574, 버그 #34291887, WL #13574)

ARM 플랫폼에서 binlog 체크섬의 CRC 계산이 더 빨라졌습니다. 기여해 주신 Krunal Bauskar에게 감사드립니다. (버그 #99118, 버그 #31101633, 버그 #32163391)

복제 채널은 이제 CHANGE REPLICATION SOURCE TO 명령어의 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 옵션을 사용하여 GTID가 없는 복제된 트랜잭션에 GTID를 할당하도록 설정할 수 있습니다. 이 기능을 사용하면 GTID 기반 복제를 사용하지 않는 소스에서 GTID 기반 복제를 사용하는 복제본으로 복제할 수 있습니다. 다중 소스 복제본의 경우, ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS를 사용하는 채널과 사용하지 않는 채널을 혼합할 수 있습니다. GTID에는 복제본의 자체 서버 UUID 또는 서로 다른 소스의 트랜잭션을 식별하기 위해 할당된 서버 UUID가 포함될 수 있습니다.
참고로, 어떤 채널에서든 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS가 설정된 복제본은 페일오버가 필요한 경우 복제 소스 서버를 대체할 수 없으며, 해당 복제본에서 가져온 백업은 복제 소스 서버를 복원하는 데 사용할 수 없습니다. 이와 동일한 제한 사항은 다른 복제본을 대체하거나 복원할 때도 적용됩니다. ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS가 설정된 복제본의 GTID 세트(gtid_executed)는 비표준이며, 다른 서버로 전송되거나 다른 서버의 gtid_executed 세트와 비교되어서는 안 됩니다. (WL #12819)

새로운 temptable_max_mmap 변수는 TempTable 스토리지 엔진이 메모리 매핑된 임시 파일에서 할당할 수 있는 최대 메모리 양을 정의하며, 이 값을 초과하면 데이터를 디스크의 InnoDB 내부 임시 테이블로 저장하기 시작합니다. 0으로 설정하면 메모리 매핑된 임시 파일에서 메모리 할당이 비활성화됩니다. 자세한 내용은 MySQL의 내부 임시 테이블 사용을 참조하십시오. (WL #14125)

버그 수정

InnoDB: COMPRESSION 옵션을 지정한 CREATE TABLE 작업이 홀 펀칭을 지원하지 않는 시스템에서 경고와 함께 허용되었습니다. 이제 해당 작업은 오류로 실패합니다. (버그 #32174200)

InnoDB: 데이터 로드 작업이 진행 중일 때 업그레이드를 시작한 후 MySQL DB 시스템을 재시작하면 어서션 실패가 발생했습니다. (버그 #32173596)

InnoDB: 동일한 undo 테이블스페이스에서 체크포인트 간에 발생하는 truncate 작업 수에 대한 오류 메시지가 잘못된 64라는 한도를 나타냈습니다. MySQL 8.0.22에서는 이 한도가 64에서 50,000으로 상향되었습니다. (버그 #32151601, 버그 #101601)

InnoDB: rw_lock_tbuf_block_t 소스 코드 구조의 크기가 줄어들었습니다. (버그 #32084500)

InnoDB: InnoDB 트랜잭션이 InnoDB 테이블에서 동작하는 쿼리 표현식을 사용하여 InnoDB가 아닌 스토리지 엔진을 사용하여 테이블을 생성한 후 일관성이 없어졌습니다. (버그 #32079103)

InnoDB: 기존 갭 락이 삭제된 레코드에서 상속된 잠금을 포함하는 상황에서 INFORMATION_SCHEMA.INNODB_TRX 테이블에 나타나는 잠금 수가 실제 레코드 잠금 수와 다를 수 있었습니다.
Alibaba의 Fungo Wang에게 패치 제공에 대해 감사드립니다. (버그 #32068538, 버그 #101305)

InnoDB: Fil_system 샤딩 코드에서 발생한 오프바이원 오류가 수정되었으며, 샤드의 최대 개수(MAX_SHARDS)가 69로 변경되었습니다. (버그 #32052821, 버그 #101260)

InnoDB: TempTable 스토리지 엔진 메모리 할당자가 불필요하게 추가 메모리 블록을 할당했습니다. (버그 #32018553)

InnoDB: 커밋되지 않은 데이터를 포함하는 테이블에 대한 SELECT COUNT(*) 작업이 불필요한 I/O로 인해 성능이 저하되었습니다.
기여해 주신 Brian Yue에게 감사드립니다. (버그 #31997733, 버그 #100966)

InnoDB: 로그 라이터를 종료하는 동안 레이스 컨디션으로 인해 어서션 실패가 발생했습니다. (버그 #31997362)

InnoDB: 페이지 정리 스레드가 동기 플러시 모드에서 최적으로 활용되지 않아 일부 경우 페이지 플러시 작업이 느려지거나 정체될 수 있었습니다. 동기 플러시 모드는 InnoDB가 리두 로그에서 여유 공간이 부족할 때 발생하며, 페이지 클리너 코디네이터가 공격적인 페이지 플러싱을 시작하게 합니다. (버그 #31994031)

InnoDB: undo 로그 트렁케이션이 활성화된 상태에서 업데이트 빈도가 높아지면 purge 작업이 지연되었습니다. 이 지연은 undo 테이블스페이스가 트렁케이션을 위해 선택될 때 innodb_purge_rseg_truncate_frequency 설정이 일시적으로 128에서 1로 변경된 결과였습니다. 이 설정을 수정하는 코드는 제거되었습니다. (버그 #31991688)

InnoDB: 자동화된 언두 테이블스페이스의 트렁케이션이 성능 저하를 초래했습니다. 이 문제를 해결하기 위해, 언두 테이블스페이스 파일은 이제 16MB로 초기화되며 최소 16MB씩 확장됩니다. 급격한 증가에 대처하기 위해, 이전 파일 확장이 0.1초 이내에 발생한 경우 확장 크기가 두 배로 증가할 수 있습니다. 이러한 확장 크기 증가는 여러 번 발생할 수 있으며 최대 256MB까지 가능합니다. 이전 파일 확장이 0.1초보다 더 오래 전에 발생한 경우, 확장 크기는 절반으로 줄어들 수 있으며, 최소 16MB까지 감소할 수 있습니다. 이전에는 언두 테이블스페이스의 초기 크기가 InnoDB 페이지 크기에 따라 달라졌고, 언두 테이블스페이스는 한 번에 4개의 익스텐트로 확장되었습니다.
AUTOEXTEND_SIZE 옵션이 언두 테이블스페이스에 정의된 경우, 언두 테이블스페이스는 위에서 설명한 논리에 따라 결정된 확장 크기와 AUTOEXTEND_SIZE 설정 중 더 큰 값으로 확장됩니다.
언두 테이블스페이스가 트렁케이트될 때, 일반적으로 16MB 크기로 재생성되지만, 현재 파일 확장 크기가 16MB보다 크고, 이전 파일 확장이 지난 1초 이내에 발생한 경우, 새로운 언두 테이블스페이스는 innodb_max_undo_log_size 변수에 정의된 크기의 4분의 1 크기로 생성됩니다.
오래된 언두 테이블스페이스 페이지는 더 이상 다음 체크포인트에서 제거되지 않으며, 대신 InnoDB 마스터 스레드에 의해 백그라운드에서 제거됩니다. (버그 #31965404, 버그 #32020900, 버그 #101194)

InnoDB: posix_fallocate()를 사용하여 임시 테이블스페이스의 공간을 미리 할당하는 동안 실패가 발생하면 오류가 발생하고 초기화 실패가 일어났습니다. 이제 경고가 대신 발행되며, InnoDBposix_fallocate()가 아닌 방식으로 공간을 미리 할당합니다. (버그 #31965379)

InnoDB: 잘못된 포인터로 인해 DISABLE_PSI_MEMORY 소스 구성 옵션이 활성화된 MySQL 서버에서 종료 실패가 발생했습니다. (버그 #31963333)

InnoDB: 특정 인덱스에 대한 새로운 통계를 계산하는 내부 함수에 의해 장시간 SX 잠금이 발생하여 실패를 초래했습니다. (버그 #31889883)

InnoDB: INFORMATION_SCHEMA.INNODB_TABLESPACES 테이블이 일부 테이블 및 스키마에 대해 FILE_SIZE를 0으로 보고했습니다. 관련 테이블스페이스가 메모리 캐시에 없을 때 테이블스페이스 이름을 사용하여 파일 이름을 결정했는데, 이 방식이 항상 신뢰할 수 있는 방법은 아니었습니다. 이제 테이블스페이스 ID를 사용하며, 테이블스페이스 이름은 백업 방법으로 남아있습니다. (버그 #31841617)

InnoDB: FULLTEXT 인덱스를 삭제한 후 테이블을 새 스키마로 이동시키기 위해 이름을 변경하면, FULLTEXT 보조 테이블이 적절하게 이름이 변경되지 않고 이전 스키마 디렉토리에 남아 있었습니다. (버그 #31773368, 버그 #100570)

InnoDB: MySQL 8.0으로 업그레이드한 후, 이전에 풀텍스트 검색 인덱스가 정의된 테이블에서 DML 작업을 수행하려고 할 때 실패가 발생했습니다. (버그 #31749490)

InnoDB: 페이지 압축된 테이블이 있는 테이블스페이스를 가져올 때, 원본 테이블과 대상 테이블에 서로 다른 COMPRESSION 설정이 정의된 경우 스키마 불일치 오류가 보고되지 않았습니다. 이제 내보낸 테이블의 COMPRESSION 설정이 FLUSH TABLES ... FOR EXPORT 작업 중 .cfg 메타데이터 파일에 저장되며, 가져올 때 두 테이블이 동일한 COMPRESSION 설정으로 정의되었는지 확인합니다. (버그 #31744694)

InnoDB: MySQL Keyring 플러그인의 기능을 확인하기 위해 사용된 더미 키들이 비활성 상태로 남아있었으며, 비활성 더미 키의 수가 시간이 지남에 따라 증가했습니다. 이제 실제 마스터 키가 사용되며, 마스터 키가 없는 경우 더미 마스터 키가 생성됩니다. (버그 #31737924)

InnoDB: InnoDB 시스템 테이블스페이스를 데이터 디렉토리 외부로 이동한 후 INFORMATION_SCHEMA.FILES 테이블을 쿼리하면 innodb_system 파일 이름을 알 수 없다는 경고가 발생했습니다. (버그 #31603047)

InnoDB: 바이너리 로깅 또는 log_slave_updates가 비활성화된 복제 환경에서, mysql.gtid_executed 테이블의 과도한 갭으로 인해 서버가 시작되지 않는 문제가 발생했습니다. 이러한 갭은 InnoDB 및 비-InnoDB 트랜잭션을 포함한 작업 부하에서 발생했습니다. InnoDB 트랜잭션의 GTID는 주기적으로 실행되는 GTID 퍼시스터 스레드에 의해 mysql.gtid_executed 테이블에 기록되며, 비-InnoDB 트랜잭션의 GTID는 복제 서버 스레드에 의해 직접 mysql.gtid_executed 테이블에 기록됩니다. GTID 퍼시스터 스레드는 엔트리 병합과 테이블 압축을 처리하는 동안 뒤처졌고, 그 결과 InnoDB 트랜잭션의 GTID 플러시 목록 크기가 증가하고 갭의 수가 많아져 서버 실패 및 이후의 시작 실패로 이어졌습니다. 이를 해결하기 위해 GTID 퍼시스터 스레드가 이제 InnoDB 및 비-InnoDB 트랜잭션 모두에 대한 GTID를 기록하며, GTID 퍼시스터 스레드가 뒤처질 경우 포어그라운드 커밋이 대기하도록 변경되었습니다. 또한, gtid_executed_compression_period의 기본 설정이 1000에서 0으로 변경되어 mysql.gtid_executed 테이블의 명시적 압축이 기본적으로 비활성화되었습니다.
기여해주신 Venkatesh Prasad에게 감사드립니다. (버그 #31599938, 버그 #100118)

InnoDB: XA 트랜잭션에 대한 GTID 값을 지속적으로 기록하는 과정에서 XA 트랜잭션 성능에 영향을 미치는 문제가 있었습니다. XA 트랜잭션에서는 준비 단계와 커밋 단계에서 두 개의 GTID 값이 생성되며, 첫 번째 GTID 값은 언두 로그에 기록된 후 두 번째 GTID 값으로 덮어씌워집니다. 두 번째 GTID 값을 기록하는 작업은 첫 번째 GTID 값을 gtid_executed 테이블에 플러시한 후에만 수행될 수 있었습니다. 이제 언두 로그에서 두 개의 XA 트랜잭션 GTID 값을 위한 공간이 예약됩니다. (버그 #31467953, 버그 #99638)

InnoDB: InnoDB 소스 파일이 Doxygen 소스 코드 문서를 빌드할 때 생성되는 경고를 해결하기 위해 업데이트되었습니다. (버그 #31354760)

InnoDB: 풀텍스트 검색 동기화 스레드가 이전에 해제된 인덱스 캐시의 단어를 읽으려고 시도했습니다. (버그 #31310404)

InnoDB: MySQL 8.0.17에 도입된 병렬 읽기 기능에서 buf_wait_for_read() 함수 내의 20µs 지연이 Windows에서 1ms로 동작하여 특정 테스트에서 예상치 못한 타임아웃이 발생했습니다. 또한 AIO 스레드에 운영 체제 I/O 요청의 불균형한 대기가 있었습니다. (버그 #31095274)
참고: 이 문제는 버그 #31123564의 회귀입니다.

InnoDB: 특정 복제된 XA 트랜잭션의 정리가 트랜잭션 객체(trx_t)를 다시 연결하지 못하여 어서션 실패가 발생했습니다. (버그 #31006095)

InnoDB: 서버 장애 후 ALTER TABLESPACE ENCRYPTION 작업이 재개되는 동안 테이블스페이스 암호화 유형 설정이 올바르게 업데이트되지 않았습니다. (버그 #30883833, 버그 #98537)

InnoDB: 중단된 테이블스페이스 암호화 작업이 서버가 다시 시작된 후 처리 재개 시 데이터 사전에서 encrypt_type 테이블 옵션 정보를 업데이트하지 않았습니다. (버그 #30883833, 버그 #98537, 버그 #30888919, 버그 #98564)

InnoDB: 스레드 슬립 지연 및 InnoDB에 진입하거나 나가는 스레드와 관련된 내부 카운터 변수가 C++ std::atomic을 사용하도록 수정되었습니다. 기여해주신 ARM의 Yibo Cai에게 감사드립니다. (버그 #30567060, 버그 #97704)

InnoDB: 사전순 메모리 변수 fetch-add(dict_temp_file_num.fetch_add) 및 저장소(dict_temp_file_num.store) 작업에 대해 느슨한 메모리 순서가 구현되었습니다.
기여해주신 Yibo Cai에게 감사드립니다. (버그 #30567054, 버그 #97703)

InnoDB: 서버 시작 후 테이블스페이스 암호화 작업을 재개한 백그라운드 스레드가 테이블스페이스에 대한 메타데이터 잠금을 확보하지 못해 동시 DDL 작업을 허용했으며, 이는 시작 스레드와의 경쟁 상태로 이어졌습니다. 이제 시작 스레드는 테이블스페이스 메타데이터 잠금이 확보될 때까지 대기합니다. (버그 #28531637)

InnoDB: numa_all_nodes_ptr 호출이 numa_get_mems_allowed() 함수로 대체되었습니다. 기여해주신 Daniel Black에게 감사드립니다. (버그 #24693086, 버그 #83044)

파티셔닝: ALTER TABLE t1 EXCHANGE PARTITION ... WITH TABLE t2 문이 t1이 파티션 테이블이 아닐 때 어서션을 유발했습니다. (버그 #100971, 버그 #31941543)
참고: 이 문제는 버그 #29706669의 회귀입니다.

복제: asynchronous_connection_failover_add_source()asynchronous_connection_failover_delete_source() 함수의 network_namespace 매개변수는 더 이상 사용되지 않습니다. 이 함수들은 비동기 연결 장애 조치 메커니즘의 복제 채널을 위한 소스 목록에서 복제 소스 서버를 추가 및 제거합니다. 복제 채널의 네트워크 네임스페이스는 CHANGE REPLICATION SOURCE 문을 사용하여 관리되며, 그룹 복제 소스 서버에 대한 특수 요구 사항이 있으므로 더 이상 함수에서 지정되지 않아야 합니다. (버그 #32078189)

복제: mysqlbinlog--print-table-metadata 옵션을 사용할 때, mysqlbinlog가 숫자 필드를 평가하는 방법이 서버가 바이너리 로그에 쓸 때 사용하는 방법과 달라, 이러한 필드에 대한 잘못된 메타데이터 출력이 발생했습니다. 이제 mysqlbinlog는 서버와 동일한 방법을 사용합니다. (버그 #31956206)

복제: 복제 채널에서 네트워크 네임스페이스를 사용하는 경우 복제본에서 마스터로의 초기 연결이 중단되면 이후의 연결 시도가 올바른 네임스페이스 정보를 사용하지 못했습니다. (버그 #31954087)

복제: 그룹 멤버가 추방되고 인스턴스의 일부 테이블이 잠겨있는 동안(예: 백업 실행 중) 자동 재가입을 시도하면 시도가 실패하고 더 이상의 시도가 이루어지지 않았습니다. 이제 이 시나리오가 올바르게 처리됩니다. (버그 #31460690)

복제: 세미동기 소스 서버에서 복제하는 복제본의 수가 증가하면 잠금 경쟁으로 인해 성능 저하가 발생할 수 있었습니다. 플러그인이 사용하는 잠금 메커니즘이 가능한 경우 공유 잠금을 사용하도록 변경되었으며, 불필요한 잠금 획득을 피하고 콜백을 제한하도록 변경되었습니다. 새로운 동작은 다음 시스템 변수를 활성화하여 구현할 수 있습니다:

  • replication_sender_observe_commit_only=1: 콜백을 제한합니다.
  • replication_optimize_for_static_plugin_config=1: 공유 잠금을 추가하고 불필요한 잠금 획득을 피합니다. 이 시스템 변수는 플러그인을 제거하려는 경우 비활성화해야 합니다.

두 시스템 변수는 세미동기 복제 플러그인을 설치하기 전 또는 후에 활성화할 수 있으며, 복제가 실행 중일 때도 활성화할 수 있습니다. 세미동기 복제 소스 서버도 이러한 시스템 변수를 활성화하여 성능 이점을 얻을 수 있습니다. 복제본과 동일한 잠금 메커니즘을 사용하기 때문입니다. (버그 #30519928)

복제: 커밋 순서가 유지되는 멀티스레드 복제본에서, 워커 스레드는 중계 로그에서 발생한 모든 이전 트랜잭션이 커밋될 때까지 자신의 트랜잭션을 커밋할 수 없습니다. 만약 나중에 커밋할 트랜잭션을 기다리고 있는 스레드가 먼저 커밋해야 하는 트랜잭션에서 필요한 행을 잠갔을 경우 교착 상태가 발생할 수 있습니다. 이때 교착 상태 감지 알고리즘이 대기 중인 스레드에 트랜잭션을 롤백하라는 신호를 보냅니다. 이전에는 트랜잭션 재시도가 불가능한 경우, 롤백된 트랜잭션의 워커 스레드가 즉시 종료되어 다른 워커 스레드에게 신호를 보내지 않아 복제가 멈출 수 있었습니다. 이제 이러한 상황에 있는 워커 스레드는 롤백 함수를 호출할 차례가 올 때까지 대기하므로 다른 스레드에게 올바르게 신호를 보냅니다. (버그 #26883680, 버그 #87796)

복제: GTID는 서명된 64비트 정수의 비음수 값의 수만큼만 서버 인스턴스에서 사용할 수 있습니다(2의 63승에서 1을 뺀 값). 만약 gtid_purged 값을 이 한계에 가까운 값으로 설정하면, 이후 커밋에서 GTID가 부족해져 binlog_error_action에서 지정된 작업이 발생할 수 있습니다. MySQL 8.0.23부터는 서버 인스턴스가 이 한계에 가까워지면 경고 메시지가 발행됩니다. (버그 #26035544)

그룹 복제: 시스템 변수 transaction_write_set_extraction=XXHASH64가 설정되면(이는 MySQL 8.0의 기본값이자 그룹 복제의 필수 사항임), 트랜잭션에 대한 쓰기 수집에 상한선이 없었습니다. 이제 표준 소스-복제본 복제를 위해서는 binlog_transaction_dependency_history_size로 지정된 숫자 제한이 적용되며, 해당 한계에 도달하면 쓰기 집합 정보는 폐기되지만 트랜잭션은 계속 실행됩니다. 이때 의존성 계산을 위한 쓰기 집합 정보가 없으므로 트랜잭션은 비동시적으로 표시되어 복제본에서 순차적으로 처리됩니다. 그룹 복제의 경우 충돌 탐지와 모든 그룹 멤버에 대한 인증을 위해 트랜잭션에서 쓰기를 추출하는 과정이 필요하므로, 트랜잭션이 완료되려면 쓰기 집합 정보를 폐기할 수 없습니다. 따라서 숫자 제한 대신 group_replication_transaction_size_limit에 설정된 바이트 한도가 적용되며, 한도를 초과하면 트랜잭션이 실행되지 않습니다. (버그 #32019842)

그룹 복제: 그룹 복제 적용 채널(group_replication_applier)이 테이블에 잠금을 유지하고 있는 경우(예: 백업 중), 그룹에서 멤버가 추방되고 자동 재가입을 시도했을 때, 시도가 실패하고 재시도하지 않았습니다. 이제 그룹 복제는 시작 시 및 재가입 시도 중에 group_replication_applier 채널이 이미 실행 중인지 확인합니다. 시작 시에 해당 채널이 실행 중이면 오류 메시지가 반환되며, 자동 재가입 시도 중에 해당 채널이 실행 중인 경우 해당 시도는 실패하지만 group_replication_autorejoin_tries 시스템 변수에 지정된 대로 추가 시도가 이루어집니다. (버그 #31648211)

Microsoft Windows: Windows에서 MySQL 서버를 서비스로 실행할 경우 공유 메모리 연결이 실패했습니다. (버그 #32009251)

JSON: JSON_ARRAYAGG() 함수가 항상 적절한 오류 처리를 수행하지 않았습니다. (버그 #31856260, 버그 #32012559, 버그 #32181438)

JSON: JSON_SET(), JSON_REPLACE(), 또는 JSON_REMOVE()를 사용하여 JSON 값을 업데이트할 때, 대상 컬럼은 경우에 따라 제자리에서 업데이트될 수 있습니다. 이 현상은 업데이트 작업의 대상 테이블이 기본 테이블일 때만 발생했지만, 대상 테이블이 업데이트 가능한 뷰일 경우 전체 JSON 값이 항상 기록되었습니다.
이제 이러한 경우, 대상 테이블이 업데이트 가능한 뷰인 경우에도 제자리에서 업데이트(즉, 부분 업데이트)가 수행됩니다. (버그 #25840784)

JSON: MySQL 8.0.22에서 준비된 문장을 한 번만 준비하도록 한 작업으로 인해 JSON 함수에서 동적 매개변수를 처리하는 데 문제가 발생했습니다. 모든 JSON 인수가 데이터 유형 MYSQL_TYPE_JSON으로 분류되었으며, JSON 함수가 두 가지 종류의 JSON 매개변수를 처리한다는 사실—JSON 값과 JSON 문서—를 간과했습니다. 이 구분은 데이터 유형만으로는 불가능했습니다. 버그 #31667405에서 이 문제는 비교 연산자 및 IN() 연산자에 대해 JSON 인수를 스칼라 값으로 태그할 수 있게 하여 해결되었고, 다른 JSON 함수의 인수는 JSON 문서로 처리되었습니다.
이번 수정은 여러 JSON 함수에서 특정 인수를 JSON 값으로 처리하는 기능을 복원합니다. 그 목록은 다음과 같습니다:
MEMBER OF()의 첫 번째 인수
JSON_INSERT(), JSON_REPLACE(), JSON_SET(), JSON_ARRAY_APPEND(), 및 JSON_ARRAY_INSERT()의 세 번째, 다섯 번째, 일곱 번째, 이후 홀수 인수. (버그 #101284, 버그 #32063203)
참조: 버그 #31667405도 참조하세요.

JSON: mysqld--debug 옵션과 함께 실행했을 때, 다중 값 인덱스를 사용하는 쿼리를 실행하려고 하면 오류가 발생했습니다. (버그 #99833, 버그 #31474182)

thread_pool 플러그인 사용으로 인해 Address Sanitizer 경고가 발생할 수 있었습니다. (버그 #32213294)

조건을 물리적 유도 테이블로 푸시다운하고, 조건이 부분적으로 푸시다운되는 경우, 쿼리 변환이 WHERE 조건에 새로운 조건을 추가한 몇몇 경우에 옵티마이저는 외부 쿼리 블록에 남아 있는 조건에 대해 내부 fix_fields() 함수를 호출할 수 있었습니다. 이 함수 호출의 성공적인 반환을 오류로 잘못 해석하여 원래의 문장이 조용히 실패했습니다. (버그 #32150145)

ORDER BY 절을 포함하는 ALTER TABLE 문을 포함하는 저장 프로시저에 대한 여러 번의 호출이 서버 종료를 유발할 수 있었습니다. (버그 #32147402)

저장 프로그램이 포함된 준비된 문이 힙 사용 후 메모리 해제 문제를 일으킬 수 있었습니다. (버그 #32131022, 버그 #32045681, 버그 #32051928)

INFORMATION_SCHEMA 테이블에 대해 물리적 유도 테이블이 포함된 쿼리가 실패할 수 있었습니다. (버그 #32127562, 버그 #101504)

잠재적인 버퍼 오버플로가 수정되었습니다. Sifang Zhao에게 이 문제를 지적해주고 해결책을 제안해 주셔서 감사합니다(비록 그 해결책은 사용되지 않았지만). (버그 #32113015, 버그 #101448)

FLOAT 값을 INT 타입 값으로 변환할 때 Undefined Behavior Sanitizer 경고가 발생할 수 있었습니다. (버그 #32099994, 버그 #32100033)

여러 행을 포함하는 쿼리에서 LOAD_FILE() 함수가 모든 행에 대해 동일한 값을 평가했습니다. (버그 #32096341, 버그 #101401)

일반적인 Linux tar 파일 배포는 압축 해제 후 너무 제한적인 파일 권한을 가지고 있어 수동으로 chmod가 필요했습니다. (버그 #32080900)

디버그 빌드의 경우, 저장 프로시저에 서브쿼리를 포함하는 준비된 SET 문이 어설션을 발생시킬 수 있었습니다. (버그 #32078387)
참고: 버그 #32100210도 참조하십시오.

준비된 문에 대해, 합법적인 콜레이션 믹스에 대해 불법적인 콜레이션 혼합 오류가 발생할 수 있었습니다. (버그 #32077842, 버그 #101346, 버그 #32145078, 버그 #101575)

REGEXP_LIKE(), REGEXP_INSTR(), 그리고 REGEXP_REPLACE() 함수는 잘못된 정규 표현식 패턴에 대해 오류를 발생시키지만, 이러한 경우에도 NULL을 반환할 수 있어 이후 디버그 어설션을 유발했습니다. 이제 이 함수들은 특정한 경우를 제외하고는 NULL을 반환하지 않도록 보장됩니다.
REGEXP_SUBSTR() 함수는 항상 NULL을 반환할 수 있으므로, 해당 함수에는 이 검사가 필요하지 않으며, 이러한 검사를 수행하지 않도록 했습니다. (버그 #32053093)

WITH ROLLUP을 사용하는 HAVING 조건에서 집계 함수를 IS NULL 또는 IS NOT NULL로 테스트할 때 잘못된 결과가 발생했습니다. (버그 #32049313)

내부 쿼리 블록에 집계 함수가 있어 현재 쿼리 블록에 새로운 집계 함수가 추가된 경우, 서버는 이에 필요한 롤업 래퍼를 추가하지 않았습니다. (버그 #32034914)

디버그 빌드에서 특정 CREATE TABLE 문이 CHECK 제약 조건을 포함하면 어설션을 발생시킬 수 있었습니다. (버그 #32018406, 버그 #101180)

보조 엔진 로드 작업 중에 InnoDB에서 잘못된 BLOB 필드 값이 전달되었습니다. (버그 #32014483)

LOCK_ORDER 도구가 InnoDB 공유 배타적 잠금을 올바르게 나타내지 못했습니다. (버그 #31994052)

해시 조인의 일부로 잘못된 열 유형을 사용하는 집계 함수를 시도했을 때 서버가 오류를 제대로 처리하지 못했습니다. (버그 #31989333)

INFORMATION_SCHEMA.KEYWORDS 테이블의 WORD 열 길이가 테이블 내용에 따라 달라질 수 있었습니다. (버그 #31982157)

퍼포먼스 스키마의 host_cache 테이블이 비어 있으면 퍼포먼스 스키마가 비활성화된 경우에도 호스트 캐시 내용을 표시하지 않았습니다. 이제 퍼포먼스 스키마가 활성화되었는지 여부에 상관없이 테이블이 캐시 내용을 표시합니다. (버그 #31978763)

이전 문장이 THD::mark_used_columns의 원래 값을 복원하지 않은 경우 HANDLER READ 문이 가끔 어설션에 도달했습니다. (버그 #31977414)

압축된 테이블을 가져올 때 테이블에 매우 큰 비압축 값을 포함하면 서버가 예기치 않게 종료될 수 있었습니다. (버그 #31943021)

해시 조인을 사용하는 서브쿼리와 LIMIT이 반복적으로 실행될 때 메모리 누수가 발생할 수 있었습니다. (버그 #31940549)

Ubuntu에서 컴파일 오류가 수정되었습니다. (버그 #31930934, 버그 #100938)

많은 수의 명령문을 실행하는 세션에서 부분 취소 정보에 대한 메모리 사용량이 과도하게 증가할 수 있었습니다. (버그 #31919448)

서버가 WHERE_CONDITION 최적화를 모든 경우에 제대로 처리하지 못했습니다. (버그 #31905199)

FLUSH TABLES WITH READ LOCK이 다른 세션이 SHOW TABLE STATUS를 실행하지 못하도록 차단할 수 있었습니다. (버그 #31894662)

몇몇 경우에, MIN()MAX()가 시간 값 또는 JSON 값을 인수로 사용하는 윈도우 함수로서 잘못 NULL을 반환했습니다. (버그 #31882291)

GRANT ... GRANT OPTION ... TOGRANT ... TO .. WITH GRANT OPTION이 가끔 서버 로그에 올바르게 기록되지 않았습니다. (버그 #31869146, 버그 #100793)

디버그 빌드에서, 256개 이상의 엔트리를 포함하는 파티션 목록을 사용하는 CREATE TABLE 문이 어설션을 발생시켰습니다. (버그 #31867653)

init_file 시스템 변수에 의해 지정된 파일의 쿼리가 서버 시작 실패를 유발할 수 있었습니다. (버그 #31835782)

해시 조인을 수행할 때, 옵티마이저가 음수 정수 값과 매우 큰 부호 없는 정수 값 간의 잘못된 일치를 등록할 수 있었습니다. (버그 #31832001, 버그 #31940639, 버그 #100967)

SHOW VARIABLESpartial_revokes 시스템 변수에 대한 잘못된 값을 보고할 수 있었습니다. (버그 #31819558, 버그 #100677)

퍼포먼스 스키마 user_defined_functions 테이블에서 UDF_LIBRARY 열 값은 서비스 API를 통해 등록된 로드 가능 함수에 대해 NULL이어야 하지만, 값이 빈 문자열로 잘못 설정되었습니다. (버그 #31791754)

서버 자동 업그레이드 절차가 latin1 캐릭터셋을 사용하는 이전 도움말 테이블을 업그레이드하지 못했습니다. (버그 #31789964)

직렬화 가능 또는 반복 읽기 트랜잭션 격리 수준에서 권한 부여 테이블을 읽는 SQL 문을 실행할 때 중복 경고가 발생할 수 있었습니다. (버그 #31769242)

DISTINCT 집계가 포함된 특정 쿼리에서(일반적으로 집계 전에 정렬을 통해 해결됨) 서버는 임시 테이블을 처리하는 논리가 중복 제거를 수행한다고 잘못 가정하여 스트리밍 대신 임시 테이블을 사용했습니다. 이제 서버는 암시된 고유 인덱스를 확인하여 더 강력한 방식으로 처리하며 불필요한 논리를 제거할 수 있게 되었습니다. (버그 #31762806)

lower_case_table_names 값과 이벤트 스케줄러 이벤트 정의의 스키마 이름 조합에 따라 서버가 멈출 수 있었습니다. (버그 #31733090)

한 저장 함수에서 다른 저장 함수를 호출할 때 필드 해석에서 충돌이 발생하여 서버 종료를 유발할 수 있었습니다. (버그 #31731334)

udf_init() 메서드 없이 정의된 로드 가능한 함수가 예기치 않은 서버 종료를 유발할 수 있었습니다. (버그 #31701219)

secure_file_priv 시스템 변수를 NULL로 설정하면 동작이 비활성화되어야 했지만, 대신 서버가 NULL이라는 디렉터리를 생성했습니다. (버그 #31700734, 버그 #100384)

mysqlpump가 공유 구조에 대한 부적절한 동시 접근으로 인해 예기치 않게 종료될 수 있었습니다. (버그 #31696241)

컴포넌트를 제거하고 해당 컴포넌트가 설치한 로드 가능 함수를 등록 해제하는 작업이 함수가 사용 중인지 여부와 제대로 동기화되지 않았습니다. (버그 #31646698)

여러 테이블에 대한 UPDATE 또는 DELETE를 수행하는 준비된 문을 실행한 후 정리가 항상 제대로 이루어지지 않았으며, 이러한 준비된 문이 처음 실행된 후 서버는 실제로 변경된 행이 없었음에도 불구하고 업데이트된 행 수를 0이 아닌 값으로 보고했습니다. (버그 #31640267)
참고: 버그 #32100210도 참조하십시오.

기본 키 확장을 지원하는 엔진의 경우, 총 키 길이가 MAX_KEY_LENGTH를 초과하거나 키 파트 수가 MAX_REF_PARTS를 초과하면, 제한을 초과한 기본 키의 키 파트가 보조 키에 추가되지 않았지만, 기본 키의 키 파트가 무조건 보조 키의 일부로 표시되었습니다.
이로 인해 보조 키가 커버링 인덱스로 처리되어 잘못된 액세스 방법이 선택되는 상황이 발생했습니다.
이제 기본 키의 키 파트를 보조 키에 추가하는 방식을 수정하여, 이전에 언급한 제한을 초과하는 키 파트는 제거되도록 수정되었습니다. (버그 #31617858)

MySQL이 -DWITH_ICU=system으로 구성된 경우, CMake는 이제 ICU 라이브러리 버전이 충분히 최신인지 확인합니다. (버그 #31600044)

--binary-as-hex 옵션과 함께 호출될 때, mysqlNULL 값을 빈 바이너리 문자열(0x)로 표시했습니다.

정의되지 않은 변수를 선택하면 NULL 대신 빈 바이너리 문자열(0x)을 반환했습니다. (버그 #31549724, 버그 #31638968, 버그 #100251)

CMake의 퍼포먼스 스키마 관련 DISABLE_PSI_xxx 옵션을 활성화하면 빌드 실패가 발생했습니다. (버그 #31549724)

몇몇 쿼리는 internal_tmp_mem_storage_engine의 값에 따라 다른 결과를 반환했습니다.
이 문제의 근본 원인은 윈도우 함수의 버퍼링 행을 처리할 때, 이 메모리 내 임시 테이블의 크기가 지정된 제한을 초과하면 새로운 임시 테이블이 디스크에 생성됩니다. 프레임 버퍼 파티션 오프셋은 새 파티션의 시작 부분에서 읽은 총 행 수로 설정되며, 이 오프셋은 윈도우 함수를 처리하는 데 필요한 힌트를 계산하기 위해 사용됩니다. 이 문제는 디스크에 임시 테이블을 생성하는 동안 새 파티션이 시작되는 특정 경우에 프레임 버퍼 파티션 오프셋이 업데이트되지 않아 잘못된 행이 읽히는 문제가 있었습니다.
이 문제는 디스크에 임시 테이블이 이동하는 동안 새 파티션이 시작될 때마다 프레임 버퍼 파티션 오프셋을 올바르게 업데이트하여 해결되었습니다. (버그 #31546816)

윈도우 함수를 처리하기 위해 행을 버퍼링하는 동안, 이 메모리 내 임시 테이블의 크기가 temptable_max_ram으로 지정된 제한을 초과하면 새로운 임시 테이블이 디스크에 생성됩니다. 디스크에 임시 테이블을 생성한 후에는 기존 힌트가 더 이상 사용되지 않으므로, 윈도우 함수를 처리하는 데 사용되는 힌트를 재설정해야 합니다. 프레임 버퍼의 첫 번째 행이 처리되는 동안 디스크에 임시 테이블을 생성할 때, 힌트가 초기화되지 않았으며 이러한 초기화되지 않은 힌트를 재설정하려고 시도하면 계획되지 않은 서버 종료가 발생했습니다.
이 문제는 힌트를 재설정하기 전에 프레임 버퍼 힌트가 초기화되었는지 확인하는 검사를 추가하여 해결되었습니다. (버그 #31544404)

퍼포먼스 스키마가 CHANNEL_NAME 열에 대해 조인을 수행할 때, USE INDEX ()로 인덱스가 비활성화된 경우 퍼포먼스 스키마가 잘못된 결과를 생성할 수 있었습니다. (버그 #31544023, 버그 #99989)

사용되지 않은 윈도우 정의를 제거할 때, ORDER BY의 일부였던 서브쿼리가 제거되지 않았습니다. (버그 #31518806)

서버가 다중 중첩된 서브쿼리를 올바르게 처리하지 못하는 경우가 있었습니다. (버그 #31472704)

VALUES 문에 대한 구문이 ORDER BY 절을 포함하지만, 이 절이 해석되지 않아 실행 엔진이 잘못된 데이터를 처리할 수 있었습니다. (버그 #31387510)

서버가 시작 시 존재하지 않는 임시 디렉터리에 접근하려고 시도하여 실패를 유발했습니다. 이제 임시 디렉터리가 존재하는지, 그리고 tmpdir 디렉터리에 파일이 성공적으로 생성되었는지 확인하는 검사가 추가되었습니다. (버그 #31377118)

중복된 정렬을 제거하는 동안, 다른 윈도우의 정렬로 인해 행이 순서대로 제공될 것으로 예상되었기 때문에 윈도우의 정렬이 제거되었습니다. 나중에 해당 윈도우가 사용되지 않음으로 인해 제거되면, 이는 정렬되지 않은 행을 유발했으며 평가 중에 예상치 못한 결과를 초래했습니다.
이제 이러한 경우, 사용되지 않은 윈도우가 제거될 때까지 중복된 정렬 제거가 수행되지 않습니다. 또한 롤업의 해석이 준비 단계로 이동되었습니다. (버그 #31361393)

반동기 복제 오류가 서버라는 하위 시스템 태그로 잘못 기록되었습니다. 이제 다른 복제 오류와 동일하게 Repl 태그로 기록됩니다. (버그 #31327337)

사용자가 자신을 역할로 부여할 수 있었습니다. (버그 #31222230)

여러 WHERE 조건이 동일한 서브쿼리를 참조하는 경우, 그중 하나가 항상 FALSE로 평가되면 서버가 이를 올바르게 처리하지 못했습니다. (버그 #31216115)

lower_case_table_names=2 설정에서, InnoDB 백그라운드 스레드가 잠금 키의 스키마 이름 부분에 대해 잘못된 대소문자를 사용하여 테이블 메타데이터 잠금을 획득하여 메타데이터가 보호되지 않고 경합 상태가 발생할 수 있었습니다. 이제 올바른 대소문자가 적용됩니다. 또한 메타데이터 사전 객체를 가져올 때 잠금 보호를 확인하는 어설션 코드를 개선하고, 해당 객체가 해제되기 전에 메타데이터 잠금이 해제되는 것을 방지하는 변경 사항이 구현되었습니다. (버그 #31165802)

클라이언트에 CR_UNKNOWN_ERROR를 보내야 할 경우, 예외가 발생했습니다. (버그 #31123643)

DOUBLE 값을 BIT, ENUM, 또는 SET 유형으로 변환할 때 Undefined Behavior Sanitizer 경고가 발생할 수 있었습니다. (버그 #31019130)

skip_name_resolve 시스템 변수가 활성화된 경우, 특정 계정이 서버 시작 실패를 유발할 수 있었습니다. (버그 #31018510)

클라이언트 프로그램이 통신 패킷에 잘못된 데이터가 포함된 경우 예기치 않게 종료될 수 있었습니다. (버그 #30890850)

클라이언트 라이브러리에서 버퍼 오버플로가 수정되었습니다. (버그 #30885987)

다중 값 또는 기타 기능 인덱스를 생성할 때, 해당 인덱스가 실제로 사용되지 않았더라도 해당 테이블에 대해 쿼리를 실행할 때 성능 저하가 발생했습니다. 이는 해당 인덱스를 지원하는 숨겨진 가상 열이 쿼리의 각 행에 대해 불필요하게 평가되었기 때문입니다. (버그 #30838749)
참조: 이 문제는 버그 #28069731의 회귀 문제입니다.

CMakelibcurl 의존성 검사 방식이 개선되었습니다. (버그 #30268245)

mysql_config_editor가 비밀번호 값에서 # 문자를 주석 문자로 잘못 처리했습니다. (버그 #29861961, 버그 #95597)

일부 경우, 옵티마이저가 빈 문자열에 대한 해시 값을 계산하려고 시도했습니다. 이제 항상 고정 값을 사용합니다. (버그 #22588319)

INSERT()RPAD() 함수가 결과의 캐릭터셋을 올바르게 설정하지 않았습니다. (버그 #22523946, 버그 #79909, 버그 #31887870, 버그 #100841)

val1 BETWEEN val2 AND val3와 같은 경계 케이스가 수정되었습니다. 예를 들어, -1 BETWEEN 9223372036854775808 AND 1이 true로 반환되는 문제가 있었습니다. (버그 #22515857, 버그 #79878)

퍼포먼스 스키마 memory_summary_global_by_event_name 테이블에서 로우 워터마크 열이 음수 값을 가질 수 있었고, 서버 메모리 사용량이 증가하지 않아도 하이 워터마크 열 값이 계속 증가하는 문제가 있었습니다. (버그 #22246001, 버그 #79285)

문자열을 숫자로 변환할 때 여러 문제가 수정되었습니다. (버그 #19186271, 버그 #73248)

정확하게 실행된 특정 그룹화 쿼리가 WITH ROLLUP이 추가되면 예상 결과를 반환하지 않았습니다. 이는 소수 정보를 항상 올바르게 파이핑하지 않아 TRUNCATE()와 같은 소수 값을 반환하는 함수가 잘못된 데이터를 받는 문제가 있었습니다. (버그 #101684, 버그 #32179240)

임시 테이블을 물리화하기 위해 필드를 생성할 때, 옵티마이저는 항목이 복사되어야 하는지 아니면 상수인지 확인합니다. 그러나 특정 경우에 이 작업이 올바르게 수행되지 않았습니다. 외부 조인과 상수를 포함하는 뷰 또는 파생 테이블에 대해 수행될 때, 항목이 테이블에 제대로 물리화되지 않아 결과에 NULL이 발생할 수 있었습니다. (버그 #101622, 버그 #32162862)
참조: 버그 #31790217도 참조하십시오.

SQL 문에서 REGEXP_REPLACE() 함수가 사용될 때, 내부 함수 Regexp_engine::Replace()가 레코드 처리 후 오류 코드 값을 재설정하지 않아 다음 레코드 처리에 영향을 미치는 문제가 있었습니다.
기여해주신 Hope Lee에게 감사드립니다. (버그 #101256, 버그 #32050219)

다음과 같은 형태의 쿼리에 대해, 임시 테이블이 생성된 후 열 목록이 일관되지 않은 상태가 되어 나중에 인덱스가 범위를 벗어나는 문제가 발생할 수 있었습니다:

SELECT * FROM (
    SELECT PI()
    FROM t1 AS table1, t1 AS table2
    ORDER BY PI(), table1.a
) AS d1;

(버그 #101012, 버그 #31955761, 버그 #31978439)
참조: 이 문제는 버그 #31790217의 회귀 문제입니다.

이미 정렬된 데이터를 집계할 때(임시 테이블을 사용하지 않으므로 스트리밍 집계라고 함), 다음 그룹의 첫 번째 행을 처리하기 전까지 그룹이 끝났는지 판단할 수 없었고, 이 시점에서 그룹에 대한 표현식은 이미 덮어쓰여 있는 경우가 많았습니다.
이 문제는 처음 그룹을 만날 때 대표적인 행을 저장하는 간단한 방법을 사용하여 나중에 출력 행이 필요할 때 해당 열을 쉽게 검색할 수 있도록 복잡한 논리를 대체함으로써 해결되었습니다. (버그 #100791, 버그 #27272052, 버그 #31073167, 버그 #31790217, 버그 #31868610)

풀텍스트 매칭을 사용하는 서브쿼리가 subquery_to_derived가 활성화된 경우 제대로 동작하지 않을 수 있으며, 디버그 빌드에서 어설션을 유발할 수 있었습니다. (버그 #100749, 버그 #31851600)

ALTER TABLE ... CONVERT TO CHARACTER SET 문이 실행되면 테이블의 모든 CHAR, VARCHAR, 및 TEXT 열의 캐릭터셋이 새 CHARACTER SET 값으로 업데이트됩니다. 이 변경은 다중 값 인덱스의 숨겨진 CHAR 열에도 적용되었는데, 숨겨진 열의 캐릭터셋은 my_charset_utf8mb4_0900_bin 또는 binary 중 하나여야 하므로 서버 디버그 빌드에서 어설션을 발생시켰습니다.
이제는 이전에 참조된 ALTER TABLE 문을 실행할 때 테이블의 숨겨진 열의 캐릭터셋을 설정하지 않도록 수정되었습니다. 이는 유사한 상황에서 BLOB 열에 대해 수행되는 방식과 유사합니다. (버그 #99403, 버그 #31301101)

일부 경우에, 서버의 내부 문자열 변환 루틴이 길이 지정자를 사용하는 부동 소수점 값을 처리할 때 문제가 발생하여 과학적 표기법을 사용하게 했습니다. (버그 #92537, 버그 #101570, 버그 #28691605, 버그 #32144265)
참조: 버그 #88256, 버그 #27041543도 참조하십시오.

Leave a Comment



이 문서 공유

8.0.23 변경 사항 (2021-01-18 GA)

링크 복사

CONTENTS