MySQL 8.0 Release Note

8.0.37 변경 사항 (2024-04-30 GA)

Estimated reading: 2 minutes 78 views

공식 문서: Changes in MySQL 8.0.37 (2024-04-30, General Availability)

감사 로그 관련 사항

MySQL은 플러그인 유형에 관계없이, 유효한 플러그인 구조체를 인수로 사용하여 plugin->deinit()을 호출하도록 변경되었습니다.
기여해 주신 마틴 알더렛에게 감사드립니다.

캐릭터셋 지원

character_set_server 시스템 변수가 SET PERSIST 또는 SET GLOBAL을 사용하여 설정되었을 때, 새로운 클라이언트 세션이나 서버 재시작 후 서버에 연결하는 클라이언트에게는 적용되지 않았습니다. 유일한 해결 방법은 서버 시작 시 해당 명령줄 옵션을 설정하는 것이었습니다.

이 문제를 해결하기 위해, 서버 재시작 시 변수 설정이 예상대로 적용되도록 설정 데이터가 올바른 순서로 읽히도록 수정했습니다. (버그 #35529604)

컴파일 관련 사항

컴파일 시 -DMYSQL_MAINTAINER_MODE=1 옵션을 사용하면 사용되지 않는 변수에 대한 경고 메세지가 컴파일 오류로 처리됩니다. 이러한 오류를 피하려면 -DMYSQL_MAINTAINER_MODE=0을 사용하여 해당 오류를 비활성화하십시오. (버그 #113662, 버그 #36198423)

s390x 아키텍처의 사이클 타이머를 개선했습니다.
기여해 주신 조나단 알브렉트에게 감사드립니다. (버그 #112845, 버그 #35949958)

컴포넌트 관련 사항

--loose 접두사를 사용하여 설정된 컴포넌트 옵션 값이 컴포넌트 설치 시 읽히지 않았습니다. (버그 #28341329)

옵티마이저 관련 사항

멀티 레인지 리드(MRR) 최적화가 이전 릴리스만큼 성능이 좋지 않았습니다. (버그 #113711, 버그 #36220640)

Performance Schema 관련 사항

십진수 값이 할당된 사용자 변수는 user_variables_by_thread 테이블에서 반올림되었습니다. (버그 #35781732)

부하가 높은 서버에서 SELECT * FROM performance_schema.data_locks를 실행하면, MySQL이 대량의 메모리를 소비하고 예기치 않게 종료될 수 있었습니다.
이번 릴리스부터 이러한 쿼리 실행에 사용되는 메모리는 memory/performance_schema/data_container에서 계측되어 메모리 소비를 모니터링할 수 있게 되었습니다. (버그 #35240825)

부하가 높은 서버에서 SELECT * FROM performance_schema.data_locks를 실행하면, InnoDB에서 데드락이 발생할 수 있었습니다. (버그 #35068461)
참고: 버그 #35240825도 참조하십시오.

추가 및 변경된 기능

중요한 변경 사항; 그룹 복제: group_replication_consistencyBEFORE_ON_PRIMARY_FAILOVER로 설정하고 발행하면, MySQL의 KILL 문이 일관성 보장을 무시하고, 중단된 트랜잭션은 롤백됩니다.

중요한 변경 사항: OpenSSL 라이브러리가 번들된 플랫폼의 경우, MySQL 서버에 링크된 OpenSSL 라이브러리가 버전 3.0.13으로 업데이트되었습니다. OpenSSL 버전 3.0.13에서 수정된 문제는 OpenSSL 공식 사이트를 참조하십시오. (버그 #36261675)

패키지: Fedora 40 및 Ubuntu 24.04에 대한 지원이 추가되었습니다.

Microsoft Windows: MySQL Windows 바이너리 파일(.exe 및 .dll 파일)의 속성을 표시할 때 추가 정보가 표시되도록 개선되었습니다. (버그 #36379291)

클론 플러그인의 버전 요구 사항이 완화되어, 동일한 시리즈의 다른 포인트 릴리스 간에 클론을 생성할 수 있게 되었습니다. 즉, 이전에는 포인트 릴리스 번호까지 일치해야 했지만, 이제는 메이저 버전과 마이너 버전만 일치하면 됩니다.
예를 들어, 클론 기능을 통해 8.4.0에서 8.4.14로, 그리고 8.0.51에서 8.0.37로 클론 생성이 가능해졌습니다. 그러나 8.0의 경우, 8.0.37보다 이전 버전에는 이전 제한이 계속 적용되므로, 8.0.36에서 8.0.42로의 클론 생성 또는 그 반대의 경우는 허용되지 않습니다.
더 자세한 내용은 The Clone Plugin부분을 참고바랍니다. (버그 #36293529, WL #15989)

버그 수정

중요한 변경 사항: Robin Hood 해시 라이브러리가 unordered_dense로 대체되었습니다. (버그 #36158022)

InnoDB; Microsoft Windows: REDO 로그 파일을 오버랩 모드로 열어 Windows에서 REDO 로그의 성능을 향상시켰습니다. (버그 #36154818)
참고: 이 문제는 버그 #12527의 회귀입니다.

InnoDB: 로그 작성기가 log.writer_mutex를 일시적으로 해제하는 함수를 호출합니다. 이로 인해 innodb_log_writer_threads=OFF인 경우 다른 스레드가 그 사이에 REDO 로그에 쓸 수 있습니다. (버그 #36425219)

InnoDB: FTS 인덱스를 가진 테이블에 대한 일부 FTS 작업이 일관성 없는 결과를 초래할 수 있었습니다. 예를 들어, FTS 캐시 동기화 중에 서버가 종료되거나 다른 FTS 작업과 동시에 동기화가 발생한 경우 등이 해당됩니다.
기여해 주신 인 펭과 텐센트 팀에게 감사의 말씀을 전합니다. (버그 #36347647)

InnoDB: 데이터가 포함된 테이블에 인덱스를 생성할 때, Valgrind가 ddl::Builder::bulk_add_row에서 초기화되지 않은 메모리 읽기를 보고할 수 있었습니다. (버그 #36342792)

InnoDB: Windows에서 공유 쓰기 잠금 없이 파일을 연 채로 fil_shard 뮤텍스를 획득하려고 하면, 동일한 파일에 접근하려는 다른 스레드와의 데드락이 발생했습니다. (버그 #36159317)
참고: 버그 #32808809도 참조하십시오.

InnoDB: 복구 중에 “Found existing redo log files, but at least one is missing”(기존의 redo 로그 파일을 찾았지만, 적어도 하나가 누락되었습니다)라는 오류가 발생할 수 있는 잠재적인 REDO 로그 로테이션 문제를 수정했습니다. (버그 #36124625)

InnoDB: os_innodb_umask 처리 방식을 개선하고, 이를 읽기 전용으로 변경했습니다. (버그 #35932118)
참고: 이 문제는 버그 #29472125의 회귀입니다.

InnoDB: 풀텍스트 인덱스와 관련된 어설션 오류를 발견하여 수정했습니다. (버그 #35836581)

InnoDB: 테이블스페이스 삭제 과정 중 어설션 실패를 유발할 수 있는 상황에서 버퍼 처리가 개선되었습니다. (버그 #35676106, 버그 #36343647)

InnoDB: 시스템 스키마 내 MySQL 테이블에 8.0.29 이전에 추가된 INSTANT ADD 열이 있는 경우(해당 버전에서는 허용되지 않음), MySQL을 8.0.29 이후 버전으로 업그레이드한 후 이들 테이블에서 DML을 실행하면 서버가 예기치 않게 종료될 수 있었습니다.
기여해 주신 리차드 당에게 감사드립니다. (버그 #35625510, 버그 #35981565, 버그 #36180360)

InnoDB: REDO 로그가 인스턴트 DDL을 사용한 열 순서 변경을 기록하지 않을 수 있어, 복구 중에 잘못된 로그 재생이 발생할 수 있었습니다. (버그 #35183686)

InnoDB: SHOW ENGINE INNODB STATUS의 결과에서 첫 번째 결과로 잘못된 값(NULL)이 표시되었습니다. (버그 #113819, 버그 #36118112)
참고: 이 문제는 버그 #34992157의 회귀입니다.

InnoDB: innodb_parallel_read_threads가 1보다 큰 값으로 설정되어 있을 때, InnoDB는 선행 읽기 휴리스틱을 불필요하게 비활성화하여 페이지가 아직 버퍼 풀에 없을 때 스톨이 발생했습니다. (버그 #113482, 버그 #36142806)

InnoDB: TempTable 스토리지 엔진에서 고유한 해시 인덱스를 사용하는 쿼리를 실행하면, MEMORY 엔진에서 쿼리를 실행하는 것보다 상당히 오래 걸릴 수 있었습니다.
기여해 주신 샤오양 첸에게 감사드립니다. (버그 #113178, 버그 #36037224, 버그 #36224958)

InnoDB: 디버그 빌드에서, MDL 락을 획득하려던 트랜잭션이 더 이상 활성화되지 않았을 때 InnoDB 백그라운드에서 어설션 오류가 발생했습니다.
이 수정은 알리바바의 겐제 우가 제공한 패치를 기반으로 하며, 기여해 주셔서 감사합니다. (버그 #112424, 버그 #35835864)
참고: 이 문제는 버그 #33700835의 회귀입니다.

InnoDB: innodb_parallel_read_threads가 1보다 큰 값으로 설정되어 있을 때, InnoDB는 불필요하게 비동기 읽기를 요청했습니다. 이는 I/O 완료 중에 더 많은 동기화가 필요하게 만들고, I/O 작업 처리를 위한 스레드(innodb_read_io_threads) 수가 제한되어 병목 현상이 발생했습니다. 이제 비동기 읽기 대신 동기 읽기가 수행됩니다. (버그 #112137, 버그 #35740866)

InnoDB: trx가 잘못된 trx->in_innodb 값을 만나면 예기치 않게 중단되었습니다.
기여해 주신 샤오화 왕에게 감사드립니다. (버그 #110652, 버그 #35277407)

InnoDB: SELECT ... GROUP BY 쿼리가 TempTable 엔진에서 Memory 엔진보다 적어도 두 배 이상 느렸습니다. (버그 #107700, 버그 #34338001)

InnoDB: MySQL은 세컨더리 인덱스 스캔을 사용하도록 하는 옵티마이저 힌트를 더 이상 무시하지 않으며, 대신 클러스터형(병렬) 인덱스 스캔을 강제로 수행합니다. (버그 #100597, 버그 #112767, 버그 #31791868, 버그 #35952353)

그룹 복제: 멤버 M1은 복구 사용자로 u1을 사용하고, M2는 복구 사용자로 u2를 사용하며, 사용자 u1과 u2는 모두 필요한 권한을 가지고 M1과 M2에 존재하고, 새로운 멤버 M3가 복구 사용자로 u2를 사용하여 그룹에 참여할 때 문제가 발생했습니다. M3는 사용자 u2만 인식하고 u1은 인식하지 못했기 때문에, M1이 M2에 연결할 수 없어 M2에서 START GROUP_REPLICATION이 거부되었습니다. 이로 인해 그룹 멤버를 M1과 M2로 나열하는 새로운 view_id가 생성되었지만, M1은 계속해서 M3로의 연결을 시도하고 오류를 로그에 기록했으며, M3는 M1의 연결 시도에 대한 액세스 거부 오류를 로그에 기록했습니다.

사양에 따르면, XCom은 과거 및 현재의 모든 구성 간에 공유되는 물리적 연결에 대한 참조를 포함하여 마지막 세 개의 알려진 구성을 저장합니다. 이는 명시적 또는 암묵적으로 그룹에 다시 참여하고 해당 구성 중 하나에 이미 존재했던 노드의 빠른 재연결을 위해 수행됩니다.

이러한 부작용으로 인해 현재 그룹에 포함되지 않은 노드에 대한 연결이 계속 시도될 수 있습니다. 이 문제를 해결하기 위해, DBA나 운영자가 시스템에 문제가 있다고 오해할 수 있는 잘못된 오류 로그를 방지하기 위해, 노드가 현재 구성에 포함되지 않은 경우 오류 로깅을 하지 않도록 했습니다. (버그 #36210988)

참고: 버그 #32592027도 참조하십시오.

그룹 복제: GTID 세트의 처리가 개선되었습니다. (버그 #36093405)

그룹 복제: 멤버가 그룹을 떠나 ERROR 상태로 전환되었지만 group_replication_exit_state_action에서 지정한 동작을 수행하지 않는 두 가지 사례가 발견되었습니다:

  • super_read_only를 활성화할 때 오류가 발생한 경우
  • 그룹 멤버의 바이너리 로그와 클론 그룹이 누락되어 멤버의 참여 복구에 실패한 경우

예를 들어, group_replication_exit_state_action의 값이 OFFLINE_MODE이고 이 중 하나의 이벤트가 발생하면 오프라인 모드가 예상대로 활성화되지 않았습니다. (버그 #36076308)

그룹 복제: 새로운 프라이머리를 설정한 후, 경우에 따라 group_replication_set_as_primary()가 작업이 완료될 때까지 무기한 대기했습니다. (버그 #36059098)

JSON: JOINGROUP BY가 일부 JSON 열 값을 다르게 처리했습니다. (버그 #101048, 버그 #31969607)

MySQL NDB ClusterJ: setLimits() 메서드를 deletePersistentAll()에 연결하여 삭제할 항목의 수를 제한할 수 있게 되었습니다.  자세한 설명은 deletePersistentAll() 부분을 참고 바랍니다. (버그 #36049906)

빌드 요구 사항을 업데이트하여 현재 CMake와 Bison에 필요한 버전을 반영했습니다. (버그 #36343254)

SET GLOBAL offline_mode=ON이 고부하 시에 발행되면 항상 올바르게 동작하지 않았습니다. (버그 #36275182)
참고: 버그 #36405894도 참조하십시오.

curl을 버전 8.6.0으로 업그레이드했습니다. (버그 #36267545)

mysqldump가 서버의 버전을 항상 올바르게 해석하지 않았습니다. (버그 #36248967)
참고: 버그 #36405879도 참조하십시오.

뷰를 생성할 때 사용된 문자 집합이 뷰 쿼리 시에 사용된 문자 집합과 다른 경우, 뷰에 대한 조건 푸시다운이 정렬 규칙 불일치로 인해 거부되었습니다. (버그 #36246859)

비추천된 exec_program() 명령의 사용은 CMake 3.28.1 이상과의 호환성을 위해 execute_process()로 대체되었습니다. (버그 #36220656)

protobuf 라이브러리를 버전 25.1로 업그레이드했습니다. (버그 #36108397)

Enterprise Linux RPM을 빌드할 때, 빌드 스크립트가 새로운 strip 명령어(/opt/rh/gcc-toolset-12 아래)를 가리키도록 업데이트되어 해당 dwz 도구를 사용할 수 있음을 확인하게 되었습니다. 이전에는 EL8에 대해서만 적용되었습니다. (버그 #36090069)

링크 타임 최적화를 사용하여 Oracle Linux에서 빌드할 때, gcc-argcc-ranlib을 찾도록 변경되었습니다. (버그 #36089900)

서버가 특정 쿼리에 대한 응답으로 예기치 않게 종료될 수 있었습니다. (버그 #35957627)

뷰 및 테이블 DDL에 의한 뷰 및 트리거 정의자의 처리가 개선되었습니다. (버그 #35942937)

서버가 특정 쿼리에 대해 항상 메타데이터를 클라이언트에게 올바르게 반환하지 않았습니다. (버그 #35904044)

다중 값 인덱스를 가진 테이블에 대해 쿼리를 실행하면 서버가 예기치 않게 종료될 수 있었습니다. 이는 주로 해당 인덱스를 사용하는 복잡한 SELECT 쿼리를 실행하는 동안 발생했습니다. (버그 #35789759)

sql/item_subselect.cc의 코드가 개선되었습니다. (버그 #35733778, 버그 #35738531, 버그 #35779012)

CREATE USER IF EXISTS가 항상 올바르게 로그에 기록되지 않았습니다. (버그 #35530823)

서버는 파티션 표현식에서의 서브쿼리를 적절히 금지하지 않았습니다. 이는 유효하지 않으며, 구문 오류를 발생시켜야 합니다. (버그 #35476172)

일부 RANK() ... OVER() 쿼리가 sql/sql_executor.cc에서 어설션을 발생시켰습니다. (버그 #35228083)

여러 연속적인 ALTER TABLE ... ALGORITHM=COPY 문이 서로 10초 이내에 실행되면 n_rows 값이 0이 되었습니다. (버그 #35127747)

Boost C++ 라이브러리 다운로드에 사용되는 URL을 업데이트했습니다. (버그 #113576, 버그 #36164514)

MySQL 8.0.30에서 처음 처리된 이전 문제의 수정이 불완전했습니다.
기여해 주신 하오 루에게 감사드립니다. (버그 #113174, 버그 #36035044)
참고: 이 문제는 버그 #110801, 버그 #35328028의 회귀입니다.

s390x에서 과도한 최적화를 피하기 위해 FMA 테스트를 -O2로 컴파일하도록 변경되었습니다.
기여해 주신 조나단 알브렉트에게 감사드립니다. (버그 #113096, 버그 #36016140)

s390x는 빅 엔디안 플랫폼이지만, 컴파일에 리틀 엔디안 ICU 데이터 디렉터리가 사용되었습니다.
기여해 주신 조나단 알브렉트에게 감사드립니다. (버그 #113095, 버그 #36016141)

루스 인덱스 스캔을 사용하는 그룹화된 쿼리에서 잘못된 결과가 반환될 수 있었습니다. (버그 #112541, 버그 #35854362)

CHAR(0)이나 BINARY(0) 등 길이 0의 열을 가진 데이터를 테이블에 삽입할 때, 디버그 빌드에서 어설션이 실패했습니다. 이제는 덜 엄격한 어설션이 소스에서 복사된 0이 아닌 바이트 수가 대상과 동일하지 않을 때만 정확하게 실패합니다. (버그 #111450, 버그 #35507763)

상관 관계 레터럴 서브쿼리 또는 다른 종속 서브쿼리의 VALUES 문이 잘못된 결과를 생성했습니다. (버그 #109252, 버그 #110076, 버그 #34852090, 버그 #35087820)

IN 연산자는 왼쪽 표현식이 NULL인 경우뿐만 아니라, 목록에서 일치하는 항목이 없고 목록의 표현식 중 하나가 NULL인 경우에도 NULL을 반환해야 합니다. 일부 경우에는 테이블에 행을 추가하면, 이후의 준비된 SELECT NULL IN (SELECT ...) 쿼리가 결과가 동일하게 유지되어야 함에도 불구하고 다른 결과를 반환하는 것이 발견되었습니다. (버그 #94857, 버그 #29602835)

Leave a Comment



이 문서 공유

8.0.37 변경 사항 (2024-04-30 GA)

링크 복사

CONTENTS