카테고리 : MySQL/릴리스노트/8.0

MySQL 8.0.37 릴리스 노트

MySQL 8.0.37 Community Server 릴리스 노트를 한국어로 번역하고, DBA가 참고해야 할 핵심 내용을 함께 정리하였습니다.

저자: Oracle 작성: 2024.04.30 약 15분 8,955자

DBA를 위한 핵심 내용

MySQL 8.0.37은 OpenSSL 3.0.13 반영, Clone 플러그인 버전 제약 완화, Group Replication 동작 변경, 다수의 InnoDB/Optimizer/Performance Schema 수정이 포함된 비교적 영향 범위가 큰 릴리스입니다. DBA 관점에서는 단순 패치보다 업그레이드 전 검증 항목이 많은 버전이며, 특히 group_replication_consistency=BEFORE_ON_PRIMARY_FAILOVER 환경의 KILL 동작 변화와 Performance Schema data_locks 조회 부하 완화가 중요합니다.

  1. group_replication_consistency=BEFORE_ON_PRIMARY_FAILOVER 상태에서 KILL이 일관성 보장을 무시하고 중단된 트랜잭션을 롤백하도록 변경되었습니다. 장애 조치 중 세션 강제 종료 절차, 운영 runbook, 애플리케이션 재시도 정책을 점검해야 합니다.
  2. 같은 8.0 계열 내에서는 포인트 릴리스가 달라도 Clone을 허용하도록 제약이 완화되었습니다. 다만 8.0.36 이하에는 기존 제약이 남으므로, 롤링 업그레이드·복제본 재구축·DR 리허설 시 소스/대상 버전 조합을 명확히 확인해야 합니다.
  3. 고부하 서버에서 performance_schema.data_locks 조회가 과도한 메모리 사용이나 InnoDB deadlock을 유발할 수 있던 문제가 수정되고 메모리 계측이 추가되었습니다. 운영 중 락 분석을 자주 수행하는 환경에서는 업그레이드 후 memory/performance_schema/data_container 관찰을 권장합니다.
  4. redo log rotation 중 복구 오류 가능성, instant DDL 컬럼 순서 변경이 redo에 제대로 기록되지 않을 수 있던 문제, FTS 작업의 일관성 문제, 시스템 스키마의 과거 INSTANT ADD 컬럼 관련 DML 종료 문제가 수정되었습니다. 장애 복구와 DDL 안정성이 중요한 환경에서는 crash recovery 리허설을 포함하십시오.
  5. MRR 성능 저하, TempTable 기반 GROUP BY/unique hash index 성능 저하, innodb_parallel_read_threads 관련 read-ahead 및 I/O 병목, loose index scan/group by 및 lateral/dependent subquery의 잘못된 결과 문제가 수정되었습니다. 쿼리 플랜이 민감한 시스템은 핵심 SQL의 실행계획과 결과 검증을 함께 수행해야 합니다.
  6. 번들 OpenSSL이 3.0.13으로 업데이트되었습니다. TLS 정책, 클라이언트 호환성, 운영체제 표준 이미지 변경이 있는 환경은 MySQL 업그레이드와 별도로 인증서·암호군·라이브러리 호환성을 확인해야 합니다. (OpenSSL 3.0 릴리스 노트)

Audit Log 관련 사항

  • MySQL은 이제 플러그인의 타입과 관계없이 유효한 플러그인 구조체를 인수로 사용하여 plugin->deinit()을 호출합니다.

    기여해 주신 Martin Alderete에게 감사드립니다.

캐릭터셋 지원

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

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

