MySQL 8.0 Release Note

8.0.28 변경 사항 (2022-01-18 GA)

Estimated reading: 7 minutes 78 views

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

감사 로그 관련 사항

새로운 audit_log_disable 시스템 변수를 사용하면 모든 연결된 세션 및 연결 중인 세션에 대해 감사 로깅을 비활성화할 수 있습니다. 자세한 내용은 감사 로깅 비활성화를 참조하십시오. (WL #14699)

C API 관련 사항

Clang을 컴파일러로 사용하여 Windows에서 C API 클라이언트 프로그램을 빌드할 때 사용되지 않는 변수 경고를 포함한 다양한 컴파일러 경고가 반환되었습니다. (버그 #33520805, 버그 #33520861)

캐릭터셋 지원

비호환 변경: CONVERT(_string_ USING _charset_)CAST(_string_ AS _charset_)와 동일하게 계산되어야 하는 반환값의 최대 길이를 정확하게 계산하지 못했습니다. 이로 인해 BINARY에서 비바이너리 캐릭터셋으로 변환하는 일부 문자열이 유효하지 않은 값으로 거부되어야 했지만 대신 값을 반환했습니다.
업그레이드 전에 이전 CONVERT() 동작에 의존할 수 있는 애플리케이션을 확인하고 필요에 따라 업데이트해야 합니다. 특히, 잘못된 값이 있는 CONVERT()를 사용하는 생성된 열에 대한 인덱스의 경우, 이러한 값을 수정하고 인덱스를 삭제한 후 이 릴리즈로 업그레이드하기 전에 인덱스를 다시 생성해야 합니다. 경우에 따라 인덱스를 삭제하고 다시 만드는 대신 ALTER TABLE _table_ FORCE를 사용하여 테이블을 다시 빌드하는 것이 더 간단할 수 있습니다. 자세한 내용은 SQL 변경 사항을 참조하십시오. (버그 #33199145)

EXPLAIN FORMAT=TREE에서 멀티 값 인덱스에 대한 범위가 데이터 타입이 바이너리 타입이 아닐 때에도 16진수로 인코딩된 값을 출력했습니다. 또한 문자열 타입을 사용하는 범위가 바이너리 콜레이션을 가지고 있을 때에도 16진수로 인코딩된 값이 출력되었습니다. 후자의 문제는 일반 인덱스에서도 발생했지만 멀티 값 인덱스에서는 항상 utf8mb4_0900_bin 콜레이션을 사용하기 때문에 더 명확하게 나타났습니다. 이제 바이너리 캐릭터셋을 가진 문자열 타입에 대해서만 16진수 인코딩이 사용됩니다. 비바이너리 캐릭터셋을 가진 문자열은 이제 EXPLAIN FORMAT=TREE 출력에서 특수 문자를 이스케이프한 일반 텍스트로 표시됩니다. (버그 #33343948)

일부 함수에서는 해결된 캐릭터셋이 첫 번째 인수의 캐릭터셋과 항상 동일하지 않았습니다. (버그 #32668730, 버그 #33238711)

컴파일 관련 사항

InnoDB: MSVC++ 레벨 4 컴파일러 경고(C4201, C4701, C4702, C4703, C4706)와 관련된 컴파일 문제를 해결했습니다. 이전에 비활성화되었던 컴파일러 경고가 이제 활성화되었습니다. (버그 #33464699)

InnoDB: MSVC++ 레벨 4 컴파일러 경고가 활성화되었습니다. (버그 #33437498)

InnoDB: Visual Studio 2019 버전 16.10 또는 16.11을 사용하여 MySQL의 디버그 버전을 빌드할 때 액세스 위반이 발생했습니다. 이는 STL 반복자 버그로 인한 것이었습니다. (버그 #33223243)

시스템 curl 라이브러리에 링크하지 않고 curl을 포함하는 바이너리 패키지가 curl 7.80.0으로 업그레이드되었습니다. (버그 #33576431)

데이터 타입 관련 사항

이번 릴리스에서는 날짜 및 시간 값과 관련된 다음 두 가지 문제를 수정했습니다:

  • CHAR 값(예: '12:00:00')을 DATE, DATETIME 또는 TIMESTAMP 열에 삽입할 때 잘못된 오류가 발생했습니다. DATE 열의 경우, 이 오류는 Data truncation: Incorrect date value: '2012-00-00' for column 'd' at row 1와 비슷하게 나타났습니다. 이 문제는 바이너리 및 텍스트 프로토콜 모두에서 발생했습니다.
  • 오프셋이 있는 값을 바이너리 프로토콜을 사용하여 DATE 또는 TIME 열에 삽입할 때 잘못된 결과가 나타났습니다. 예를 들어, 연결된 시간대가 GMT-5로 설정된 경우 TIME 열에 '2021-10-10 00:00:00.123+01:00'을 삽입하면 '18:00:00'이 반환되었으며, 이는 값이 연결 시간대로 변환되었음을 나타냅니다(DATETIME 열에 대해서만 시간대 변환이 적용되어야 함).

이번 수정에서는 TIMESTAMP 값에 시간대 오프셋이 있는 경우 이를 인식하고 TIME 또는 DATE 열에 삽입할 때 적절히 조정하도록 했습니다. (버그 #33616957, 버그 #33649009)
참고: 관련 버그 #33539844도 참조하십시오.

이전 문제에 대한 MySQL 8.0.27의 수정으로 인해, 부울 표현의 해결된 데이터 유형이 서명된 INT에서 부호 없는 BIGINT로 변경되어 타입 처리 과정이 단순화되었습니다. 그러나 당시에는 무해해 보였던 메타데이터 변경이 일부 MySQL 커넥터에서 문제를 일으켰습니다.
이제 원래 문제에 대한 다른 해결 방법을 제공하고 메타데이터 변경을 되돌려, 정수의 부정 값에 대해 최소 두 자릿수로 max_length를 조정했습니다. (버그 #33516898)
참고: 이 문제는 버그 #33117410의 회귀 문제입니다.

일부 열 유형(JSONTEXT 포함)의 정렬 시, 정렬 버퍼 크기가 정렬에서 가장 큰 행의 크기보다 최소 15배 크지 않은 경우 정렬 버퍼가 소진될 수 있었습니다. 이제 정렬 버퍼는 가장 큰 정렬 키 크기의 15배만 크면 충분합니다. (버그 #103325, 버그 #105532, 버그 #32738705, 버그 #33501541)
참고: 이 문제는 버그 #30400985, 버그 #30804356의 회귀 문제입니다.

사용 중단 및 제거 관련 사항

MySQL 8.0.28부터 TLS v1.0 및 TLS v1.1 연결 프로토콜에 대한 지원이 제거되었습니다. 해당 프로토콜들은 MySQL 8.0.26부터 사용 중단이 권고되었습니다. 이에 대한 배경은 IETF 메모 Deprecating TLS v1.0 and TLS v1.1를 참조하십시오. 더 안전한 TLSv1.2 및 TLSv1.3 프로토콜을 사용하여 연결을 설정해야 합니다. TLSv1.3을 사용하려면 MySQL 서버 소프트웨어와 클라이언트 애플리케이션이 OpenSSL 1.1.1 이상으로 컴파일되어 있어야 합니다.
MySQL 8.0.28부터 --tls-version 옵션을 지원하는 MySQL Shell을 포함한 클라이언트 프로그램은 TLSv1 또는 TLSv1.1로 설정된 경우 TLS/SSL 연결을 설정할 수 없습니다. 클라이언트가 이러한 프로토콜을 사용하여 TCP 연결을 시도할 경우 연결이 실패하고 오류가 반환됩니다. 소켓 연결에서는 --ssl-mode가 REQUIRED로 설정된 경우 연결이 실패하며, 그렇지 않은 경우 TLS/SSL이 비활성화된 상태로 연결이 이루어집니다.
서버 측에서 MySQL 8.0.28부터 다음 설정이 변경됩니다:

  • tls_versionadmin_tls_version의 허용 값에 TLSv1 또는 TLSv1.1이 포함되지 않습니다.
  • group_replication_recovery_tls_version의 허용 값에 TLSv1 또는 TLSv1.1이 포함되지 않습니다.
  • 비동기 복제의 경우, 복제본은 소스 서버에 대한 연결 프로토콜(SOURCE_TLS_VERSION 옵션을 통한 CHANGE REPLICATION SOURCE TO)을 TLSv1 또는 TLSv1.1로 설정할 수 없습니다.

(WL #14775)

CHARACTER SET latin1에 대한 단축어 ASCIICHARACTER SET ucs2에 대한 단축어 UNICODE가 이제 사용 중단으로 지정되었으며, 추후 MySQL 버전에서 제거될 수 있습니다. 이러한 단축어를 사용할 경우 경고가 발생하며, 대신 CHARACTER SET을 사용해야 합니다. (WL #13146)
아래 나열된 문자셋과 해당하는 모든 정렬 방식이 이제 사용 중단으로 지정되었으며, MySQL 이후 릴리스에서 제거될 수 있습니다:

  • ucs2
  • macromanmacce
  • dec
  • hp8

SQL 문이나 기타 MySQL 서버 내에서 이들 문자셋 또는 그 정렬 방식을 사용할 경우 사용 중단 경고가 표시됩니다.
위의 문자셋 대신 utf8mb4를 사용하는 것이 좋습니다. 추가 정보는 The ucs2 Character Set (UCS-2 Unicode Encoding), West European Character Sets, Central European Character Sets을 참조하십시오. (WL #13594, WL #13595, WL #13596, WL #13597)

이벤트 스케줄러 관련 사항

이전에는 super_read_only 시스템 변수가 비활성화될 때 서버가 자동으로 이벤트 스케줄러를 재시작하는 편의 기능이 제공되었습니다. 이제 동일한 편의 기능이 read_only 시스템 변수가 비활성화될 때 독립적으로 적용됩니다. 이 업데이트 이전에는 read_only를 비활성화하면 필요에 따라 super_read_only도 비활성화될 수 있었지만, 코드가 분리되어 있어 이벤트 스케줄러가 재시작되지 않았습니다. (버그 #33539082)

전문 검색 관련 사항

MATCH()가 인수의 함수로 동작하는 것이 아니라 기본 테이블의 현재 행의 행 ID를 기반으로 동작하는 방식으로 구현되었기 때문에, 이 함수를 롤업 열과 함께 사용하는 쿼리는 성능이 저하되고 결과도 신뢰할 수 없었습니다. 이러한 이유로, 다음 조건이 모두 참인 경우 MATCH()와 롤업 열을 사용하는 것이 더 이상 허용되지 않습니다:

  • MATCH()SELECT 목록, GROUP BY 절, HAVING 절 또는 ORDER BY 절에 나타납니다.
  • 쿼리가 GROUP BY ... WITH ROLLUP을 사용합니다.
  • 그룹화된 열이 MATCH()의 인수로 사용됩니다.

이러한 쿼리는 이제 ER_FULLTEXT_WITH_ROLLUP 오류와 함께 거부됩니다. (WHERE 절에서 롤업 열과 함께 MATCH()를 사용하는 것은 이 변경 사항의 영향을 받지 않으며 여전히 허용됩니다.)
자세한 내용은 전문 검색 함수를 참조하십시오. (버그 #32565923, 버그 #32996762, WL #14697)

SQL 구문 관련 사항

중요 변경 사항: 준비된 구문을 사용할 때, DATE_ADD()DATE_SUB() 함수는 YEAR, MONTH, DAY 부분만 포함된 계산(즉, 시간 부분이 없는 계산)에서도 DATETIME 값을 반환했습니다.
MySQL 8.0.22에서 준비된 구문 단일 준비(single preparation)가 구현되기 전에는, 이러한 경우 TIME 값이 반환되었습니다. 이 작업 이전에는 DATE_ADD(), DATE_SUB()ADDTIME()와 같은 특정 시간 함수의 반환 유형을 해결 시간에 인수와 해당 타입을 사용하여 결정했었습니다. 이후에는 사용자 변수 참조와 동적 매개변수가 하나의 실행 기간 동안만 상수로 간주되어 반환 타입을 다른 방식으로 결정해야 했습니다. 예를 들어, 동적 매개변수가 첫 번째 인수인 경우, DATE_ADD()의 기본 해결 타입은 DATETIME으로 간주되었습니다. 이는 DATETIME이 모든 시간 값을 수용하므로 암묵적인 재준비(reprepare)를 피할 수 있기 때문입니다.
이러한 변경 사항은 회귀 문제를 나타내며, 이 문제는 더 정밀한 해결 데이터 타입을 도출하고 해당 매개변수의 실제 값과 일치하지 않는 경우에만 재준비를 수행하는 방식으로 해결하는 것이 더 적절합니다. (이러한 기능은 이미 MySQL 서버에서 숫자 매개변수에 대해 사용 중이었습니다.) 이 수정에 의해 이 솔루션이 구현되었습니다.
이제 시간 값이 예상되는 경우 문자열 및 숫자 값을 구문 분석하고 유효한 시간 값이 발견되면 해당 값이 변환됩니다. 이 수정은 시간 함수의 해결된 데이터 타입 결정도 개선합니다.
이 수정에 따라, DATE_ADD()DATE_SUB() 함수(및 이들의 동의어인 ADDDATE()SUBDATE())의 타입은 다음과 같이 해결됩니다:

  • 첫 번째 인수가 동적 매개변수인 경우, 두 번째 인수가 YEAR, MONTH, DAY 값 조합만 포함된 간격(interval)일 때 해당 인수의 해결 타입은 DATE입니다. 그렇지 않으면 타입은 DATETIME입니다.
  • 첫 번째 인수가 DATETIME으로 해결되면 함수의 해결된 타입도 DATETIME입니다.
  • 첫 번째 인수가 DATE인 경우, 두 번째 인수가 HOUR, MINUTE, 또는 SECOND를 사용하는 간격이 아닌 한 함수의 해결된 타입도 DATE입니다. 그렇지 않으면 타입은 DATETIME입니다.
  • 첫 번째 인수가 TIME 값인 경우, 해결된 타입도 TIME입니다. 그러나 간격 인수가 YEAR, MONTH, 또는 DAY를 사용하면 함수의 해결된 타입은 DATETIME으로 설정됩니다.

위의 조건 중 하나도 충족되지 않으면 함수는 MySQL 8.0.21 이전 버전과 마찬가지로 VARCHAR로 해결됩니다.
ADDTIME()SUBTIME() 함수는 이제 다음과 같이 타입이 해결됩니다:

  • 첫 번째 인수가 동적 매개변수인 경우, 해결된 타입은 DATETIME 대신 TIME입니다.
  • 그렇지 않으면 함수의 해결된 타입은 첫 번째 인수의 해결된 타입에서 파생됩니다.

또한, DATE_ADD()DATE_SUB()의 경우 첫 번째 인수의 해결된 타입이 DATE이고 DATETIME 값이 제공되면 함수의 해결된 타입을 DATETIME으로 설정하기 위해 구문이 재준비됩니다. TIME 값이 제공된 경우에는 동작이 변경되지 않습니다.
ADDTIME()SUBTIME()의 경우 강제적인 재준비는 없습니다. (버그 #103781, 버그 #32915973, 버그 #33477883, 버그 #33539844)

이전에는 로드 가능한 함수와 저장된 함수가 동일한 네임스페이스를 공유하여 동일한 이름을 가질 수 없었습니다. 이후 구현 변경으로 동일한 네임스페이스를 공유해야 하는 이유가 사라졌고, 저장된 함수가 기존 로드 가능한 함수와 동일한 이름으로 생성될 수 있었습니다. 저장된 함수를 호출하려면 스키마 이름을 사용하여 명시적으로 호출해야 합니다. 이제 서버는 저장된 함수 이름이 기존 로드 가능한 함수 이름과 충돌할 경우 경고를 생성합니다. (버그 #33301931)

MBRContains() 함수를 사용하는 쿼리는 사용 가능한 모든 공간 인덱스를 사용하지 않았습니다. (버그 #32975221)
참조: 이 문제는 버그 #29770705의 회귀 문제입니다.

FORMAT() 함수는 es_ES 또는 es_MX 로케일을 지정했을 때 천 단위 구분 기호를 표시하지 않고 서식을 지정한 숫자를 반환했습니다. (버그 #31374305)

group_concat_max_len 값이 증가되었을 때 GROUP_CONCAT() 함수의 결과 길이가 잘못되었습니다. 작은 group_concat_max_len 값에서는 결과가 올바르게 나타났습니다. 이 문제는 산술 오버플로로 인해 발생했습니다.
기여해주신 Hope Lee에게 감사드립니다. (버그 #105380, 버그 #33521497)

옵티마이저 관련 사항

쿼리에서 범위 스캔이 먼저 선택될 수 있으며, 옵티마이저는 동일한 범위 스캔을 사용하여 정렬을 건너뛸 수 있다고 결정할 수 있습니다. 요청된 정렬이 인덱스 순서와 다를 경우, 역방향 인덱스 스캔이 필요할 수 있습니다. 요청된 정렬이 범위 스캔에서 사용되지 않은 키 부분에 대해 이루어진 경우, 범위 스캔에 사용된 키 부분의 개수를 변경 사항에 맞게 업데이트합니다. 이 문제는 키 부분 정보가 업데이트되지 않아, 사용된 키 부분 수를 기반으로 키 부분 정보를 액세스해야 할 때 발생했습니다.
이제 역방향 스캔이 확장된 키 부분을 사용할 경우 이를 기록하고, 평가에 적합한 플래그를 설정합니다. (버그 #33615893)
참조: 이 문제는 버그 #33037007의 회귀 문제입니다.

옵티마이저 트레이스와 EXPLAIN FORMAT=TREE 출력 모두에서 날짜 범위가 이진수로 출력되었습니다. 이제 이러한 경우 시간 값이 따옴표로 묶인 문자열로 출력됩니다. (버그 #33335079)

조건이 푸시다운되었을 때, 하위 쿼리의 SELECT 목록에서 사용자 변수에 대한 할당을 평가한 결과가 영향을 받는 경우가 있었습니다. 이로 인해 이제 사용자 변수에 할당이 있는 구문에 대해서는 조건 푸시다운이 방지됩니다.
기여해주신 Casa Zhang 및 Tencent 팀에 감사드립니다. (버그 #104918, 버그 #33341080)

조인 버퍼가 특정 임의 크기로 설정된 경우, 해시 조인을 위해 생성된 청크 파일 수가 너무 적었습니다. 이로 인해 각 파일에 조인 버퍼에 맞지 않는 더 많은 행이 포함되어 프로브 청크를 여러 번 읽어야 했습니다. 청크 파일이 얼마나 필요한지 계산할 때 정수 나눗셈을 사용한 것이 원인이었으며, 이를 부동 소수점 나눗셈으로 수정했습니다.
기여해주신 Øystein Grøvlen에게 감사드립니다. (버그 #104186, 버그 #33073354)

BIT 타입에 대한 집계를 사용하는 쿼리가 사용된 인덱스나 조인 타입에 따라 다른 결과를 반환할 수 있었습니다. 이는 이러한 집계를 사용하는 DML 구문이 BIT 값을 정수 타입으로 캐시한 후, 출력할 때 문자열 형식으로 변환하기 때문이었습니다. 현재 문제는 이 조회가 BIT 값을 정수로 처리하여 잘못된 문자열 값을 반환하는 데서 발생했습니다.
이 문제는 캐시된 BIT 값을 문자열 형식으로 올바르게 변환할 수 있는 새로운 내부 클래스를 추가하여 해결되었습니다.
기여해주신 Hope Lee에게 감사드립니다. (버그 #100859, 버그 #31894023)

HAVING 절 내부에 하위 쿼리가 있는 외부 DISTINCT 쿼리를 포함하는 DML 구문에서, 내부 하위 쿼리가 외부 DISTINCT 쿼리의 열을 참조하려고 시도했습니다. 이는 하위 쿼리가 HAVING 외부의 어느 곳에서 사용되거나 외부 SELECT에서 그룹화가 사용되지 않을 때만 허용되어야 합니다. 이러한 쿼리는 이러한 조건 중 어느 것도 충족되지 않았음에도 실행이 허용되었습니다.
이 문제를 해결하기 위해, 이와 같은 잘못된 열 참조를 감지하고 오류를 반환하도록 열 참조 검사를 확장했습니다.
기여해주신 Song Zhibai에게 감사드립니다. (버그 #97742, 버그 #30617496)

패키징 관련 사항

MySQL 다운로드 패키지에 서명하는 데 사용되는 GnuPG 빌드 키가 업데이트되었습니다. 이전 GnuPG 빌드 키는 2022-02-16에 만료될 예정입니다. GnuPG 서명 확인을 사용하여 MySQL 다운로드 패키지의 무결성과 진위를 확인하는 방법이나, 공개 GnuPG 빌드 키의 사본을 얻는 방법에 대한 정보는 GnuPG를 사용한 서명 확인을 참조하십시오.
GnuPG 키 업데이트로 인해 repo.mysql.com을 사용하도록 구성된 시스템에서 apt 또는 yum을 사용하여 MySQL 5.7.37 이상 또는 MySQL 8.0.28 이상으로 업그레이드할 때 서명 확인 오류가 발생할 수 있습니다. 이 문제를 해결하려면 다음 방법 중 하나를 사용하십시오:

  1. MySQL APT 또는 YUM 저장소 설치 패키지를 https://dev.mysql.com/downloads/에서 수동으로 다시 설치합니다.
  2. MySQL GnuPG 공개 키를 다운로드하여 시스템 GPG 키링에 추가합니다.

(버그 #33587308)

번들된 libedit 라이브러리가 버전 20210910-3.1로 업그레이드되었습니다. (버그 #33568767)

Performance Schema 관련 사항

이제 쿼리에 사용된 CPU 시간을 측정할 수 있는 새로운 명령문 지표 CPU_TIME이 제공됩니다.이를 지원하기 위해 다음과 같은 변경이 이루어졌습니다:

이 수정 작업을 위해 기여해주신 Facebook 팀에 감사드립니다. (버그 #32202060, 버그 #101764, WL #14779)

추가 및 변경된 기능

중요 변경 사항: 특정 SELECT 내에 나타날 수 있는 고유한 윈도우의 수가 이제 127로 제한됩니다. 고유한 윈도우의 수는 명명된 윈도우와 각 윈도우 함수의 OVER 절에서 지정된 암시적 윈도우의 합계입니다.
많은 수의 윈도우를 사용하려면 thread_stack 서버 시스템 변수를 증가시켜야 할 수 있습니다. (버그 #33279604)

InnoDB: 이제 InnoDBALGORITHM=INSTANT를 사용하는 ALTER TABLE ... RENAME COLUMN 작업을 지원합니다.
ALGORITHM=INSTANT를 지원하는 작업은 데이터 사전에서 메타데이터만 수정합니다. 테이블 데이터는 영향을 받지 않으며, 작업이 즉시 완료됩니다. 명시적으로 지정하지 않으면 ALGORITHM=INSTANT가 이를 지원하는 DDL 작업에 기본적으로 사용됩니다.
이 기능과 ALGORITHM=INSTANT를 지원하는 다른 DDL 작업에 대한 자세한 내용은 온라인 DDL 작업을 참조하십시오. (WL #14785)

MySQL Enterprise Audit를 사용하는 사용자가 실수로 시스템 관리자 자신과 다른 관리자들이 시스템에 접근할 수 없도록 하는 “중단” 항목을 감사 로그 필터에 생성할 수 있습니다. MySQL 8.0.28부터는 AUDIT_ABORT_EXEMPT 권한이 제공되어, 사용자 계정의 쿼리가 “중단” 항목으로 차단될지라도 항상 실행될 수 있습니다. 이 권한을 가진 계정은 감사 구성 오류 후 시스템에 다시 접근할 수 있습니다. 쿼리는 감사 로그에 여전히 기록되지만, 권한 덕분에 거부되지 않고 허용됩니다.
MySQL 8.0.28 이후에 생성된 SYSTEM_USER 권한을 가진 계정에는 자동으로 AUDIT_ABORT_EXEMPT 권한이 부여됩니다. MySQL 8.0.28 이상으로 업그레이드 절차를 수행할 때 기존 계정 중 이 권한이 없는 계정이 있다면, SYSTEM_USER 권한을 가진 기존 계정에도 AUDIT_ABORT_EXEMPT 권한이 할당됩니다. (WL #14670)

tmp_table_size 변수는 이제 TempTable 스토리지 엔진에 의해 생성된 개별 메모리 내부 임시 테이블의 최대 크기를 정의합니다. 적절한 크기 제한은 개별 쿼리가 전역 TempTable 리소스를 과도하게 소비하지 않도록 방지합니다. 자세한 내용은 내부 임시 테이블 스토리지 엔진을 참조하십시오. (WL #14647)

innodb_open_files 변수는 InnoDB가 한 번에 열 수 있는 파일 수를 정의하며, 이제 SELECT innodb_set_open_files_limit(N) 문을 사용하여 런타임에 설정할 수 있습니다. 이 문은 새 제한을 설정하는 저장 프로시저를 실행합니다.
LRU에서 관리되지 않는 파일이 innodb_open_files 제한을 모두 소비하지 않도록 LRU에서 관리되지 않는 파일은 이제 innodb_open_files 제한의 90%로 제한되며, 나머지 10%는 LRU에서 관리되는 파일을 위해 예약됩니다.
이제 innodb_open_files 제한에는 이전에는 계산되지 않았던 임시 테이블스페이스 파일도 포함됩니다. (WL #14591)

FROM_UNIXTIME(), UNIX_TIMESTAMP(), 및 CONVERT_TZ() 함수는 이제 64비트 값을 지원하는 플랫폼에서 64비트 값을 처리할 수 있습니다. 여기에는 64비트 버전의 Linux, MacOS, 및 Windows가 포함됩니다.
호환 가능한 플랫폼에서는, FROM_UNIXTIME()이 이제 32536771199.999999초를 최대 인수로 허용하며, 이는 UTC 기준 '3001-01-18 23:59:59.999999'에 해당합니다(최대 6자리의 선택적 소수점 포함). 인수가 이보다 크면 함수는 NULL을 반환합니다.
호환 가능한 플랫폼에서는, UNIX_TIMESTAMP()가 이제 최대 값으로 UTC 기준 '3001-01-18 23:59:59.999999'를 허용하며, 이는 Unix Epoch 이후 32536771199.999999초에 해당합니다. 인수가 이보다 크면 함수는 0을 반환합니다.
또한, 호환 가능한 플랫폼에서는, CONVERT_TZ()가 2038년을 넘어 UTC 기준 '3001-01-18 23:59:59.999999'까지 시간대 변환을 수행합니다. datetime 인수가 이 값을 초과하면 인수가 변경되지 않고 반환됩니다. 이 “no-op” 동작은 이전에 UTC 기준 '2038-01-19 03:14:07.999999'을 초과하는 값에 대해 발생했던 동작과 동일합니다.
이러한 3가지 함수의 32비트 플랫폼에서의 동작은 변경되지 않았습니다.
TIMESTAMP 타입의 동작은 이번 변경의 영향을 받지 않으며, 해당 타입의 최대 허용 값은 플랫폼에 상관없이 여전히 UTC 기준 '2038-01-19 03:14:07.999999'입니다. 이보다 미래의 날짜를 다루려면 MySQL의 DATETIME 타입을 대신 사용하십시오. (WL #14630)

이번 릴리즈에서는 글로벌 및 사용자별 메모리 할당 모니터링과 제한 기능이 도입되었습니다. 이제 Global_connection_memory 상태 변수를 확인하여 모든 사용자 연결이 소비한 총 메모리를 확인할 수 있으며, 이를 활성화하려면 global_connection_memory_tracking = 1을 설정해야 합니다.
총 메모리에는 시스템 프로세스 또는 MySQL 루트 사용자가 사용한 메모리가 포함되지만, 이러한 사용자들은 메모리 사용으로 인해 연결이 끊기지 않습니다.
InnoDB 버퍼 풀에서 사용된 메모리는 총 메모리에 포함되지 않습니다.
상태 변수가 업데이트되는 빈도는 connection_memory_chunk_size를 조정하여 간접적으로 제어할 수 있습니다. Global_connection_memory는 총 메모리 사용량이 이 크기만큼 변동될 때만 업데이트됩니다.
connection_memory_limit을 설정하여 사용자 연결당 리소스 사용량 제한을 지정할 수 있으며, 이 제한을 초과하는 사용자는 추가 쿼리를 실행할 수 없습니다. 또한 global_connection_memory_limit을 설정하여 글로벌 메모리 제한을 부과할 수 있습니다. Global_connection_memory가 글로벌 제한을 초과하면 일반 사용자는 메모리 사용을 요구하는 새 쿼리를 실행할 수 없습니다. MySQL 루트와 같은 시스템 사용자는 이러한 제한을 받지 않습니다. (WL #13458)

버그 수정

InnoDB: 인덱스 생성 작업 중 계산된 최소 I/O 버퍼 크기가 I/O 블록 크기와 일치하지 않아 레코드가 버퍼 경계를 초과할 수 있었습니다. (버그 #33570629)

InnoDB: 디버그 빌드에서 세마포어 데드락 검출기에서 사용된 sync_array_detect_deadlock 알고리즘이 코드 및 시간 복잡도 측면에서 단순화되었으며, 릴리스 빌드에서도 해당 알고리즘이 사용되도록 구현되었습니다. (버그 #33538505)

InnoDB: InnoDB 소스에 있는 ut::make_unique 라이브러리 함수가 할당된 필드의 유형을 지정할 수 있도록 허용되었습니다. (버그 #33538461)

InnoDB: 리두 로그 버퍼 메모리 할당을 추적하기 위한 Performance Schema 계측이 추가되었습니다. (버그 #33527660)

InnoDB: 세마포어 대기 시간이 길어졌을 때 오류 로그에 기록된 경고가 래치 소유자에 대한 정보를 제공하지 않았습니다. (버그 #33509386)

InnoDB: 전역 잠금 시스템 래치로 보호된 임계 구역에서 스레드가 소요하는 시간을 줄이기 위해 래치 해제 및 재획득 메커니즘이 도입되었습니다. (버그 #33502610, 버그 #33563523)

InnoDB: Windows에서 홀 펀치 작업이 실패했습니다. 이 작업은 비동기 작업으로 수행되었으며, 이 작업에는 이벤트 객체에 대한 핸들이 포함된 OVERLAPPED 구조가 필요했습니다. 그러나 OVERLAPPED 구조가 제공되지 않았습니다. (버그 #33496778)

InnoDB: InnoDB 소스의 ut_time() 인프라가 타입 검사된 표준 라이브러리 구현으로 대체되었습니다. (버그 #33460092)

InnoDB: 복원 작업 후 누락된 테이블스페이스에 접근하려는 시도를 나타내는 많은 오류가 오류 로그에 기록되었습니다. (버그 #33437625)

InnoDB: Performance Schema를 고려한 ut::make_uniqueut::make_shared 메모리 관리 라이브러리 함수가 InnoDB 소스에 추가되었습니다. 정렬된 유형을 위한 유사한 함수(ut::make_unique_alignedut::make_shared_aligned)도 추가되었습니다. (버그 #33420694)

InnoDB: InnoDB 소스의 buf_validate() 함수가 최적화되어 디버그 빌드에서 성능이 향상되었습니다.
기여해주신 Hobert Lu에게 감사드립니다. (버그 #33417058, 버그 #104967)

InnoDB: NUMA가 활성화된 시스템에서 버퍼 풀에 할당된 메모리 청크의 페이지 크기가 특정 시나리오에서 시스템 페이지 크기와 일치하지 않아 다음과 같은 오류가 발생했습니다: Failed to set NUMA memory policy of buffer pool page frames to MPOL_INTERLEAVE. (버그 #33406701)
참고: 이 문제는 버그 #32714144의 회귀입니다.

InnoDB: InnoDB 소스의 mem_heap을 사용하는 두 개의 std::unique_ptr 인스턴스가 함수 포인터 대신 무상태 함수 객체를 사용하는 Scoped_heap() 래퍼를 사용하도록 변경되었습니다. (버그 #33405520)

InnoDB: 사전 캐시를 채우는 동안 범위 끝을 초과했을 때 prebuilt 구조의 m_end_range 플래그가 true로 설정되었으나, 사전 캐시가 초기화될 때 이 플래그가 false로 재설정되지 않았습니다. 그 결과, 범위 끝을 초과하지 않은 경우에도 이후 핸들러가 다시 사용될 때 m_end_range 플래그가 잘못 설정될 수 있었습니다. (버그 #33384537)

InnoDB: 테이블 가져오기 작업 중 테이블의 테이블스페이스가 삭제된 후 새 테이블 ID가 할당되었을 때 데이터 사전의 열 메타데이터가 업데이트되지 않았습니다. (버그 #33319149)

InnoDB: 디버그 전용 시스템 변수 innodb_interpreterNULL로 설정하면 실패가 발생했습니다. (버그 #33316661)

InnoDB: 전문 검색 인덱스 생성 파일 관리가 개선되었습니다. (버그 #33270893)

InnoDB: 집계를 위해 사용된 임시 테이블에 새 행을 삽입하는 업데이트 작업이 임시 테이블을 디스크로 이동시키고, 업데이트 작업이 새 디스크 기반 임시 테이블에서 다시 시도되었습니다. 임시 테이블이 디스크로 이동되기 전에 레코드 데이터에 준비된 BLOB 포인터가 만료되어 실패가 발생했습니다. (버그 #33242407)

InnoDB: 메모리 할당이 이제 Performance Schema와 호환되는 표준 준수 맞춤 메모리 할당자를 통해 수행됩니다. (버그 #33159210)

InnoDB: 동일한 테이블에 대해 통계를 비활성화하고 다시 활성화하려는 스레드 간의 경쟁 상태로 인해 어설션 실패가 발생했습니다. (버그 #33135425)

InnoDB: innodb_flush_log_at_trx_commit 설정이 1이 아닌 경우 또는 장기 실행 트랜잭션이 있는 경우 리두 로그 플러시 속도가 일관되지 않을 수 있었습니다. (버그 #33128461)

InnoDB: 대형 페이지 할당 처리는 이를 처리하기 위해 설계된 라이브러리에 의해 수행됩니다. 대형 페이지 할당 메커니즘을 사용할 수 없는 경우, 대체 메커니즘이 정렬된 일반 페이지를 할당합니다. 대체 메커니즘은 대형 페이지 주소 공간이 부족하거나, 하드웨어 또는 운영 체제 아키텍처에서 대형 페이지 지원이 비활성화된 경우 또는 MySQL에서 대형 페이지 지원이 명시적으로 비활성화된 경우(--large-pages=0)에 발생할 수 있습니다. 대형 페이지 할당 및 할당 해제를 위한 ut_allocator 함수는 새로운 라이브러리 함수로 대체되었습니다. (버그 #33119009, 버그 #33118309, 버그 #33149501, 버그 #32135935)

InnoDB: 일반 4K 페이지 정렬 할당 처리는 이제 Performance Schema와 호환되는 독립형 라이브러리에 의해 수행됩니다. (버그 #33118362)

InnoDB: 적절하게 정렬된 유형의 동적 저장소 관리를 담당하는 새로운 InnoDB 라이브러리에 속하는 함수가 이 목적을 위해 이전에 사용된 함수를 대체했습니다. (버그 #33110341)

InnoDB: 적절하게 정렬된 유형의 동적 할당 처리는 이제 Performance Schema와 호환되는 라이브러리에 의해 수행됩니다. (버그 #33110312)

InnoDB: LOB 페이지를 해제하는 정리 배치 끝에서 필요한 인덱스 데이터 구조가 해제되어 실패가 발생했습니다. (버그 #32918325)

InnoDB: 동적 메모리 관리 함수(ut_* 함수)의 Performance Schema 계측 논리에서 불일치가 해결되었습니다. (버그 #32715466)

InnoDB: InnoDB 동적 할당 루틴의 제한 사항으로 인해 생성 가능한 유형의 배열을 동적으로 할당할 수 없었습니다. 이 제한이 해결되어 기본 생성 가능한 유형, 비기본 생성 가능한 유형 및 두 유형 모두 할당할 수 있습니다. (버그 #32714047)

InnoDB: READ COMMITTED 또는 READ UNCOMMITTED 사용 시 트리거 또는 함수 내에서 실행된 특정 쿼리가 동일한 테이블에서 동시 트랜잭션을 방해했습니다. 획득된 잠금이 너무 제한적이었습니다. (버그 #32636792)

InnoDB: 암호화되고 압축된 테이블스페이스 페이지, 대부분의 Windows 페이지 및 Microsoft 볼륨 관리 기능을 구현하지 않는 Windows 볼륨에서 홀 펀치 기능이 예상대로 작동하지 않았습니다. (버그 #32136255)

InnoDB: MySQL 8.0.28에서 타입 검사된 표준 라이브러리(std) 구현으로 ut_time() 인프라를 대체한 후 성능 저하가 발생했습니다. 이는 시스템 호출을 생성하는 std 클럭이 사용하는 시간 라이브러리로 인해 발생했습니다. 이제 저해상도 클럭이 사용됩니다. (버그 #107763, 버그 #34352870)
참고: 이 문제는 버그 #33460092의 회귀입니다.

패키징: icu-data-files RPM이 추가되었으며, 이는 서버 패키지에서 분리되었습니다. 이 패키지는 MySQL 정규 표현식에 필요한 ICU 데이터 파일입니다. (버그 #35162346)

파티셔닝: 생성된 열 표현식에서 비결정적 함수가 있는 테이블을 생성하는 것은 불가능해야 하지만, 모든 경우에 적용되지는 않았습니다. 하나 이상의 ALTER TABLE 문을 사용하여 하나 이상의 생성된 열이 포함된 파티셔닝된 테이블을 만들 수 있었습니다. 이 테이블에 대해 SHOW CREATE TABLE을 실행하여 얻은 CREATE TABLE 문을 실행하려고 할 때, MySQL은 잘못된 열이 아닌 파티셔닝 표현식을 참조하는 잘못된 오류 메시지로 문을 거부했습니다.
이는 생성된 열에 대한 안전하지 않은 표현식을 확인하는 결과(thd->safe_to_cache_query 내부 변수)에 의해 발생했으며, 파티셔닝 표현식을 구문 분석할 때 이를 다시 확인했지만 변수가 지워지지 않아 문제가 없는 경우에도 오류가 발생했습니다. 이제 이러한 경우 파티션 함수를 구문 분석하기 전에 thd->safe_to_cache_query를 재설정합니다.
AES_ENCRYPT(), AES_DECRYPT(), RANDOM_BYTES()와 같은 특정 비결정적 함수의 생성된 열에서의 사용 문제는 별도로 처리됩니다. (버그 #29268656)
참고: 관련 버그 버그 #32592320.

파티셔닝: 파티션된 테이블의 기본 키 이외의 인덱스를 사용하는 쿼리가 과도한 CPU 부하를 발생시키는 경우가 있었습니다. (버그 #104576, 버그 #33238010)

복제: 백업을 위해 인스턴스가 잠긴 동안 PURGE BINARY LOGS 문이 발행될 수 있어 서버에서 파일을 제거하는 방식으로 백업 잠금 규칙을 위반할 수 있었습니다. 이제 백업 잠금이 활성화된 상태에서는 이 문을 사용할 수 없습니다. (버그 #33437026)

복제: 테이블 또는 데이터베이스 이름이 64바이트를 초과하는 경우 테이블 맵 이벤트를 읽을 때 복제가 오류와 함께 중지되었습니다. 이제 더 긴 이름의 전송을 지원하도록 수정되었습니다. (버그 #33305975, 버그 #104798)

복제: Performance Schema 테이블 replication_applier_status_by_worker가 쿼리되는 동안 STOP REPLICA 명령이 진행 중인 경우 잠금 충돌이 발생할 수 있었습니다. 이제 이 문제가 해결되었습니다. (버그 #33290947)

복제: MySQL 8.0.26부터 반동기 복제를 구현하는 플러그인의 새로운 버전이 “master”와 “slave”라는 용어를 “source”와 “replica”로 대체하여 제공됩니다. 그 후 복제 채널이 현재 사용 중일 때 rpl_semi_sync_masterrpl_semi_sync_slave 플러그인을 잘못 제거할 수 있는 문제가 수정되었습니다. (버그 #33270401)

복제: PAD_CHAR_TO_FULL_LENGTH SQL 모드가 활성화된 복제 서버에서 복제 메타데이터 저장소 테이블의 복제 채널 이름에 공백이 추가되어, 해당 데이터를 사용하는 복제 작업에서 오류가 발생할 수 있었습니다. 이제 MySQL 8.0에서는 문자 열에 VARCHAR를 사용하여 문제를 해결했고, MySQL 5.7에서는 테이블에서 읽을 때 SQL 모드를 비활성화하여 문제를 해결했습니다. (버그 #33213841)

복제: 복제본이 연결을 끊는 동안 SHOW REPLICAS 문이 발행되면 서버가 삭제된 데이터에 액세스할 수 있었습니다. (버그 #33206343, 버그 #104566)

복제: 복제본 서버에 replica_preserve_commit_order = 1 시스템 변수가 설정된 상태에서 장기간 집중적으로 사용하면 커밋 순서 티켓이 고갈될 수 있었습니다. 최대 값 초과 후 잘못된 동작으로 인해 복제 작업자 스레드가 무기한 대기 상태에 빠졌습니다. 이제 커밋 순서 티켓 생성기가 올바르게 순환되도록 수정되었습니다. (버그 #32891221, 버그 #103636)

복제: 복제 소스 서버가 4GB 오프셋을 초과하는 바이너리 로그 파일 위치를 포함하는 하트비트 이벤트를 전송할 때 복제 수신 스레드가 오류로 중지되었습니다. 이 상황을 처리하는 새로운 하트비트 이벤트(Heartbeat_log_event_v2, 로그 이벤트 유형 41)가 추가되었습니다. (버그 #29913991)

그룹 복제: 성능 스키마 복제 그룹 멤버 통계 테이블이 확인되는 동안 자동 재가입 절차에서 Group Replication이 예상치 않게 중단될 수 있었습니다. 이제 작업의 동시 처리가 올바르게 처리됩니다. (버그 #33609089)

그룹 복제: 분산 복구를 위한 기증자로 그룹 멤버를 선택하는 과정에서 운영 체제에 정의된 표준 난수 선택기를 사용합니다. 이 난수 선택기가 사용 불가능할 때 예외가 발생하여 멤버 가입 절차가 중단되었습니다. 이제 Group Replication은 이러한 가능성을 고려하여 운영 체제의 난수 선택기가 오류를 반환하는 경우 대체 선택기를 사용합니다. (버그 #33596124)

그룹 복제: STOP GROUP_REPLICATION 문은 그룹 멤버의 비동기 복제 채널을 중지하지만, 진행 중인 트랜잭션을 명시적으로 커밋하지 않습니다. Group Replication 그룹 멤버에서 종료 중 추가 트랜잭션이 커밋되면 그룹과의 불일치가 발생하여 다시 가입하는 데 문제가 발생할 수 있습니다. 서버는 작업 완료 후 읽기 전용 상태로 남습니다. 따라서 이러한 문제를 방지하기 위해 gtid_next 시스템 변수에 GTID가 할당되어 있는 동안에는 STOP GROUP_REPLICATION 문을 실행할 수 없습니다. (버그 #33412483)

그룹 복제: Group Replication 자동 재가입 절차를 사용하는 추방된 그룹 멤버가 다른 그룹 멤버로부터 정보를 수집하는 동안 호환성 검사가 완료되기 전에도 상태를 RECOVERING으로 너무 일찍 보고했습니다. 상태 변경은 멤버가 실제로 그룹 멤버로 승인되는 시점인 뷰 설치 중에 수행됩니다. (버그 #33380840)

그룹 복제: CMake 옵션 DWITH_GROUP_REPLICATION=0을 사용하여 MySQL 소스 배포에서 Group Replication 플러그인을 비활성화해도 관련 응용 프로그램과 테스트가 비활성화되지 않아 빌드에 문제가 발생했습니다. (버그 #33308513)

그룹 복제: Group Replication에서 SET gtid_next 문이 그룹 멤버에서 다음 트랜잭션의 GTID를 설정하는 데 사용되는 경우, 다른 멤버에서 동시에 시작된 트랜잭션에 동일한 GTID가 사용될 수 있습니다. 두 트랜잭션이 커밋 단계에 도달하면 총 순서에서 두 번째 트랜잭션은 롤백되어 상황이 해결됩니다. 그러나 Group Replication의 트랜잭션 일관성 수준(group_replication_consistency 시스템 변수)이 BEFORE 또는 BEFORE_AND_AFTER로 설정된 경우, 한 멤버는 gtid_owned 세트에서 GTID를 소유하고, 다른 멤버는 트랜잭션을 커밋하기 전에 소유권 해제를 기다리면서 교착 상태에 빠질 수 있었습니다. 이제 대기 함수는 소유되었지만 커밋되지 않은 GTID가 아니라 커밋된 트랜잭션의 GTID만 고려하며, 세션이 동시에 커밋된 GTID를 소유한 경우 실행 중인 세션에서 오류가 발생합니다. (버그 #33051454, 버그 #104096)

그룹 복제: Group Replication의 그룹 통신 엔진(XCom, Paxos 변형)이 가입 중인 멤버와 통신하는 기존 그룹 멤버에게 문제가 있을 때(예: 네트워크 문제로 인해) 더 많은 정보를 기록합니다. 이로 인해 그룹이 가입 중인 멤버의 이전 인스턴스를 기억하고 다시 가입을 시도하지 못하게 할 수 있습니다. (버그 #32873315)

그룹 복제: Group Replication의 Group Communication System(GCS)은 추방된 멤버 중 그룹에 성공적으로 가입한 멤버와 그렇지 못한 멤버를 기록에서 구분합니다. (버그 #32630484)

그룹 복제: Group Replication이 시작되거나 중지될 때 Performance Schema의 그룹 멤버 통계를 쿼리하면 경합 상태가 발생했습니다. (버그 #32392468)

Microsoft Windows: Windows에서 MySQL Server(상업용) 및 MySQL NDB Cluster(상업용 및 커뮤니티)용 누락된 디버그 및 테스트 스위트 바이너리가 추가되었습니다. (버그 #32713189)

JSON: JSON_TABLE()에 전달된 첫 번째 인수가 단일 JSON 값이 아닌 행일 때, 행 표현식을 평가하려고 할 때 단언문이 발생했습니다. 첫 번째 인수가 행일 경우 함수 해상도 중에 오류를 발생시켜, 행 표현식 자체가 평가되지 않도록 수정했습니다. (버그 #33414235)

LPAD() 또는 RPAD()를 생성된 열의 표현식에 사용하는 경우, 부모 테이블에서 인덱스가 손상되었습니다. (버그 #33661337)
참고: 관련 버그 버그 #32668730, 버그 #33238711.

경고가 발생한 경우 임시 테이블을 사용한 집계의 결과에서 일부 행이 누락되는 경우가 있었습니다. (버그 #33603911)

openSUSE 15의 경우, mysql.spec에 libtirpc rpcgen 빌드 요구 사항이 추가되어 이제 TI-RPC를 사용합니다. (버그 #33582982)

여러 테이블에 대해 작동하는 UPDATE 문은 실행할 때마다 목록에 요소를 추가할 수 있었습니다. 요소가 목록에서 제거되지 않아 문이 실행될 때마다 메모리 사용량이 증가했습니다. 이제 실행 후 요소 목록을 지워 문제를 해결했습니다. (버그 #33574408)

Performance Schema의 processlist 테이블의 HOST 열 크기가 VARCHAR(255)에서 VARCHAR(261)로 증가했습니다. (버그 #33570218)

OpenSSL 오류로 인한 키링 마이그레이션 실패 시 단언문이 발생했습니다. SSL 오류 상태가 스레드의 OpenSSL 오류 큐에서 플러시되지 않았습니다. (버그 #33546207)

프로세스 목록 호출이 실패를 일으켰습니다. (버그 #33511690)

상업용 Debian 서버 패키지에 두 개의 테스트 플러그인(component_test_page_track_component.so 및 component_test_global_priv_registration.so)이 포함되어 있었으며, 이들은 별도의 선택적 테스트 패키지로 이동되었습니다. (버그 #33504443)

기본 Fedora dnf/yum 패키지와 같은 버전의 설치 관련 문제를 해결하기 위해 릴리스 패키지 버전 번호가 1에서 10으로 증가했습니다. (버그 #33504443)

Debian 기반 패키지의 호환성 레벨을 9에서 11로 증가시켰으며, 호환성 레벨 10 이상의 요구 사항을 충족하기 위해 dh_systemd_enable 및 dh_systemd_start 호출을 dh_installsystemd로 대체했습니다. (버그 #33458752)

전체 텍스트 검색 쿼리와 관련된 삭제 작업이 실패를 일으켰습니다. (버그 #33455243)

keyring_okv 플러그인을 사용할 때 잘못된 오류 처리가 시작 실패를 일으켰습니다. (버그 #33449117)

Debian에서 mysql-community-server-debug 패키지에 mysql-community-server 의존성을 추가하여 디버그 빌드에 필요한 모든 패키지를 포함하도록 했습니다. (버그 #33426737)

DECIMAL 유형의 가상 생성된 열에 대해, 필드 버퍼를 소수점 값으로 변환할 때 정의되지 않은 동작을 방지하기 위해 항상 일부 데이터를 저장합니다. (버그 #33424846)

저장 프로시저에 의해 설정된 변수가 포함된 표현식이 기본 파생 테이블에 있을 때, 조건을 파생 테이블로 푸시하는 기능을 MySQL이 지원합니다. (버그 #33423394)

tls_versionadmin_tls_version 설정이 이제 서버 시작 시 유효성 검사를 거칩니다. (버그 #33390209)

admin_tls_version 변수가 잘못된 값을 허용했습니다. (버그 #33389818)

두 개 이상의 사용 중단된 시스템 변수가 SET PERSIST 문을 통해 유지된 경우, 서버가 재시작될 때 첫 번째 변수에 대해서만 사용 중단 경고가 기록되었습니다. (버그 #33388488)

인덱스 범위 스캔에서 키 부분이 같은 경우, 이제 범위가 등식으로 표시됩니다. 예를 들어, 이전에는 3 <= a <= 3로 표시되던 범위가 이제 a = 3으로 표시됩니다. (버그 #33351123)

tmpfiles.d 구성 파일에서 /var/run 사용이 사용 중단됨에 따라 /var/run 참조를 /run으로 대체했습니다. 현재 설정을 유지하기 위해 /var/run에서 /run으로의 심볼릭 링크는 그대로 유지됩니다. (버그 #33351110, 버그 #33588618)

특정 구성의 서버에서 SHOW PROCESSLIST 또는 INFORMATION_SCHEMA.PROCESSLIST를 실행할 때 실패가 발생했습니다. (버그 #33341623)

ICU 오류 코드 U_FILE_ACCESS_ERROR를 새로운 MySQL 오류 코드 ER_REGEXP_MISSING_FILE에 매핑했습니다. (버그 #33326003)

키링 함수 인수 유효성 검사 실패로 인해 실패가 발생했습니다. (버그 #33319782)

인덱스 범위 스캔 반복자가 예상대로 검사된 행 수를 항상 증가시키지 않았습니다. (버그 #33305632)

명령줄에서 create_admin_listener_thread 시스템 변수를 활성화하면 특정 오류 조건에서 서버 종료가 발생할 수 있었습니다. (버그 #33300587)

SUBSTR() 함수가 인수를 평가하려고 할 때 발생한 오류를 항상 올바르게 처리하지 못했습니다. (버그 #33290160)

국제 구성 요소 for Unicode 버전 67은 \X(그래프 묶음을 일치시키는 새로운 구현)를 도입했으며, 이는 현재 MySQL에 포함되지 않은 로케일 데이터를 필요로 합니다.
이로 인해, MySQL과 번들된 ICU 버전을 사용할 때는 \X를 사용하는 쿼리가 ER_REGEXP_MISSING_RESOURCE 오류를 발생시키고, 시스템에서 제공된 ICU를 사용할 때는 ER_WARN_REGEXP_USING_DEFAULT 경고를 표시합니다. (버그 #33290090)

BLACKHOLE 스토리지 엔진에 저장된 테이블에 대한 전체 텍스트 검색 쿼리에서 선택된 쿼리 계획이 전체 텍스트 인덱스 스캔을 사용할 경우 오류가 발생했으며 빈 결과 집합이 반환되지 않았습니다. (버그 #33250020)

퍼포먼스 스키마에서 반환된 LOCK_TIME이 SQL 테이블과 데이터 잠금에서 기다린 시간을 누락하여 과소 평가되었습니다. 이 릴리스부터는 LOCK_TIME이 다음을 포함합니다:

  • SQL 테이블에서 대기한 모든 시간
  • 데이터 잠금에서 대기한 모든 시간

이제 LOCK_TIME이 슬로우 로그와 퍼포먼스 스키마에 일관되게 보고됩니다. (버그 #33236909)

mysql 클라이언트 프롬프트에 새 옵션 \T가 추가되어 현재 세션이 트랜잭션 블록 내에 있을 때 별표(*)를 출력합니다. 이 옵션은 --prompt 명령줄 옵션, MySQL 옵션 파일 또는 MYSQL_PS1 환경 변수를 사용하여 사용할 수 있습니다. 기여해주신 Murakami Kohei에게 감사드립니다. (버그 #33214862, 버그 #104598)

RANGE INTERVAL 표현식에서 상수 하위 쿼리가 항상 올바르게 처리되지 않았습니다. (버그 #33197418)

NULL로 평가된 소수점 표현식이 항상 올바르게 처리되지 않았습니다. (버그 #33169048)

글로벌 SELECT 권한이 있는 MySQL 역할이 부여된 사용자 계정이 mysql 데이터베이스에 대한 접근을 거부당했습니다. 역할이 부여될 때 사용자 계정의 글로벌 권한이 확인되지 않았습니다. (버그 #33159353, 버그 #104423)

SELECT 별칭에 대해 Item_ref를 설정할 때 캐시된 속성이 복사되지만(해당 항목이 ROLLUP 표현식의 일부인지 여부 포함), 이는 아직 올바르게 계산되지 않았을 수 있습니다. 캐시된 값을 강제로 재계산하도록 수정하여 문제가 발생하지 않도록 했습니다. (버그 #33149402, 버그 #104394)

MySQL 5.7에서 MySQL 8.0으로 테이블을 업그레이드하는 동안 잘못된 주석 문자열이 감지되어 충분한 컨텍스트 정보를 제공하지 않는 오류와 함께 업그레이드가 실패했습니다. (버그 #33148961)

특정 경우에 허용되지 않은 SERIAL 유형의 생성된 열을 만들 수 있었습니다.
Numeric Data Type SyntaxCREATE TABLE and Generated Columns을 참조하십시오. (버그 #33141966)

트리거 또는 저장 함수 내에서 암시적으로 또는 명시적으로 트랜잭션을 커밋하는 명령문은 허용되지 않습니다. 이 경우 CREATE TRIGGERCREATE FUNCTION은 오류를 보고해야 하지만(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG), DROP TABLESPACE를 올바르게 처리하지 못했습니다. (버그 #33141958)

SHOW TABLE STATUS 작업이 매우 큰 AVG_ROW_LENGTH 값으로 정의된 테이블에서 실행될 때 단언문 실패가 발생했습니다. (버그 #33114368)

스캔 중에 읽을 것으로 예상되는 최대 행 수를 계산할 때, 중간 결과가 64비트 부호 없는 정수의 최대 허용값을 초과할 수 있는 배정밀도(double)가 사용되었습니다. 이는 중간 배정밀도 값을 정수로 변환할 때 정의되지 않은 동작을 유발했으며, 이로 인해 일부 경우 단언문 실패로 이어질 수 있었습니다.
우리는 이 문제를 중간 결과를 [1, UINT64_MAX] 범위로 제한하여 해결했습니다. (버그 #33066458)

UNIONLIMIT 0을 모두 사용하는 쿼리가 디버그 빌드에서 단언문 실패를 일으켰습니다. (버그 #33066455)
참조: 이 문제는 버그 #32302724의 회귀 문제입니다.

ALTER EVENT ... RENAME TO를 사용하여 이벤트의 이름을 변경할 때 성능 스키마에 있는 원래 이벤트의 계측이 삭제되지 않았습니다. (버그 #33059358)

스레드 풀 플러그인을 사용할 때 SSL 핸드셰이크 단언문이 디버그 빌드에서 발생했습니다. (버그 #33012398)

GROUP BY WITH ROLLUP 또는 하나 이상의 윈도우 함수를 사용하는 준비된 명령문이 한 번만 성공적으로 실행될 수 있었습니다. (버그 #33007266)

INSERT INTO `view` VALUE(`tuple`) AS `row_alias`(`id_list`) 형식의 명령문에서 오류가 발생했습니다. 이러한 명령문을 실행할 때 서버는 VALUES 별칭으로 생성된 파생 테이블을 준비하기 위해 내부 함수 Sql_cmd_insert_base::prepare_values_table()을 호출합니다. 이 함수는 기초 테이블의 열을 가리키는 Item_field 객체로 Sql_cmd_insert_base.values_field_list를 채웁니다. 테이블이 아닌 뷰에 삽입할 때, 뷰 열을 참조하는 Item_view_ref에서 기초 테이블의 해당 열을 나타내는 Item_field로 변환하는 예상 real_item() 변환이 수행되지 않았습니다. (버그 #32858783)

다중 중첩된 서브셀렉트를 제대로 처리하지 못해 서버가 예기치 않게 종료되는 문제가 발생했습니다. (버그 #32547812)

SHOW PROCESSLIST 작업 중 세션 스레드 객체를 검사하고 동시에 스레드의 보안 컨텍스트를 변경할 때 경합 상태가 발생했습니다. (버그 #32320541, 버그 #102052)

UNION 결과에 대해 수행할 작업이 없는 경우 행이 임시 테이블에 저장되지 않고 스트리밍됩니다. 그러나 임시 테이블에 대한 자리 표시자가 여전히 쿼리 블록에 존재합니다. 이 테이블이 인스턴스화되지 않았기 때문에 행을 테이블에서 읽는 비용을 추정하고 범위 기반 액세스를 최적화하는 동안 이 비용을 계산하는 검사가 예측할 수 없는 결과를 초래할 수 있었습니다.
우리는 인스턴스화되지 않은 임시 테이블의 경우 이러한 행 추정값 검색을 건너뛰도록 수정했습니다. (버그 #32255904)

공통 테이블 식을 사용하는 다중 테이블 DELETE 명령문이 항상 올바르게 처리되지 않았습니다. (버그 #32238558)
참조: 이 문제는 버그 #98330, 버그 #30796015의 회귀 문제입니다.

클라이언트에 CR_UNKNOWN_ERROR를 보내야 하는 경우 예외가 발생할 수 있었습니다. (버그 #31933415)

SSL 관련 코드가 수정되어 잠재적인 메모리 누수를 방지했습니다. (버그 #31933295)

일부 경우 다중 테이블 UPDATE 명령문이 동시 액세스를 차단할 수 있었습니다. (버그 #31731752)

복잡한 설정에 대한 내부 슬롯을 사용하는 키링 시스템 변수는 더 이상 DEFAULT 설정을 허용하지 않습니다. (버그 #30879700)

mysql.tables_privmyql.columns_priv 권한 테이블의 Timestamp 열이 GRANTREVOKE 작업에 대해 0 타임스탬프 값("0000-00-00 00:00:00")으로 설정되어 권한 테이블의 논리적 복원이 불가능했습니다. MySQL 8.0.28부터 타임스탬프 열에 유효한 시작 시간 값이 기록됩니다.
권한 테이블의 논리적 복원을 방해하는 0 타임스탬프 값을 가진 기존 권한 테이블 레코드가 있는 경우, 해결 방법으로는 권한 테이블이나 덤프 파일에서 0 타임스탬프 값을 CURRENT_TIMESTAMP로 대체하는 것입니다.
기여해주신 Venkatesh Prasad Venugopal에게 감사드립니다. (버그 #30863899, 버그 #98495)

MySQL 5.7과 8.0에서 mysqldump를 사용하여 테이블별 덤프를 생성하는 데 MySQL 5.6보다 더 긴 시간이 걸렸습니다. 이는 mysqldump에서 로그 파일 그룹에 대한 정보를 조회할 때 사용되는 information_schema.files 테이블이 MySQL 5.7부터 InnoDB 데이터 파일뿐만 아니라 NDB 데이터 파일에 대한 정보를 포함하기 때문입니다. MySQL 8.0에서는 적절한 데이터 파일만 선택하도록 쿼리를 다시 작성하여 이 문제가 해결되었습니다. MySQL 5.7에서는 Information Schema 테이블에 인덱스가 없기 때문에 여전히 전체 테이블 스캔이 필요합니다. (버그 #29210990, 버그 #93875)

키링 메모리 관리가 개선되었습니다. (버그 #25042167)

테이블 내에 FORCE INDEX 힌트가 있는 경우 이를 저장하고 복원할 때 FORCE INDEX FOR GROUP BY에 대해 잘못된 값이 설정될 수 있었습니다. (버그 #105694, 버그 #33604416)

sql_buffer_result 시스템 변수가 활성화된 상태에서 하나의 행만 반환하는 쿼리를 실행하고 결과를 테이블에 삽입하려고 할 때, 임시 테이블에서 출력을 설정하는 과정에서 데이터 예외가 발생할 수 있었습니다. (버그 #105351, 버그 #33515752)
참조: 이 문제는 버그 #33152269의 회귀 문제입니다.

윈도우 기능에 대한 입력 결과 집합 끝에서 WindowIterator::Read()에서 활성 슬라이스의 재설정이 수행되지 않았습니다. 이로 인해 정렬 값(ORDER BY 정렬 단계)을 읽을 때 잘못된 값이 읽혔습니다. 활성 슬라이스가 여전히 1로 설정되어 있었기 때문입니다. 이는 입력 테이블에서 읽은 항목을 나타내지만, ORDER BY 정렬 단계는 윈도우 함수가 계산된 후 값을 읽어야 하므로 마지막 윈도우의 출력 테이블 슬라이스로 활성 슬라이스를 설정해야 합니다.
우리는 읽기 직후에 출력 슬라이스로 슬라이스를 재설정하여 입력 세트 끝에서 반환될 때 이미 올바르게 설정되도록 수정했습니다.
기여해주신 Casa Zhang과 Tencent 팀에게 감사드립니다. (버그 #105045, 버그 #33399696)

내부 함수 set_parse_error_message()에서 strncpy()가 사용된 것이 코드 점검을 통해 드러났으며, 복사할 버퍼의 마지막 바이트가 null 바이트인지 확인하지 않았습니다. 이 문제를 해결하기 위해 strncpy() 대신 snprintf()를 사용하여 결과가 잘리더라도 유효한 상태가 되도록 했습니다. (버그 #104856, 버그 #33321787)

DEFINER 절로 생성된 트리거(또는 저장 함수)를 활성화하는 준비된 명령문을 실행할 때, 테이블 액세스 확인에 정의자 권한이 아닌 호출자 권한이 사용되었습니다. 이로 인해 트리거 또는 저장 함수에서 사용된 테이블에 대한 권한 확인이 실패할 수 있었습니다. (버그 #104168, 버그 #33064461)

단일 히스토그램이 구성될 때, 이전 버킷의 빈도에 현재 버킷의 빈도를 더해 누적 빈도가 계산됩니다. 그러나 누산기(accumulator)에 부동 소수점 값이 사용되었기 때문에 누적 부동 소수점 오류가 발생하여 최종 누적 빈도가 1.0보다 약간 더 커질 수 있었습니다.
이 수정 사항은 중간 부동 소수점 오류를 피하기 위해 빈도를 정수 유형으로 누적합니다.
기여해주신 Casa Zhang과 Tencent 팀에게 감사드립니다. (버그 #104108, 버그 #33045336)

index_condition_pushdown=ONtransaction_isolation='READ-COMMITTED' 설정에서 부합되지 않는 보조 인덱스에 대한 잠금이 트랜잭션이 커밋되거나 롤백될 때까지 해제되지 않았습니다. (버그 #102722, 버그 #32554667)

저장 함수 내에서 실행된 쿼리에 대해 다중 값 인덱스가 사용되지 않았습니다. (버그 #102359, 버그 #32427727)
참조: 버그 #104700, 버그 #33268466도 참조하십시오.

다음 형식의 SQL 명령문에서 오류가 발생했습니다:

INSERT INTO target_table
  SELECT aggregate_expression, non_aggregate_expression
  FROM empty_table;

이 문제는 임시 테이블에서 집계를 사용하는 쿼리 계획과, non_aggregate_expression이 실행 중에는 상수였으나 실행 간에 변경될 수 있는 경우에 발생했습니다. 예를 들어, NOW() 또는 USER()와 같은 함수가 포함될 수 있습니다. 이로 인해 모든 행이 동일한 값을 갖기 때문에 non_aggregate_expression 열을 임시 테이블에 추가할 필요가 없었음에도 불구하고 추가되었습니다. 또한 행이 없을 경우, target_table에 삽입할 적법한 값이 없어 오류가 발생했습니다.
우리는 non_aggregate_expression이 현재 실행 중 상수인 경우 임시 테이블 열을 사용하지 않도록 수정했습니다. (버그 #102252, 버그 #32384355, 버그 #33546083)

문자열로 전달된 값을 포함하는 준비된 명령문을 실행할 때, MySQL이 이를 정수로 해석하려 시도하여 입력 값과 관련 없는 오류를 반환할 수 있었습니다.
최근 변경 이후, 동적 매개변수 처리가 리팩터링되어 매개변수의 파생 데이터 유형이 상황에 따라 결정되었습니다. 예를 들어, int_col = ? 비교에서 매개변수는 비교 대상인 (정수형) 열과 동일한 유형을 부여받았습니다. 기존 MySQL 응용 프로그램과의 호환성을 유지하기 위해, 소수점 또는 부동 소수점 값이 매개변수로 제공되면 명령문이 자동으로 다시 준비되어 실제 값에 따라 매개변수에 새로운 유형이 할당되었습니다. 이러한 처리는 숫자 매개변수에 대한 호환성을 유지했습니다.
그러나 문자열 매개변수가 제공된 경우에도 여전히 정수로 해석되었으며, 이는 값의 실제 유형을 감지하던 이전 MySQL 버전과 호환되지 않았습니다. 그 결과, int_col = ?'1.7' 값으로 실행될 경우 문자열의 정수 부분만 사용되어 실제 비교는 int_col = 1이 되었습니다.
이 문제를 해결하기 위해 이제 문자열 매개변수가 제공되면 매개변수를 분석하여 정수, 소수점 또는 부동 소수점 값인지 확인하고, 매개변수의 실제 데이터 유형을 적절하게 업데이트합니다. 이후 실제 유형이 해결된 유형과 호환되지 않으면 명령문이 새로운 실제 유형으로 다시 준비됩니다. 이제 이전 명령문은 int_col = 1.7로 평가되며, 비교는 소수점 숫자를 사용하여 평가됩니다. (버그 #101806, 버그 #32213576, 버그 #103364, 버그 #32787037)

Leave a Comment



이 문서 공유

8.0.28 변경 사항 (2022-01-18 GA)

링크 복사

CONTENTS