MySQL 8.0.40 릴리스 노트
MySQL 8.0.40 Community Server 릴리스 노트를 한국어로 번역하고, DBA가 참고해야 할 핵심 내용을 함께 정리하였습니다.
DBA를 위한 핵심 내용
MySQL 8.0.40은 관측성·보안·InnoDB 안정성 측면에서 볼 항목이 많은 릴리스입니다. 특히 Performance Schema의 data_locks/data_lock_waits 조회 방식이 바뀌어 잠금 관측 부하가 줄었지만, 결과 스냅샷의 의미가 일부 달라졌습니다. 잠금 대기 분석을 자동화해둔 DBA라면 이 변경은 단순 성능 개선이 아니라 해석 방식 변경으로 봐야 합니다.
- Performance Schema
data_locks와data_lock_waits가 재설계되어 전역 뮤텍스 의존이 줄고,sys.innodb_lock_waits도 부하가 큰 환경에서 훨씬 적은 잠금만 조회하도록 개선되었습니다. 대신 개별 트랜잭션이 보유한 모든 잠금의 일관된 스냅샷을 항상 보여주던 이전 방식과 달라질 수 있으므로, 잠금 진단 쿼리나 모니터링 결과 해석을 점검해야 합니다. mysql클라이언트에system명령을 제어하는--system-command옵션이 추가되었습니다. 기본값은 활성화이지만, 운영 서버에서 클라이언트의 OS 명령 실행을 제한하려는 보안 정책이 있다면--system-command=OFF또는--skip-system-command를 검토할 수 있습니다.- OpenSSL이 3.0.15로 업데이트되었고, 이 버전에는 X.509 name check와
SSL_select_next_proto()관련 서비스 거부/버퍼 과읽기 수정이 포함되어 있습니다. 번들 OpenSSL을 쓰는 플랫폼에서는 보안 패치 성격이 분명합니다. (OpenSSL 3.0 변경 내역) - InnoDB에서는 조인 성능 회귀,
INSTANT알고리즘으로 컬럼을 삭제하거나 기본값을 변경한 뒤 발생할 수 있는 서버 중단, redo log 용량 축소 후 쓰기 불능, FTS/보조 인덱스/테이블스페이스 import 관련 문제가 수정되었습니다. 온라인 DDL과 INSTANT DDL을 적극적으로 쓰는 환경에서는 업그레이드 전후 DDL 회귀 테스트가 필요합니다. - Group Replication에서는 primary의 짧은 네트워크 비활성 이후 모든 secondary가 예기치 않게 종료될 수 있던 문제가 포함되어 있습니다. 클러스터 네트워크가 불안정하거나 장애 주입 테스트를 수행하는 환경에서는 멤버 상태 변화와 자동 복구 동작을 확인해야 합니다.
- 별도 웹 검색에서는 8.0.40 자체에 대한 널리 알려진 비공식 회귀 보고를 확인하지 못했습니다. 이 버전은 외부 이슈보다 Performance Schema 잠금 관측 방식 변경, OpenSSL 보안 업데이트, InnoDB/Group Replication 안정성 수정이 핵심입니다.
C API 관련 사항
- 비동기 인터페이스는 상태 정보를 저장하기 위해 안전하지 않은 static 지역 변수를 사용했습니다. (Bug #115703, Bug #36891894)
컴파일 관련 사항
-
MySQL이 Fedora 41에서 컴파일되지 않았습니다. (Bug #37046924)
-
MySQL이 Ubuntu 24.10에서 컴파일되지 않았습니다. (Bug #37042308)
-
Oracle의 Open Source 가이드라인을 준수하기 위해 MySQL 소스에
CONTRIBUTING.md및SECURITY.md파일을 추가했습니다. (Bug #36998165) -
CMAKE_MINIMUM_REQUIRED를 올바른 필수 CMake 버전(3.14.6) 및 MySQL에서 사용하는 타사 라이브러리에 대한 CMake 정책과 맞추었습니다. (Bug #36978193) -
시스템 curl 라이브러리에 링크하는 대신 curl을 포함하는 바이너리 패키지가 curl 8.9.1을 사용하도록 업그레이드되었습니다. curl 버전 8.9.1에서 수정된 중요한 문제는 https://curl.se/docs/security.html에 설명되어 있습니다. (Bug #36967379, Bug #36955197)
-
포함된
zlib라이브러리가 버전 1.2.13에서 버전 1.3.1로 업그레이드되었습니다. (Bug #36950863) -
CMake 옵션
BUILD_SHARED_LIBS및CMAKE_SKIP_INSTALL_ALL_DEPENDENCY는 이제 빌드의 최상위 수준에서OFF로 설정됩니다. (Bug #36930664) -
번들로 제공되는
libcurl라이브러리를 버전 8.9.0으로 업그레이드했습니다. (Bug #36886877) -
번들로 제공되는
lz4라이브러리가 버전 1.10.0으로 업그레이드되었습니다. (Bug #36886747) -
CMake용
-DWITHOUT_SERVER옵션이 Enterprise Linux 7에서 작동하지 않았습니다. (Bug #36824515) -
MySQL과 함께 사용되는
libfido의 버전이 1.15.0으로 업그레이드되었습니다. (Bug #36752604) -
MySQL 코드베이스에 사용되는 clang-format의 버전이 10에서 15로 업그레이드되었습니다. (Bug #36500268)
-
번들로 제공되는 TI-RPC 버전이 1.3.5로 업그레이드되었습니다. (Bug #115698, Bug #36886602)
-
Protobuf 22 이상을 사용하여 MySQL을 빌드할 수 없었습니다.
기여해 주신 Gordon Wang에게 감사드립니다. (Bug #115163, Bug #36678092)
SQL 함수 및 연산자 관련 사항
DATABASE()가UNION쿼리의 일부로 사용될 때 이 함수의 출력이 잘렸습니다. (Bug #36871927)
Performance Schema 관련 사항
-
Performance Schema
data_locks및data_lock_waits테이블을 다시 설계하여, 이를 쿼리하는 데 트랜잭션 또는 잠금 시스템에 대한 배타적 전역 뮤텍스가 필요하지 않도록 했습니다. 이제 이전에는 트랜잭션을 반복 처리했던 것과 달리, 잠금을 보유하는 해시 테이블의 버킷을 반복 처리하여 활발히 처리 중인 샤드에만 래치를 겁니다. 또한 이는 속도와 메모리 측면에서 반복 처리 로직의 복잡도를 개선하여 이러한 쿼리가 시스템의 나머지 부분에 미치는 영향을 줄입니다.쿼리 결과는 두 버킷을 방문하는 사이에 트랜잭션이 커밋되거나, 시작되거나, 또는 소유한 잠금 집합을 변경한 경우 트랜잭션 잠금의 불완전한 목록을 표시할 수 있습니다. 이는 두 개의 서로 다른 트랜잭션이 서로 다른 시점에 표시될 수는 있었지만, 개별 트랜잭션이 보유한 잠금의 일관된 스냅샷을 항상 표시했던 이전 동작과 다릅니다. 다시 말해, 새 접근 방식은 충돌하는 잠금이 대기 중인 잠금과 항상 같은 버킷에 있으므로, 단일 대기 큐의 일관된 뷰를 제공하여 대기 중인 잠금과 충돌하는 잠금을 표시하지만, 이전 접근 방식은 해당 잠금이 다른 트랜잭션에 속해 있었기 때문에 그중 일부를 놓칠 수 있었습니다. 이전 접근 방식은 보고된 트랜잭션이 보유한 다른 모든 잠금을 항상 표시했지만, 충돌 중인 경우에도 다른 트랜잭션의 잠금을 놓칠 수 있었습니다. (Bug #112035, Bug #113761, Bug #36302624, Bug #36015586, Bug #36690035, Bug #35712638, Bug #36891888)
-
부하가 높은 인스턴스에서
SELECT * FROM sys.innodb_lock_waits;를 실행하면 서버 성능에 영향을 주었습니다.이 릴리스부터
SELECT * FROM sys.innodb_lock_waits;는 각 대기마다 모든 잠금을 두 번 스캔하는 대신, 각 대기마다 잠금 2개만 가져옵니다.이 수정의 일부로
DATA_LOCKS및DATA_LOCK_WAITS에 기본 키가 추가되었습니다. (Bug #100537, Bug #31763497)
sys 스키마 관련 사항
- 이 릴리스에서는
innodb_lock_waits뷰의 성능이 개선되었습니다. (Bug #36337708)
Thread Pool 관련 사항
- 일부 동시 연결 시도가 올바르게 처리되지 않았습니다. (Bug #36625082)
추가되거나 변경된 기능
-
중요한 변경 사항: OpenSSL 라이브러리가 번들로 제공되는 플랫폼의 경우, MySQL Server에 링크된 OpenSSL 라이브러리가 버전 3.0.15로 업데이트되었습니다. 자세한 내용은 OpenSSL 3.0 Series Release Notes 및 OpenSSL Security Advisory [3rd September 2024]를 참조하십시오. (Bug #37021075)
-
mysql 클라이언트에
--system-command옵션이 추가되었으며, 이 옵션은system클라이언트 명령을 활성화하거나 비활성화합니다.이 옵션은 기본적으로 활성화됩니다. 비활성화하려면
--system-command=OFF또는--skip-system-command를 사용하십시오. 그러면system명령이 오류와 함께 거부됩니다. (Bug #36377685, WL #16482)참조: 다음도 참조하십시오: Bug #36248967.
수정된 버그
-
성능; InnoDB: MySQL 8.0.28에서 인라인으로 정의되었던
InnoDB내부의 여러 함수가 MySQL 8.0.33에서는 더 이상 인라인이 아닌 것으로 확인되었으며, 이는 부분적으로InnoDBadaptive hash index를 개선하기 위해 MySQL 8.0.30에서 이루어진 개선 사항에 수반된 리팩터링 때문이었습니다. 이로 인해InnoDB테이블에서 조인을 사용하는 쿼리에 부정적인 영향이 있었습니다. (Bug #111538, Bug #35531293)참조: 이 문제는 다음의 회귀입니다: Bug #81814, Bug #16739204, Bug #23584861.
-
InnoDB: InnoDB는
INSTANT알고리즘을 사용하여 기본값을NULL로 변경한REDUNDANT테이블 컬럼의 업데이트를 허용하지 않았습니다. 대신 MySQL이 예기치 않게 중단되었습니다. (Bug #36840107) -
InnoDB:
log_files_truncate로 redo log 용량을 줄였을 때, 드문 상황에서file.end_lsn이log_sys->write_lsn과 같아져 이후 redo log 쓰기가 허용되지 않았습니다. (Bug #36730830) -
InnoDB:
INSTANT알고리즘을 사용하여 컬럼을 삭제한 후DELETE또는UPDATE문을 실행할 때 MySQL 서버가 예기치 않게 중단될 수 있었습니다. (Bug #36723117) -
InnoDB: FTS 인덱스 최적화가 콜레이션 순서상 동일하지만 바이트 측면에서는 다른 토큰에서 때때로 올바르게 작동하지 않았습니다. (Bug #36652127)
-
InnoDB: 컴파일되는 동안 최적화되어 제거되는 것을 방지하기 위해
std::this_thread::sleep_for(std::chrono::seconds(0))사용을std::this_thread::yield()로 대체했습니다. (Bug #36522343) -
InnoDB: 데이터베이스에 사용자가 생성한
FTS_DOC_ID컬럼을 기본 키로 사용하여 MySQL 5.7에서 생성된 full-text 인덱스가 포함되어 있을 때 업그레이드 프로세스가 예기치 않게 중단되었습니다.이 수정에 기여해 주신 Alibaba의 Huaxiong Song 및 팀에 감사드립니다. (Bug #36496164)
-
InnoDB: 다중 값 가상 컬럼에 대한 범위 조건이 있는 인덱스에 대해 optimizer를 비활성화했습니다. (Bug #36341532)
-
InnoDB: Windows에서 파일 액세스를 느리게 하던 doublewrite buffer 회귀를 수정하고, 파일을 열 때 사용하는
FILE_FLAG_OVERLAPPED플래그 사용을 리팩터링했습니다. (Bug #36259487) -
InnoDB: 테이블의 보조 인덱스에 있는 nullable 컬럼 수가 strict mode의 영향을 받기 때문에, 테이블이 생성되었을 때와 다른
sql_mode로 테이블을 가져온 경우 스키마 불일치가 발생할 수 있었습니다. 이제 tablespace를 가져온 후 보조 인덱스 트리도 손상 여부를 확인합니다. (Bug #35799038) -
InnoDB: FTS 인덱스가 있는 테이블의 tablespace가 discard되면, 해당 FTS 테이블도 함께 삭제됩니다. 이러한 테이블을 비우는 작업을 수행할 때, 코드는 테이블 메타데이터에 FTS 인덱스가 있으면 FTS 테이블도 반드시 존재한다고 잘못 가정했습니다. (Bug #35343458)
-
InnoDB: FusionIO에 대해 시스템이 다른 섹터 크기를 지원하는지 확인할 때 초기화되지 않은 버퍼가 임시 파일에 기록되고 있었습니다. 이 확인은
innodb_flush_method가O_DIRECT또는O_DIRECT_NO_FSYNC로 설정된 경우 수행됩니다. (Bug #115229, Bug #36705034) -
InnoDB: 보조 인덱스가 관련된 테이블 rebuild 작업은 MySQL 8.0.26과 비교할 때
InnoDB임시 파일에 대해 더 많은 파일 I/O가 필요했으며, 이로 인해 쿼리 성능이 저하되었습니다. (Bug #114465, Bug #36444172) -
InnoDB: parallel index builder로 인덱스를 추가하는 작업은
Alter_stage클래스의 문제로 인해 Performance Schema가 활성화된 경우 훨씬 느렸습니다. (Bug #113505, Bug #36163502) -
InnoDB: 최근 optimizer 변경 사항을 더 잘 고려하도록
innodb.parallel_read_kill관련 unit test를 수정했으며,innodb.ddl_killunit test와 관련 macro 사용을 수정했습니다.이러한 수정에 기여해 주신 Dmitry Lenev와 Percona 팀에 감사드립니다. (Bug #113002, Bug #115416, Bug #35992036, Bug #36764973)
References: 다음도 참조하십시오: Bug #112767.
-
파티셔닝:
ALTER TABLE이 파티셔닝된 테이블에서 항상 올바르게 작동하지는 않았습니다. (Bug #36677952) -
Group Replication: 특정 조건에서 primary 호스트의 짧은 네트워크 비활성 기간 이후 모든 secondary가 예기치 않게 종료되었습니다. (Bug #35642087)
References: 다음도 참조하십시오: Bug #32673639, Bug #34565855.
-
Group Replication: 보고된 스레드별 집계 메모리가 할당된 것 중 다른 스레드가 해제한 모든
memory/sql/Gtid_set::Interval_chunk를 반영하지 않아, Group Replication 스레드thread/group_rpl/THD_applier_module_receiver에서 리소스 사용량이 부정확하게 계속 증가하는 결과로 이어졌습니다.performance_schema.memory_summary_global_by_event_name에서 보고되는 전역 메모리는 이 문제의 영향을 받지 않았습니다. (Bug #34819861) -
Group Replication:
xcom\network\xcom_network_provider_native_lib.cc에서 잠재적인 메모리 누수를 제거했습니다. (Bug #115162, Bug #36673883) -
스레드 풀과 audit log 플러그인을 모두 사용해 실행 중일 때 서버가 연결을 항상 올바르게 처리하지는 않았습니다. (Bug #37039422)
-
Debian 기반 시스템용 패키지는 이제
WITH_ZLIB=system으로 빌드되며, debug 빌드에 대해MYSQL_MAINTAINER_MODE를 비활성화합니다. (Bug #37038213) -
상용 빌드에 번들로 포함된 Kerberos 라이브러리를 버전 1.21.3으로 업데이트했습니다. 자세한 내용은 Kerberos 5 1.21.x Release Notes를 참조하십시오. (Bug #37034600)
-
regexp::Regexp_facade::~Regexp_facade()의 heap-use-after-free 경고를 제거했습니다. (Bug #36867806) -
테이블스페이스를 덤프하는 동안 mysqldump가 출력에서 특정 SQL 문을 제대로 이스케이프하지 않았습니다. 또한 이제 덤프는 다음 식별자를 백틱으로 감쌉니다:
LOGFILE GROUP,TABLESPACE,ENGINE. (Bug #36816986) -
sql/sql_executor.cc의 문제에 대한 이전 수정은const_for_execution()이 아니라const_item()을 확인했습니다. (Bug #36804785)참조: 이 문제는 다음의 회귀입니다: Bug #34951115.
-
IndexRangeScanIterator를 사용하여 인덱스 범위 스캔을 실행할 때, 리팩터링 중에IndexRangeScanIterator::m_expected_rows에 사용된 데이터 타입이 double에서 boolean으로 변경되었기 때문에 레코드 버퍼가 전혀 설정되지 않았습니다. 이 의도하지 않은 변경은 되돌려졌습니다.또한 인덱스 범위 스캔에 대해 레코드 버퍼가 활성화된 경우, 이러한 스캔을 커버하는 데 사용되는 다중 값 인덱스에서 문제가 발생했습니다. (이는 인덱스 병합 스캔의 일부로 사용될 때만 가능합니다. 인덱스 병합 스캔은 커버링 인덱스 스캔을 강제하기 때문입니다.) 문제의 원인은
Field_typed_array::key_cmp()구현에 인덱싱된 표현식에 대한 생성 컬럼의 값이 필요하지만, 이 컬럼은 다중 값 인덱스에서 사용할 수 없으므로, 스토리지 엔진이 커버링 스캔을 위해 레코드 버퍼를 채울 때 종료 범위 조건을 안전하게 평가할 수 없다는 점이었습니다. 이를 수정하기 위해, 이제 다중 값 인덱스가 커버링 인덱스 범위 스캔에 사용되는 경우 레코드 버퍼를 비활성화합니다. (Bug #36775910)References: 다음도 참조하십시오: Bug #36341532.
-
특정 트리거 및 저장 프로시저가 올바르게 처리되지 않았습니다. (Bug #36775910)
-
외부 테이블을 참조할 때 발생한 일부 오류가 올바르게 처리되지 않았습니다. (Bug #36758378)
-
Debian에서 LTO 빌드 호환성을 높이기 위해
libmysqlclient.a제거를 중단했습니다. (Bug #36737581) -
내부 함수
my_convert_internal()이 때때로 의도한 값이 아니라 포인터를 반환했습니다. (Bug #36684463)References: 이 문제는 다음의 회귀입니다: Bug #36479091.
-
서버 컴포넌트의 메모리 문제를 제거했습니다. (Bug #36600205)
-
mysql 클라이언트의 메모리 누수를 수정했습니다. (Bug #36600203)
-
AES_ENCRYPT()함수가 항상 유효한 결과를 반환하지는 않았습니다. (Bug #36593265) -
일부 경우에 매우 많은 수의 로우와 많은 테이블이 포함된 조인이 올바르게 처리되지 않았습니다. (Bug #36562979)
-
동일한 트랜잭션에서
FULLTEXT인덱스 추가와 함께 사용한DROP INDEX가 때때로 계획되지 않은 서버 종료로 이어졌습니다. (Bug #36559642) -
Optimizer 힌트의 일부 조합이 올바르게 작동하지 않았습니다. (Bug #36492114)
-
이전 문제의 수정 이후,
GROUP BY의 일부이며 select 목록에서 발견되지 않는const항목은 필드 목록에 숨겨진 항목으로 추가되지 않지만, 임시 테이블을 생성하는 동안ROLLUP작업과 관련된 표현식의 대체 항목을 검사할 때는 이 점이 고려되지 않았습니다. 필드 목록에서 발견되지 않는 항목이const항목인지 확인하고, 그렇다면 동일한 항목을 대체 항목으로 사용하도록 하여 이를 수정했습니다. (Bug #36444257)References: 이 문제는 다음의 회귀입니다: Bug #34951115.
-
데이터 마스킹 함수
gen_rnd_pan()및mask_ssn()의 테스트 중 발견된 어설션을 제거했습니다. (Bug #36397869, Bug #36398272)References: 다음도 참조하십시오: Bug #36398221.
-
FTS 비교와 관련된 문제를 수정했습니다.
기여해 주신 Alibaba의 Shaohua Wang 및 팀에 감사드립니다. (Bug #36210202)
-
일부
CREATE TABLE... SELECT문이 항상 올바르게 처리되지는 않았습니다. (Bug #36138460) -
RelWithDebInfo 빌드는 더 이상 "-g1" 플래그로 컴파일되지 않으며, 이에 따라 사용 가능한 디버깅 정보와 생성되는 파일 크기가 증가합니다. (Bug #36111629)
참조: 다음도 참조하십시오: Bug #33664929.
-
서버가
--skip-grant-tables와 함께 실행되었을 때 발생할 수 있는 잠재적 오동작을 수정했습니다. (Bug #36043213) -
조인의
ON조건에서 외부 쿼리 블록의 테이블 컬럼에 대한 참조와 관련된 문제를 이전에 수정한 내용에서 발생한 회귀를 수정했습니다. (Bug #35854686)참조: 이 문제는 다음의 회귀입니다: Bug #96946, Bug #30350696.
-
특정한 드문 경우에, 외래 키가 있는 테이블 생성을 포함하는
CREATE TABLE문이 올바르게 처리되지 않았습니다. (Bug #35553557, Bug #36350852) -
SHOW INDEX및 생성된 컬럼과 관련된 문제를 수정했습니다. (Bug #35497623) -
일부 경우에, prepared statement의 테이블 DDL이 올바르게 처리되지 않았습니다. (Bug #35221658)
-
SLES 15 대상 플랫폼을 openSUSE 15.5에서 15.6으로 변경했으며, 이는 또한 GCC 12 대신 GCC 13을 사용하고 OpenSSL 1.1.x 대신 시스템의 OpenSSL 3.x를 대상으로 빌드함을 의미합니다. (Bug #115535, Bug #36934913)
-
Debian 패키지 설명의 오타를 수정했습니다.
기여해 주신 Henning Pöttker에게 감사드립니다. (Bug #115363, Bug #36749142)
-
prefer_ordering_index=off인 경우, 참조 키가 없는 쿼리는 정렬을 피할 수 있었어야 했음에도 전체 테이블을 스캔하고 정렬하는 방식으로 되돌아갔습니다.기여해 주신 Daniel Nichter에게 감사드립니다. (Bug #113699, Bug #36213938)
-
multi-valued 인덱스와 함께 greater-than(
>) 또는 less-than(<) 비교를 사용하는 쿼리는 동일한 인덱스와 함께 equality(=) 비교를 사용하는 동일한 쿼리보다 훨씬 느리게 실행되었습니다. (Bug #104897, Bug #33334911)