컴파일 관련 사항

  • 사용되지 않는 변수에 대한 경고는 -DMYSQL_MAINTAINER_MODE=1로 컴파일할 때 컴파일 오류로 전환됩니다. 이를 방지하려면 -DMYSQL_MAINTAINER_MODE=0을 사용하여 이러한 오류를 비활성화하십시오. (Bug #113662, Bug #36198423)

  • s390x 아키텍처의 cycle timer가 개선되었습니다.

    기여해 주신 Jonathan Albrecht에게 감사드립니다. (Bug #112845, Bug #35949958)

컴포넌트 관련 사항

  • --loose 접두사를 사용하여 설정된 컴포넌트 옵션의 값은 컴포넌트가 설치될 때 읽히지 않았습니다. (Bug #28341329)

Optimizer 관련 사항

  • multi-range read (MRR) 최적화가 이전 릴리스만큼 잘 수행되지 않았습니다. (Bug #113711, Bug #36220640)

Performance Schema 관련 사항

  • 십진수 값을 할당받은 사용자 변수가 user_variables_by_thread 테이블에서 올림 처리되었습니다. (Bug #35781732)

  • 부하가 높은 서버에서 SELECT * from performance_schema.data_locks를 실행하면 MySQL이 너무 많은 메모리를 소비하고 예기치 않게 종료될 수 있었습니다.

    이 릴리스부터 이러한 쿼리를 실행하는 데 사용되는 메모리는 이제 memory/performance_schema/data_container로 계측되어, 메모리 소비량을 관찰할 수 있습니다. (Bug #35240825)

  • 부하가 높은 서버에서 SELECT * from performance_schema.data_locks를 실행하면 InnoDB에서 데드락이 발생할 수 있었습니다. (Bug #35068461)

    참조: 다음도 참조하십시오: Bug #35240825.

추가되거나 변경된 기능

  • 중요한 변경; Group Replication: group_replication_consistencyBEFORE_ON_PRIMARY_FAILOVER로 설정된 상태에서 실행되는 경우, MySQL KILL 문은 이제 모든 일관성 보장을 무시하며, 중단된 모든 트랜잭션은 이제 롤백됩니다.

  • 중요한 변경: OpenSSL 라이브러리가 번들로 제공되는 플랫폼의 경우, MySQL Server에 링크된 OpenSSL 라이브러리가 버전 3.0.13으로 업데이트되었습니다. OpenSSL 버전 3.0.13에서 수정된 문제는 https://openssl-library.org/news/openssl-3.0-notes/에 설명되어 있습니다. (Bug #36261675)

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

  • Microsoft Windows: MySQL Windows 바이너리 파일(.exe.dll 파일)은 이제 속성을 볼 때 추가 정보를 표시합니다. (Bug #36379291)

  • Clone 플러그인 버전 요구 사항이 완화되어 같은 시리즈의 서로 다른 포인트 릴리스 간 클론을 허용합니다. 즉, 이전에는 릴리스 번호도 일치해야 했지만 이제는 메이저 및 마이너 버전 번호만 일치하면 됩니다.

    예를 들어, MySQL 8.0.37에서 (향후의) MySQL 8.0.42로의 클론 또는 그 반대가 지원됩니다. 예를 들어 8.0.37보다 이전 버전에는 이전 제한 사항이 여전히 적용되므로, MySQL 8.0.36에서 다른 MySQL 릴리스로의 클론(또는 다른 MySQL 릴리스에서 8.0.36으로의 클론)은 계속 지원되지 않습니다.

    자세한 내용은 The Clone Plugin을 참조하십시오. (Bug #36293529, WL #15989)

    with "참조:". For "Robin Hood hashing library," I’ll use "Robin Hood 해싱 라이브러리". I wonder if "overlapped mode" should simply stay as is since it’s a technical term. For the ..." too.Translating and finalizing markdown

수정된 버그

  • 중요한 변경: Robin Hood 해싱 라이브러리가 unordered_dense로 교체되었습니다. (Bug #36158022)

  • InnoDB; Microsoft Windows: redo log 파일을 overlapped mode로 열어 Windows에서 redo log 성능을 개선했습니다. (Bug #36154818)

    참조: 이 문제는 다음 버그의 회귀입니다: Bug #12527.

  • InnoDB: 로그 라이터는 log.writer_mutex를 일시적으로 해제하는 함수를 호출합니다. innodb_log_writer_threads=OFF인 경우, 이로 인해 잠재적으로 이 시간 사이에 다른 스레드가 redo log에 기록할 수 있었습니다. (Bug #36425219)

  • InnoDB: FTS 인덱스가 있는 테이블에 대한 일부 FTS 작업이 일관되지 않은 결과로 이어졌습니다. 예를 들어, FTS 캐시를 동기화하는 동안 서버가 종료되거나, 다른 FTS 작업과 동시에 동기화가 발생한 경우입니다.

    기여해 주신 Yin Peng 및 Tencent 팀에 감사드립니다. (Bug #36347647)

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

  • InnoDB: 병합 정렬 버퍼와 관련된 문제를 수정했습니다. (Bug #36319083)

  • InnoDB: Windows에서 공유 쓰기 잠금 없이 파일을 열린 상태로 유지하고 fil_shard 뮤텍스 획득을 시도하면, fil_shard 뮤텍스를 획득한 후 동일한 파일에 액세스하려고 시도하던 다른 스레드와 데드락이 발생했습니다. (Bug #36159317)

    References: 함께 참조하십시오: Bug #32808809.

  • InnoDB: 복구 중에 "Found existing redo log files, but at least one is missing" 오류를 발생시킬 수 있었던 잠재적인 리두 로그 로테이션 문제를 수정했습니다. (Bug #36124625)

  • InnoDB: os_innodb_umask 처리를 개선하고, 이를 읽기 전용으로 만들었습니다. (Bug #35932118)

    References: 이 문제는 다음의 회귀입니다: Bug #29472125.

  • InnoDB: 전체 텍스트 인덱스와 관련된 어설션 실패를 발견하고 수정했습니다. (Bug #35836581)

  • InnoDB: 테이블스페이스 삭제 프로세스 중 버퍼 처리를 개선했으며, 이는 잠재적으로 어설션 실패를 일으킬 수 있었던 상황입니다. (Bug #35676106, Bug #36343647)

  • InnoDB: 시스템 스키마의 MySQL 테이블에 8.0.29 이전에 추가된 INSTANT ADD 컬럼이 있고(해당 버전부터는 허용되지 않습니다), MySQL이 8.0.29보다 높은 버전으로 업그레이드된 후 이러한 테이블에 대한 DML이 실행되면 서버가 예기치 않게 종료되었습니다.

    기여해 주신 Richard Dang에게 감사드립니다. (Bug #35625510, Bug #35981565, Bug #36180360)

  • InnoDB: redo 로그가 instant DDL을 사용한 컬럼 순서 변경을 잠재적으로 기록하지 않을 수 있었으며, 이로 인해 복구 중 잘못된 로그 재생이 발생할 수 있었습니다. (Bug #35183686)

  • InnoDB: SHOW ENGINE INNODB STATUS의 결과에서 File IO 섹션의 첫 번째 스레드 이름으로 유효하지 않은 값(NULL)이 표시되었습니다. (Bug #113819, Bug #36118112)

    References: 이 문제는 다음의 회귀입니다: Bug #34992157.

  • InnoDB: innodb_parallel_read_threads가 1보다 큰 값으로 설정된 경우, InnoDB는 read-ahead 휴리스틱을 불필요하게 비활성화했으며, 이로 인해 페이지가 이미 버퍼 풀에 있지 않을 때 stall이 발생했습니다. (Bug #113482, Bug #36142806)

  • InnoDB: TempTable 스토리지 엔진에서 unique hash index를 사용하는 쿼리를 실행하면, MEMORY 엔진으로 쿼리를 실행하는 것과 비교해 시간이 상당히 더 오래 걸릴 수 있었습니다.

    기여해 주신 xiaoyang chen께 감사드립니다. (Bug #113178, Bug #36037224, Bug #36224958)

  • InnoDB: Debug 빌드에서, InnoDB의 백그라운드가 MDL 잠금을 획득하려던 트랜잭션이 더 이상 활성 상태가 아닐 때 어설션 실패가 발생했습니다.

    이 수정은 Alibaba의 Genze Wu가 제공한 패치를 기반으로 합니다. 기여해 주셔서 감사합니다. (Bug #112424, Bug #35835864)

    참조: 이 문제는 다음의 회귀입니다: Bug #33700835.

  • InnoDB: innodb_parallel_read_threads가 1보다 큰 값으로 설정된 경우, InnoDB는 불필요하게 비동기 읽기를 요청했으며, 이로 인해 I/O 완료 중 더 많은 동기화가 필요했고 I/O 작업을 처리하는 데 사용할 수 있는 스레드 수(innodb_read_io_threads)가 제한되어 병목이 발생했습니다. 이제 이는 비동기 읽기 대신 동기 읽기를 수행합니다. (Bug #112137, Bug #35740866)

  • InnoDB: 잘못된 trx->in_innodb 값을 만난 후 trx가 예기치 않게 중단되었습니다.

    기여해 주신 Shaohua Wang님께 감사드립니다. (Bug #110652, Bug #35277407)

  • InnoDB: SELECT... GROUP BY 쿼리는 TempTable 엔진을 사용할 때 Memory 엔진보다 최소 두 배 느렸습니다. (Bug #107700, Bug #34338001)

  • InnoDB: MySQL은 더 이상 보조 인덱스 스캔을 사용하라는 Optimizer 힌트를 무시하지 않으며, 이전에는 대신 클러스터형(병렬) 인덱스 스캔을 강제했습니다. (Bug #100597, Bug #112767, Bug #31791868, Bug #35952353)

  • Group Replication: 멤버 M1M2가 그룹에 있고, M1u1을 복구 사용자로 사용하며 M2u2를 자체 복구 사용자로 사용하고, 두 사용자 u1u2가 필요한 모든 권한을 가진 상태로 M1M2에 모두 존재하며, 새 멤버 M3u2를 복구 사용자로 사용하여 그룹에 참여할 때 문제가 발생했습니다. M3는 사용자 u2만 알고 있었지만 사용자 u1은 알지 못했으므로, M1M2에 연결할 수 없었기 때문에 M2에서 START GROUP REPLICATION이 거부되었습니다. 이로 인해 그룹 멤버를 M1M2로 나열하는 새 view_id도 생성되었지만, 그럼에도 M1M3에 연결하려는 시도를 계속했으며, M1은 mysql 연결 설정 오류를 로깅하고 M3M1의 연결 시도에 대한 접근 거부 오류를 로깅했습니다.

    설계상 XCom은 과거 및 현재의 모든 구성에서 공유되는 물리적 연결에 대한 참조를 포함하여 마지막으로 알려진 세 가지 구성을 저장합니다. 이는 명시적으로 또는 암시적으로 그룹에 다시 참여하고, 해당 구성 중 하나에 이미 존재했던 노드가 빠르게 다시 연결할 수 있도록 하기 위해 수행됩니다.

    이로 인한 부작용은 현재 그룹에 없는 노드에 계속 연결을 시도할 수 있다는 점이었습니다. 이 문제를 해결하기 위해, DBA 또는 오퍼레이터가 시스템에 문제가 있다고 잘못 생각하게 만들 수 있는 잘못된 부정 판단을 피하기 위해, 해당 노드가 현재 구성에 없는 경우 오류 로깅을 억제합니다. (Bug #36210988)

    참조: 또한 Bug #32592027을 참조하십시오.

  • Group Replication: GTID 집합 처리가 개선되었습니다. (Bug #36093405)

  • Group Replication: 멤버가 그룹을 나가고 ERROR 상태로 이동했지만 group_replication_exit_state_action에 지정된 동작을 따르지 않은 두 가지 사례가 발견되었습니다. 이러한 사례는 여기에 나열되어 있습니다:

    • super_read_only를 활성화하는 동안 오류가 발생한 경우
    • 그룹 멤버에서 바이너리 로그와 clone 그룹이 누락되어 멤버 조인 복구가 불가능한 경우

    : group_replication_exit_state_action 값이 OFFLINE_MODE이고 이러한 이벤트 중 하나가 발생했을 때, 예상대로 오프라인 모드가 활성화되지 않았습니다. (Bug #36076308)

  • Group Replication: 새 primary를 성공적으로 설정한 후, group_replication_set_as_primary()는 일부 경우 작업이 완료되기를 무기한 기다렸습니다. (Bug #36059098)

  • JSON: JOINGROUP BY는 일부 JSON 컬럼 값을 서로 다르게 처리했습니다. (Bug #101048, Bug #31969607)

  • MySQL NDB ClusterJ: 이제 삭제할 항목 수를 제한하기 위해 setLimits() 메서드를 deletePersistentAll()에 체이닝할 수 있습니다. 자세한 내용은 deletePersistentAll() 설명을 참조하십시오. (Bug #36049906)

  • CMake 및 Bison에 현재 필요한 버전과 맞추기 위해 BuildRequire 규칙을 업데이트했습니다. (Bug #36343254)

  • 높은 부하 상태에서 실행될 때 SET GLOBAL offline_mode=ON이 항상 올바르게 수행되지는 않았습니다. (Bug #36275182)

    참조: 함께 참조하십시오: Bug #36405894.

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

  • mysqldump가 항상 서버 버전을 올바르게 해석하지는 않았습니다. (Bug #36248967)

    참조: 함께 참조하십시오: Bug #36405879.

  • 뷰를 쿼리할 때 사용된 캐릭터셋과 다른 캐릭터셋으로 뷰가 생성된 경우, 뷰에 대한 조건 푸시다운이 콜레이션 불일치로 거부되었습니다. (Bug #36246859)

  • CMake 3.28.1 이상과의 호환성을 제공하기 위해 더 이상 사용되지 않는 exec_program() 명령 사용이 execute_process()로 대체되었습니다. (Bug #36220656)

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

  • Enterprise Linux RPM을 빌드할 때, 빌드 스크립트가 이제 더 새로운 strip 명령(/opt/rh/gcc-toolset-12 아래)을 가리키며, 해당 dwz 도구를 사용할 수 있는지도 이제 확인합니다. 이전에는 이것이 EL8에 대해서만 구현되어 있었습니다. (Bug #36090069)

  • link-time optimization을 사용하여 Oracle Linux에서 빌드할 때 이제 gcc-argcc-ranlib를 찾습니다. (Bug #36089900)

  • 특정 쿼리에 대한 응답으로 서버가 때때로 예기치 않게 종료되었습니다. (Bug #35957627)

  • 특정 경우에 lateral join이 올바르게 처리되지 않았습니다. (Bug #35945239)

    참조: 다음도 참조하십시오: Bug #107700, Bug #34338001. 이 문제는 다음의 회귀입니다: Bug #32644631.

  • 뷰 및 테이블 DDL에 의한 뷰 및 트리거 definer 처리가 개선되었습니다. (Bug #35942937)

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

  • 다중 값 인덱스가 있는 테이블에 대해 쿼리를 실행할 때, 서버가 때때로 예기치 않게 종료되었으며, 대개 이 인덱스를 사용하는 복잡한 SELECT 쿼리를 실행하는 동안 발생했습니다. (Bug #35789759)

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

  • CREATE USER IF EXISTS가 항상 올바르게 로깅되지는 않았습니다. (Bug #35530823)

  • 서버가 파티션 표현식에서 서브쿼리를 올바르게 금지하지 않았습니다. 이는 유효하지 않으며, 문법 오류를 발생시켜야 합니다. (Bug #35476172)

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

  • 연속된 ALTER TABLE... ALGORITHM=COPY 문이 서로 10초 이내에 실행되었을 때, n_rows 값이 0이 되었습니다. (Bug #35127747)

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

  • MySQL 8.0.30에서 처음 처리된 이전 문제에 대한 수정이 불완전했습니다.

    기여해 주신 Hao Lu에게 감사드립니다. (Bug #113174, Bug #36035044)

    참조: 이 문제는 다음의 회귀입니다: Bug #110801, Bug #35328028.

  • s390x에서는 이제 과도한 최적화를 피하기 위해 FMA 테스트를 -O2로 컴파일합니다.

    기여해 주신 Jonathan Albrecht에게 감사드립니다. (Bug #113096, Bug #36016140)

  • s390x가 big-endian 플랫폼임에도, 컴파일에 little-endian ICU 데이터 디렉터리가 사용되었습니다.

    기여해 주신 Jonathan Albrecht에게 감사드립니다. (Bug #113095, Bug #36016141)

  • group by loose index scan을 사용한 쿼리에서 때때로 잘못된 결과가 얻어졌습니다. (Bug #112541, Bug #35854362)

  • CHAR(0) 또는 BINARY(0)와 같은 길이가 0인 컬럼이 있는 데이터를 테이블에 삽입할 때 디버그 빌드에서 어설션이 실패했습니다. 이제 덜 엄격한 어설션은 소스에서 복사된 바이트 수가 0이 아닌 경우 그 바이트가 대상과 동일하다는 것을 감지할 때에만 더 정확하게 실패합니다. (Bug #111450, Bug #35507763)

  • 상관 lateral 또는 기타 종속 서브쿼리 안의 VALUES 문이 잘못된 결과를 산출했습니다. (Bug #109252, Bug #110076, Bug #34852090, Bug #35087820)

  • IN은 왼쪽의 표현식이 NULL인 경우뿐만 아니라, 목록에서 일치하는 항목을 찾지 못했고 목록의 표현식 중 하나도 NULL인 경우에도 NULL을 반환해야 합니다. 일부 경우에는 테이블에 로우를 추가하면 결과가 동일하게 유지되어야 하는데도 이후의 prepared SELECT NULL IN (SELECT...) 쿼리가 다른 결과를 반환하는 것으로 확인되었습니다. (Bug #94857, Bug #29602835)