MySQL 8.0 Release Note

8.0.20 변경 사항 (2020-04-27 GA)

Estimated reading: 9 minutes 74 views

공식 문서: Changes in MySQL 8.0.20 (2020-04-27, General Availability)

계정 관리 관련 사항

이전에는 사용자가 자신이 정의하지 않은 루틴의 정의에 접근하기 위해서는 전역 SELECT 권한을 보유해야 했으며, 이는 매우 광범위한 권한이었습니다. 이제 새로운 SHOW_ROUTINE 권한을 부여하여 루틴 정의에 접근할 수 있는 더 제한적인 범위의 권한을 사용할 수 있습니다. (즉, 관리자는 다른 용도로 전역 SELECT 권한이 필요하지 않은 사용자로부터 이 권한을 회수하고, 대신 SHOW_ROUTINE 권한을 부여할 수 있습니다.) 이를 통해 계정은 광범위한 권한 없이 저장된 루틴을 백업할 수 있습니다.
SHOW_ROUTINE 권한은 다음에 대한 접근을 제공합니다:

이전 버전의 MySQL에서 업그레이드할 경우, 전역 SELECT 권한을 가진 사용자는 이미 SHOW_ROUTINE 권한을 가진 사용자가 없는 경우, 자동으로 SHOW_ROUTINE 권한을 부여받습니다. (WL #9049)

컴파일 관련 사항

Solaris: Clang과 GCC를 이제 Solaris에서 MySQL을 컴파일하는 데 사용할 수 있지만, 두 컴파일러 모두 실험적이며 현재는 프로덕션 코드에 사용할 수 없습니다. (버그 #30562248)

EL7 및 EL8에서 CMake 설정이 GCC 8보다 GCC 9를 먼저 찾도록 조정되었습니다. MySQL 배포판과 함께 제공되는 libmysqlclient로 인해 해당 플랫폼에서 libmysqlclient를 사용해 빌드된 클라이언트 애플리케이션은 영향을 받으며, 재컴파일이 필요할 수 있습니다. (버그 #30722756)

Windows에서 Visual Studio에 대한 CMake 컴파일러 버전 검사가 업데이트되어 현재 Visual Studio 2019가 지원되는 버전임을 나타냅니다. (버전 검사는 CMake-DFORCE_UNSUPPORTED_COMPILER=1 옵션으로 실행하여 우회할 수 있습니다.) (버그 #30688403)

사용 중단 및 제거 관련 사항

JSON: 이전에는 JSON_TABLE() 함수 호출 시 ON EMPTYON ERROR 절을 순서에 상관없이 지정할 수 있었습니다. 그러나 이는 SQL 표준과 상충되며, 표준에 따르면 ON EMPTY가 지정된 경우 항상 ON ERROR 절보다 먼저 와야 합니다. 이로 인해 이제 ON ERRORON EMPTY보다 먼저 오는 구문은 더 이상 권장되지 않으며, 서버는 경고를 발생시킵니다. 비표준 구문에 대한 지원은 향후 MySQL 버전에서 제거될 예정입니다. (WL #13512)

max_length_for_sort_data 시스템 변수가 옵티마이저의 변경으로 인해 더 이상 필요 없고 효과가 없게 되어 사용 중단되었습니다. (WL #13600)
참고: 관련 사항은 버그 #30473261을 참조하십시오.

VALUES()INSERT ... ON DUPLICATE KEY UPDATE 구문에서 새 행 값을 참조하기 위해 사용하는 것은 이제 사용 중단되었으며, 향후 MySQL 릴리스에서 제거될 예정입니다. 대신, MySQL 8.0.19 이상 버전에서 구현된 새로운 행과 그 열에 대한 별칭을 사용해야 합니다.
예를 들어, 여기 표시된 구문은 새 행 값을 참조하기 위해 VALUES()를 사용합니다

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

앞으로는 새로운 행에 대한 별칭을 사용하는 다음과 같은 구문을 사용해야 합니다

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;

또는, 다음과 같이 새로운 행과 각각의 열에 대한 별칭을 사용할 수 있습니다

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;

더 많은 정보와 예제는 INSERT … ON DUPLICATE KEY UPDATE 구문을 참조하십시오. (WL #13325)

JSON 관련 사항

MySQL에 포함된 rapidjson 라이브러리가 2020년 1월 16일자 GitHub 스냅샷으로 업그레이드되었습니다. 이 스냅샷에서 Mac OS X에서 빌드 시 발생하는 컴파일러 오류에 대한 수정이 추가되었습니다. (버그 #30898701)

로깅 관련 사항

서버에 SIGHUP 신호를 보내도 더 이상 상태 보고서가 에러 로그에 기록되지 않습니다. SIGHUP에 대한 서버의 다른 응답 동작은 계속 수행됩니다. 자세한 내용은 MySQL의 Unix 신호 처리를 참조하십시오.
마찬가지로, mysqladmin debug도 더 이상 상태 보고서를 기록하지 않습니다. (버그 #30578923)

JSON 형식의 에러 로그 싱크인 log_sink_json에 이제 로그 메시지에 ts(타임스탬프)가 포함됩니다. 값은 1970년 1월 1일 00:00:00 UTC 이후의 밀리초를 나타내는 정수입니다. 자세한 내용은 에러 로그 출력 형식을 참조하십시오. (WL #13786)

옵티마이저 관련 사항

이제 중첩 블록 루프를 사용하는 모든 경우에 해시 조인이 사용됩니다. 이는 다음 유형의 쿼리에 해시 조인이 사용될 수 있음을 의미합니다:

  • 내부 비등가 조인
  • 세미조인
  • 안티조인
  • 왼쪽 외부 조인
  • 오른쪽 외부 조인

이 작업은 MySQL 8.0.18에서 수행된 작업을 기반으로 하며, 해시 조인이 하나 이상의 등가 조인 조건이 있는 쿼리에서만 사용될 수 있었던 제한을 제거합니다. 또한, 이제 내부 및 외부 조인(세미조인 및 안티조인 포함)은 배치 키 접근(BKA)을 사용할 수 있습니다. 이는 조인 버퍼 메모리를 점진적으로 할당하여 개별 쿼리가 실제로 해결하는 데 필요한 자원보다 많은 자원을 사용하지 않도록 합니다. 자세한 내용은 배치 키 접근 조인을 참조하십시오.
이 수정은 이전 버전의 MySQL에서 사용된 실행기를 대체하는 작업을 완료하며, 특히 WHERE _value_ IN (SELECT _column_ FROM _table_ WHERE _condition_)와 같은 IN 쿼리와 같은 형태로 실체화된 쿼리를 처리하는 인덱스 하위 쿼리 엔진의 교체를 포함합니다.
자세한 정보와 예제는 해시 조인 최적화를 참조하십시오. (버그 #30528604, 버그 #30473261, 버그 #30912972, WL #13377, WL #13476)

이번 릴리스에는 기존의 FORCE INDEXIGNORE INDEX와 같은 SQL 키워드를 사용하는 인덱스 힌트를 대체하기 위한 새로운 인덱스 수준의 옵티마이저 힌트가 도입되었습니다. 이 새로운 힌트는 향후 MySQL 릴리스에서 사용 중단될 기존 인덱스 힌트를 대체할 예정입니다. 새 힌트와 각 힌트에 대한 간략한 설명은 다음과 같습니다:

  • JOIN_INDEX: MySQL이 ref, range, index_merge 등과 같은 모든 가능한 접근 방식에 대해 지정된 인덱스나 인덱스를 사용하도록 강제합니다. 이는 FORCE INDEX FOR JOIN 인덱스 힌트와 동일합니다.
    NO_JOIN_INDEX: 서버가 지정된 인덱스나 인덱스를 무시하도록 합니다. 이는 IGNORE INDEX FOR JOIN과 동일합니다.
  • GROUP_INDEX: 서버가 GROUP BY 작업에 대해 인덱스 스캔에 지정된 인덱스나 인덱스를 사용하도록 합니다. 이는 FORCE INDEX FOR GROUP BY와 동일합니다.
    NO_GROUP_INDEX: GROUP BY 작업에 대해 지정된 인덱스나 인덱스를 무시하도록 합니다. 이는 IGNORE INDEX FOR GROUP BY와 동일합니다.
  • ORDER_INDEX: MySQL이 행 정렬을 수행할 때 지정된 인덱스나 인덱스를 사용하도록 합니다. 이는 FORCE INDEX FOR ORDER BY와 동일합니다.
    NO_ORDER_INDEX: 서버가 행 정렬을 수행할 때 지정된 인덱스나 인덱스를 무시하도록 합니다. 이는 IGNORE INDEX FOR ORDER BY와 동일합니다.
  • INDEX: JOIN_INDEX, GROUP_INDEX, ORDER_INDEX의 조합으로 작동하며, 지정된 인덱스나 인덱스를 모든 범위에서 사용하도록 서버를 강제합니다. 이는 FORCE INDEX와 동일합니다.
    NO_INDEX: NO_JOIN_INDEX, NO_GROUP_INDEX, NO_ORDER_INDEX의 조합으로 작동하며, 지정된 인덱스나 인덱스를 모든 범위에서 무시하도록 서버를 강제합니다. 이는 IGNORE INDEX와 동일합니다.

다음 쿼리는 주어진 열과 인덱스를 가진 테이블에서 인덱스 힌트를 사용하는 예입니다

SELECT a,b FROM t1 USE INDEX FOR ORDER BY (i_ab) ORDER BY a;

이번 릴리스에서 도입된 인덱스 수준의 옵티마이저 힌트를 사용하여 이 쿼리를 다음과 같이 다시 작성할 수 있습니다

SELECT /*+ ORDER_INDEX(t1 i_ab) */ a,b FROM t1 ORDER BY a;

새로운 인덱스 수준 옵티마이저 힌트는 SELECT, UPDATEDELETE 문에서 사용할 수 있습니다. (이는 FORCE INDEX 또는 IGNORE INDEX를 사용하는 인덱스 힌트가 SELECTUPDATE에서만 사용 가능한 것과는 다릅니다.) 따라서 다음과 같은 문이 가능합니다:

UPDATE /*+ INDEX(t1 i_ab) */ t1 SET d = 1
    WHERE a = 1 AND b = 2 AND c = 3;

DELETE /*+ INDEX(t1 i_a,i_c) */ FROM t1
    WHERE a = 1 AND b = 2 AND c = 3;

여러 힌트를 동일한 주석 내에 지정할 수도 있습니다. 예:

DELETE /*+ INDEX(t1 i_a) JOIN_INDEX(t1 i_c) */
    FROM t1 WHERE a = 1 AND b = 2 AND c = 3;

인덱스 수준 옵티마이저 힌트는 다른 옵티마이저 힌트와 동시에 사용할 수 있습니다. 이 경우 인덱스 수준 힌트가 먼저 적용되며, 다른 옵티마이저 힌트의 효과는 인덱스 수준 힌트에서 허용된 인덱스 집합에만 제한됩니다.
인덱스 수준 힌트는 뷰를 생성할 때도 사용할 수 있습니다. 예를 들어:

CREATE VIEW v1 AS
    SELECT /*+ NO_INDEX(t1 i_a,i_b) */ a FROM t1
    WHERE b IN
        (SELECT /*+ NO_INDEX(t1 i_ab,i_b) */ a FROM t1 WHERE a > 3)
    ORDER BY a;

이러한 인덱스 수준 옵티마이저 힌트가 인덱스 힌트와 동일한 문에서 사용되면, 인덱스 힌트는 무시됩니다.
새로운 인덱스 수준 옵티마이저 힌트는 USE INDEX보다 FORCE INDEX와 동일한 기능을 합니다. 즉, 하나 이상의 인덱스 수준 옵티마이저 힌트를 사용하면 테이블 스캔은 지정된 인덱스를 사용하여 테이블의 행을 찾을 방법이 없을 때만 사용됩니다. USE INDEX의 특정 인스턴스와 동일한 인덱스 또는 인덱스 세트를 MySQL이 사용하도록 하려면 NO_INDEX, NO_JOIN_INDEX, NO_GROUP_INDEX, NO_ORDER_INDEX 또는 이러한 조합을 사용할 수 있습니다.
추가 정보 및 예시는 인덱스 수준 옵티마이저 힌트를 참조하십시오. (WL #13538)

패키징 관련 사항

curl 라이브러리 대신 curl을 포함하는 바이너리 패키지가 curl 7.69.0으로 업그레이드되었습니다. (버그 #30866333)

RPM 패키지의 경우 comp_err 유틸리티가 -test 하위 패키지로 이동되어 테스트 구성 요소로 표시되었습니다. (버그 #30716034)

번들된 libedit 라이브러리가 3.1 버전으로 업그레이드되었습니다. (버그 #28939380, 버그 #20770875, 버그 #22930525, 버그 #22332089, 버그 #27433491, 버그 #27285445, WL #13534)

번들된 LZ4 라이브러리가 1.9.2 버전으로 업그레이드되었습니다. 이는 mysqlpump 런타임 오류를 발생시키는 버그 #30369643과 같은 문제를 해결합니다. (WL #13690)
참고: 관련 사항은 버그 #30369643을 참조하십시오.

Performance Schema 관련 사항

퍼포먼스 스키마는 세션별로 발생할 수 없는 글로벌 오류에 대한 세션 관련 통계를 수집했습니다. 이제 더 이상 이 작업을 수행하지 않으며, 오류 계측에 대한 메모리 오버헤드를 줄였습니다. 또한, 글로벌 오류에 대한 행은 더 이상 스레드, 계정, 사용자 또는 호스트별로 보고되는 오류 요약에 포함되지 않습니다. (버그 #30311574)

플러거블 인증

LDAP 서버는 LDAP 검색을 다른 LDAP 서버로 위임하는 LDAP 리퍼럴(LDAP referral) 기능을 설정할 수 있습니다. 그러나 LDAP 리퍼럴을 활성화하면 특정 조건에서 LDAP 작업 오류로 인해 검색이 실패할 수 있습니다. MySQL Enterprise Edition LDAP 인증 플러그인이 리퍼럴 오류를 방지할 수 있도록 새로운 authentication_ldap_simple_referralauthentication_ldap_sasl_referral 시스템 변수가 추가되었습니다. 이 변수들은 각 플러그인이 MySQL 인증 중에 LDAP 서버가 리퍼럴을 사용할지 여부를 제어할 수 있게 합니다. 자세한 내용은 LDAP 검색 리퍼럴을 참조하십시오. (WL #12888)

MySQL Enterprise Edition SASL LDAP 인증 플러그인은 이제 MySQL 클라이언트와 서버에서 GSSAPI/Kerberos 인증 방식을 지원합니다. 이는 Microsoft Active Directory가 기본적으로 Kerberos를 활성화하는 Linux 환경에서 유용합니다. 자세한 내용은 LDAP 인증 방법을 참조하십시오.
이 기능은 모든 RPM 및 DEB 패키지에서 사용할 수 있지만 TAR 아카이브 패키지에서는 사용할 수 없습니다. (WL #12888)

SQL 구문 관련 사항

이전에는 SELECT 명령문의 INTO 절이 두 가지 위치에 올 수 있었습니다:

  • FROM
SELECT * INTO OUTFILE 'file_name' FROM table_name;
  • FOR UPDATE, FOR SHARE등 잠금 앞
SELECT * FROM table_name INTO OUTFILE 'file_name' FOR UPDATE;

이제 그 세번째 위치로써, INTO 절을 SELECT 명령문의 제일 끝에 배치할 수 있습니다

SELECT * FROM table_name FOR UPDATE INTO OUTFILE 'file_name';

INTO 절을 끝에 배치하는 것이 권장 위치입니다. 잠금 절 앞에 있는 위치는 이제 사용 중단되었으며, 향후 MySQL 버전에서 지원이 제거될 예정입니다. 즉, FROM 이후에 있지만 끝에 있지 않은 SELECT 명령문에서 INTO 절을 사용하는 경우 경고가 발생합니다.
또한, UNION 구문에서도 INTO와 관련된 몇 가지 변경 사항이 있었습니다. 다음 UNION 변형은 구문적으로 올바르며 동일한 결과를 생성합니다:

... UNION SELECT * FROM table_name INTO OUTFILE 'file_name';
... UNION (SELECT * FROM table_name) INTO OUTFILE 'file_name';
... UNION SELECT * INTO OUTFILE 'file_name' FROM table_name;
... UNION (SELECT * INTO OUTFILE 'file_name' FROM table_name);

그러나 마지막 두 변형은 전체 쿼리 표현식(UNION)이 아닌 지정된 테이블에서 데이터를 수집하는 것처럼 보이므로 혼란을 줄 수 있습니다. 이러한 두 가지 UNION 변형은 이제 사용 중단되었으며, 향후 MySQL 버전에서 지원이 제거될 예정입니다. 따라서:

  • 쿼리 표현식의 마지막 쿼리 블록에서 FROM 앞의 INTO 사용은 경고를 발생시킵니다.쿼리 표현식의 괄호로 묶인 마지막 블록에서 FROM과 관계없이 INTO를 사용하는 경우 경고가 발생합니다.

이러한 사용 중단은 모든 INTO 형식에 적용됩니다: INTO OUTFILE, INTO DUMPFILE, 및 INTO var_list. (WL #13559)

테스트 스위트 관련 사항

perfschema.idx_compare_replication_applier_status 테스트 케이스가 트랜잭션 재시도 횟수의 이전 값을 저장하고 이를 새로운 값과 비교하도록 업데이트되었습니다. 기여해주신 Facebook에게 감사드립니다. (버그 #30810627, 버그 #98389)

X Plugin 관련 사항

MySQL 서버 인스턴스의 클라이언트 연결 제한(서버 시스템 변수 max_connections으로 지정)이 X Plugin이 시작되는 동안 초과된 경우, X Plugin이 서버 설정을 가져오기 위한 세션을 생성하지 못해 시작에 실패했습니다. 이제 X Plugin은 시작 시 클라이언트 연결 제한을 받지 않는 관리 세션을(mysql_admin_session 서비스 사용) 생성합니다. (버그 #30894981)

X Protocol 세션을 초기화할 수 없을 때 이미 너무 많은 X Protocol 연결이 있을 경우, 오류 코드 5011이 반환되었습니다(세션을 열 수 없음). 이제는 더 관련성 높은 오류 코드 1040(연결이 너무 많음)이 반환됩니다. (버그 #30753637)

JSON 참조를 검증하는 문제로 인해 유효성 검사 스키마로 컬렉션을 생성할 때 오류가 발생했습니다. (버그 #30733330)

X Protocol을 사용하는 클라이언트와의 MySQL 서버 인스턴스 종료 시, X Plugin에서 레이스 컨디션이 발생하여 유효하지 않은 클라이언트 연결이 처리될 수 있었습니다. 종료 중 유효하지 않은 클라이언트는 클라이언트 타임아웃 확인에서 무시되어, mysqlx_wait_timeout 시스템 변수(기본값 8시간)에서 설정된 타임아웃이 도달할 때까지 종료를 차단했습니다. 이 문제를 방지하기 위해, 이제 유효하지 않은 상태의 클라이언트도 클라이언트 타임아웃 확인에 포함됩니다. (버그 #30702685)

MySQL 8.0 서버에 연결할 때 X Plugin이 세션에 대해 mysql 클라이언트와 다른 콜레이션을 설정하여, 콜레이션에 의존하는 쿼리에 문제가 발생할 수 있었습니다. 이제 X Plugin은 utf8mb4 캐릭터셋의 기본값인 utf8mb4_0900_ai_ci 콜레이션을 사용합니다. (버그 #30516849)

X Protocol 연결을 위한 작업 스레드가 생성 시 시스템 스레드로 식별되어 SYS_default 리소스 그룹에 할당되었습니다. 이로 인해 리소스 관리 목적으로 사용자 리소스 그룹에 할당할 수 없었습니다. 이제는 사용자 스레드로 식별되어 USR_default 리소스 그룹에 할당됩니다. X Protocol은 현재 CREATE, ALTER, DROPSET RESOURCE GROUP 명령을 지원하지 않지만, 이러한 명령은 클래식 MySQL 프로토콜 연결을 사용하여 X Protocol 연결 스레드에서 작동할 수 있습니다. (버그 #30059288)

이제 X Plugin은 초기화가 시작되면 MySQL 시스템 변수를 액세스할 수 있어 플러그인 설치 스레드가 별도의 스레드를 시작하지 않고 필요한 연결 설정을 직접 할 수 있습니다. (버그 #29127302)

추가 및 변경된 기능

중요 변경 사항: 이전에는 TINYBLOB 또는 BLOB보다 큰 BLOB 유형의 열이 정렬 작업의 페이로드로 포함될 경우 서버가 완전한 행 대신 행 ID만 정렬하여, 정렬이 완료된 후 디스크에서 행을 다시 가져오는 방식으로 전환되었습니다. 이는 내부적으로 LONGBLOB로 구현된 JSONGEOMETRY 열에서도 동일한 방식으로 동작했으며, 이들 열은 거의 항상 LONGBLOB의 최대 크기인 4GB (또는 MEDIUMBLOB의 최대 크기인 16MB)보다 훨씬 작음에도 불구하고 동일하게 처리되었습니다. 이제 서버는 이러한 유형의 열을 TINYBLOBBLOB 열과 마찬가지로 압축된 애드온으로 변환하므로, 테스트 결과 상당한 성능 향상이 있었습니다. 이와 관련하여 MEDIUMBLOBLONGBLOB 열의 처리 방식은 변경되지 않았습니다.
이 개선 사항의 한 가지 영향은, 매우 큰 (수 MB 이상의) JSON 또는 GEOMETRY 열 값을 포함한 행을 정렬할 때 정렬 버퍼의 크기가 충분하지 않을 경우 메모리 부족 오류가 발생할 수 있다는 점입니다. 이는 일반적으로 사용하는 방식대로 sort_buffer_size 시스템 변수를 증가시켜 보완할 수 있습니다. (버그 #30400985, 버그 #30804356)

InnoDB: 잠금 대기 중인 트랜잭션의 우선순위를 조정하는 Contention-Aware Transaction Scheduling (CATS) 알고리즘이 개선되었습니다. 이제 트랜잭션 스케줄링 가중치 계산이 별도의 스레드에서 완전히 수행되므로 계산 성능과 정확성이 향상되었습니다.
트랜잭션 스케줄링에 사용되었던 First In First Out (FIFO) 알고리즘은 CATS 알고리즘의 개선으로 인해 더 이상 필요하지 않게 되어 제거되었습니다. 이전에 FIFO 알고리즘에 의해 수행되었던 트랜잭션 스케줄링은 이제 CATS 알고리즘이 수행합니다.
INFORMATION_SCHEMA.INNODB_TRX 테이블에 TRX_SCHEDULE_WEIGHT 열이 추가되어, CATS 알고리즘에 의해 할당된 트랜잭션 스케줄링 가중치를 쿼리할 수 있습니다.
트랜잭션 스케줄링 이벤트를 모니터링하기 위한 다음 INNODB_METRICS 카운터가 추가되었습니다:

  • lock_rec_release_attempts
    레코드 잠금 해제 시도의 횟수.
  • lock_rec_grant_attempts
    레코드 잠금 부여 시도의 횟수.
  • lock_schedule_refreshes
    대기 그래프가 분석되어 트랜잭션 스케줄 가중치가 갱신된 횟수.

(WL #13486)

InnoDB: 더블라이트 버퍼의 저장 위치가 시스템 테이블스페이스에서 더블라이트 파일로 이동되었습니다. 더블라이트 버퍼 저장 영역을 시스템 테이블스페이스에서 분리함으로써 쓰기 대기 시간이 줄어들고 처리량이 증가하며, 더블라이트 버퍼 페이지의 배치에 대한 유연성이 향상되었습니다. 고급 더블라이트 버퍼 구성을 위해 다음의 시스템 변수가 도입되었습니다:

자세한 내용은 더블라이트 버퍼를 참조하십시오. (WL #5655)

EXPLAIN ANALYZE 명령은 이제 KILL QUERY 또는 CTRL-C를 사용해 실행 중에 중단할 수 있습니다. (버그 #30787515)

EXPLAIN FORMAT=TREE는 이제 윈도우 함수에 대한 inversion 정보를 표시합니다. (버그 #30770631)

EXPLAIN FORMAT=TREE 출력이 평가된 윈도우 함수에 대한 더 많은 정보를 제공하도록 개선되었으며, 일반 집계 함수와 동일한 정보를 제공합니다. (버그 #30573446, 버그 #30582782)

이제 CMake 옵션 -DWITH_LTO=1을 macOS에서 사용할 수 있습니다. (버그 #30125902)

이제 MySQL 서버 인스턴스에서 바이너리 로그 트랜잭션 압축을 활성화할 수 있습니다. 바이너리 로그 트랜잭션 압축이 활성화되면 트랜잭션 페이로드는 zstd 알고리즘을 사용해 압축된 후 하나의 이벤트(Transaction_payload_event)로 서버의 바이너리 로그 파일에 기록됩니다. 압축된 트랜잭션 페이로드는 복제 스트림에서 복제본, 다른 그룹 복제 그룹 구성원 또는 mysqlbinlog와 같은 클라이언트로 전송되는 동안 압축된 상태로 유지됩니다. 수신 스레드는 이를 압축 해제하지 않으며, 압축된 상태로 릴레이 로그에 기록됩니다. 따라서 바이너리 로그 트랜잭션 압축은 트랜잭션을 전송하는 서버 인스턴스뿐만 아니라 수신자(및 해당 백업)에서도 저장 공간을 절약하고, 서버 인스턴스 간에 트랜잭션을 전송할 때 네트워크 대역폭을 절약합니다.
MySQL 서버 인스턴스에서 바이너리 로그 트랜잭션 압축을 활성화하려면 기본값이 OFFbinlog_transaction_compression 시스템 변수를 사용하십시오. 또한 binlog_transaction_compression_level_zstd 시스템 변수를 사용해 zstd 알고리즘의 압축 수준을 설정할 수 있습니다. 이 값은 1(최소 노력)부터 22(최대 노력)까지 압축 노력을 결정합니다. (WL #3549)

CHANGE MASTER TO 명령의 새로운 옵션 REQUIRE_TABLE_PRIMARY_KEY_CHECK는 복제 슬레이브가 기본 키 확인에 대한 자체 정책을 선택할 수 있게 합니다. 이 옵션이 복제 채널에서 ON으로 설정되면 슬레이브는 복제 작업에서 기본 키를 요구하는 sql_require_primary_key 시스템 변수 값을 항상 ON으로 사용합니다. OFF로 설정되면 슬레이브는 마스터가 기본 키를 요구했는지와 관계없이 복제 작업에서 기본 키를 요구하지 않습니다. 기본값인 STREAM으로 설정된 경우, 슬레이브는 각 트랜잭션에 대해 마스터에서 복제된 값을 사용합니다.

  • 멀티소스 복제를 위해 REQUIRE_TABLE_PRIMARY_KEY_CHECKON 또는 OFF로 설정하면 슬레이브가 여러 마스터의 복제 채널 간에 일관된 sql_require_primary_key 설정을 유지할 수 있습니다. ON을 사용하면 여러 마스터가 동일한 테이블 세트를 업데이트할 때 기본 키의 실수로 인한 손실을 방지할 수 있으며, OFF를 사용하면 기본 키를 조작할 수 있는 마스터와 그렇지 않은 마스터가 함께 작동할 수 있습니다.
  • PRIVILEGE_CHECKS_USER가 채널에 복제 권한 확인을 적용하도록 설정된 경우, REQUIRE_TABLE_PRIMARY_KEY_CHECKON 또는 OFF로 설정하면, 각 트랜잭션의 마스터 설정에 맞게 sql_require_primary_key 값을 변경하기 위해 제한된 세션 변수를 설정할 때 세션 관리 수준 권한이 필요하지 않습니다.

(WL #13239)

MySQL 8.0.19부터 X Protocol 연결을 통해 전송되는 메시지에 대해 압축이 지원되었습니다. 서버와 클라이언트가 사용할 압축 알고리즘에 동의하면 연결을 압축할 수 있습니다. 기본적으로 서버는 Deflate, LZ4 및 zstd 압축 알고리즘을 허용하며, mysqlx_compression_algorithms 시스템 변수를 설정하여 허용할 알고리즘을 선택할 수 있습니다. MySQL 8.0.19에서는 X Protocol이 각 알고리즘에 대한 라이브러리 기본 압축 수준을 사용하며, 클라이언트는 이를 협상할 수 없습니다.
MySQL 8.0.20부터 클라이언트는 X Protocol 연결에 대한 기능 협상 중 특정 압축 수준을 요청할 수 있습니다. X Protocol은 각 알고리즘에 대한 최대 압축 수준을 설정하여, 서버가 리소스를 과도하게 소비할 수 있는 높은 압축 수준 요청에 동의하지 않도록 합니다. 초기 최대 압축 수준은 Deflate에 대해 5, LZ4에 대해 8, zstd에 대해 11로 설정되었습니다. 이 설정은 새로운 mysqlx_deflate_max_client_compression_level, mysqlx_lz4_max_client_compression_level, 및 mysqlx_zstd_max_client_compression_level 시스템 변수를 사용하여 조정할 수 있습니다.
또한 성능 테스트를 통해 네트워크 전송 시간과 압축 시간 사이의 균형을 맞추기 위한 새로운 기본 압축 수준이 선택되었습니다. 이 기본값은 각 알고리즘에 대한 라이브러리 기본값과 반드시 동일하지는 않으며, 클라이언트가 알고리즘에 대한 압축 수준을 요청하지 않는 경우 적용됩니다. 초기 기본 압축 수준은 Deflate에 대해 3, LZ4에 대해 2, zstd에 대해 3으로 설정되었습니다. 이 설정은 새로운 mysqlx_deflate_default_compression_level, mysqlx_lz4_default_compression_level, 및 mysqlx_zstd_default_compression_level 시스템 변수를 사용하여 조정할 수 있습니다. (WL #13034)

버그 수정

호환되지 않는 변경: ST_Contains()를 사용하는 일부 쿼리는 > 0을 추가하지 않으면 결과를 반환하지 않았습니다.

참고
이전 MySQL 버전에서 업그레이드할 경우, 공간 인덱스가 있는 테이블의 공간 인덱스를 다시 생성해야 합니다.

(버그 #30461595, 버그 #97347)

성능: MySQL 5.7에서 MySQL 8.0으로 업그레이드한 후 공간 인덱스가 있는 테이블에 대한 일부 쿼리가 효율적으로 수행되지 않았습니다. (버그 #94655, 버그 #29488350)
참고: 관련 버그 #89551, 버그 #27499984.

NDB Cluster: NDB는 루트 테이블의 기본 파티션을 소유한 노드당 하나의 SPJ 워커를 정의합니다. 이 테이블이 모든 프래그먼트 복제본에서 읽도록 설정된 경우, DBTC는 모든 SPJ 워커를 동일한 DBSPJ 인스턴스로 이동시켜 일부 SPJ 워커의 사용이 제한되었습니다. (버그 #30639165)

NDB Cluster: ndb_mgm 클라이언트 바이너리를 사용하여 NDB 8.0.16 이하 버전에서 NDB 8.0.17 이상의 관리 노드에 접근할 때 SHOW 명령을 실행하면 Unknown field: is_single_user 오류 메시지가 발생했습니다. (버그 #30599413)참고: 관련 버그 #16275500.

InnoDB: CREATE UNDO TABLESPACE 작업에서 경로를 지정하지 않고 undo 데이터 파일 이름을 지정하면, innodb_undo_directory 변수로 지정된 디렉터리에 있는 동일한 이름의 기존 undo 데이터 파일이 제거되었습니다. 파일 이름 충돌 검사는 innodb_undo_directory 변수로 지정된 디렉터리가 아닌 데이터 디렉터리에서 수행되었습니다. (버그 #30908328, 버그 #98628)

InnoDB: 디버그 빌드에서 MySQL 8.0.19에서 도입된 회귀로 인해 뮤텍스 및 rw-lock 데드락 디버그 검사가 느려졌습니다. (버그 #30886393)
참고: 이 문제는 버그 #30628872의 회귀입니다.

InnoDB: Valgrind 테스트에서 조건부 점프 또는 이동이 초기화되지 않은 값에 따라 달라진다는 오류가 발생했습니다. 이 오류는 잘못된 검증 로직으로 인한 false-positive였습니다. (버그 #30837136)

InnoDB: rw_lock_debug_mutex_enter()(소스 파일 sync0debug.cc)에 배리어가 누락되어 스레드가 깨어나지 않고 대기하는 문제가 발생할 수 있었습니다. (버그 #30819167)

InnoDB: Linux에서 서버 초기화 속도를 향상시키기 위해, 이제 redo 로그 파일에 공간을 할당할 때 posix_fallocate()가 사용됩니다. (버그 #30804431, 버그 #98342)

InnoDB: 데이터 사전 테이블 열기 함수가 잘못된 잠금 순서로 구현되었습니다. (버그 #30782103, 버그 #97825)

InnoDB: MySQL 8.0.17에서 도입된 병렬 읽기 스레드 기능 변경으로 인해 SELECT COUNT(*) 성능이 저하되었습니다. 페이지가 불필요하게 디스크에서 읽혔습니다. (버그 #30766089)

InnoDB: init_file 시작 변수를 사용하여 부트스트랩 스레드가 실행한 SQL 작업에 대해 DDL 로깅이 수행되지 않아, DDL 단계 이후 제거되어야 할 파일이 남아 있었습니다. (버그 #30721214, 버그 #98131)

InnoDB: 특정 수의 레코드가 있는 테이블에서 JSON 배열로 캐스팅된 열에 인덱스를 추가하면 “Incorrect key file for table” 오류가 발생했습니다. (버그 #30709525, 버그 #98098)

InnoDB: Valgrind 오류는 초기화되지 않은 lock->writer_thread 값이 조건부 점프에서 사용되었다고 보고했습니다. (버그 #30694177)

InnoDB: 내부 버퍼 풀 통계 카운터(n_page_gets)가 페이지 번호에 따라 분할되어 여러 스레드에 의해 액세스될 때 경합을 피할 수 있었습니다. (버그 #30604841, 버그 #97822)

InnoDB: .cfg 파일과 데이터 사전이 ALGORITHM=INSTANT로 추가된 열의 기본값을 모두 포함하고 있어 스키마 불일치 오류로 테이블스페이스 가져오기 작업이 실패했습니다. 기본값이 다를 경우에만 오류가 발생해야 합니다. (버그 #30561144)

InnoDB: 느린 종료가 일부 GTID를 플러시하지 못해, 플러시되지 않은 GTID를 undo 로그에서 복구해야 했습니다. (버그 #30548229)

InnoDB: macOS 및 FreeBSD용으로 최적화된 MySQL 빌드에서 성능 스키마 메모리 할당을 위한 접두사를 메모리에 할당하는 코드의 정렬 요구 사항이 깨져 실패를 초래했습니다. (버그 #30530857)

InnoDB: 가상 열을 추가하면 새 데이터 사전 객체에 데이터가 누락되어 어설션 실패가 발생했습니다. (버그 #30524263)

InnoDB: undo 테이블스페이스의 모드를 확인할 때 필수 래치가 적용되지 않았습니다. undo 테이블스페이스가 비어 있는지 확인할 때도 필수 래치가 적용되지 않았습니다. (버그 #30509134)

InnoDB: 데이터 수정 전에 GTID 값을 유지하기 위해 XA 트랜잭션에 업데이트 undo 로그 세그먼트를 할당하면 실패가 발생했습니다. (버그 #30456328)

InnoDB: 테이블스페이스가 삭제된 파티션 테이블에서 실행된 쿼리가 어설션 실패를 일으켰습니다. (버그 #30437407, 버그 #97271)

InnoDB: row_upd_clust_rec_by_insert 함수가 클러스터된 인덱스 레코드를 삭제된 것으로 표시하고 레코드의 업데이트된 버전을 클러스터된 인덱스에 삽입할 때 잘못된 n_ext 값(외부 필드의 총 개수)이 하위 함수에 전달되어 어설션 실패가 발생했습니다. (버그 #30437378)

InnoDB: 복제 작업 중 데이터 사전 버퍼 테이블에 쓰기가 종료 시 너무 늦게 이루어져 실패를 초래했습니다. 새로 생성된 더티 페이지가 플러시되지 않았습니다. (버그 #30427369, 버그 #30405535)

InnoDB: innodb_buffer_pool_evict 디버그 변수가 uncompressed로 설정된 상태에서 수행된 작업이 어설션 실패를 일으켰습니다. (버그 #30405531)

InnoDB: GCC 내장 기능이 사용할 수 없을 때 boolean recursive 플래그와 쓰기 스레드 ID에 대한 접근 순서를 제어하는 읽기-쓰기 잠금 코드(rw_lock_t)가 일부 인스턴스에서 C++ std::atomic을 사용하도록 수정되었습니다. ARM의 Yibo Cai에게 감사드립니다. (버그 #30401416, 버그 #97150)

InnoDB: MySQL 5.7에서 MySQL 8.0으로 업그레이드하는 동안, 드롭된 FULLTEXT 인덱스 후에도 남아 있는 FTS_DOC_ID 열과 FTS_DOC_ID_INDEX에 대한 서버 데이터 사전 객체 정보가 누락되어 실패가 발생했습니다. (버그 #30357954)

InnoDB: 병렬 스캔에 대한 불필요한 메시지가 오류 로그에 출력되었습니다. (버그 #30330448)

InnoDB: MySQL 5.7에서 MySQL 8.0으로 업그레이드하는 동안 GEN_CLUST_INDEX라는 클러스터된 인덱스가 PRIMARY로 이름이 변경되어 mysql.innodb_index_stats 테이블에 클러스터된 인덱스의 중복 항목이 추가되었습니다. (버그 #30330448)

InnoDB: 여러 내부 함수가 쓰기 이벤트 슬롯을 일관되지 않게 계산했습니다. (버그 #30228108, 버그 #96519)

InnoDB: 특정 상황에서 크래시 복구 중 redo 로그 적용 단계에서 테이블스페이스 암호화 키 정보가 적용되지 않을 수 있었습니다. (버그 #30209760)

InnoDB: 파일 작업 실패로 인해 페이지 추적 아카이버가 실패했고, 이로 인해 메인 스레드가 중단되어 어설션 실패가 발생했습니다. 또한 페이지 추적 아카이버가 innodb_read_only 모드에서 잘못 활성화되었습니다. (버그 #30202643)

InnoDB: ALGORITHM=INSTANT를 사용하여 추가된 열이 있는 테이블스페이스를 가져오려고 할 때 인덱스 손상 오류가 보고되었습니다. 이 오류는 즉시 추가된 열과 관련된 메타데이터가 누락되어 발생했습니다. (버그 #30191523, 버그 #96477)

InnoDB: 트랜잭션이 LOB 레코드를 가져오려고 할 때 null LOB 참조가 발생하여 어설션 실패가 발생했습니다. 그러나 이 특정 시나리오에서는 LOB 값이 아직 완전히 기록되지 않았기 때문에 null LOB 참조가 유효했습니다. (버그 #30144303)

InnoDB: autocommit이 비활성화된 상태에서 테이블 로드 작업을 롤백하는 동안 병렬 읽기 작업에서 트리 구조 변경을 고려하지 않아 서버가 종료되었습니다. (버그 #30060690)

InnoDB: 롤백 세그먼트 메모리 객체에서 유지되는 현재 크기 값이 유효하지 않아 trx_purge_free_segment() 함수에서 어설션 실패가 발생했습니다. 현재 크기 값을 검증하기 위한 검증 루틴(trx_rseg_t::validateCurrSize())이 추가되었습니다. (버그 #29947027)

InnoDB: 잘못된 매개변수 값으로 실행된 준비된 문장이 어설션 실패를 일으켰습니다. (버그 #29880907)

InnoDB: 열 추가 작업 중 어설션 실패가 발생했습니다. 이 실패는 대기 포인터로 인해 발생했습니다. (버그 #29866408)
참조: 이 문제는 버그 #28491099의 회귀입니다.

InnoDB: 문자열 값을 사용하는 특정 InnoDB 시스템 변수를 업데이트하는 동안 Valgrind 테스트에서 잘못된 읽기 오류가 발생했습니다. (버그 #29717909, 버그 #95215)

InnoDB: MySQL 8.0에서 undo 테이블스페이스 ID 값이 변경됨에 따라 undo 테이블스페이스 수정에 대한 redo 로그 레코드 크기가 증가했습니다. 이로 인해 쓰기 I/O가 많은 워크로드에서 성능 저하가 발생했습니다. 이 문제를 해결하기 위해 undo 테이블스페이스 수정에 대한 redo 로그 레코드 크기를 줄이도록 redo 로그 형식이 수정되었습니다. (버그 #29536710)

InnoDB: InnoDB 파일 쓰기와 관련된 추가 정보(진행 데이터 포함)가 이제 오류 로그에 기록됩니다. (버그 #29472295, 버그 #94634)

InnoDB: 공간 인덱스가 있는 테이블에 삽입문을 실행할 때 튜플 손상으로 인해 레코드 유형 불일치 어설션이 발생했습니다. (버그 #29465567)

InnoDB: 손상된 undo 로그 레코드의 경우 undo 로그 레코드 크기를 계산하는 함수가 잘못된 길이 값을 계산할 수 있어 malloc 실패가 발생했습니다. 잘못된 계산을 감지하기 위해 어설션 코드가 추가되었습니다. (버그 #29448406, 버그 #82734)

복제: SQL 문이 바이너리 로그에 민감한 정보가 일반 텍스트로 나타나지 않도록 다시 작성되는 중에, SHOW PROCESSLIST 문을 사용하여 쿼리를 검사하면 쿼리가 바이너리 로그에 기록될 때 손상되어 복제가 중지될 수 있었습니다. 이제 쿼리 스레드는 다시 작성이 완료될 때만 업데이트되며, 쿼리 다시 쓰기 프로세스는 비공개로 유지됩니다. (버그 #30569003, 버그 #97531, 버그 #30654405)

복제: GRANT 또는 REVOKE 문이 부분적으로만 실행될 때, 바이너리 로그에 사건 이벤트가 기록되어 복제 슬레이브의 적용기 스레드가 중지되고 슬레이브가 마스터와 수동으로 조정될 수 있었습니다. 이전에는 세션에서 첫 번째로 실행된 GRANT 또는 REVOKE 문이 실패하면 세션에 대한 캐시 관리자가 아직 존재하지 않기 때문에 사건 이벤트에 GTID가 적용되지 않아 복제 슬레이브에서 오류가 발생했습니다. 또한 GRANT 문이 사용자를 생성했지만 권한이 잘못 지정되어 실패한 경우에도 사건 이벤트가 기록되지 않아 복제 슬레이브에서 오류가 발생했습니다. 이제 이러한 문제가 모두 해결되었습니다. (버그 #30566518, 버그 #30324661)

복제: 서버 시작 후 thread/sql/compress_gtid_table 스레드가 시작되면 mysql.gtid_executed 테이블에 대한 압축이 트리거되며, 압축 프로세스가 완료되면 그 효과가 나타납니다. (버그 #30541799)

복제: 예기치 않은 복제 슬레이브와 마스터 간의 연결 끊김이 발생할 경우, 마스터의 덤프 스레드에 대한 참조가 등록된 슬레이브 목록에서 제거되지 않아 슬레이브 목록에 액세스하는 문이 실패할 수 있었습니다. 이 문제가 수정되었습니다. (버그 #29915479)

복제: 파티션된 테이블이 관련된 경우, 캐시 공간 부족으로 인해 행 이벤트를 바이너리 로그에 기록할 수 없는 상황에서 서버가 올바르게 처리하지 못했습니다. 이제 이 상황에서 적절한 오류가 반환됩니다. (버그 #29848931)

복제: binlog_format=MIXED, tx_isolation=READ-COMMITTED, 및 binlog_row_image=FULL 설정을 사용하는 경우, 트랜잭션 스토리지 엔진을 사용하는 INSERT ... SELECT 쿼리가 바이너리 로그에 기록될 때 행 이미지에서 null 값을 포함한 열이 생략되었습니다. 이는 INSERT ... SELECT 문을 처리할 때 열이 바이너리 로깅 형식이 선택되기 전에 삽입으로 표시되었기 때문입니다. 이제 이 문제가 해결되었습니다. (버그 #29110804, 버그 #93423)

복제: 특정 조건에서 조건부 주석의 복제가 실패할 수 있었습니다. (버그 #28388217)

그룹 복제: 그룹 복제 메시지 서비스를 사용하는 스레드가 퍼포먼스 스키마 계측에 올바르게 등록되지 않아 퍼포먼스 스키마 테이블에서 스레드 작업이 보이지 않았습니다. (버그 #30824676)

그룹 복제: 그룹 복제는 분산 복구를 위해 복제 작업을 시작하고 관리하지만, 복제용으로 설정된 그룹 멤버는 사용자가 수동으로 시작한 복제 작업에도 참여할 수 있습니다. MySQL 8.0.20 이전 릴리스에서는 그룹 복제가 실행 중인 그룹 멤버와 관련된 복제 작업을 수동으로 시작할 수 없었습니다. MySQL 8.0.20부터는 복제 작업이 수신자의 데이터를 제거하고 교체하지 않는 경우 수동으로 복제 작업을 시작할 수 있습니다. 그룹 복제가 실행 중인 경우 복제 작업을 시작하는 명령문에는 DATA DIRECTORY 절을 포함해야 합니다. (버그 #30798640)

그룹 복제: 그룹 복제 채널의 경우, 그룹 복제가 실행 중일 때 PRIVILEGE_CHECKS_USER 옵션을 사용하여 CHANGE MASTER TO 문을 실행하면 채널의 릴레이 로그 파일이 삭제되었습니다. 이 경우 아직 적용되지 않은 상태에서 릴레이 로그에 수신되고 대기 중인 트랜잭션이 손실될 수 있었습니다. 이제 CHANGE MASTER TO 문은 그룹 복제가 실행 중이지 않을 때만 실행할 수 있습니다. (버그 #30655369)

그룹 복제: 그룹 복제 실패 감지 메커니즘은 서버가 메시지 전송을 중단하면 의심을 제기하고, 그룹 멤버 중 과반수가 여전히 통신 중인 경우 해당 멤버가 결국 추방됩니다. 그러나 실패 감지 메커니즘은 다수의 그룹 멤버 중 하나 이상이 이미 추방 대상으로 표시되었으나 아직 그룹에서 제거되지 않은 상황을 고려하지 않았습니다. 네트워크가 불안정하고 멤버들이 다양한 조합으로 자주 연결이 끊기고 다시 연결되면, 그룹 전체가 모든 멤버를 추방 대상으로 표시하게 되어 그룹이 더 이상 존재하지 않게 되고, 다시 설정해야 하는 상황이 발생할 수 있었습니다.
이제 그룹 복제 그룹 통신 시스템(GCS)은 추방 대상으로 표시된 그룹 멤버를 추적하고, 과반수를 결정할 때 이 멤버들을 의심되는 멤버 그룹에 포함된 것으로 취급합니다. 이를 통해 적어도 하나의 멤버는 그룹에 남아 그룹이 계속 존재할 수 있도록 합니다. 추방된 멤버가 실제로 그룹에서 제거되면 GCS는 해당 멤버를 추방 대상으로 표시한 기록을 제거하여, 멤버가 다시 그룹에 합류할 수 있도록 합니다. (버그 #30640544)

그룹 복제: 그룹 복제가 높은 부하 상태에서 실행 중인 MySQL 서버에서 퍼포먼스 스키마 테이블에 접근할 수 없었습니다. (버그 #30112711, 버그 #30675790)

그룹 복제: 그룹 복제에서 로컬 그룹 멤버의 통계를 위해 퍼포먼스 스키마에 대한 내부 쿼리가 그룹의 멤버십 변경과 동시에 발생할 경우 실패했습니다. 내부 쿼리의 잠금 처리가 개선되어 이 문제가 해결되었습니다. (버그 #30049349, 버그 #30791583, 버그 #30963553)

그룹 복제: 그룹 복제 분산 복구 과정에서, 합류하는 멤버가 그룹 내의 어느 기증자와도 원격 복제 작업을 완료할 수 없을 경우, 기증자의 바이너리 로그에서 상태 전송을 사용하여 필요한 모든 데이터를 가져옵니다. 그러나 마지막으로 시도한 원격 복제 작업이 중단되어 합류하는 멤버가 불완전한 데이터나 없는 데이터를 남기면, 그 직후에 상태 전송을 시도해도 실패할 수 있었습니다. 이제 그룹 복제는 실패한 원격 복제 작업 후 상태 전송을 시도하기 전에, 원격 복제 작업이 합류하는 멤버의 로컬 데이터를 제거하는 단계에 도달하지 않았는지 확인합니다. 데이터가 제거된 경우, 합류하는 멤버는 그룹을 떠나고 group_replication_exit_state_action 시스템 변수가 지정한 조치를 취합니다. (버그 #29669099, 버그 #29944828)

그룹 복제: 퍼포먼스 스키마 메모리 계측 오버헤드를 줄이기 위한 이전 변경 사항이 그룹 복제 성능 저하를 초래했습니다. (버그 #28719976)
참조: 이 문제는 버그 #27500610의 회귀입니다.

그룹 복제: 그룹 복제가 특정 작업을 수행하기 전에 서버에서 실행 중인 트랜잭션을 확인합니다. 이전에는 이 확인 서비스가 커밋 단계에 있는 트랜잭션을 카운트하지 않아 작업이 시간 초과될 수 있었습니다. 이제 커밋 단계에 있는 트랜잭션도 현재 진행 중인 트랜잭션 집합에 포함됩니다. (버그 #28327838)

JSON: JSON_TABLE() 함수가 엄격 모드에서 INSERT 문과 함께 사용될 때, 변환 오류가 ON ERROR 절에 의해 처리되더라도 INSERT가 거부될 수 있었습니다. 그러나 오류가 ON ERROR 절에 의해 처리되는 경우, ERROR ON ERROR가 실제로 지정되지 않은 한, 해당 문이 거부되지 않아야 합니다.
이 문제는 NULL ON ERROR 또는 DEFAULT ... ON ERROR가 지정되었거나 암시된 경우, 대상 타입으로 값을 변환할 때 경고를 무시하도록 하여 수정되었습니다. (버그 #30628330)

JSON: JSON_TABLE() 함수의 출력이 뷰에서 사용될 때 항상 올바르지 않았습니다. 이번 수정은 다음 문제들을 해결합니다:

  • 열 이름이 따옴표로 묶이지 않아, 이들이 필요한 경우 구문 오류가 발생했습니다.
  • 일부 열 유형이 잘못 보고되었습니다.
  • UNSIGNED와 같은 일부 열 유형 속성이 손실되었습니다.
  • 열 캐릭터셋과 정렬 규칙이 손실되었습니다.

(버그 #30263373)

JSON: JSON_SCHEMA_VALID() 및 JSON_SCHEMA_VALIDATION_REPORT() 함수는 포함된 준비된 문이 실행될 때마다 인수가 JSON으로 변환 가능한지 확인했으나, 이는 효율적이지 않고 필요하지 않았습니다. 이제 이러한 경우 확인은 문이 준비될 때 한 번만 수행됩니다. (버그 #97878, 버그 #30622327)

SYSTEM_USER 권한을 가진 DEFINER를 사용하는 저장된 객체에 대해 권한 요구 사항이 잘못 확인되었습니다. (버그 #31077699)

MySQL 소스에서 생성된 문서에서 Clang이 보고한 여러 오류가 수정되었습니다. (버그 #30956093)

FreeBSD에서 krb5 패키지가 이제 종속성으로 포함됩니다. (버그 #30887620)

동일한 공통 테이블 표현식(CTE)에 대한 여러 참조가 포함된 쿼리에서 의사 주석이 CTE 정의 경계를 넘을 경우, 구문 오류 메시지가 혼란스럽게 발생했습니다. (버그 #30871301)

Debian 패키지를 사용한 설치 시, /var/run/mysqld 디렉터리가 생성되지 않았습니다. (버그 #30855015, 버그 #98484)

mysqlslap은 SQL 문이 오류를 반환할 때 스레드를 적절히 종료하지 않았습니다. 이로 인해 이미 해제된 메모리를 다시 해제하려는 시도가 발생할 수 있었습니다. (버그 #30850310)

X Plugin이 문서를 중복 키의 삽입 또는 업데이트로 컬렉션에 추가하려고 할 때, 기본 키가 아닌 필드에서 고유 키 제약 조건을 충족하지 못한 경우, 문제의 원인을 설명하지 않는 오류가 반환되었습니다. 이제 적절한 오류가 반환됩니다. (버그 #30843865)

해석기에 의해 생성된 정수 값이 부울 값을 기대하는 테스트에 전달되었습니다. (버그 #30837240)

IN 표현식을 사용하여 대용량 문자열 값을 포함하는 하나 이상의 열에 액세스하는 쿼리가 메모리 누수를 일으킬 수 있었습니다. (버그 #30814171)

DELETE 문의 대상이 공통 테이블 표현식(Common Table Expression, CTE)일 때 문장이 제대로 작동하지 않았습니다. (버그 #30796015, 버그 #98330)

create_admin_listener_thread를 활성화하고 admin_address를 활성화하지 않은 상태에서 서버를 시작하면 종료 중 비정상 종료가 발생했습니다. (버그 #30785609)

동일한 열에 대해 기본 키와 보조 키가 있는 테이블에서, 보조 인덱스의 길이가 다른 경우 범위 최적화기가 범위 값을 비교할 때 잘못된 키 부분을 선택했습니다. (버그 #30783011)

잘못된 타입의 인수를 가진 집계 함수와 함께 DISTINCT를 사용할 때 발생한 오류가 올바르게 전파되지 않았습니다. (버그 #30782687)

압축을 사용한 복제에서, 마스터가 재시작되면 슬레이브가 어설션을 발생시킬 수 있었습니다. (버그 #30774692)

디버그 빌드의 경우 최적화기 트레이스를 출력하는 중 서버가 종료될 수 있었습니다. (버그 #30773218, 버그 #98258)

mysql_real_connect_nonblocking() C API 함수가 블로킹 동작을 보였습니다. (버그 #30771233)

LOCK TABLES가 활성화된 상태에서, INFORMATION_SCHEMA 쿼리를 처리하는 동안 서버가 내부 임시 테이블을 잠그려고 시도하여 어설션이 발생할 수 있었습니다. (버그 #30764651, 버그 #98221)

mysqldump의 내부 네트워크 타임아웃이 700초에서 86400초로 증가하여 바쁜 서버 또는 응답하지 않는 서버에 연결할 수 있었습니다. (버그 #30755992, 버그 #98203)

-DWITH_SASL=_path/to/custom/installation_을 설정하면 libsasl이 의도치 않게 daemon_memcached 플러그인에 연결되었습니다. (버그 #30755301)

윈도우 함수의 프레임 버퍼와 연결된 임시 테이블을 삭제한 후, 프레임 버퍼의 임시 테이블 매개변수가 정리되지 않아 복사 필드와 연결된 문자열 버퍼가 제대로 해제되지 않았습니다. (버그 #30752366)

-libs-compat RPM 패키지가 이제 zlib 시스템과 함께 빌드되어 libmysqlclient.so.18에서 기호를 무제한 내보내는 문제를 방지합니다. (버그 #30722389, 버그 #98130)

서버가 히스토그램 샘플링을 일찍 종료하여 어설션 실패가 발생했습니다. 샘플링 작업의 완료를 나타내는 불필요한 부울 변수가 제거되었습니다. (버그 #30717778)

항상 거짓인 조건 때문에 WHERE 조건을 제거할 때, 물질화된 파생 테이블이 제대로 정리되지 않아 메모리 누수가 발생했습니다. (버그 #30712243)

동일한 GEOMETRY 값을 여러 번 비교할 때 항상 제대로 처리되지 않았습니다. (버그 #30697042)
참고: 이 문제는 버그 #30306306과도 관련이 있습니다.

MIN()MAX()IN () 하위 쿼리를 포함한 WHERE 절에서 일부 쿼리에 대해 잘못된 값을 반환할 수 있었습니다. (버그 #30691682, 버그 #98047)

서버 시작 시 MySQL Enterprise Firewall이 활성화된 상태에서 화이트리스트와 사용자 테이블이 없으면 서버 시작에 실패했습니다. (버그 #30690181)

준비된 문장에서 정리된 물리적 임시 테이블이 여전히 참조되고 있을 경우, 다시 실행할 때 서버가 종료될 수 있었습니다. (버그 #30674598)

ER_WARN_DEPRECATED_SQL_CALC_FOUND_ROWSER_WARN_DEPRECATED_FOUND_ROWS 오류 메시지가 잘못된 범주로 분류되었습니다. 이제 이들은 클라이언트에 보내는 메시지로 올바르게 분류되며, 오류 로그 메시지 범위에서는 OBSOLETE_ER_WARN_DEPRECATED_SQL_CALC_FOUND_ROWSOBSOLETE_ER_WARN_DEPRECATED_FOUND_ROWS로 지정되었습니다. (버그 #30673043)

하위 쿼리 내 일부 조인이 외부 쿼리에서 EXISTS 또는 NOT EXISTS를 사용할 때 항상 올바르게 처리되지 않았습니다. (버그 #30671329)

ORDER BY 절이 결과에 영향을 미치지 않는 ORDER BY _constant_ 쿼리가 항상 올바르게 처리되지 않았습니다. (버그 #30669493)

wild_case_match()에서 경계를 벗어난 체크가 누락되어 포인터가 경계를 넘어 읽기를 시도하는 문제가 발생했습니다. (버그 #30668886)

strconvert() 함수가 filenameutf8_general_ci 문자열 간의 변환에 대해 안전하지 않았습니다. (버그 #30668847)

고정 길이 키를 사용하는 일부 파일 정렬이 항상 올바르게 처리되지 않았습니다. (버그 #30665034)

두 문자열 열(특히 PAD SPACE 정렬 방식의 BLOB 열) 간의 해시 조인 수행 시, MySQL이 전체 정렬 키를 행에 저장하여 대량의 메모리를 사용하게 되었습니다. 이제 정렬 규칙에 따라 인식된 해시만 저장되며, 64비트 해시 충돌 시에도 잘못된 결과를 방지하기 위해 추가적인 동등성 비교가 추가되었습니다. (버그 #30664831)

두 개 이상의 테이블이 세미조인으로 결합되고 조인 최적화기가 느슨한 스캔을 선택한 경우, 두 왼쪽 테이블이 중복 제거 중첩 루프 이터레이터 아래에 배치되어 과도한 중복 제거가 발생할 수 있었습니다. 이 문제는 여러 테이블에 걸친 느슨한 스캔을 별도의 내부 구조로 처리하여 해결했습니다. (버그 #30659810)

const 테이블과 0개 이상의 알려진 0 값 표현식이 포함된 유니언에서 정확히 하나의 행을 가진 파생 테이블이 0개의 행을 가진 것으로 잘못 읽힐 수 있었습니다. (버그 #30655712, 버그 #97967)

MySQL 8.0.19 패치에서 잘못된 INFORMATION_SCHEMA 및 데이터 사전 버전 번호가 설정되었습니다. 어설션 코드를 추가하여 이후 버전 정보 오류를 방지했습니다. (버그 #30645158, 버그 #97948)
참고: 이 문제는 버그 #29871530의 회귀 문제입니다.

이터레이터 트리를 설정할 때, 최적화기가 자명하게 참인 조건을 필터링하고 무시하도록 수정되었습니다. (버그 #30644591)

특정 조건에서, 임시 MERGE 테이블에서 SHOW COLUMNS를 실행하면 어설션이 발생하거나 서버가 종료될 수 있었습니다. (버그 #30640463)
참고: 이 문제는 버그 #28811287 및 버그 #92834의 회귀 문제입니다.

이벤트 스케줄러에 메모리 누수가 있었습니다. (버그 #30628268)

비동기 C API 함수 사용 시, 이미 해제된 메모리를 다시 해제하려고 시도할 수 있었습니다. (버그 #30596999, 버그 #97805)

CHECK 제약 조건을 포함한 테이블에서 일부 간단한 쿼리가 과도한 메모리 할당 및 성능 스키마 호출로 인해 비효율적이었습니다. (버그 #30594613)

특정 상황에서 Memcached 명령이 초기화되지 않은 메모리 버퍼를 읽어 실패를 일으킬 수 있었습니다. (버그 #30592346)

InnoDBINFORMATION_SCHEMA.INNODB_TABLES을 채우는 동안 스키마 및 테이블 메타데이터 요청을 발행하는 동안 스키마가 삭제되는 경우 경합 상태가 발생하여 사용자 쿼리가 INNODB_TABLES에서 오류를 보고할 수 있었습니다. (버그 #30591967)

클라이언트 라이브러리가 악의적인 서버에 의해 무한 루프에 빠질 수 있었습니다. (버그 #30581726)

ALTER USER를 사용하여 계정의 MAX_USER_CONNECTIONS 값을 재설정한 경우, 현재 연결된 계정이 있을 때 모든 연결이 종료될 때까지 설정이 적용되지 않았습니다. (버그 #30578217, 버그 #97735)

최적화기가 ‘위드아웃'(weedout)을 설정할 때, 위드아웃의 일부인 모든 테이블에 행 ID를 제공하라고 알립니다. 단일 행을 반환하는 ‘위드아웃’의 경우(수렴 위드아웃), 최적화기는 행 ID 없이 처리해야 한다고 예상합니다. 이터레이터 실행기에서는 LIMIT 1을 사용하여 수렴 위드아웃을 구현하지만, 일반 위드아웃 이터레이터는 수렴 위드아웃을 처리하지 않고 항상 행 ID를 기대합니다. 외부 조인의 오른쪽에서 수렴 위드아웃이 처리될 경우, 수렴 위드아웃이 일반 위드아웃으로 처리되어 이터레이터 실행기가 테이블에서 제공하지 않은 행 ID를 요청하게 됩니다. 이제 이러한 경우에도 LIMIT 1 최적화가 적용됩니다. (버그 #30566549, 버그 #30282693)

SET PERSIST가 잘못된 디렉토리로 변수를 지속하려고 시도하여 실패할 수 있었습니다. (버그 #30561982)

테이블이 없는 데이터베이스의 테이블 이름이 잘못되었을 때에도 저장된 프로그램에서 정의된 오류 핸들러가 호출되지 않았습니다. (버그 #30561920, 버그 #97682)

MySQL의 중복 제거 최적화 전략(참고: IN 및 EXISTS 서브쿼리 프레디케이트의 세미조인 변환 최적화)은 이미 본 행 ID의 내부 테이블을 사용하며, 이 테이블의 열에는 고유 인덱스가 있습니다. 이 고유 인덱스의 키가 너무 커지면(매우 큰 행 ID에서 발생할 수 있음), 서버는 고유하지 않은 해시 키로 중복 제거로 돌아가며, 해시 필드에만 인덱스를 사용하는 임시 테이블과 동일합니다. 후자의 인덱스가 제대로 초기화되지 않아 쿼리가 제대로 실행되지 않고 서버가 조기 종료될 수 있었습니다. (버그 #30556257)

디버그 빌드의 경우 LOCK TABLES에서 서버가 물질화된 임시 테이블을 잘못 처리하고 어설션을 발생시킬 수 있었습니다. (버그 #30476213, 버그 #97404)

물질화된 쿼리 블록 배열 SELECT_LEX_UNIT::m_query_blocks_to_materialize가 실행 간에 재설정되지 않아, 두 번째 실행 시 준비된 문이 실패할 수 있었습니다. (버그 #30438038)

열 정렬을 변경하더라도 서버를 재시작하기 전까지는 고유 인덱스에 영향을 미치지 않았습니다. (버그 #30386119, 버그 #97103)

역할을 사용할 때, 저장 함수에 대한 EXECUTE 권한이 저장 프로시저에 대한 권한으로 처리되었습니다. 이로 인해 함수에 대한 역할 권한으로 EXECUTE를 사용할 수 없었습니다. (버그 #30376231)

비결정 함수에 대한 입력으로 열 값이 사용된 조건이 포함된 물질화된 서브쿼리가 잘못된 결과를 생성했습니다. (버그 #30368937)

여러 가지 수정 사항이 InnoDB Memcached 플러그인에 적용되었습니다. 이러한 수정 사항은 잠재적인 교착 상태 문제, 연결 목록 래치 관련 문제, 오래된 플러시 뮤텍스 제거와 관련된 문제를 해결했습니다. (버그 #30354225)

utf8mb4_0900_bin 정렬을 사용하는 문자열이 다른 정렬을 사용하는 utf8mb4 문자열과 비교할 수 없었습니다. 이제 두 문자열 모두에 대해 utf8mb4_0900_bin을 사용하여 비교합니다. (버그 #30350111)

최적화 중 MySQL은 모든 인수가 동일하다고 간주되는 조건을 제거합니다. 예를 들어, 1 <> 1은 제거되고 false로 대체됩니다. 이 과정에서 비결정 인수가 포함된 조건도 제거되어 RAND() < RAND() 같은 조건이 불가능한 조건으로 간주되었습니다. 이제 최적화기가 비결정 인수가 포함된 조건을 더 이상 제거하지 않습니다. (버그 #30311271)

이벤트를 제거하면 이벤트 스케줄링이 방해받을 수 있었습니다. (버그 #30301356, 버그 #96849)

이벤트 스케줄러가 Valgrind 빌드에서 경고를 보고했습니다. (버그 #30301340)

클론 플러그인을 사용하는 동안 서버를 종료하면 Valgrind 오류가 발생했습니다. (버그 #30248419)

mysqld-auto.cnf 파일이 잘못된 형식인 경우 서버가 시작되지 않았으나(예상된 동작), 오류를 보고하지 않았습니다(예상치 않은 동작). (버그 #30169731, 버그 #96501)

UPDATE 문이 일치하는 행 중 일부만 업데이트된 경우, 일치하는 행(찾은 행)의 수가 일관되지 않게 반환될 수 있었습니다. 예를 들어, WITH CHECK OPTION 절이 있는 뷰를 통해 업데이트되지 않은 행은 일치하는 행으로 계산되지 않았으나, 실패한 CHECK CONSTRAINT 때문에 업데이트되지 않은 행은 일치하는 행으로 계산되었습니다. 이제 WITH CHECK OPTION 절을 통과하지 못한 행도 일치하는 행으로 계산됩니다. (버그 #30158954)

복제된 디렉터리에서 MySQL 서버를 다시 시작할 때, InnoDB가 이전에 서버에서 삭제한 통계 테이블에 대한 테이블 스페이스 파일을 찾을 수 없다는 오류를 보고했습니다. (버그 #30093799)

ORDER BY를 사용하는 서브쿼리를 포함한 쿼리에서 UNION을 올바르게 처리하지 못했습니다. (버그 #29952565)

INFORMATION_SCHEMA 쿼리에 대해 동적 통계 테이블을 업데이트할 때, 키를 삽입하려는 여러 시도로 인해 중복 키 오류가 발생할 수 있는 경합 조건이 발생했습니다. (버그 #29948755, 버그 #95929)

문자열을 반환하는 함수에 대해 정의된 뷰의 경우, SHOW CREATE VIEW가 혼합된 정렬 오류로 실패할 수 있었습니다. (버그 #29904087)

스레드가 삭제될 때 성능 스키마가 스레드 계측을 제거하지 못할 수 있었습니다. (버그 #29859605)

지수 표기법을 포함하는 숫자 값을 포함한 WHERE 절을 가진 쿼리가 올바르게 처리되지 않았습니다.
또한, 특정 정수를 문자열로 삽입하려고 할 때 문자열을 정수로 변환하지 못하여 서버가 종료되는 문제가 발생했습니다. (버그 #29723340, 버그 #30441969)

ER_CLONE_DONOR 오류를 수집하고 수신자의 데이터가 삭제되었는지 확인하는 내부 인터페이스가 추가되었습니다. (버그 #29682642)

DEFAULT 값이 있는 경우 테이블에서 열을 삭제할 수 없었습니다. (버그 #29661106)

CONNECTION_CONTROL 플러그인의 경우, 성능 스키마 계측이 실제로 관련 코드가 실행되지 않으면 성능 스키마에서 발견되지 않는 키를 사용했습니다. (버그 #29539976)

널 값이 가능한 열 c에 대해, 이제 최적화기가 c < c, c > c, c <> c 조건이 항상 거짓임을 인식하고 모든 행에 대해 평가하지 않습니다. (널 값이 불가능한 열의 경우 최적화기가 이미 항상 거짓인 조건을 인식했습니다.) Daniel Black에게 감사드립니다. (버그 #29115386, 버그 #93642)

Index.xml에서 문자 집합을 재초기화할 때 해제 후 사용 오류가 발생할 수 있었습니다. (버그 #28956360, 버그 #93276)

sys 스키마 ps_setup_reset_to_default() 프로시저가 MySQL 5.7 기본값을 사용하고 있었으나 이제는 MySQL 8.0 기본값을 사용하도록 수정되었습니다. (버그 #27636611)

일부 연결 암호화 암호가 작동하지 않았습니다. (버그 #27045306)

이전에는 mysqlpump가 옵션 파일에서 [mysql_dump][client] 그룹을 읽었습니다. 이제 mysqlpump[mysqlpump] 그룹도 읽습니다. [mysql_dump] 그룹은 여전히 허용되지만 더 이상 사용되지 않습니다. (버그 #24733245, 버그 #83144)

SELECT DISTINCT ... ORDER BY ... 형식의 쿼리에서, ORDER BY가 조인의 첫 번째 테이블로 푸시되었을 때 결과가 항상 올바르게 정렬되지 않았습니다. (버그 #98217, 버그 #30760534)

가변 길이 키로 사용된 항목에 대해 NULL 표시기가 제대로 기록되지 않아 모든 항목이 NULL이 아닌 것으로 간주되었으며, 특정 정렬 방식을 사용할 때 빈 문자열과 동일하게 간주되었습니다. 이 문제의 한 가지 눈에 띄는 예는 nullable 문자열을 사용하는 표현식으로 정렬할 때 순서가 잘못되는 경우입니다. 예를 들어, 열 c1NULL 값과 빈 문자열 값이 모두 포함된 경우 다음과 같은 쿼리에서 이 문제가 발생할 수 있습니다:

SELECT c1, SUBSTR(c1, 1) AS c2 FROM t ORDER BY c2;

(버그 #98035, 버그 #30687020)

열 이름이 대소문자가 다른 표현식에서 GROUP BY 절을 사용할 때, 쿼리가 부정확한 결과를 반환했습니다. 예를 들어, CREATE TABLE 명령문에서 열 이름이 ID로 정의되었지만 쿼리에서 GROUP BY id를 사용하는 경우입니다.
이 문제는 서버가 표현식의 열 이름과 테이블의 열 이름을 대소문자를 구분하여 비교했기 때문에 발생했습니다. 이제 서버가 이러한 비교를 예상대로 대소문자를 구분하지 않고 수행하도록 수정되었습니다. (버그 #97628, 버그 #98222, 버그 #30541701, 버그 #30761372)

두 개의 테이블을 결합한 서브쿼리로 파생된 테이블에 결합된 테이블을 업데이트하는 다중 테이블 UPDATE 문이 MySQL 5.6에서는 적절히 최적화되었으나, MySQL 8.0에서는 서브쿼리에 대해 STRAIGHT_JOIN을 사용한 것처럼 처리되었습니다. (버그 #97418, 버그 #30488700)

EXPLAIN은 이제 블록 중첩 루프 대신 해시 조인을 사용합니다. 왜냐하면 후자는 더 이상 존재하지 않고 거의 모든 경우에 해시 조인으로 대체되었기 때문입니다. (버그 #97299, 버그 #30444550)

외부 쿼리 블록의 테이블에서 열을 참조하는 ON 조인 조건이 작동하지 않았으며, WHERE에서만 사용할 수 있었습니다. 이 문제는 다음과 같은 쿼리가 이제 올바르게 작동하도록 수정되었습니다:

SELECT o.order_date FROM orders o 
WHERE o.order_date IN  ( SELECT c.contact_name FROM customers c     
INNER JOIN order_details od
ON o.order_id = od.discount );

이전에는 이 쿼리를 다음과 같이 다시 작성해야 했습니다:

SELECT o.order_date FROM orders o 
WHERE o.order_date IN  ( SELECT c.contact_name FROM customers c
INNER JOIN order_details od
ON 1 
WHERE o.order_id = od.discount );

동일한 FROM 절의 다른 테이블을 참조하는 경우, 예를 들어 SELECT * FROM t1 CROSS JOIN (t2 LEFT JOIN t3 ON t1.c=3)와 같은 쿼리에서는 여전히 외부 참조가 금지되며 이 경우에는 다음과 같이 LATERAL 조인이 필요합니다: SELECT * FROM t1 JOIN LATERAL (SELECT * FROM t2 LEFT JOIN t3 ON t1.c=3). (버그 #96946, 버그 #30350696)

복합 해시 인덱스의 첫 번째 열을 필터링한 쿼리에서 이 인덱스를 잘못 사용하여 오류가 발생했습니다. (버그 #94737, 버그 #29527115)

외부 쿼리 블록의 테이블에서 열을 참조하는 ON 조인 조건이 작동하지 않았으며, WHERE에서만 사용할 수 있었습니다. 이 문제는 다음과 같은 쿼리가 이제 올바르게 작동하도록 수정되었습니다:

SELECT o.order_date FROM orders o
WHERE o.order_date IN  ( SELECT c.contact_name FROM customers c
                    INNER JOIN order_details od
                    ON o.order_id = od.discount );

이전에는 이 쿼리를 다음과 같이 다시 작성해야 했습니다:

SELECT o.order_date FROM orders o
WHERE o.order_date IN  ( SELECT c.contact_name FROM customers c
                    INNER JOIN order_details od
                    ON 1
                    WHERE o.order_id = od.discount );

동일한 FROM 절의 다른 테이블을 참조하는 경우, 예를 들어 SELECT * FROM t1 CROSS JOIN (t2 LEFT JOIN t3 ON t1.c=3)와 같은 쿼리에서는 여전히 외부 참조가 금지되며 이 경우에는 다음과 같이 LATERAL 조인이 필요합니다: SELECT * FROM t1 JOIN LATERAL (SELECT * FROM t2 LEFT JOIN t3 ON t1.c=3). (버그 #35242, 버그 #96946, 버그 #11748138, 버그 #30350696)

서버를 빌드하는 데 사용된 OpenSSL 버전과 MySQL의 다른 부분(예: 라이브러리 또는 플러그인)에 사용된 버전 간에 불일치가 발생할 수 있었습니다. 이로 인해 LDAP 인증 플러그인과 같은 일부 기능이 작동하지 않을 수 있었습니다. 이제 동일한 OpenSSL 버전이 모든 빌드에 사용됩니다. (WL #13759)

a=b AND FALSE와 같은 불가능한 표현식을 FALSE로 최적화하는 MySQL 8.0의 이전 작업은 이러한 표현식이 외부 조인 조건으로 나타날 때 덜 효율적인 실행을 초래할 수 있었습니다. 조인이 필터를 따르는 카테시안 곱으로 해석되기 때문입니다. (버그 #8202, 버그 #89739, 버그 #97552, 버그 #11745046, 버그 #27581277, 버그 #30520749)
참고: 이 문제는 버그 #98206 및 버그 #30756135와 관련이 있습니다.

Leave a Comment



이 문서 공유

8.0.20 변경 사항 (2020-04-27 GA)

링크 복사

CONTENTS