MySQL 8.0 Release Note

8.0.38 변경 사항 (2024-07-01 GA)

Estimated reading: 2 minutes 99 views

공식 문서: Changes in MySQL 8.0.38 (2024-07-01, General Availability)

감사 로그 관련 사항

감사 로그에서 파일을 제거하거나 이름을 변경한 후에 감사 로그 가지치기가 작동하지 않았습니다. 이제 이러한 경우에도 가지치기가 계속되지만, 누락된 감사 로그 파일을 삭제할 수 없었다는 경고가 오류 로그에 출력됩니다. (버그 #35902913)

C API 관련 사항

서버 측 준비된 문장의 결과를 수신하는 동안, C API 애플리케이션이 중단되었습니다.

컴파일 관련 사항

번들된 googletest 소스와 googlemock 소스를 버전 1.14.0으로 업그레이드했습니다. (버그 #36562482)

GenError에 누락된 종속성을 추가했습니다. (버그 #36551721)

Linux 시스템에서 -DWITH_TCMALLOC=BUNDLED를 지정하여, 소스에 포함된 번들된 tcmalloc 라이브러리를 사용하여 MySQL을 빌드할 수 있게 되었습니다. 이는 Linux에서만 지원됩니다. (버그 #36313839)

번들된 tcmalloc()은 이제 Enterprise Linux 8에서 MySQL을 빌드할 때 사용됩니다. (버그 #114844, 버그 #35674008)

Linux aarch64 플랫폼 바이너리는 페이지 크기로 4k 또는 64k를 사용하는 시스템과의 호환성을 유지하기 위해 patchelf --page-size=65536을 사용하여 빌드되도록 변경되었습니다. (버그 #114233, 버그 #36393794)

연결 관리 관련 사항

connection_control 플러그인이 도입한 지연 후에 conn_delay/Waiting 상태가 재설정되지 않아 잘못된 모니터링 정보가 생성되었습니다. (버그 #35205358)

데이터 딕셔너리 관련 사항

일반 열과 생성된 열이 혼합된 MyISAM 테이블을 MySQL 5.7에서 8.0 이상으로 업그레이드하려고 하면 테이블이 손상되었습니다. (버그 #106301, 버그 #35503328)

플러거블 인증

mysql_native_password 플러그인으로 인증할 때 발생하는 사용 중단 경고가 이제 한 번만 표시됩니다. (버그 #35792948)

스레드 풀 관련 사항

연결 핸들러 스레드가 없는 스레드 그룹에 연결하면 연결이 중단됩니다. 연결 핸들러 스레드가 하나 이상 남아 있는 경우에만 연결 핸들러 스레드가 종료되도록 하여 이 문제를 해결했습니다. (버그 #36550125)

버그 수정

InnoDB: ALTER TABLE 작업 후 UPDATE에서 MySQL이 예기치 않게 중단되었습니다. (버그 #36571091)
참고: 이 문제는 버그 #35183686의 회귀입니다.

InnoDB: 로그 인덱스 크기 계산에서 열 순서 변경이 고려되도록 수정되었습니다. (버그 #36526369)
참고: 이 문제는 버그 #35183686의 회귀입니다.

InnoDB: InnoDB에 의해 수행되는 파일 시스템 작업은 디렉터리 변경 작업을 수행할 때 부모 디렉터리를 일관되게 fsync하도록 변경되었습니다. (버그 #36174938)

InnoDB: 디버그 빌드에서 innodb_interpreter_output 디버그 변수를 설정하면 서버가 예기치 않게 중단되었습니다. 이제 이 변수는 읽기 전용으로 변경되었습니다. (버그 #36041032)

InnoDB: 중복 행 형식(MySQL 5.7.35 이전에서 허용되었던)에 대해 너무 넓은 열 인덱스를 사용하여 생성된 테이블의 경우, 인플레이스 업그레이드로 인해 테이블이 조용히 가져와졌지만, 테이블에 접근할 수 없었고 백업 생성에 문제가 발생했습니다. 이제 유효하지 않은 인덱스를 사용하는 모든 작업은 인덱스가 삭제될 때까지 ER_INDEX_CORRUPT로 거부됩니다. ER_IB_INDEX_PART_TOO_LONG 오류도 에러 로그에 보고됩니다. (버그 #35869747)
참고: 버그 #34826861도 참조하십시오.

InnoDB: 컬럼 인덱스가 유효할 때, 유효하지 않은 컬럼 인덱스를 참조하는 InnoDB 어설션 오류가 발생했습니다. (버그 #34800754)

InnoDB: 빈 XA 트랜잭션의 경우, XA START 후 서버를 종료하면 서버가 예기치 않게 중단됩니다. (버그 #32416819)

InnoDB: 빈 XA 트랜잭션을 처리하는 동안 복제 적용기 또는 바이너리 로그 적용기를 종료하면 시스템이 예기치 않게 중단되었습니다. (버그 #32416819)

InnoDB: Validate_files::check() 함수에서 불필요한 힙 사용을 제거했습니다.
기여해 주신 화시옹 송에게 감사드립니다. (버그 #115041, 버그 #36626203)

InnoDB: 파티션 테이블을 innodb_parallel_read_threads=1로 읽을 때, 256회 읽기 후 어떤 테이블에서도 읽기 성능이 크게 저하되었습니다. InnoDB는 병렬 읽기 스레드를 사용하지 않음에도 불구하고 병렬 읽기 스레드의 최대 용량에 도달한 것처럼 동작했습니다.
기여해 주신 케 유에게 감사드립니다. (버그 #114154, 버그 #36347408)

InnoDB: 공간 참조 식별자(SRID) 속성이 있는 열을 포함하는 공간 인덱스의 결과가 비어 있었습니다. 또한, 공간 인덱스에서 FORCE INDEX를 사용하여 커버링 인덱스 스캔을 강제하면 어설션이 발생했습니다. (버그 #112676, 버그 #114200, 버그 #35894664, 버그 #36361834)

InnoDB: 수천 개의 읽기 전용 트랜잭션이 존재하는 경우, data_lock 테이블 및 data_lock_waits 테이블을 쿼리하는 것과 관련된 성능 문제가 수정되었습니다. (버그 #109539, 버그 #34951273)

복제: 소스에 JSON 함수를 통해 입력된 저장된 생성된 열이 포함되어 있고 binlog_row_imageMINIMAL로 설정된 경우, 기반이 되는 열에 대한 이후의 업데이트 또는 삭제가 다음 오류로 실패했습니다:

Invalid JSON text in argument 1 to function json_extract: 'The document is empty.'

복제본이 생성된 열을 다시 평가하려고 시도했지만 기반이 되는 열을 사용할 수 없어 해당 오류로 실패했습니다. 이번 릴리스부터는 기반 열을 사용할 수 없는 경우 (저장된) 생성된 열은 다시 평가되지 않습니다. (버그 #36515172)

복제: relay_log_space_limit이 활성화된 GTID 기반 복제를 실행할 때, 자동 포지셔닝 프로토콜을 재시작하면 때때로 무한 루프에 빠져 복제에서 데드락이 발생했습니다. 이는 레플리카가 이전 로그를 정리할 수 없을 때뿐만 아니라, 이 제한을 초과하는 크기의 트랜잭션에 대해서도 relay_log_space_limit이 준수되지 않았기 때문입니다.이 문제를 해결하기 위해 다음과 같은 변경을 했습니다:

  • 수신기(receiver)는 수신한 트랜잭션이 정리된 릴레이 로그에 맞출 수 없는 경우를 제외하고, 사용자가 설정한 relay_log_space_limit을 준수합니다. 수신된 트랜잭션을 큐에 넣기 전에, 수신기는 전체 트랜잭션을 스케줄링할 수 있는지 확인합니다. 그렇지 않으면 수신기는 다음 작업을 수행합니다:
    • 수신기가 대기 중임을 나타내는 플래그를 설정합니다.
    • 릴레이 로그를 로테이션시킵니다.
    • 릴레이 로그 정리가 실행되었고 어플라이어(applier)가 사용 가능한 모든 릴레이 로그를 정리했다는 알림을 받을 때까지 기다립니다. 이후 수신기는 제한을 다시 확인하지 않고 트랜잭션을 큐에 넣을 수 있습니다.
  • 다음 파일로 이동하기 전에, 코디네이터(coordinator)는 수신기가 사용 가능한 릴레이 로그 공간을 기다리고 있는지 확인합니다. 그렇다면 코디네이터는 현재 릴레이 로그 파일을 포함하여 적용된 로그를 강제로 정리합니다. 현재 릴레이 로그 파일을 안전하게 정리하려면 코디네이터는 다음을 수행해야 합니다
    • 다음 파일로 이동하기 전에 모든 작업자를 동기화합니다.
    • 릴레이 로그의 현재 정리를 허용하기 위해 필요한 그룹 위치를 강제로 업데이트합니다.
    • 어플라이어가 이동된 릴레이 로그 파일 이름을 포함하는 수신기가 읽는 변수를 업데이트합니다.

이러한 작업은 수신기가 트랜잭션 경계에서 대기하고 있으며, 대기하기 전에 릴레이 로그를 회전한다는 것을 알고 있기 때문에 허용됩니다.
(버그 #36507020)

복제: 작업자는 이제 relay_log에 정의된 기본값을 사용하는 대신, 트랜잭션을 시작한 릴레이 로그 파일에 대한 정보를 포함합니다. (버그 #36395631)

복제: 트랜잭션이 바이너리 로그에 커밋되는 동안 인시던트를 처리하면 MySQL이 무기한 대기하는 문제가 발생했습니다. (버그 #35671897)

그룹 복제: /xcom/gcs_xcom_networking.cc에서 메모리 누수가 제거되었습니다. (버그 #36532199)

그룹 복제: 특정 상황에서, 프라이머리의 호스트의 네트워크 비활성 상태가 20초 이상 지속되면, 세컨더리들이 예기치 않게 중단될 수 있었습니다. (버그 #36306144)

그룹 복제: 특정 상황에서, 릴레이 로그 로테이션 직전에 가비지 컬렉션이 발생하면, 어플라이어가 세컨더리 멤버에서 새로운 트랜잭션 적용을 중단할 수 있었습니다. 이는 가비지 컬렉션이 릴레이 로그의 last_committedsequence_number를 증가시켜, 로그 로테이션 후 기록된 sequence_number에 갭을 만들었기 때문입니다. 릴레이 로그의 다른 위치에서 갭이 발생한 경우 어플라이어는 영향을 받지 않았습니다.
이번 릴리스부터는 가비지 컬렉션 중에 last_committed만 업데이트됩니다. (버그 #36280130, 버그 #36446250)

JSON: NULLIF(), COALESCE(), 그리고 시프트(>>) 연산자에 누락된 오류 처리 체크를 추가했습니다. (버그 #113668, 버그 #35513196, 버그 #36198403)
참고: 버그 #31358416도 참조하십시오.

MySQL NDB ClusterJ: ClusterJ 테스트 스위트를 실행하면 스레드 수가 존재하지 않는다는 오류 메시지가 표시되었습니다. 이는 스레드와 연결 처리가 잘못되었기 때문이며, 이 패치로 수정되었습니다. (버그 #36086735)

특정 숫자의 평균이 항상 올바르게 계산되지 않았습니다. (버그 #36563773)

strings의 다음 파일에 잘못된 라이선스 정보가 포함되어 있었습니다:

  • mb_wc.h
  • ctype-uca.cc
  • ctype-ucs2.cc
  • ctype-utf8.cc
  • dtoa.cc
  • strxmov.cc
  • strxnmov.cc

(버그 #36506181)

특정 비정상적인 경우에, UpdateXML() 함수가 그 인수를 모두 올바르게 처리하지 않았습니다. (버그 #36479091)

SRID 속성이 있는 열을 포함하는 공간 인덱스에서 FORCE INDEX를 사용한 쿼리를 설명하면 예기치 않은 종료가 발생했습니다. (버그 #36418426)

식의 참조 카운트를 증가시킬 때, 이 식 내의 기반 식은 참조되지 않습니다. 식을 삭제할 때, 참조 카운트를 감소시킨 후 기반 식도 검사되어, 결과적으로 의도치 않게 기반 식이 삭제되었습니다. 이 문제는 Item_ref::real_item()sql/item.h의 어설션에서 발생했습니다. 현재 식에 유일하게 남은 참조가 포함되지 않는 한, 기반 식을 참조하지 않도록 함으로써 이 문제를 수정했습니다. (버그 #36204344, 버그 #36356279)

특정 조건에서 EXPLAIN FORMAT=JSON FOR CONNECTION으로 인해 예기치 않은 종료가 발생할 수 있었습니다. (버그 #36189820)

특정 조건에서 경쟁 상태로 인해 TABLE_HANDLES가 사용하는 RAM의 양이 최대 9GB까지 증가할 수 있었습니다. (버그 #36170903)

일부 CREATE USER 문이 올바르게 처리되지 않았습니다. (버그 #36022885)

ORDER BYLIMIT를 포함하는 SELECT의 경우, 옵티마이저는 처음에 매우 비용이 큰 풀 테이블 스캔을 선택한 다음, 다른 체크를 수행하여 perform_order_index 타입의 패스를 사용했지만, 이는 옵티마이저 플랜의 비용에 반영되지 않았습니다. (버그 #35930969)

DB 종료 시 클라이언트 연결이 매번 올바르게 종료되지는 않았습니다. (버그 #35854919)

모든 내부 ACL 비트마스크 변수는 명시적으로 32비트(uint32_t)로 변경되었습니다. (버그 #35507223)

FIND_IN_SET()에 함수 인덱스를 추가할 수 없었습니다. (버그 #35352161)

풀텍스트 인덱스와 innodb_optimize_fulltext_only가 활성화된 동일한 테이블에서 두 개의 OPTIMIZE TABLE 문을 동시에 실행하면 서버가 종료될 수 있었습니다. (버그 #34929814)

Valgrind에서 authentication_kerberos를 실행하는 동안 관찰된 메모리 누수를 제거했습니다. (버그 #34482788, 버그 #36570929)

비추천된 데이터 마스킹 플러그인이 구현한 gen_range() 함수가 항상 올바른 결과를 반환하지 않았습니다.
이 문제는 데이터 마스킹 플러그인에만 영향을 주었으며, 이를 대체하는 데이터 마스킹 컴포넌트에는 영향을 미치지 않았습니다. (버그 #34163992)

include/my_command.h에 잘못된 주석을 수정했습니다.
기여해 주신 쇼 나카조노에게 감사드립니다. (버그 #114507, 버그 #36455468)

결정론적 스토어드 함수가 return 문 내에서 JOIN ON을 사용할 경우, 결정론적 스토어드 함수가 잘못된 결과를 반환할 수 있었습니다. 예를 들어, 두 번의 실행 사이에 FLUSH TABLES로 인해 테이블 메타데이터가 유발되어 쿼리를 재준비해야 하는 경우, ON 절이 손실될 수 있었습니다. (버그 #114235, 버그 #36379879)

준비된 문 실행 시에 THREADSPROCESSLIST_INFO 열이 업데이트되지 않았습니다.
기여해 주신 다니엘 렌스키와 아마존에 감사드립니다. (버그 #104121, 버그 #33057164)

Leave a Comment



이 문서 공유

8.0.38 변경 사항 (2024-07-01 GA)

링크 복사

CONTENTS