MySQL 8.0 Release Note

8.0.21 변경 사항 (2020-07-13 GA)

Estimated reading: 10 minutes 70 views

공식 문서: Changes in MySQL 8.0.21 (2020-07-13, General Availability)

계정 관리 관련 사항

이제 MySQL 사용자 계정을 생성하거나 업데이트할 때 사용자별 코멘트와 속성을 설정할 수 있습니다. 사용자 코멘트는 COMMENT 절의 인수로 전달된 임의의 텍스트로, CREATE USER 또는 ALTER USER 문에서 사용됩니다. 사용자 속성은 JSON 객체 형태의 데이터로, 이 두 문에서 사용되는 ATTRIBUTE 절의 인수로 전달됩니다. 속성은 JSON 객체 표기법의 유효한 키-값 쌍을 포함할 수 있습니다.
예를 들어, 다음 두 문 중 첫 번째 문은 bill@localhost 사용자 계정을 생성하며, 코멘트 텍스트로 This is Bill's user account를 사용합니다. 두 번째 문은 이 계정에 email 키와 bill@example.com 값을 가진 사용자 속성을 추가합니다.

CREATE USER 'bill'@'localhost' COMMENT 'This is Bill\'s user account';

ALTER USER 'mary'@'localhost'
    ATTRIBUTE '{"email":"bill@example.com"}';

동일한 CREATE USER 또는 ALTER USER 문에서 COMMENTATTRIBUTE를 동시에 사용할 수는 없습니다.
사용자 코멘트와 사용자 속성은 내부적으로 JSON 객체로 함께 저장되며, 코멘트 텍스트는 comment 키의 값으로 저장됩니다. 사용자 코멘트와 사용자 속성은 INFORMATION_SCHEMA.USER_ATTRIBUTES 테이블의 ATTRIBUTE 열에서 조회할 수 있습니다. 이 데이터는 JSON 형식이므로 MySQL의 JSON 함수와 연산자(참조: JSON Functions)를 사용하여 작업할 수 있습니다. 기존 사용자 속성의 변경 사항은 JSON_MERGE_PATCH()를 사용한 것처럼 현재 값과 병합됩니다. 새로운 키-값 쌍은 속성에 추가되며, 기존 키의 새로운 값은 이전 값을 덮어씁니다.
특정 키-값 쌍을 사용자 속성에서 제거하려면, ALTER USER user ATTRIBUTE '{"key":null}' 명령을 사용하십시오.
자세한 정보와 예시는 CREATE USER 문, ALTER USER 문, 및 INFORMATION_SCHEMA USER_ATTRIBUTES 테이블을 참조하십시오. (WL #13562)
참고: 또한 버그 #31067575를 참조하십시오.

C API 관련 사항

OpenSSL 권장에 따라, C 클라이언트 라이브러리에서 사용하던 x509_check_host()X509_check_ip_asc() 호출이 각각 X509_VERIFY_PARAM_set1_host()X509_VERIFY_PARAM_set1_ip_asc() 호출로 대체되었습니다. (버그 #29684791)

MySQL C API는 이제 비동기 함수에 대한 압축을 지원합니다. 즉, mysql_options() 함수의 MYSQL_OPT_COMPRESSION_ALGORITHMSMYSQL_OPT_ZSTD_COMPRESSION_LEVEL 옵션이 동기 작업뿐만 아니라 비동기 작업에도 영향을 미칩니다. 자세한 내용은 mysql_options()를 참조하십시오.Facebook의 기여에 감사드립니다. (버그 #96802, 버그 #30284871, WL #13510)

컴파일 관련 사항

서버 빌드에 필요한 최소 Boost 라이브러리 버전이 이제 1.72.0입니다. (버그 #30963985)

설정 관련 사항

tcmalloc은 더 이상 mysqld_safe--malloc-lib 옵션에서 허용되지 않습니다. (버그 #31372027)

연결 관리 관련 사항

MySQL 서버는 일반 클라이언트 연결을 위한 “메인” 네트워크 인터페이스와 선택적으로 관리용 클라이언트 연결을 위한 관리용 네트워크 인터페이스를 지원합니다. 이전에는 메인 인터페이스와 관리 인터페이스가 암호화된 연결을 위한 인증서 및 키 파일과 같은 동일한 TLS 구성을 사용했습니다. 이제 관리 인터페이스에 대해 별도로 TLS 자료를 구성할 수 있습니다.

  • 관리 인터페이스에만 적용되는 새로운 구성 매개변수가 추가되었습니다.
  • ALTER INSTANCE RELOAD TLS 문에 FOR CHANNEL 절이 확장되어, TLS 컨텍스트를 다시 로드할 채널(인터페이스)을 지정할 수 있습니다.
  • 새로운 퍼포먼스 스키마 tls_channel_status 테이블은 메인 및 관리 인터페이스의 TLS 컨텍스트 속성을 노출합니다.
  • 하위 호환성을 위해, 관리 인터페이스는 관리 인터페이스에 대해 비표준 TLS 매개변수 값이 구성되지 않는 한 메인 인터페이스와 동일한 TLS 컨텍스트를 사용합니다.

자세한 내용은 암호화된 연결을 위한 관리 인터페이스 지원, ALTER INSTANCE 문, 및 tls_channel_status 테이블을 참조하십시오. (WL #13850)

사용 중단 및 제거 관련 사항

파티셔닝: 인덱스 접두사가 있는 컬럼은 테이블의 파티셔닝 키의 일부로 지원되지 않습니다. 이전에는 이러한 컬럼이 키로 파티셔닝된 테이블을 생성, 변경 또는 업그레이드할 때 서버에 의해 단순히 생략되었으며, 제안된 파티셔닝 함수가 접두사가 있는 컬럼만 사용하는 경우를 제외하고는 이 생략에 대한 표시가 없었으며, 이 경우 오류 메시지가 발생했으나 실제 문제의 원인을 명확히 밝히지 않았습니다. 이 동작은 이제 사용 중단되었으며, 향후 릴리스에서 이러한 컬럼을 사용한 파티셔닝 키를 제안할 경우 CREATE TABLE 또는 ALTER TABLE 문이 거부될 수 있습니다.
인덱스 접두사를 사용하는 한 개 이상의 컬럼이 파티셔닝 키의 일부로 지정된 경우, 이제 각 컬럼에 대해 경고가 생성됩니다. 또한, 제안된 파티셔닝 키에 지정된 모든 컬럼이 인덱스 접두사를 사용하는 경우, CREATE TABLE 또는 ALTER TABLE 문이 거부되면, 반환된 오류 메시지는 해당 문이 실패한 이유를 명확하게 설명합니다. 여기에는 테이블의 기본 키에 있는 컬럼을 암시적으로 정의하는 빈 PARTITION BY KEY() 절을 사용하는 경우도 포함됩니다.
자세한 내용과 예시는 키 파티셔닝에 대한 컬럼 인덱스 접두사 미지원KEY 파티셔닝을 참조하십시오. (버그 #29941932, 버그 #29941959, 버그 #31100205, WL #13588)
참고: 또한 버그 #29942014를 참조하십시오.

JSON 관련 사항

JSON_VALUE() 함수를 추가하여 JSON 컬럼에 인덱스를 생성하는 작업을 간소화했습니다. JSON_VALUE(json_docpath RETURNING type) 호출은 CAST( JSON_UNQUOTE( JSON_EXTRACT(json_docpath) ) AS type)와 동일하며, 여기서 json_doc은 JSON 문서이고, path는 문서 내의 단일 값을 가리키는 JSON 경로 표현식이며, typeCAST()와 호환되는 데이터 유형입니다. RETURNING type은 선택 사항이며, 반환 유형이 지정되지 않으면 JSON_VALUE()VARCHAR(512)를 반환합니다.
JSON_VALUE()는 또한 JSON_TABLE()과 유사한 ON EMPTYON ERROR 절을 지원합니다.
JSON_VALUE()를 사용하여 JSON 컬럼에 인덱스를 생성할 수 있습니다. 예시는 다음과 같습니다:

CREATE TABLE inventory(
    items JSON,
    INDEX i1 ( (JSON_VALUE(items, '$.name' RETURNING CHAR(50))) ),
    INDEX i2 ( (JSON_VALUE(items, '$.price' RETURNING DECIMAL(5,2))) ),
    INDEX i3 ( (JSON_VALUE(items, '$.quantity' RETURNING UNSIGNED)) )
);

items 컬럼에 {"name": "hat", "price": "22.95", "quantity": "17"}과 같은 값이 포함되어 있다고 가정하면, 다음과 같은 인덱스를 사용할 수 있는 쿼리를 실행할 수 있습니다:

SELECT items->"$.price" FROM inventory
    WHERE JSON_VALUE(items, '$.name' RETURNING CHAR(50)) = "hat";

SELECT * FROM inventory
    WHERE JSON_VALUE(items, '$.price' RETURNING DECIMAL(5,2)) <= 100.01;

SELECT items->"$.name" AS item, items->"$.price" AS amount
    FROM inventory
    WHERE JSON_VALUE(items, '$.quantity' RETURNING UNSIGNED) > 500;

자세한 정보와 예시는 JSON_VALUE() 함수 설명을 참조하십시오. (WL #12228)

옵티마이저 관련 사항

MySQL은 LIMIT 절이 있는 ORDER BY 또는 GROUP BY 쿼리에서 최적화를 위해 항상 정렬된 인덱스를 사용하려고 시도하며, 이 방식이 더 빠른 실행을 제공할 것으로 판단될 경우 옵티마이저가 선택한 다른 옵션을 무시합니다. 이 결정 알고리즘은 데이터 분포 및 기타 조건에 대한 특정 가정을 기반으로 하므로 항상 완벽하게 정확하지는 않으며, 일부 경우에는 다른 최적화를 선택하는 것이 성능에 더 유리할 수 있습니다. 이러한 상황을 처리하기 위해 이제 optimizer_switch 시스템 변수를 사용하여 prefer_ordering_index 플래그를 off로 설정하여 이 최적화를 비활성화할 수 있습니다.
이 플래그와 사용 예에 대한 자세한 내용은 전환 가능한 최적화LIMIT 쿼리 최적화를 참조하십시오.
Jeremy Cole에게 기여해주신 것에 감사드립니다. (버그 #97001, 버그 #30348211, WL #13929)
참고: 또한 버그 #31686878을 참조하십시오.

LIMIT 또는 ORDER BY를 사용하지 않는 경우, [NOT] IN 또는 [NOT] EXISTS 조건을 포함하는 서브쿼리를 사용하는 단일 테이블 UPDATE 또는 DELETE 문이 이제 세미조인 변환 또는 서브쿼리 물리화를 사용할 수 있습니다. 이는 서브쿼리에서 사용된 옵티마이저 힌트 또는 optimizer_switch 서버 시스템 변수 값에 따라 허용됩니다.
세미조인 최적화 또는 서브쿼리 물리화가 단일 테이블 DELETE 또는 UPDATE에 사용되는 경우, 옵티마이저 트레이스의 join_optimization 객체에서 이를 확인할 수 있습니다. 또한 EXPLAIN FORMAT=TREE를 사용하여 변환이 수행되었는지 확인할 수 있습니다. 최적화가 수행되지 않은 경우, 이 명령은 <not executable by iterator executor>를 표시하며, 다중 테이블 문에서는 전체 플랜을 보고합니다.
이 작업의 일환으로, 트랜잭션 격리 수준이 REPEATABLE READ보다 약할 때, 다중 테이블 InnoDB 테이블의 UPDATE 문에서 반일관성 읽기를 지원합니다. (버그 #35794, 버그 #96423, 버그 #11748293, 버그 #30139244, WL #6507)

optimizer_switch 플래그 subquery_to_derived를 추가했습니다. 이 플래그가 on으로 설정되면, 옵티마이저는 적격한 스칼라 서브쿼리를 유도 테이블에 대한 좌측 외부 조인(경우에 따라 내부 조인)으로 변환합니다. 이 최적화는 다음 조건을 충족하는 서브쿼리에 적용될 수 있습니다:

  • 하나 이상의 집계 함수를 사용하지만 GROUP BY가 없음.
  • SELECT, WHERE, JOIN 또는 HAVING 절의 일부로 사용됨.
  • 상관 서브쿼리가 아님.
  • 비결정적 함수를 사용하지 않음.

ANYALL 서브쿼리 중 MIN() 또는 MAX()로 재작성될 수 있는 쿼리도 영향을 받지 않습니다.
subquery_to_derived=on 상태에서는 GROUP BY 절이 없는 IN, NOT IN, EXISTS, 또는 NOT EXISTS의 인수로 사용되는 테이블 서브쿼리에도 이 최적화를 적용할 수 있습니다.
subquery_to_derived 플래그는 기본적으로 off로 설정되어 있으며, 일반적으로 성능 향상에 도움이 되지 않으므로 주로 테스트 목적으로 사용됩니다.
자세한 내용과 예시는 전환 가능한 최적화(Switchable Optimizations)를 참조하세요. 또한, 파생 테이블, 뷰 참조 및 공통 테이블 표현식의 병합 또는 물질화 최적화(Optimizing Derived Tables, View References, and Common Table Expressions with Merging or Materialization)LIMIT 쿼리 최적화(LIMIT Query Optimization)도 참고할 수 있습니다. (WL #13851)

MySQL 8.0.18에서 수행된 작업을 기반으로, 문자열 데이터 유형을 숫자 또는 시간 유형과 비교할 때의 불일치를 방지하기 위해 쿼리에 캐스트를 주입하는 기능을 서버가 수행합니다. 이제 옵티마이저는 표현식 및 조건 내에서 인수의 데이터 유형과 예상 데이터 유형이 일치하지 않는 경우 항목 트리 내에서 캐스팅 작업을 추가합니다. 이로 인해 문자열 유형이 숫자 또는 시간 유형과 비교되는 쿼리가 SQL 표준을 준수하는 쿼리와 동일하게 작동하며, 이전 MySQL 릴리스와의 하위 호환성도 유지됩니다. 이러한 캐스트는 표준 숫자 비교 연산자(=>=><<=<>/!=<=>)를 사용하여 문자열 값이 숫자 또는 시간 값과 비교될 때마다 수행됩니다.
이제 이러한 암시적 캐스트는 문자열 유형(CHARVARCHARBINARYVARBINARYBLOBTEXTENUM, 또는 SET)과 숫자 유형(SMALLINTTINYINTMEDIUMINTINT/INTEGERBIGINTDECIMAL/NUMERICFLOATDOUBLEREAL; BIT) 간에 수행되며, 문자열 값은 DOUBLE로 캐스트됩니다. 숫자 값이 이미 DOUBLE, FLOAT, REAL 유형이 아닌 경우, 해당 값 또한 DOUBLE로 캐스트됩니다. YEAR 값도 문자열 값과 비교할 때 DOUBLE로 캐스트됩니다. 문자열 유형이 TIMESTAMP 또는 DATETIME 값과 비교될 때는 인수들이 DATETIME으로 캐스트되며, 문자열 유형이 DATE 값과 비교될 때는 문자열이 DATE로 캐스트됩니다.
예를 들어, SELECT * FROM t1 JOIN t2 ON t1.char_col = t2.int_col와 같은 쿼리는 SELECT * FROM t1 JOIN t2 ON CAST(t1.char_col AS DOUBLE) = CAST(t2.int_col AS DOUBLE)로 재작성되고 실행됩니다. 또한 SELECT * FROM t1 JOIN t2 ON t1.varchar_col = t2.timestamp_colSELECT * FROM t1 JOIN t2 ON CAST(t1.varchar_col AS DATETIME) = CAST(t2.timestamp_col AS DATETIME)로 변환되어 실행됩니다.
특정 쿼리에 캐스트가 주입되는 경우, EXPLAIN ANALYZE, EXPLAIN FORMAT=JSON, 또는 EXPLAIN FORMAT=TREE의 출력에서 확인할 수 있습니다. EXPLAIN [FORMAT=TRADITIONAL]도 사용할 수 있지만, 이 경우 EXPLAIN 문을 실행한 후 SHOW WARNINGS를 실행하여 재작성된 쿼리를 확인해야 합니다.
이 변경 사항은 쿼리 결과나 성능에 영향을 미치지 않을 것으로 예상됩니다. (WL #13456)

패키징 관련 사항

RPM 및 Debian 패키지에서 클라이언트 측 플러그인은 서버 패키지에서 클라이언트 패키지로 이동되었습니다. 또한 클라이언트 측 플러그인의 디버그 버전은 테스트 패키지로 이동되었습니다. (버그 #31123564, 버그 #31336340)

Windows용 MSI 패키지에는 더 이상 레거시 서버 데이터 구성 요소가 포함되지 않습니다. (버그 #31060177)

번들로 제공되는 Protobuf 라이브러리는 버전 3.6.1에서 3.11로 업그레이드되었습니다. (버그 #31000511, 버그 #98852)

MySQL에 번들로 포함된 libevent 라이브러리는 버전 2.1.11로 업그레이드되었습니다. 또한 WITH_LIBEVENT CMake 옵션에 대해 다음 두 가지 변경 사항이 적용되었습니다:

  1. yes는 더 이상 system의 동의어로 허용되지 않습니다. 대신 system을 사용해야 합니다.
  2. system이 지정되었지만 시스템 libevent가 발견되지 않으면, 번들 버전이 누락된 시스템 라이브러리 대신 사용되지 않고 오류가 발생합니다.

(버그 #30926742)

MySQL에 번들로 포함된 ICU(International Components for Unicode) 라이브러리는 버전 65.1로 업그레이드되었습니다.

플러거블 인증

SASL LDAP 인증을 구현하는 MySQL Enterprise Edition의 authentication_ldap_sasl 플러그인은 여러 인증 방법을 지원하지만, 호스트 시스템 구성에 따라 일부 방법은 사용할 수 없을 수 있습니다. 새로운 Authentication_ldap_sasl_supported_methods 상태 변수는 지원되는 방법을 검색할 수 있도록 해줍니다. 이 변수의 값은 지원되는 방법 이름이 공백으로 구분된 문자열입니다. 예시: "SCRAM-SHA1 GSSAPI" (WL #13876)

보안 관련 사항

비호환 변경: 이제 INFORMATION_SCHEMA.FILES 테이블에 대한 액세스는 PROCESS 권한이 필요합니다.
이 변경 사항은 테이블스페이스 정보를 액세스하는 mysqldump 명령을 사용하는 사용자에게 영향을 미치며, 이제 해당 명령에 대해서도 PROCESS 권한이 필요합니다. 테이블스페이스 정보를 덤프할 필요가 없는 사용자는 mysqldump--no-tablespaces 옵션과 함께 사용하여 이 요구 사항을 우회할 수 있습니다. (버그 #30350829)

OpenSSL 라이브러리가 번들로 제공되는 플랫폼의 경우, MySQL 서버에 연결된 OpenSSL 라이브러리는 버전 1.1.1g로 업데이트되었습니다. 새로운 OpenSSL 버전에서 수정된 문제는 https://www.openssl.org/news/cl111.txthttps://www.openssl.org/news/vulnerabilities.html에서 설명하고 있습니다. (버그 #31296697)

이전에는 LOAD DATA 문에서 LOCAL 데이터를 로드하는 기능을 클라이언트 측에서 모든 파일에 대해 활성화하거나 완전히 비활성화하여 제어할 수 있었습니다. 이제 mysql_options() C API 함수의 새로운 MYSQL_OPT_LOAD_DATA_LOCAL_DIR 옵션을 사용하여 클라이언트가 LOCAL 데이터 로드를 지정된 디렉터리에 있는 파일로만 제한할 수 있습니다. 자세한 내용은 LOAD DATA LOCAL의 보안 고려 사항을 참조하십시오. (WL #13168)

테스트 스위트 관련 사항

mysql-test-run.pl은 더 이상 고유 접두어로 명령 옵션을 허용하지 않습니다. 옵션 이름을 완전히 입력해야 합니다. (버그 #31390127)

MySQL 테스트는 googletest 1.10.0을 사용하도록 업데이트되었습니다. (버그 #31364750)

innodb.innodb_mysql 테스트 케이스는 출력 행 순서의 비결정성을 피하기 위해 업데이트되었습니다. Facebook에 기여에 감사드립니다. (버그 #30810572, 버그 #98377)

이제 mysql-test-run.pl은 사용 가능한 포트 범위를 검색할 때 제외할 포트 범위를 지정하는 --mtr-port-exclude 옵션을 지원합니다. 동일한 효과를 얻기 위해 MTR_PORT_EXCLUDE 환경 변수를 설정할 수도 있습니다. Facebook에 기여에 감사드립니다. (버그 #30809607)

CTRL+C(SIGINT)를 수신할 때 중단되는 것 외에도, 이제 mysql-test-run.pl은 해당 시점까지 실패한 테스트 케이스 목록을 표시합니다. (버그 #30407014)

X Plugin 관련 사항

전체 문서를 참조하는 데 사용된 달러 기호($)가 사용된 컨텍스트에 따라 X 플러그인이 참조를 다르게 처리했습니다. 이제 이 동작이 표준화되었습니다. (버그 #31374713)

글로벌 SQL 모드에 대한 특정 설정으로 인해 X 플러그인의 인증 프로세스가 올바른 사용자 비밀번호를 수락하지 못했습니다. 이제 인증 프로세스는 일관성을 유지하기 위해 글로벌 SQL 모드 설정과 독립적으로 작동합니다. (버그 #31086109)

기능 추가 및 변경 사항

중요 변경 사항; 그룹 복제: 기본적으로 복제 소스 서버는 각 이벤트에 대해 시스템 변수 binlog_checksum에 의해 지정된 체크섬을 바이너리 로그에 기록하며, 기본값은 CRC32로 설정되어 있습니다. 이전에는 그룹 복제가 바이너리 로그에 있는 체크섬을 지원하지 않았기 때문에 그룹의 구성원이 될 서버 인스턴스를 구성할 때 binlog_checksumNONE으로 설정해야 했습니다. 이제 이 요구 사항이 제거되어 기본 설정을 사용할 수 있습니다. 그룹의 모든 멤버가 동일한 binlog_checksum 설정을 가질 필요는 없습니다.
그룹 복제는 이벤트가 원본 서버의 바이너리 로그에 기록되기 전에 여러 소스에서 릴레이 로그로 이벤트가 작성되므로 group_replication_applier 채널에서 들어오는 이벤트를 확인하는 데 체크섬을 사용하지 않습니다. 그러나 체크섬은 group_replication_recovery 채널 및 그룹 멤버의 다른 복제 채널에서 이벤트의 무결성을 확인하는 데 사용됩니다. (WL #9038)

성능: UNHEX() 함수의 구현을 개선하여 16진수 문자열을 이진 표현으로 매핑하는 조회 테이블을 도입했습니다. 이 변경으로 인해 테스트 시 함수의 실행 속도가 8배 이상 빨라졌습니다. (버그 #31173103)

InnoDB: 이제 ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG 구문을 사용하여 Redo 로그 기록을 활성화하거나 비활성화할 수 있습니다. 이 기능은 새로운 MySQL 인스턴스에 데이터를 로드하는 데 사용됩니다. Redo 로그 기록을 비활성화하면 Redo 로그 기록을 피함으로써 데이터 로드 속도를 높일 수 있습니다.
새로운 INNODB_REDO_LOG_ENABLE 권한은 Redo 로그 기록을 활성화하거나 비활성화할 수 있도록 허용합니다.
새로운 Innodb_redo_log_enabled 상태 변수는 Redo 로그 기록 상태를 모니터링할 수 있도록 해줍니다.
자세한 내용은 Redo 로그 기록 비활성화를 참조하십시오. (WL #13795)

InnoDB: 바쁜 시스템에서 언두 테이블스페이스를 잘라내는 작업은 버퍼 풀에서 이전 언두 테이블스페이스 페이지를 제거하고 새로운 언두 테이블스페이스의 초기 페이지를 디스크로 플러시하는 플러시 작업으로 인해 성능에 영향을 미칠 수 있었습니다. 이 문제를 해결하기 위해 이러한 플러시 작업이 제거되었습니다.
이전 언두 테이블스페이스 페이지는 가장 최근에 사용되지 않은 상태가 되면 수동으로 해제되거나 다음 전체 체크포인트에서 제거됩니다. 새 언두 테이블스페이스의 초기 페이지는 잘라내기 작업 중에 디스크로 플러시되는 대신 Redo 로그로 기록되며, 이는 언두 테이블스페이스 잘라내기 작업의 내구성을 향상시킵니다.
체크포인트 사이에서 동일한 언두 테이블스페이스에 대한 잘라내기 작업이 과도하게 발생하는 문제를 방지하기 위해, 이제 체크포인트 사이에서 동일한 언두 테이블스페이스에 대해 64번까지 잘라내기 작업이 제한됩니다. 이 한도를 초과하면 언두 테이블스페이스는 비활성화될 수 있지만, 다음 체크포인트 이후에야 잘라내기가 수행됩니다.
더 이상 사용되지 않는 언두 잘라내기 플러시 작업과 관련된 INNODB_METRICS 카운터가 제거되었습니다. 제거된 카운터에는 undo_truncate_sweep_count, undo_truncate_sweep_usec, undo_truncate_flush_count, 및 undo_truncate_flush_usec가 포함됩니다.
자세한 내용은 언두 테이블스페이스를 참조하십시오. (WL #11819)

InnoDB: InnoDB는 시작 시 테이블스페이스 파일이 다른 위치로 이동된 경우를 대비해 알려진 테이블스페이스 파일 경로를 데이터 사전에 저장된 테이블스페이스 파일 경로와 비교하여 유효성을 검사합니다. 새로운 innodb_validate_tablespace_paths 변수를 사용하면 테이블스페이스 경로 유효성 검사를 비활성화할 수 있습니다. 이 기능은 테이블스페이스 파일이 이동되지 않는 환경을 위한 것입니다. 테이블스페이스 경로 유효성 검사를 비활성화하면 많은 수의 테이블스페이스 파일이 있는 시스템의 시작 시간이 단축됩니다.
자세한 내용은 테이블스페이스 경로 유효성 검사 비활성화를 참조하십시오. (WL #14008)

InnoDB: DATA DIRECTORY 절을 사용하여 데이터 디렉터리 외부에 생성된 테이블 및 테이블 파티션 데이터 파일은 이제 InnoDB가 알고 있는 디렉터리로 제한됩니다. 이 변경 사항은 데이터베이스 관리자가 테이블스페이스 데이터 파일을 생성할 위치를 제어할 수 있도록 하며, 복구 중에 데이터 파일을 찾을 수 있도록 보장합니다.
일반 테이블스페이스와 테이블별 테이블스페이스 데이터 파일(.ibd 파일)은 InnoDB가 인식하지 않는 한 언두 테이블스페이스 디렉터리(innodb_undo_directory)에 생성될 수 없습니다.
알려진 디렉터리는 datadir, innodb_data_home_dir, 및 innodb_directories 변수에 의해 정의된 디렉터리입니다.
파일별 테이블 테이블스페이스에 있는 InnoDB 테이블을 잘라내는 경우 기존 테이블스페이스가 삭제되고 새 테이블스페이스가 생성됩니다. MySQL 8.0.21부터, InnoDB는 새 테이블스페이스를 기본 위치에 생성하며, 현재 테이블스페이스 디렉터리가 알려지지 않은 상태에서 이전 버전으로 생성된 경우 오류 로그에 경고를 기록합니다. TRUNCATE TABLE이 현재 위치에 있는 테이블스페이스를 생성하도록 하려면, innodb_directories 설정에 디렉터리를 추가한 후 TRUNCATE TABLE을 실행하십시오. (WL #13065)

InnoDB: 테이블 및 행 리소스에 대한 잠금 큐에 접근해야 하는 작업의 동시성을 향상시키기 위해 잠금 시스템 뮤텍스(lock_sys->mutex)가 샤딩 래치로 교체되었으며, 잠금 큐는 테이블 및 페이지 _잠금 큐 샤드_로 그룹화되어 각 샤드가 전용 뮤텍스로 보호됩니다. 이전에는 단일 잠금 시스템 뮤텍스가 모든 잠금 큐를 보호했으며, 이는 높은 동시성 시스템에서 쟁점이 되었습니다. 새로운 샤딩된 구현은 잠금 큐에 더 세밀하게 접근할 수 있게 합니다.
잠금 시스템 뮤텍스(lock_sys->mutex)는 다음 샤딩된 래치로 교체되었습니다:

  • 64개의 읽기-쓰기 잠금 객체(rw_lock_t)로 구성된 전역 래치(lock_sys->latches.global_latch). 개별 잠금 큐에 접근하려면 공유 전역 래치와 잠금 큐 샤드에 대한 래치가 필요합니다. 모든 잠금 큐에 접근해야 하는 작업은 배타적인 전역 래치를 취하며, 이는 모든 테이블 및 페이지 잠금 큐 샤드를 래치합니다.
  • 512개의 뮤텍스로 구현된 테이블 샤드 래치(lock_sys->latches.table_shards.mutexes)는 각각 512개의 테이블 잠금 큐 샤드 중 하나에 전용입니다.
  • 512개의 뮤텍스로 구현된 페이지 샤드 래치(lock_sys->latches.page_shards.mutexes)는 각각 512개의 페이지 잠금 큐 샤드 중 하나에 전용입니다.

퍼포먼스 스키마 wait/synch/mutex/innodb/lock_mutex 인스트루먼트는 새로운 전역, 테이블 샤드, 페이지 샤드 래치를 모니터링하는 인스트루먼트로 교체되었습니다:

  • wait/synch/sxlock/innodb/lock_sys_global_rw_lock
  • wait/synch/mutex/innodb/lock_sys_table_mutex
  • wait/synch/mutex/innodb/lock_sys_page_mutex

(WL #10314)

그룹 복제: 그룹 복제 그룹 멤버는 이제 조인 멤버가 분산 복구 중 상태 전송을 위해 이들에 연결할 수 있는 IP 주소 목록을 광고할 수 있습니다. 이전에는 기존 멤버의 표준 SQL 클라이언트 연결이 이 목적과 클라이언트 트래픽 모두에 사용되었습니다. 분산 복구 엔드포인트를 광고함으로써 네트워크 인프라에서 분산 복구 트래픽(원격 클로닝 작업 및 바이너리 로그의 상태 전송)을 보다 잘 제어할 수 있습니다. 멤버의 분산 복구 엔드포인트 목록은 새로운 group_replication_advertise_recovery_endpoints 시스템 변수를 사용하여 지정되며, SQL 클라이언트 연결이 분산 복구에 사용되었을 때 적용되는 동일한 SSL 요구 사항이 적용됩니다. (WL #13767)

그룹 복제: 이제 START GROUP_REPLICATION 문에서 USER, PASSWORD, 및 DEFAULT_AUTH 옵션을 사용하여 분산 복구에 대한 사용자 자격 증명을 지정할 수 있습니다. 이러한 자격 증명은 group_replication_recovery 채널에서 분산 복구에 사용됩니다. START GROUP_REPLICATION에서 사용자 자격 증명을 지정하면 자격 증명은 메모리에만 저장되며, STOP GROUP_REPLICATION 문 또는 서버 종료로 인해 제거됩니다. 이러한 자격 증명은 복제 메타데이터 저장소에 저장된 CHANGE MASTER TO 문을 사용하여 설정된 사용자 자격 증명을 대체할 수 있으며, 이를 통해 그룹 복제 서버를 무단 액세스로부터 보호할 수 있습니다.
새로운 사용자 자격 증명 제공 방법은 서버 시작 시 그룹 복제를 자동으로 시작하는 것과 호환되지 않습니다. 이전에 CHANGE MASTER TO 문을 사용하여 사용자 자격 증명을 설정한 경우, START GROUP_REPLICATION에서 지정된 자격 증명이 우선합니다. 그러나 START GROUP_REPLICATION이 사용자 자격 증명 없이 지정된 경우, 복제 메타데이터 저장소의 자격 증명이 사용되며, 이는 group_replication_start_on_boot 시스템 변수가 ON으로 설정된 경우(분산 복구를 위한 원격 클로닝 작업 후 포함) 자동 시작 시 발생합니다. START GROUP_REPLICATION에서 사용자 자격 증명을 지정하여 보안 이점을 얻으려면 group_replication_start_on_boot 시스템 변수가 OFF로 설정되어 있는지 확인하고(기본값은 ON), group_replication_recovery 채널에 대해 이전에 설정된 사용자 자격 증명을 지우려면 CHANGE MASTER TO 문을 사용하십시오. (WL #13768)

그룹 복제: 그룹 복제의 XCom 메시지 캐시 최대 크기 설정(group_replication_message_cache_size)의 최소값이 약 1GB에서 134217728바이트(약 128MB)로 감소되었습니다. 이 크기 제한은 캐시에 저장된 데이터에만 적용되며, 캐시 구조에는 추가로 50MB의 메모리가 필요합니다. 동일한 캐시 크기 제한을 모든 그룹 멤버에 설정해야 합니다. 이전에 최소값으로 설정된 기본 XCom 메시지 캐시 크기인 1GB는 변경되지 않았습니다.
더 작은 메시지 캐시 크기는 가용 메모리가 제한된 호스트와 네트워크 연결이 우수한 호스트에 배포할 수 있도록 제공됩니다. 호스트가 불안정한 네트워크에 있는 경우 메시지 캐시 크기가 작을수록 일시적인 연결 손실 후 그룹 멤버가 다시 연결하기 어려워지기 때문에 group_replication_message_cache_size 설정을 매우 낮게 설정하는 것은 권장되지 않습니다. 멤버가 일시적으로 부재하는 동안 교환된 메시지가 캐시의 최대 크기 제한에 도달하여 다른 멤버의 XCom 메시지 캐시에서 삭제된 경우, 해당 멤버는 메시지 캐시를 사용하여 다시 연결할 수 없습니다. 대신 그룹에서 나가 분산 복구를 통해 트랜잭션을 가져와야 하며, 이는 메시지 캐시를 사용하는 것보다 더 느린 프로세스입니다. 하지만 멤버는 운영자 개입 없이도 이 방법으로 다시 그룹에 가입할 수 있습니다.
MySQL 8.0.21부터, 기본적으로 멤버가 그룹에서 추방되기 전에 5초의 추방 타임아웃이 추가됩니다(group_replication_member_expel_timeout 시스템 변수에 의해 지정됨). 이 기본 설정으로 인해 XCom 메시지 캐시는 이제 그룹이 교환한 메시지를 10초 동안(추방 타임아웃 + 초기 5초 감지 기간) 저장해야 하며, 이전에는 5초 동안만(초기 5초 감지 기간) 저장해야 했습니다. (WL #13979)

그룹 복제: group_replication_member_expel_timeout은 그룹 복제 그룹 멤버가 의심이 발생한 후, 실패한 것으로 의심되는 멤버를 그룹에서 추방하기 전에 기다리는 시간을 초 단위로 지정합니다. 의심이 발생하기 전의 초기 5초 감지 기간은 이 시간에 포함되지 않습니다.
이전에는 group_replication_member_expel_timeout에 의해 지정된 대기 시간이 0으로 설정되어, 의심된 멤버는 5초 감지 기간이 끝난 직후에 추방될 가능성이 있었습니다. 사용자 피드백에 따라 대기 시간이 이제 5초로 기본 설정되었으며, 그룹과의 접촉을 잃은 멤버가 그룹에 다시 연결할 수 있는 총 10초를 확보할 수 있습니다. 멤버가 이 시간 내에 다시 연결하면 XCom 메시지 캐시에서 누락된 메시지를 복구하고 자동으로 ONLINE 상태로 복귀할 수 있으며, 그룹에서 추방된 후 자동 재가입 절차를 따르거나 수동 운영자 개입이 필요하지 않습니다.
이전에 XCom 메시지 캐시의 크기를 멤버가 추방되기 전 예상되는 메시지 양(5초 감지 기간)에 맞춰 조정한 경우, 새로운 추방 타임아웃(기본 시간의 2배인 10초)을 감안하여 group_replication_message_cache_size 설정을 증가시켜야 합니다. 새로운 기본 추방 타임아웃으로 인해 현재 연결할 수 없는 멤버가 복구를 위해 필요할 가능성이 있는 메시지가 메시지 캐시에서 제거되었다는 경고 메시지를 그룹의 활성 멤버로부터 GCS로부터 받게 될 수 있습니다. 이 메시지는 멤버가 메시지 캐시를 사용하여 다시 연결해야 했음을 나타내며, 현재 대기 시간을 지원하기에 캐시 크기가 충분하지 않을 수 있음을 보여줍니다. (WL #13773)

그룹 복제: 그룹 복제 자동 재가입 기능이 이제 기본적으로 활성화됩니다. MySQL 8.0.16부터 사용 가능한 group_replication_autorejoin_tries 시스템 변수는 추방되었거나 다수의 타임아웃에 도달한 멤버가 그룹에 자동으로 다시 가입하도록 만듭니다. 원래는 0으로 기본 설정되어 자동 재가입이 활성화되지 않았으나, 이제 기본값이 3으로 설정되어 멤버가 추방되거나 다수의 타임아웃에 도달한 경우 그룹에 자동으로 다시 가입하려고 세 번 시도합니다. 각 시도 사이에 멤버는 5분 동안 기다립니다. 지정된 시도 횟수가 소진되면 멤버는 다시 가입하거나 중지되지 않고 group_replication_exit_state_action 시스템 변수에 의해 지정된 동작을 진행합니다.
자동 재가입 기능은 특히 일시적인 네트워크 문제가 자주 발생하는 경우 멤버를 그룹에 다시 참여시키기 위해 수동 개입이 필요하지 않도록 합니다. 자동 재가입 시도 중 및 시도 사이에 멤버는 슈퍼 읽기 전용 모드에 있으며, 쓰기를 허용하지 않습니다. 그러나 시간이 지남에 따라 오래된 읽기 가능성이 증가할 수 있지만 멤버에서 읽기는 여전히 가능합니다. 멤버를 오프라인 상태로 전환하려면 STOP GROUP_REPLICATION 문을 사용하거나 서버를 종료하여 언제든지 멤버를 수동으로 중지할 수 있습니다. 일정 기간 동안 오래된 읽기 가능성을 허용할 수 없는 경우, group_replication_autorejoin_tries 시스템 변수를 0으로 설정하십시오. 이 경우 멤버가 그룹에서 추방되거나 다수의 타임아웃에 도달할 때마다 운영자의 개입이 필요합니다. (WL #13706)

--disabled-storage-engines 옵션은 이제 옵션 값에 나열된 스토리지 엔진 주변의 공백을 무시합니다. (버그 #31373361, 버그 #99632)

새로운 HANDLE_FATAL_SIGNALS CMake 옵션을 통해 Address Sanitizer 및 Undefined Behavior Sanitizer 빌드가 MySQL 내부 함수 대신 치명적 신호를 처리하기 위해 sanitizer 런타임 라이브러리를 사용할지 여부를 구성할 수 있습니다. 기본값은 비-Sanitizer 빌드의 경우 ON, Sanitizer 빌드의 경우 OFF입니다. 옵션이 OFF로 설정되면 SIGBUS, SIGILL 및 SIGSEGV에 대해 기본 동작이 사용되며 내부 함수는 사용되지 않습니다. (버그 #31068443)

GROUP BY에서 두 번 이상 반복된 열(별칭을 통해)을 사용하는 경우, ROLLUP과 결합했을 때 MySQL 5.7과 다른 동작을 했습니다. 예:

SELECT a, b AS a, COUNT(*) FROM t1 GROUP BY a, b WITH ROLLUP;

이러한 쿼리의 동작이 MySQL 5.7과 더 잘 맞도록 변경되었습니다. 그러나 이러한 쿼리는 향후 동작이 변경되거나 불법이 될 수 있으므로 피하는 것이 좋습니다. (버그 #30921780, 버그 #98663)

comp_err는 특정 입력 파일 문제에 대해 더 나은 오류 메시지를 제공합니다. 기여해주신 Facebook에 감사드립니다. (버그 #30810629, 버그 #98390)

MySQL 서버 Docker 컨테이너는 이제 클라이언트 세션 내에서 서버 재시작을 지원합니다(예: 클라이언트가 RESTART 문을 실행할 때 또는 InnoDB Cluster 인스턴스 구성 중에 발생). 이 중요한 기능을 활성화하려면 컨테이너를 docker run 옵션 --restart 값을 on-failure로 설정하여 시작해야 합니다. 자세한 내용은 MySQL 서버 인스턴스 시작을 참조하십시오. (버그 #30750730)

EXPLAIN ANALYZE는 이제 FORMAT 옵션을 지원합니다. 현재 TREE가 유일하게 지원되는 형식입니다. (버그 #30315224)

ALTER INSTANCE ROTATE INNODB MASTER KEY는 이제 read_only 또는 super_read_only가 활성화된 경우 허용되지 않습니다. (버그 #30274240)

원자 DDL을 지원하는 스토리지 엔진에서, CREATE TABLE ... SELECT 문은 이제 행 기반 복제가 사용될 때 바이너리 로그에 하나의 트랜잭션으로 기록됩니다. 이전에는 테이블을 생성하는 하나의 트랜잭션과 데이터를 삽입하는 다른 트랜잭션으로 기록되었습니다. 이 변경으로 인해 CREATE TABLE ... SELECT 문은 이제 행 기반 복제에 안전해졌으며 GTID 기반 복제에서 사용할 수 있습니다. 자세한 내용은 원자 데이터 정의문 지원을 참조하십시오. (버그 #11756034, 버그 #47899, WL #13355)

LOAD XML은 이제 가져올 XML 파일의 CDATA 섹션을 지원합니다. (버그 #98199, 버그 #30753708)

X 플러그인의 mysqlx_bind_address 시스템 변수는 이제 MySQL 서버의 bind_address 시스템 변수와 마찬가지로 여러 IP 주소를 허용하여 X 플러그인이 여러 네트워크 소켓에서 TCP/IP 연결을 수신할 수 있도록 합니다.
중요한 차이점은 MySQL 서버의 경우 주소 목록에 오류가 있으면 서버가 시작되지 않지만, X 플러그인은 필수 플러그인이 아니므로 X 플러그인은 그렇지 않다는 것입니다. X 플러그인은 나열된 주소 중 하나를 구문 분석할 수 없거나 X 플러그인이 해당 주소에 바인딩할 수 없는 경우 해당 주소를 건너뛰고 오류 메시지를 기록하며 나머지 주소에 바인딩을 시도합니다. X 플러그인의 Mysqlx_address 상태 변수는 바인딩이 성공한 주소만 표시합니다. 나열된 주소 중 어느 것도 성공적인 바인딩을 생성하지 못하면 X 플러그인은 X 프로토콜을 사용할 수 없다는 오류 메시지를 기록합니다. (WL #12715)

ENGINE_ATTRIBUTESECONDARY_ENGINE_ATTRIBUTE 옵션이 CREATE TABLE, ALTER TABLE, 및 CREATE INDEX 구문에 추가되었습니다. ENGINE_ATTRIBUTE 옵션은 또한 CREATE TABLESPACEALTER TABLESPACE 구문에 추가되었습니다. 테이블, 열, 인덱스 및 테이블스페이스에 대한 스토리지 엔진 속성을 정의할 수 있는 새로운 옵션은 향후 사용을 위해 예약되어 있습니다.
테이블, 열, 인덱스 및 테이블스페이스에 대한 스토리지 엔진 속성을 쿼리할 수 있는 INFORMATION_SCHEMA 테이블이 추가되었습니다. 값은 데이터 사전에 저장됩니다. 테이블은 향후 사용을 위해 예약되어 있습니다.

(WL #13341)

MySQL 서버의 기본 로깅 수준은 정보 로그 메시지를 생략하여 그룹 복제의 비오류 상황에서 발생하는 그룹 멤버십 변경과 같은 중요한 수명 주기 이벤트가 포함되지 않았습니다. 이제 복제 그룹의 중요한 이벤트에 대한 메시지가 시스템 메시지로 다시 분류되어 서버 로깅 수준에 관계없이 항상 서버 오류 로그에 나타납니다. 이를 통해 운영자는 서버의 복제 그룹 멤버십에 대한 전체 기록을 검토할 수 있습니다. 또한 그룹 통신 계층의 소켓 바인딩 오류는 정보 메시지에서 오류 메시지로 다시 분류되었습니다. (WL #13769)

버그 수정

InnoDB: GROUP BY 연산이 JSON 배열 열에서 잘못된 타입 캐스팅으로 인해 UBSan 빌드에서 실패를 일으켰습니다. (버그 #31451475)

InnoDB: 여러 InnoDB 오류 로그 메시지에 기호 값이 정의되지 않았습니다. (버그 #31401028)

InnoDB: 더블라이트 플러시 및 동기화 작업과 관련된 데이터 파일 쓰기 실패 후 단일 페이지 쓰기에 대한 파일 세그먼트가 해제되지 않았습니다. (버그 #31370227)

InnoDB: 트렁케이트 작업 후 동일한 공간 ID를 사용하는 언두 테이블스페이스 절단과 관련된 코드가 제거되었습니다. 이제 절단된 언두 테이블스페이스는 다른 공간 ID를 가진 새로운 테이블스페이스 데이터 파일로 대체됩니다. (버그 #31354435)

InnoDB: 언두 테이블스페이스에 대한 예약된 공간 ID 범위가 테이블스페이스당 512개에서 400,000개로 증가했습니다. (버그 #31340834)

InnoDB: ddl_log 테이블에 로그를 삽입하는 동안 발생한 오류가 반환되지 않아 작업이 성공한 것처럼 보였으며, 테이블스페이스 암호화 작업 중 트랜잭션이 등록되지 않았습니다. (버그 #31236217)

InnoDB: lob::purge() 함수가 삭제 표시된 레코드를 수정할 때 생성된 언두 로그 레코드 유형(TRX_UNDO_UPD_DEL_REC)에 대해 LOB를 제대로 해제하지 못했습니다. (버그 #31222046, 버그 #99339)

InnoDB: 폐기된 파티션을 재구성하려는 시도 후 종료 오류가 발생했습니다. (버그 #31215415)

InnoDB: 디렉터리 또는 파일 경로를 검색하는 내부 get_real_path() 함수가 경로가 파일인지 디렉터리인지 여부를 결정하기 전에 끝의 구분자를 제거하도록 수정되었습니다. 또한 경로가 존재하지 않거나 파일 또는 하위 디렉터리로 식별되지 않는 경우 기본 이름에 세 글자 접미사가 있으면 파일로 간주합니다. (버그 #31215160)

InnoDB: 테이블스페이스 관련 오류 메시지가 수정되었습니다. (버그 #31205520, 버그 #31205441)

InnoDB: 잠재적인 컴파일 문제를 방지하기 위해 __attribute__((const))__attribute__((pure)) 속성이 내부 InnoDB 함수에서 제거되었습니다. (버그 #31153123)

InnoDB: 히스토그램 샘플링을 위한 읽기 스레드를 생성할 때 병렬 읽기 스레드 제한이 지켜지지 않아 단언 실패가 발생했습니다. (버그 #31151218)

InnoDB: 트랜잭션 읽기 뷰가 히스토그램 통계를 생성하기 위해 레코드를 샘플링할 때 확인되지 않았습니다. (버그 #31151077)

InnoDB: I/O 완료 루틴이 다른 스레드에 의해 래치가 유지되어 LRU 리스트 뮤텍스를 획득하지 못했습니다. (버그 #31128739)

InnoDB: 첨부 가능한 트랜잭션 스레드가 이미 메인 스레드에서 예약된 InnoDB 티켓을 요청하여 교착 상태가 발생했습니다. 또한 이 교착 상태 시나리오에서 서버가 KILL 문에 응답하지 못했습니다. (버그 #31090777)

InnoDB: INNODB_METRICS 테이블의 AVG_COUNT_RESET 값이 NULL로 보고되었습니다. METRIC_AVG_VALUE_RESET 필드가 잘못 표시되었습니다. Fungo Wang의 기여에 감사드립니다. (버그 #31084706, 버그 #98990)

InnoDB: 언두 테이블스페이스 트렁케이트 작업 중 예기치 않은 중지 후 시작 시 일부 롤백 세그먼트 헤더 페이지가 손상된 것으로 확인되었습니다. 헤더 페이지가 작성되는 동안 롤백 세그먼트 헤더 페이지의 암호화가 시작되어 예상대로 일부 헤더 페이지가 암호화되지 않았습니다. (버그 #31045160)

InnoDB: 잠금 시스템(lock_sys) 코드의 다양한 측면이 리팩토링되었으며, lock_syslock_rec_block_validate()lock_test_prdt_page_lock() 함수의 문제가 수정되었습니다. (버그 #31001732)

InnoDB: temptable_max_ram 임계값을 초과하여 메모리 매핑 파일을 사용할 때 성능 저하가 발생했습니다. (버그 #30952983, 버그 #98739)

InnoDB: 잘못 정의된 COMPRESSION 절이 있는 테이블에서 DROP TABLE 작업을 수행할 때 디버그 모드에서 실패가 발생했습니다. InnoDB가 호출자에게 적절히 처리할 수 있도록 오류를 반환하지 않았습니다. (버그 #30899683, 버그 #98593)

InnoDB: 히스토리 목록 길이가 0에 가까워지면 퍼지 스레드 활동이 과도해져 CPU 리소스를 낭비하고 뮤텍스 경합이 발생했습니다. (버그 #30875956)

InnoDB: MySQL 8.0.18에서 도입된 회귀로 인해 INFORMATION_SCHEMA.INNODB_COLUMNS 쿼리 성능에 영향을 미쳤습니다. (버그 #30837086, 버그 #98449)
참조: 이 문제는 버그 #93033, 버그 #28869903의 회귀입니다.

InnoDB: .cfg 파일을 사용한 ALTER TABLE ... IMPORT TABLESPACE 작업이 “테이블에 대한 잘못된 키 파일” 오류로 실패했습니다. (버그 #30830441)

InnoDB: 파티션을 삭제한 후 DROP TABLE 작업이 관련 데이터 파일을 제거하지 않았으며 DROP DATABASE 작업이 데이터베이스 디렉터리를 제거할 수 없다는 오류와 함께 실패했습니다. MySQL 5.7에서 MySQL 8.0으로 업그레이드하는 동안 삭제된 파티션이 있는 경우 업그레이드가 실패했습니다. (버그 #30818917)

InnoDB: 서버가 간헐적으로 “ibuf 커서 복원 실패” 오류와 함께 실패했습니다. (버그 #30770380, 버그 #91033)

InnoDB: 한 테이블에서 다른 테이블로 데이터를 복사하는 ALTER TABLE 작업 중에 “Out of range value for column” 오류가 발생했습니다. 여러 행을 삽입하는 작업에 필요한 AUTO_INCREMENT 행 수를 추적하는 카운터가 대량 삽입 작업 후에 항상 0으로 재설정되지 않는 문제가 있었습니다. (버그 #30765952, 버그 #98211)

InnoDB: 내부 TempTable의 records_in_range() 핸들러 함수에 DBUG_ABORT() 호출이 포함되어 있어 디버그 빌드에서 단언 실패를 유발하고 일반 빌드에서는 빈 결과 집합을 반환했습니다. (버그 #30716037)

InnoDB: btr_cur_pessimistic_update() 함수가 lob::purge() 호출로 인해 변경된 커서 위치를 처리하지 못했습니다. (버그 #30712878)

InnoDB: DELETE IGNORE 작업 중 타입 변환 실패로 인해 단언 실패가 발생했습니다. (버그 #30664660)

InnoDB: 퍼지 작업이 NULL LOB 참조를 만나 단언 실패가 발생했습니다. (버그 #30658887)

InnoDB: 메모리를 해제할 때 청크 크기가 잘못 계산되어 SELECT DISTINCT 쿼리 성능이 저하되었습니다. (버그 #30562964)

InnoDB: TempTable 스토리지 엔진에서 세그먼트 오류가 발생했습니다. (버그 #30050452, 버그 #31116036, 버그 #99136)

InnoDB: 종료 중 치명적인 “페이지가 여전히 고정 또는 더티 상태” 오류가 발생했습니다. (버그 #29759555, 버그 #95285)
참조: 이 문제는 버그 #29207450의 회귀입니다.

파티셔닝: 파티션된 테이블에 대해 ORDER BY를 사용한 쿼리가 다음 조건에서 정렬되지 않은 결과를 반환했습니다:

  • 테이블에 열 중 하나에 접두어가 있는 복합 인덱스가 있었음.
  • 쿼리의 WHERE 절에 접두어가 있는 열에 대한 동일 조건이 포함되어 있었음.
  • 접두어가 있는 열이 인덱스의 가장 왼쪽 열이었음.
  • ORDER BY에 사용된 열이 인덱스의 가장 오른쪽 열이었음.
  • 인덱스가 ORDER BY 처리를 위해 사용되었음.

Quanan Han에게 제안을 주신 것에 대해 감사드립니다. (버그 #84070, 버그 #25207522)

복제: 그룹의 일관성 수준이 (group_replication_consistency 시스템 변수로 설정) BEFORE 또는 BEFORE_AND_AFTER로 설정된 경우, 기본 장애 조치(failover) 시 교착 상태가 발생할 수 있었습니다. 기본 장애 조치가 이제 이러한 상황을 방지하기 위해 다르게 등록됩니다. (버그 #31175066, 버그 #98643)

복제: 복제 소스 서버가 종료 후 다시 시작되면 MEMORY 테이블이 비워집니다. 이 효과를 복제하기 위해, 소스 서버가 시작된 후 처음으로 해당 MEMORY 테이블을 사용할 때, 그 테이블을 비워야 함을 알리기 위해 복제본에 DELETE 문이 바이너리 로그에 기록됩니다. 이전에는 생성된 DELETE 문이 현재 세션의 바이너리 로그 문 캐시에 기록되어 같은 GTID를 가진 다른 문과 함께 기록되거나, BEGINCOMMIT 문 없이 기록될 수 있었습니다. 또한 어떤 경우에는 생성된 DELETE 문이 이를 트리거한 트랜잭션에 할당된 GTID를 소비할 수 있었습니다. 이제 생성된 DELETE 문은 BEGINCOMMIT 문과 함께 기록되며, 결과 트랜잭션은 문 캐시에 기록된 직후 바이너리 로그로 즉시 플러시되어 항상 자체 GTID를 받고 다른 트랜잭션과 분리됩니다. (버그 #30527929, 버그 #25681518, 버그 #77729)

복제: MySQL 8.0.14에서 패치 후, 함수 호출에 임시 테이블 작업이 포함된 경우, binlog_format = MIXED로 설정되었을 때 해당 작업이 문 형식으로 바이너리 로그에 기록될 수 있었습니다. 이는 함수 호출을 포함한 CREATE TEMPORARY TABLE 문이 바이너리 로그에 잘못 기록되게 했습니다. 추가 분석 후, 저장 함수 및 트리거에서 임시 테이블에 대한 작업이 문 형식 바이너리 로깅에 대해 안전하지 않은 것으로 표시되었으며, 이는 복제 문제를 일으킬 가능성이 큽니다. binlog_format = MIXED로 설정된 경우, 이러한 작업은 이제 행 형식으로 기록됩니다. (버그 #30395151, 버그 #30320009)

Replication: MySQL 8.0.14 및 MySQL 5.7.25에서 시스템 변수 binlog_transaction_dependency_trackingbinlog_transaction_dependency_history_size와 관련된 교착 상태 시나리오를 수정하는 과정에서 트랜잭션 종속성 추적에 사용된 기록 세트 히스토리가 동시 업데이트로부터 보호되지 않는 부작용이 발생했습니다. 이제 기록 세트 히스토리와 추적 모드는 액세스할 때마다 올바르게 잠깁니다. (버그 #29719364, 버그 #95181)
참조: 버그 #28511326, 버그 #91941도 참조하십시오.

복제: CHANGE MASTER TO 문에서 MASTER_USER가 빈 문자열로 지정된 경우(MASTER_USER=''), 해당 문은 성공하고 복제 메타데이터 저장소에서 이전에 지정된 사용자 이름을 지웠습니다. 그러나 이후 저장소에서 정보를 읽으면, 예를 들어 그룹 복제 채널의 자동 재시작 중에 채널에 대해 기본 사용자 이름이 대체될 수 있었습니다. 이제 이 문제가 수정되어 MySQL 8.0.21부터는 항상 START SLAVE 문 또는 복제 채널을 시작하는 START GROUP_REPLICATION 문을 사용하여 사용자 자격 증명을 제공하는 경우 빈 MASTER_USER 사용자 이름을 설정하는 것이 유효한 접근 방식입니다. 이 접근 방식은 복제 채널이 항상 재시작 시 운영자 개입을 필요로 한다는 것을 의미하지만, 사용자 자격 증명은 복제 메타데이터 저장소에 기록되지 않습니다.
또한 CHANGE MASTER TO 문서가 수정되어 MASTER_USER=''를 지정할 수 있음을 명확히 했으며, 빈 자격 증명으로 복제 채널을 시작하려고 할 때만 오류가 발생한다고 명시되었습니다. (버그 #27357189)

그룹 복제: 모든 사용자 연결을 제어하는 시스템 변수 group_replication_consistency로 설정된 글로벌 값이 MySQL 서버 모듈의 SQL API를 사용하는 그룹 복제의 내부 연결에도 적용되었습니다. 이는 분산 복구 중 클론 플러그인 상태를 확인할 때와 같이 그룹 복제가 group_replication_consistency를 오류로 보고할 수 있었습니다. 이제 이러한 내부 연결은 SQL API를 사용할 때 EVENTUAL 일관성 수준을 사용하며, 이는 group_replication_consistency가 사용 가능해지기 전의 동작과 일치하며, 오류 메시지를 발생시키지 않습니다. (버그 #31303354, 버그 #99345)

그룹 복제: Windows에서 Group Replication이 Windows API 함수 SleepConditionVariableCS를 사용하여 새 쓰기 이벤트를 대기할 때, Group Replication이 2일 이상 실행된 후 이 함수로 인해 눈에 띄게 높은 CPU 사용량이 발생했습니다. MySQL 서버 인스턴스를 재시작하면 이 문제를 해결할 수 있었으나 시간이 지나면 다시 증가했습니다. 이는 시간 초과를 계산하는 데 사용된 두 개의 시계 함수가 시간이 지남에 따라 서로 간의 차이가 발생하여, 시간 초과가 점점 짧아지고 함수 호출 빈도가 증가한 것에 기인했습니다. 이제 Windows에서 단일 시계의 현재 시간을 사용하여 시간 초과를 계산함으로써 이 문제가 해결되었습니다. (버그 #31117930)

그룹 복제: Group Replication이 분산 복구 중에 중지되면, 선택된 기부자 멤버의 기록에 액세스하려고 할 때 메모리 문제가 발생할 수 있었습니다. 이제 이 기록은 분산 복구 상태와 함께 로컬로 유지됩니다. (버그 #31069563)

그룹 복제: Group Replication의 분산 복구가 원격 클로닝 작업을 포함하는 경우, 이 작업을 나타내는 플래그는 서버 인스턴스가 다시 시작될 때까지 설정된 상태로 유지되었습니다. 이전에는 서버에서 Group Replication을 중지하고 다시 시작할 경우, 이 플래그로 인해 group_replication_applier 채널에 대한 중계 로그 파일을 정리했습니다. 이는 원격 클로닝 작업 후 시작 시 복제된 데이터 테이블과의 불일치를 방지하기 위한 조치입니다. 정리된 중계 로그 파일에 적용되지 않은 트랜잭션이 있으면 해당 멤버는 그룹을 부트스트랩하는 데 사용할 수 없었습니다. 그러나 다른 멤버에서 트랜잭션을 가져와 그룹에 성공적으로 합류할 수 있었습니다. 이제 Group Replication은 원격 클로닝 작업 후 처음 시작할 때만 중계 로그 파일을 정리하며, 이후 시작 시에는 플래그를 무시합니다. (버그 #31059680)

그룹 복제: 데이터 불일치 가능성을 피하기 위해, 그룹 복제는 동일한 서버의 새로운 인스턴스(같은 주소를 가지고 있지만 새로운 식별자를 가진)가 이전 인스턴스가 아직 그룹의 멤버로 등록되어 있는 동안 그룹에 참여하는 것을 차단합니다. 이전에는 그룹 복제 그룹 통신 시스템(GCS)이 서버의 이전 인스턴스에 메시지를 전송하려고 시도할 때까지 해당 연결을 활성 상태로 간주했으며, 소켓에서 오류가 반환될 때만 비활성 상태로 인식했습니다. 이 과정은 상당한 시간이 소요될 수 있었습니다. 이 기간 동안 서버의 새 인스턴스는 기존 멤버들이 이전 인스턴스와의 연결을 기다리고 있어 그룹에 참여할 수 없었습니다. 이제 GCS는 메시지를 성공적으로 보낼 수 있을 때만 서버 연결을 활성 상태로 간주하며, 소켓이 더 이상 쓸 수 없는 상태가 되면 해당 서버 연결을 비활성 상태로 처리하고 적극적으로 닫습니다. 연결이 종료되면 그룹 멤버가 해당 서버 주소로 다시 연결을 시도하며, 새 인스턴스가 그룹에 참여할 수 있게 됩니다. (버그 #30770577)

그룹 복제: 그룹 복제가 단일 기본(primary) 모드에서 다중 기본 모드로 전환될 때 알림을 브로드캐스트하지 않았습니다. 이제 이 변경 사항은 라우팅에 사용할 수 있도록 알림이 전송됩니다. (버그 #30738896)

그룹 복제: group_replication_force_members 시스템 변수를 설정하여 그룹의 특정 멤버 구성을 강제할 경우, 다른 멤버가 이미 해당 멤버의 퇴출을 요청한 경우 해당 작업이 실패할 수 있었습니다. group_replication_force_members 시스템 변수를 사용하여 지정된 구성을 적용하는 작업은 먼저 보류 중인 그룹 재구성을 강제로 처리합니다. 멤버에서 설정된 퇴출 시간 초과가 만료되어 퇴출이 성공하면, 이 작업은 시간 초과되어 완료되지 못할 수 있습니다. 이러한 상황을 방지하기 위해, 그룹 복제는 이제 보류 중인 그룹 재구성을 무시하고 group_replication_force_members 시스템 변수에 지정된 새로운 구성을 직접 구현합니다. (버그 #29820966)

그룹 복제: 그룹 복제는 다른 그룹 멤버와의 연결을 추적할 때 수신 연결만 고려했으며, 발신 연결은 고려하지 않았습니다. 예를 들어, 멤버 A에서 멤버 B로의 발신 연결이 방화벽 설정 문제로 끊겼지만, 멤버 B에서 멤버 A로의 수신 연결은 정상인 경우, 멤버 A는 멤버 B의 상태를 ONLINE으로 표시했지만, 멤버 A의 메시지는 멤버 B에 도달하지 않았습니다. 멤버 B는 멤버 A의 상태를 UNREACHABLE로 표시했습니다. 이제, 한 그룹 멤버가 활성 연결을 가진 다른 그룹 멤버로부터 핑(ping)을 받기 시작하면(이 경우 멤버 A가 멤버 B로부터 핑을 받음), 이는 연결에 문제가 있다는 지표로 간주됩니다. 충분한 핑이 수신되면, 핑을 받은 측(이 경우 멤버 A)은 연결을 종료하여 양쪽 멤버의 연결 상태가 일관되도록 합니다. (버그 #25660161, 버그 #84796)

JSON: JSON_TABLE() 함수에 전달된 표현식과 경로가 JSON null을 반환할 때, 이 함수는 SQL NULL을 반환해야 함에도 불구하고 오류를 발생시켰습니다. (버그 #31345503)

JSON: MySQL 5.7 및 8.0.17 이전 버전에서는 IS TRUE로 JSON 부울 값을 테스트할 때 SQL 부울 값으로 변환하려고 시도했습니다. 예를 들어 다음과 같은 쿼리를 실행했을 때:

mysql> CREATE TABLE test (id INT, col JSON);

mysql> INSERT INTO test VALUES (1, '{"val":true}'), (2, '{"val":false}');

mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE;
+------+---------------+--------------+
| id   | col           | col->"$.val" |
+------+---------------+--------------+
|    1 | {"val": true} | true         |
+------+---------------+--------------+

MySQL 8.0.17 이후에는 SQL 조건에서 모든 술어를 완전하게 만드는 작업의 결과로, JSON 값을 SQL 부울 컨텍스트에서 평가할 때 JSON 정수 0과 암시적으로 비교가 수행됩니다. 이는 다음과 같이 변경된 결과를 반환합니다:

mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE;
+------+----------------+--------------+
| id   | col            | col->"$.val" |
+------+----------------+--------------+
|    1 | {"val": true}  | true         |
|    2 | {"val": false} | false        |
+------+----------------+--------------+

이러한 경우 서버는 이제 경고를 제공합니다: SQL 부울 컨텍스트에서 JSON 값을 평가할 때 JSON 정수 0과의 암시적 비교가 수행됩니다. 원하는 결과가 아니면 JSON을 SQL 숫자 유형으로 변환하는 것을 고려하십시오. 예를 들어 JSON_VALUE() 함수를 다음과 같이 사용할 수 있습니다:

mysql> SELECT id, col, col->"$.val" FROM test
    ->     WHERE JSON_VALUE(col, "$.val" RETURNING UNSIGNED) IS TRUE;
+------+---------------+--------------+
| id   | col           | col->"$.val" |
+------+---------------+--------------+
|    1 | {"val": true} | true         |
+------+---------------+--------------+

(버그 #31168181)

JSON: 다중 값 인덱스를 가진 테이블에 대한 GROUP BY 쿼리가 서버에서 항상 올바르게 처리되지 않았습니다. (버그 #31152942)

log_error_services를 영구 설정한 경우, 일부 상황에서 서버 시작 중 잘못된 시점에 적용될 수 있었습니다. (버그 #31464539)

SHOW CREATE USER는 특정 수동 권한 테이블 수정 후 서버 종료를 일으킬 수 있었습니다. (버그 #31462844)

일부 메모리 상의 부분 취소 업데이트가 잘못된 권한을 생성할 수 있었습니다. (버그 #31430086)

log_error_verbositySET PERSIST로 설정한 경우, 이 설정이 서버 시작 중 InnoDB 초기화에 영향을 미치기에는 너무 늦게 적용되었습니다. (버그 #31410674)

파서가 생성된 열 표현식에서 하위 쿼리를 거부하기 전에 잘못된 어설션을 발생시켰습니다. (버그 #31396191)

이 릴리스에서는 조건이 없는 조인을 위한 두 가지 미세 최적화를 포함합니다:

  1. 조건이 없는 해시 반조인 또는 세미조인의 경우, 해시 테이블을 빌드할 때 LIMIT 1을 추가하여 더 많은 행이 있어도 결과에 영향을 미치지 않도록 했습니다.
  2. 조건이 없는 해시 반조인에서 해시 테이블이 비어 있지 않으면 외부 측의 스캔을 생략했습니다.

이 변경 사항들은 해시 안티조인으로의 재작성으로 인해 옵티마이저가 NOT EXISTS 쿼리를 재작성하지 않고 실행하게 되어 “결과 행이 없음”으로 대체되는 성능 저하 문제를 해결합니다. 대신 중첩 루프가 사용되는 경우, NOT EXISTS 내부의 비상관 서브쿼리는 더 이상 안티조인으로 변환되지 않습니다.
이 수정은 또한 constant NOT IN (non_correlated_subquery)를 사용하는 서브쿼리에도 적용됩니다. (버그 #31376809)

-DWITH_EDITLINE=system로 구성할 경우, 오래된 라이브러리 버전에서 컴파일 오류가 발생했습니다. (버그 #31366715)

이전 MySQL 배포에서 번들로 제공된 libedit 라이브러리 업그레이드로 인해 mysql 클라이언트에서 CTRL+C (SIGINT) 명령어가 일부 상황에서 작동하려면 Enter 키를 추가로 눌러야 하는 문제가 발생했습니다. (버그 #31360025)

AUTO_INCREMENTDEFAULT 값 표현식으로 선언된 열이 허용되지 않는 조합이었지만, ALTER TABLE에서 AUTO_INCREMENT 열에 대해 SET DEFAULT (expr) 작업을 수행할 때 오류가 발생하지 않았습니다. (버그 #31331454)

protocol_compression_algorithms 시스템 변수를 빈 문자열로 설정할 수 있었습니다. 이제는 더 이상 허용되지 않습니다. (버그 #31326231)

MySQL 서버에서 내부적으로 사용되는 조회 함수가 인수 모호성을 나타낼 때 정수 -1을 반환하는데, 이 값을 부호 없는 값으로 변환한 후 후속 계산에서 사용하면 정의되지 않은 동작을 초래할 수 있었습니다. 이제 함수가 -1을 반환할 경우, 오류로 처리하고 해당 값은 더 이상 사용되지 않습니다. (버그 #31326120)

부호 있는 값을 부정할 때 특정 상황에서 정의되지 않은 동작이 발생할 수 있었습니다. 이를 방지하기 위해 이제 부정할 값을 부호 없는 값으로 처리합니다. (버그 #31325602)

WEIGHT_STRING() 함수가 정수 인수에 대해 항상 올바른 결과를 반환하지 않았습니다. (버그 #31321257)
참조: 이 문제는 버그 #30776132의 회귀 문제입니다.

CONCAT('') 또는 CONCAT_WS('')를 변수에 할당할 경우 해당 변수가 빈 문자열이 아니라 NULL로 설정되었습니다. (버그 #31320716, 버그 #99485, 버그 #31413167, 버그 #99722)

일부 상황에서 권한 제한이 무시될 수 있는 문제를 수정했습니다. (버그 #31306814, 버그 #31315692)

특정 SELECT 문에서 행을 잠그기 위한 권한이 제대로 확인되지 않아 다른 사용자가 잘못 차단될 수 있었습니다. (버그 #31293065)

파일 정렬을 수행할 때 내부 함수가 실패 시 NULL을 반환할 수 있었으며, 정렬된 하위 선택 항목이 null 가능하지 않은 경우에도 그렇습니다. (버그 #31281602)

Windows에서 바이너리 로그에 대한 명령문 재작성이 비효율적이었습니다. (버그 #31260698)
참조: 이 문제는 버그 #30654405의 회귀 문제입니다.

메모리에서 익명 사용자를 표현하는 방식의 불일치로 인해 권한 부여 작업을 수행할 때 문제가 발생할 수 있었습니다. (버그 #31246179)

관리 연결 인터페이스가 활성화된 경우, 주 연결 인터페이스에서 Unix 소켓 파일 연결을 수락하는 데 문제가 발생할 수 있는 경쟁 조건이 있었습니다. (버그 #31241872)

WITH ADMIN OPTION으로 역할이 부여되었을 때, 수여자는 해당 역할을 활성화한 후에만 역할을 관리할 수 있었습니다. (버그 #31237368)

default_roles 또는 role_edges 시스템 테이블의 잘못된 행이 서버 오작동을 일으킬 수 있었습니다. (버그 #31217385)

런타임 중 컴포넌트 초기화 실패가 종료 시 오류 로그에 반복적으로 메시지를 기록할 수 있었습니다. (버그 #31217037)

익명 사용자에게 역할을 부여하는 것에 대한 금지가 불완전하게 시행되었습니다. (버그 #31215017)

권한 상승 문제를 수정했습니다. (버그 #31210226)

keyring_hashicorp 키링 플러그인이 구성 매개변수의 값을 충분히 확인하지 않았습니다. (버그 #31205363)

keyring_hashicorp 키링 플러그인은 binlog_encryption 시스템 변수를 설정하여 바이너리 로그 암호화를 활성화하는 것을 허용하지 않았습니다. (버그 #31204841)

keyring_hashicorp 키링 플러그인은 audit_log 플러그인이 암호화 비밀번호를 설정하는 것을 허용하지 않았습니다. (버그 #31197670)

REGEXP_SUBSTR()ORDER BY 절을 사용하는 일부 쿼리가 서버에서 올바르게 처리되지 않았습니다. (버그 #31184858)

일부 경우에 nullptr에 대한 포인터 산술이 적용된 문제가 수정되었습니다. (버그 #31172750)

사용할 수 있는 파일 설명자가 부족할 경우, mysql_real_connect()가 클라이언트를 종료시켰습니다. (버그 #31151052)

killall 명령어를 사용하여 mysqld 종료를 시작하면 종료 시작을 나타내는 메시지가 기록되지 않았습니다. 이 문제가 수정되었습니다. (버그 #31121907)

mysql_real_connect_nonblocking() 호출 시 유효하지 않은 호스트로 인해 mysql_close()를 호출할 때 클라이언트가 종료될 수 있었습니다. (버그 #31104389, 버그 #99112)

Debian 패키지에서 설치 실패를 유발할 수 있는 Python 2 종속성이 제거되었습니다. (버그 #31099324)

lf_hash_insert()에서 발생할 수 있는 잠재적인 메모리 누수가 수정되었습니다. (버그 #31090258, 버그 #99078)

LDAP SASL 인증 플러그인에서 sasl_client_done()이 여러 번 호출될 경우, 특정 상황에서 정의되지 않은 동작이 발생할 수 있었습니다. (버그 #31088206)

스레드 풀 플러그인이 활성화된 상태에서 높은 동시성 조건이 클라이언트 컨텍스트 손실을 일으켜 서버가 종료될 수 있었습니다. (버그 #31085322)

mysql_use_result()을 사용하여 처리된 결과 집합에서, mysql_fetch_row_nonblocking()이 행 수를 증가시키지 않아, 모든 행을 가져온 후 mysql_num_rows()가 잘못된 행 수를 반환했습니다. (버그 #31082201, 버그 #99073)

실제로 평가되지 않은 EXISTS()에 대한 불필요한 최적화가 제거되었습니다. (버그 #31069510)

--skip-grant-tables 옵션으로 시작된 서버에서 partial_revokes 시스템 변수를 활성화하면 서버가 종료되었습니다. (버그 #31066069, 버그 #31202963)

외부 참조가 있는 재귀적 공통 테이블 식을 사용하는 쿼리가 잘못된 결과를 반환할 수 있었습니다. (버그 #31066001, 버그 #99025)

최소 문자 길이가 1바이트 이상인 멀티바이트 캐릭터셋에서 파서가 실패할 수 있었습니다. (버그 #31063981)

특정 경우, LEAST() 함수가 널 허용이 아닌 입력에 대해 NULL을 반환할 수 있었습니다. (버그 #31054254)
참조: 이 문제는 버그 #25123839의 회귀 문제입니다.

mysql_real_connect_nonblocking()MYSQL_OPT_CONNECT_TIMEOUT 옵션이 설정된 경우 블록되었습니다. (버그 #31049390, 버그 #98980)

mysql_fetch_row_nonblocking() C API 함수에서 null 행을 반환하는 마지막 호출이 오류를 설정하고 있었습니다. 이는 발생하지 말아야 했습니다. (버그 #31048553, 버그 #98947)

Windows에서 기본 연결 유형이 명명된 파이프를 사용하는데, TCP/SSL 연결을 의도한 비차단 C API가 이를 고려하지 않아 클라이언트가 종료되었습니다. 이제 문제를 나타내는 오류 메시지를 출력합니다. (버그 #31047717)

인증에 실패한 X 플러그인 연결이 전역 audit_log_filter_id 시스템 변수를 수정했습니다. (버그 #31025461)

LOAD DATA 명령이 입력 파일 행을 구문 분석할 때 숨겨진 생성된 열을 무시하지 않았습니다. (버그 #31024266, 버그 #98925)

메타데이터 잠금 하위 시스템에서 핀박스 고갈이 잘못된 오류 메시지를 출력할 수 있었습니다. (버그 #31019269, 버그 #98911)

CREATE TABLE ... SELECT 명령에서 함수 인덱스를 포함한 경우 실패했습니다. (버그 #31017765, 버그 #98896)

X 프로토콜 연결의 경우, 전역 세션 뮤텍스 검사를 개선하여 스레드 수가 증가할 때 발생하는 경미한 성능 저하를 제거했습니다. (버그 #31000043)

여러 하위 쿼리를 포함한 쿼리를 실행할 때 서버가 예기치 않게 종료되는 경우가 있었습니다. (버그 #30975826)

SHOW CREATE TRIGGER 명령이 FLUSH TABLES WITH READ LOCK이 활성화된 경우 실패했습니다. (버그 #30964944)

특정 INFORMATION_SCHEMA 뷰에 기반한 데이터 사전 테이블에 대한 과도한 접근 검사로 인해 SHOW COLUMNS의 성능이 저하되었습니다. 이 검사가 줄어들어 성능이 개선되었습니다.
추가로, INFORMATION_SCHEMA 쿼리로 구현된 여러 SHOW 명령이 optimizer_switch 시스템 변수에 대해 derived_merge 플래그를 활성화하면 성능이 향상될 수 있는 것으로 확인되었습니다. 해당 쿼리들은 다음과 같습니다:

SHOW SCHEMAS
SHOW TABLES
SHOW TABLE STATUS
SHOW COLUMNS
SHOW KEYS
SHOW EVENTS
SHOW TRIGGERS
SHOW PROCEDURE STATUS
SHOW FUNCTION STATUS
SHOW CHARACTER SET
SHOW COLLATION

(버그 #30962261, 버그 #98750, 버그 #30921214)

동일한 두 개의 쿼리가 별도로 실행될 때 대소문자 구분이 있는 정렬 규칙을 사용할 경우 한 행이 반환되었으나, 대소문자 구분이 없는 정렬 규칙을 사용할 때는 두 행이 반환되었습니다. 동일한 두 조건을 AND로 결합한 단일 쿼리에서는 하나의 행만 반환되어야 했음에도 불구하고 두 행이 반환되었습니다. (버그 #30961924)

ALTER TABLE 명령이 디스플레이 너비가 255를 초과하는 SET 열에 대해 실행될 때, 다른 조건이 충족됨에도 불구하고 제자리에서 수행되지 않았습니다. (버그 #30943642, 버그 #98523)

서버가 출력할 숫자가 yottabytes로 너무 큰지 여부를 확인할 때, 값이 double로 ULLONG_MAX와 비교되었습니다. 그러나 ULLONG_MAX는 double로 표현될 수 없어, ULLONG_MAX yottabytes 바로 위의 double 값이 0Y로 잘못 출력되었습니다. 이 오류 변환은 Clang 10에서 보고되었습니다. (버그 #30927590)

X 프로토콜을 사용하는 연결에서 리소스 그룹 SQL 명령(예: CREATE RESOURCE GROUP)이 작동하지 않았습니다. (버그 #30900411)

SHOW GRANTS 명령이 함수 권한을 프로시저 권한으로 잘못 표시할 수 있었습니다. (버그 #30896461, 버그 #98570)

여러 클라이언트가 동시에 연결될 때 audit_log 플러그인이 연결 이벤트를 잘못 처리했습니다. (버그 #30893593)

LOCK_ORDER 도구가 빈 의존성 그래프에 대해 구문 오류를 보고했습니다. 빈 그래프가 이제 허용됩니다.
LOCK_ORDER 도구는 스레드 목록 유지 관리 오류로 인해 예기치 않은 동작을 보일 수 있었습니다. (버그 #30889192)

MySQL 5.7에서의 업그레이드가 root 사용자에게 REPLICATION_APPLIER 권한을 부여하지 않았습니다. (버그 #30783149)

gen_range() 사용자 정의 함수가 인수를 잘못 처리하여 서버 종료를 일으킬 수 있었습니다. (버그 #30763294)

UPDATE 처리 중 내부 메모리 테이블을 InnoDB로 변환할 때 키 길이 오류가 발생할 수 있었습니다. (버그 #30674616)

동적 권한(항상 글로벌 권한)을 절차나 함수 수준에서 부여하려고 시도해도 오류가 발생하지 않았습니다. (버그 #30628160)

테이블 값 생성자가 LIMIT 절을 무시했습니다. 이제 해당 절을 고려합니다. 예를 들어: VALUES ROW(1), ROW(2), ROW(3) LIMIT 2는 1과 2를 출력합니다. (버그 #30602659)

*라는 이름의 열을 정의할 수는 있지만, SELECT `*` SELECT *와 동일하게 처리되어 쿼리에서 이 열만 선택할 수 없었습니다. 즉, 백틱으로 둘러싸여도 별표 문자는 모든 테이블 열 목록으로 확장되었습니다. (버그 #30528450)

FROM_DAYS() 함수가 범위를 벗어난 결과를 생성할 수 있었습니다(연도 > 9999). (버그 #30455845, 버그 #97340)

디버그 빌드에서 mysql.func 테이블을 MyISAM으로 변경할 때 서버가 종료되었습니다(권장되지 않는 작업). 이제 이 작업이 금지되었습니다. (버그 #30248138, 버그 #96692)

INFORMATION_SCHEMAKEY_COLUMN_USAGETABLE_CONSTRAINTS 뷰에 대한 쿼리가 정의에서 UNION을 사용하여 느릴 수 있었습니다. 이 쿼리는 UNIONLATERAL 테이블로 이동하여 옵티마이저가 인덱스를 더 잘 사용할 수 있도록 재작성되었습니다. (버그 #30216864, 버그 #30766181, 버그 #98238)

특정 경우, LIMIT 절이 잘못되어 옵티마이저가 테이블에서 읽어야 할 행 수를 0으로 잘못 추정했습니다. (버그 #30204811)
참조: 이 문제는 버그 #29487181의 회귀 문제입니다.

내부 패킷 길이 함수가 잘못된 정수 유형 값을 반환했습니다. (버그 #30139031)

INSERT 명령문의 길이를 계산할 때, VARBINARY 문자열에 사용되는 _binary 캐릭터셋 도입부를 고려하지 않았습니다. (버그 #29998457, 버그 #96053)

접두사 키로 정의된 파티셔닝된 테이블을 업그레이드할 때 오류 로그에 출력된 메시지가 충분한 세부 정보를 제공하지 않았습니다. 이제 스키마, 테이블, 열, 접두사 길이를 나타내는 경고 메시지가 출력됩니다. (버그 #29942014)
참조: 버그 #31100205도 참조하십시오.

mysql_store_result() 함수가 잘못된 데이터 패킷을 감지하지 못할 수 있었습니다. (버그 #29921423)

외래 키 관계에서 하위 테이블을 생성할 때 엔진 대체가 발생하면 어설션이 발생했습니다. (버그 #29899151, 버그 #95743)

mysqltestmysql-test-run.pl은 더 이상 --sleep 명령줄 옵션을 지원하지 않습니다. mysqltest는 더 이상 real_sleep 명령을 지원하지 않습니다. (버그 #29770237)

서버는 최대 허용 길이(255자)를 초과하는 호스트 이름에 대한 연결을 허용했습니다. (버그 #29704941)

여러 테이블을 업데이트하는 UPDATE에서 첫 번째 테이블의 키를 업데이트할 때, 임시 테이블 전략을 사용하면 중복 항목이 임시 테이블에 기록되고 Can't find record 오류가 발생할 수 있었습니다. (버그 #28716103)

서버가 쿼리를 최적화할 때 때때로 GROUP BY가 있는 하위 쿼리를 잘못 제거했으며, 외부 선택에서 이 하위 쿼리가 사용된 경우에도 발생할 수 있었습니다. 하위 쿼리에 집계 함수가 포함된 경우에도 이 문제가 발생할 수 있었습니다. (버그 #28240054)

NAME_CONST() 함수의 강제 규칙이 잘못 평가되었습니다. (버그 #26319675)

스토리지 엔진에서 행을 읽을 때, “더 이상 레코드 없음” 외의 오류가 무시될 수 있었고, 이는 나중에 문제를 일으킬 수 있었습니다. (버그 #20162055)

여러 테이블을 업데이트할 때 임시 테이블이 사용되면, 이 정보가 EXPLAIN FORMAT=TREE 출력에 표시되지 않았으며, 이로 인해 해당 임시 테이블 사용이 UPDATE 문 성능에 미치는 영향을 알 수 없었습니다. (버그 #17978975)

중복을 제거하기 위한 filesort를 수행할 때, 예를 들어 SELECT DISTINCT를 실행할 때, 정렬 후에 ORDER BY를 충족시키기 위해 또 다른 정렬이 필요할 수 있습니다. 이러한 ORDER BY가 조인의 첫 번째 테이블로 푸시된 경우, 조인 전체가 아닌 경우, 이 마지막 정렬이 실제로 수행되지 않았습니다. (버그 #99687, 버그 #31397840)

MySQL 8.0.20에서 수행된 리팩토링 작업으로 인해 널 허용이 아닌 열에 대한 단일 행 버퍼링이 제대로 작동하지 않았습니다. 이 열이 외부 조인을 위한 내부 테이블일 수 있고, 따라서 복사해야 할 NULL 플래그를 가질 수 있기 때문입니다. 임시 테이블 없이 GROUP BY를 수행할 경우, NULL 플래그가 이전 출력 행이 아닌 다음 출력 행에서 가져와야 하며, 반환된 데이터가 일관되지 않게 됩니다. (버그 #99398, 버그 #31252625)
참조: 이 문제는 버그 #30460528의 회귀 문제입니다.

DECIMAL 또는 FLOAT 유형의 상수가 왼쪽 피연산자로, 정수 열 값이 오른쪽 피연산자로 사용된 경우 상수 접기 코드의 논리적 오류로 인해 잘못된 결과가 생성되었습니다. (버그 #99145, 버그 #31110614)

0-0을 비교하는 쿼리에서, 적어도 하나가 부동 소수점 값인 경우, 잘못된 결과가 반환되었습니다. (버그 #99122, 버그 #31102789)

슬라이스를 사용하지 않고 롤업을 다시 구현했습니다. 이로 인해 다음과 같은 알려진 문제가 수정되었습니다:

  • 반복 열이 포함된 GROUP BY ... WITH ROLLUP에서 잘못된 결과가 생성되었습니다. 즉, GROUP BY a, b, a WITH ROLLUP 형식의 GROUP BY가 결과에서 일부 열 이름을 잘못 NULL로 표시했습니다.
  • 결과를 출력하기 위해 임시 테이블이 필요하지 않은 GROUP BY ... WITH ROLLUP에서도 적어도 하나 이상의 예상 열 이름 대신 잘못된 NULL이 출력되었습니다.

(버그 #98768, 버그 #99141, 버그 #26227613, 버그 #29134467, 버그 #30967158, 버그 #30969045, 버그 #31110494)

SELECT DISTINCT( HEX( WEIGHT_STRING(varchar_column) ) ) 쿼리가 잘린 결과를 반환했습니다. (버그 #98592, 버그 #30898753)

MAX(), MIN() 또는 두 함수를 모두 포함한 쿼리에서 오류 처리 문제가 발생하여, 쿼리에서 오류가 발생했을 때도 가능한 모든 반복을 수행할 때까지 쿼리가 계속 실행되었습니다. (버그 #98242, 버그 #30769515)

LEAST(), GREATEST() 및 기타 함수, 그리고 UNION의 유형 전파 코드를 리팩토링한 후, ENUM과 같은 데이터 유형에 대한 결과 유형 조정이 수행되었으며, 이로 인해 부호 있는 값과 부호 없는 값을 모두 수용할 수 없는 유형으로 대체되었습니다. (버그 #95148, 버그 #29698617)
참조: 이 문제는 버그 #83895, 버그 #25123839의 회귀 문제입니다.

Leave a Comment



이 문서 공유

8.0.21 변경 사항 (2020-07-13 GA)

링크 복사

CONTENTS