MySQL 8.0 Release Note

8.0.17 변경 사항 (2019-07-22 GA)

Estimated reading: 10 minutes 80 views

공식 문서: Changes in MySQL 8.0.17 (2019-07-22, General Availability)

감사 로그 관련 사항

암호화된 MySQL Enterprise Audit 로그 파일의 암호화 및 복호화 작업은 MySQL 키링에 저장된 암호를 사용합니다. 이전에는 단일 암호만 저장되었습니다. 새로운 암호를 생성하면 이전 암호에 접근할 수 없어, MySQL Enterprise Audit가 이전 암호로 암호화된 로그 파일을 읽을 수 없게 되었습니다. 이제 MySQL Enterprise Audit는 키링에서 암호 기록을 구현하며, 이 기록에는 암호 보관 및 만료 기능이 포함됩니다. 감사 로그 플러그인은 각 암호화된 로그 파일 이름에 해당 파일을 읽기 위해 필요한 암호의 ID를 포함합니다. 키링에서 보관된 오래된 암호의 만료 및 제거를 활성화하기 위해 새로운 audit_log_password_history_keep_days 시스템 변수가 제공됩니다. 자세한 내용은 감사 로그 구성 설정을 참조하십시오. (WL #11246)

C API 관련 사항

다음과 같은 C API 변경 사항이 있었습니다:

  • HOSTNAME_LENGTH가 60에서 255로 변경되었으며, include/mysql_com.h에서 include/my_hostname.h로 이동되었습니다.
  • USER_HOST_BUFF_SIZEinclude/mysql_com.h에서 sql/auth/auth_common.h로 이동되었습니다.

(버그 #29590300)

캐릭터셋 지원

utf8mb4 캐릭터셋에 새로운 이진 정렬 방식인 utf8mb4_0900_bin이 추가되었습니다. 이는 기존의 utf8mb4_bin 이진 정렬 방식과 다음과 같이 다릅니다:

  • 정렬 가중치의 경우, utf8mb4_bin은 코드 포인트를 사용하며, 경우에 따라 선행 0바이트가 추가될 수 있지만, utf8mb4_0900_binutf8mb4 인코딩 바이트를 사용합니다. 두 정렬 방식 모두 정렬 순서는 동일하지만, utf8mb4_0900_bin의 정렬 속도가 훨씬 빠릅니다.
  • utf8mb4_bin의 패드 속성은 PAD SPACE인 반면, utf8mb4_0900_binNO PAD입니다. 따라서 utf8mb4_0900_bin을 사용하는 작업은 후행 공백을 추가하지 않으며, 후행 공백이 포함된 문자열을 비교할 때 두 정렬 방식 간의 차이가 있을 수 있습니다.

자세한 내용은 유니코드 캐릭터셋을 참조하십시오. (WL #10354)

컴포넌트 관련 사항

새로운 mysql_current_thread_reader 컴포넌트 서비스가 추가되어 컴포넌트가 현재 스레드에 대한 핸들을 획득할 수 있게 되었습니다. 예를 들어, 이 서비스는 컴포넌트가 현재 세션의 스레드 핸들을 다른 서비스에 전달하여 해당 세션의 속성에 접근할 수 있게 합니다. 이 서비스에 대한 자세한 내용은 MySQL 서버 Doxygen 문서의 컴포넌트 서브시스템 섹션을 참조하십시오. https://dev.mysql.com/doc/index-other.html에서 확인할 수 있습니다. (WL #12727)

구성 관련 사항

mysys_ssl 디렉터리의 소스 파일들이 mysys 디렉터리로 이동되었으며, mysys_ssl 라이브러리는 더 이상 빌드되지 않습니다. (버그 #29488066)

MySQL 구성은 이제 최소 CMake 버전 3.5.1을 요구합니다. (버그 #29337090)

MySQL 전반에 걸쳐 호스트 이름의 최대 허용 길이가 60자에서 255 ASCII 문자로 늘어났습니다. 이는 데이터 사전의 호스트 이름 관련 열, mysql 시스템 스키마, 성능 스키마, INFORMATION_SCHEMA, sys 스키마, CHANGE MASTER TO 문에서의 MASTER_HOST 값, SHOW PROCESSLIST 문 출력의 Host 열, 계정 관리 문에서 사용되는 계정 이름 및 DEFINER 속성, 호스트 이름 관련 명령 옵션 및 시스템 변수에 적용됩니다.
주의사항:

  • 허용되는 호스트 이름 길이의 증가로 인해 호스트 이름 열에 인덱스가 있는 테이블에 영향을 미칠 수 있습니다. 예를 들어, 호스트 이름에 인덱스를 사용하는 mysql 시스템 스키마의 테이블에는 더 긴 인덱스 값을 수용하기 위해 ROW_FORMAT 속성이 DYNAMIC으로 명시되었습니다.
  • 일부 파일 이름 값의 구성 설정은 서버 호스트 이름을 기반으로 구성될 수 있습니다. 허용되는 값은 기본 운영 체제에 의해 제한되며, 이는 255자 호스트 이름을 포함할 만큼 충분히 긴 파일 이름을 허용하지 않을 수 있습니다. 이는 general_log_file, log_error, pid_file, relay_log, slow_query_log_file 시스템 변수 및 해당 옵션에 영향을 미칩니다. 호스트 이름 기반 값이 OS에서 허용하는 파일 이름 길이를 초과할 경우, 명시적으로 더 짧은 값을 제공해야 합니다.
  • 서버는 이제 255자 호스트 이름을 지원하지만, --ssl-mode=VERIFY_IDENTITY 옵션을 사용하여 서버에 연결할 때는 OpenSSL에서 지원하는 최대 호스트 이름 길이에 의해 제약을 받습니다. 호스트 이름 일치는 SSL 인증서의 두 필드와 관련이 있으며, 각 필드의 최대 길이는 다음과 같습니다: Common Name: 최대 길이 64; Subject Alternative Name: RFC#1034에 따른 최대 길이.

호스트 이름의 최대 길이를 60자로 예상하는 애플리케이션은 이 변경 사항을 반영하여 수정해야 합니다. (버그 #13548245, 버그 #63814, 버그 #27925782, 버그 #90601, 버그 #27955121, 버그 #29584642, 버그 #29602081, 버그 #94907, WL #12571)

디버깅 관련 사항

MySQL 서버는 다중 스레드 애플리케이션으로, mutex와 같은 여러 내부 잠금 원시 기능을 사용합니다. 잠금 획득 교착 상태를 감지하고 런타임 실행이 교착 상태가 없음을 보장하기 위해, MySQL은 이제 LOCK_ORDER 도구를 지원합니다. 이를 통해 서버 설계의 일부로 잠금 순서 종속성 그래프를 정의하고, 서버 실행 시 잠금 획득이 비순환적이며 실행 경로가 그래프를 준수하는지 확인할 수 있습니다. LOCK_ORDER 지원에는 다음이 포함됩니다:

  • 서버 잠금 순서 종속성 그래프를 정의하는 lock_order_dependencies.txt 파일.
  • MySQL을 LOCK_ORDER 도구로 빌드할지 구성하는 WITH_LOCK_ORDER CMake 옵션.
  • 서버 실행 중 LOCK_ORDER 도구 작동을 구성하는 시스템 변수 세트.
  • 테스트 케이스 실행 중 LOCK_ORDER 도구를 활성화할지를 제어하는 mysql-test-run.pl--lock-order 옵션.

LOCK_ORDER 도구를 사용하려면 도구가 활성화된 상태에서 소스로부터 MySQL을 빌드해야 합니다. 자세한 내용은 LOCK_ORDER 도구를 참조하십시오. 이 도구는 서버 디버깅을 위한 것이며, 프로덕션 환경에서의 사용을 위한 것이 아닙니다.

사용 중단 및 제거 관련 사항

X DevAPI: Collection 객체의 다음 메서드가 사용 중단되었으며, 향후 릴리스에서 제거될 예정입니다:

  • Collection.find().where()
  • Collection.modify().where()
  • Collection.remove().where()

.where() 메서드에 의존하는 모든 Collection 코드는 수정되어야 하며, .where() 메서드에 포함된 표현식은 적절한 .find(), .remove(), 및 .modify() 메서드에 직접 제공되어야 합니다. (WL #12902)

이전 업그레이드 중 mysql_upgrade 프로그램에 의해 생성된 mysql_upgrade_info 파일은 mysql_upgrade 프로그램을 실행한 운영 체제 사용자만 수정할 수 있었으며, 이로 인해 업그레이드 오류가 발생할 수 있었습니다. 이제 오류 대신 경고가 표시되어 업그레이드 작업이 계속 진행될 수 있게 되었습니다. mysql_upgrade_info 파일은 사용 중단되었으며, 향후 MySQL 버전에서 제거될 예정입니다. (버그 #29702060, 버그 #95165)

FLOAT(M,D)DOUBLE(M,D) 구문은 FLOATDOUBLE 형식(및 그 동의어)의 열에 대한 자리 수를 지정하기 위한 MySQL 비표준 확장입니다. 이 구문은 사용 중단되었으며, 향후 MySQL 버전에서 지원이 제거될 예정입니다. (버그 #25328973, 버그 #84363, WL #12575)

문자열 데이터 유형의 경우, BINARY 속성은 열 캐릭터셋(또는 열 캐릭터셋이 지정되지 않은 경우 테이블 기본 캐릭터셋)의 이진(_bin) 정렬을 지정하기 위한 MySQL 비표준 확장입니다. MySQL 8.0에서 utf8mb4 캐릭터셋은 여러 개의 _bin 정렬 방식을 가지므로, 이 비표준 BINARY 속성은 모호하며 사용 중단되었습니다. 대신 명시적인 _bin 정렬 방식을 사용하는 것이 좋습니다.데이터 유형이나 캐릭터셋을 지정하는 데 사용하는 BINARY의 사용은 변함이 없습니다. (WL #13068)

C 스타일의 비표준 &&, ||, 그리고 ! 연산자는 각각 표준 SQL AND, OR, 및 NOT 연산자의 동의어이며, 사용 중단되었고 향후 MySQL 버전에서 지원이 제거될 예정입니다. 비표준 연산자를 사용하는 애플리케이션은 표준 연산자를 사용하도록 수정해야 합니다.

참고PIPES_AS_CONCAT SQL 모드가 활성화된 경우가 아니면 || 연산자의 사용은 사용 중단되었습니다. 이 경우, ||는 SQL 표준 문자열 연결 연산자를 의미합니다.

(WL #13070)

ZEROFILL 속성은 숫자 데이터 유형에 대해 사용 중단되었으며, 정수 데이터 유형에 대한 표시 너비 속성도 사용 중단되었습니다. 정수 데이터 유형에 대한 ZEROFILL 및 표시 너비에 대한 지원은 향후 MySQL 버전에서 제거될 예정입니다. 이러한 속성의 효과를 내기 위한 대체 방법을 고려하십시오. 예를 들어, 애플리케이션은 LPAD() 함수를 사용하여 원하는 너비까지 숫자를 0으로 채우거나, 서식화된 숫자를 CHAR 열에 저장할 수 있습니다. (WL #13127)

FLOAT, DOUBLE, 및 DECIMAL 형식(및 그 동의어)의 열에 대한 UNSIGNED 속성은 사용 중단되었으며, 향후 MySQL 버전에서 지원이 제거될 예정입니다. 이러한 열에 대해 단순한 CHECK 제약 조건을 대신 사용하는 것을 고려하십시오. (WL #12391)

FLOATDOUBLE 형식(및 그 동의어)의 열에 대한 AUTO_INCREMENT 지원은 사용 중단되었으며, 향후 MySQL 버전에서 제거될 예정입니다. 이러한 열에서 AUTO_INCREMENT 속성을 제거하거나 해당 열을 정수 유형으로 변환하는 것을 고려하십시오. (WL #12595)

SQL_CALC_FOUND_ROWS 쿼리 수정자와 이에 동반되는 FOUND_ROWS() 함수는 이제 사용 중단되었으며, 향후 MySQL 버전에서 제거될 예정입니다. 이를 대체하기 위해, 쿼리를 LIMIT과 함께 실행한 다음 추가 행이 있는지 확인하려면 COUNT(*)를 사용하여 두 번째 쿼리를 실행하는 방식을 고려하십시오. 예를 들어, 다음 쿼리 대신:

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();

대신 다음 쿼리를 사용하십시오:

SELECT * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT COUNT(*) WHERE id > 100;

COUNT(*)는 특정 최적화를 거칠 수 있습니다. SQL_CALC_FOUND_ROWS는 일부 최적화를 비활성화합니다. (WL #12615)

설치 관련 사항

서버 시작 시 자동 업그레이드는 완료하는 데 시간이 걸릴 수 있습니다. systemd 환경에서 더 나은 상태 알림을 위해, 서버는 이제 업그레이드 시작과 종료 시 시스템 알림 소켓으로 메시지를 전송합니다. (상태는 server mysqld status 명령으로 모니터링할 수 있습니다.) (버그 #29493201)

키링 관련 사항

keyring_aws 플러그인이 최신 AWS Encryption SDK를 사용하도록 업데이트되었으며, OpenSSL 1.1과 함께 작동합니다.새로운 SDK에서 지원하는 추가 AWS 리전은 keyring_aws_region 변수를 통해 지원됩니다. 지원되는 AWS 리전 목록은 해당 변수 설명을 참조하십시오. (WL #12886)

패키징 관련 사항

mysql-community-server Linux 패키지의 다운로드 크기와 디스크 용량을 줄이기 위해, 디버그 바이너리와 플러그인이 별도의 패키지로 이동되었습니다:

  • EL8, Fedora: 디버그 바이너리 및 관련 플러그인을 포함한 mysql-community-server 패키지가 디버그 바이너리나 플러그인이 포함되지 않은 mysql-community-server 패키지와 디버그 바이너리 및 플러그인을 포함한 mysql-community-server-debug 패키지로 분리되었습니다.
  • Debian: 디버그 바이너리 및 관련 플러그인을 포함한 mysql-community-server 패키지가 디버그 바이너리가 없는 mysql-community-server 패키지, 디버그 바이너리를 포함한 mysql-community-server-debug 패키지, 그리고 디버그 플러그인을 포함한 mysql-community-test-debug 패키지로 분리되었습니다.

모든 경우에 디버그 패키지는 해당하는 mysql-community-server 패키지에 의존합니다. (버그 #29769061, 버그 #28647754, 버그 #92415, 버그 #29702765, 버그 #95169, 버그 #29681301)

Performance Schema 관련 사항

컴파일 시 성능 스키마 버전 확인이 개선되어 서버 버전과의 호환성 문제가 발생하지 않도록 했습니다. (버그 #29550156)

이전에는 성능 스키마의 RWLOCK 도구가 우선순위 읽기/쓰기 잠금을 rwlock으로 명명하여 일반 잠금과 우선순위 잠금을 구분하지 못하고, 어떤 유형의 잠금 해제 작업이 수행되었는지에 대한 정보를 수집하지 않았습니다. 이제 우선순위 읽기/쓰기 잠금이 prlock으로 명명되어 해당 이벤트가 wait/synch/prlock으로 시작됩니다. 또한, 잠금 해제 작업에 대한 정보도 제공됩니다. (버그 #29270712)

플러그인 관련 사항

모든 플러그인이 서버 시작 시점에 InnoDB가 초기화되기 전에 로드되는 --early-plugin-load 옵션을 사용하여 “초기” 로드가 가능한 것은 아닙니다. 그러나 InnoDB는 암호화된 테이블에서 작동하기 위해 키링 백엔드 플러그인을 필요로 합니다. 플러그인이 서버에 초기 로드가 가능한지 여부를 나타낼 수 있도록, 플러그인 설명자에서 사용할 수 있는 새로운 PLUGIN_OPT_ALLOW_EARLY 플래그가 추가되었습니다. 자세한 내용은 서버 플러그인 라이브러리 및 플러그인 설명자를 참조하십시오. MySQL 배포판에 포함된 키링 플러그인에는 이제 PLUGIN_OPT_ALLOW_EARLY 플래그가 활성화되어 있으며, 이는 InnoDB에서 필요하지만, 이 플래그는 키링 플러그인에만 국한되지 않고, 서버 시작 시 초기 로드에 성공할 수 있는 다른 플러그인에서도 설정될 수 있습니다.
이 플래그는 서버 시작 시 --plugin-load 또는 --plugin-load-add 옵션을 사용하거나, INSTALL PLUGIN 명령을 사용하여 런타임에 플러그인을 로드할 수 있는지 여부에는 영향을 미치지 않습니다.
MySQL 8.0.17 이전에 MySQL 배포판을 사용하여 컴파일된 모든 플러그인에는 이 플래그가 설정되어 있지 않습니다. 이를 pre-8.0.17 서버에 로드할 때는 문제가 없지만, 8.0.17 이상 서버에서 이러한 플러그인 바이너리를 --early-plugin-load를 사용하여 로드하려고 시도하면 실패합니다. 이 플러그인은 MySQL 8.0.17 이상을 기준으로 다시 컴파일되어야 합니다. (버그 #29040456, 버그 #93550, WL #12935)

보안 관련 사항

OpenSSL 라이브러리가 번들된 플랫폼의 경우, MySQL 서버에 연결된 OpenSSL 라이브러리가 버전 1.0.2s로 업데이트되었습니다. 새로운 OpenSSL 버전에서 수정된 문제들은 https://www.openssl.org/news/cl102.txthttps://www.openssl.org/news/vulnerabilities.html에서 확인할 수 있습니다. (버그 #29881152)

X Plugin 관련 사항

createIndex() 메서드는 MySQL 8.0.16의 회귀로 인해 DOUBLE(M,D) 구문을 지원하지 않았습니다. (버그 #29748841)

X 프로토콜에서 인수를 옥텟으로 인코딩한 메시지의 처리 방식을 수정하여 문자열 배열과 같은 비스칼라 데이터를 지원할 수 있도록 했습니다. (버그 #29721046)

SSL 연결에 대해 호스트 이름 신원 확인이 활성화된 경우(--ssl-mode=VERIFY_IDENTITY), X 프로토콜이 서버 인증서의 CA 인증서에서 Subject Alternative Name(SAN)과의 일치 여부를 확인하지 않았습니다. 이로 인해 유효한 SAN으로 지정된 호스트 이름을 사용하는 연결 요청이 불필요하게 거부될 수 있었습니다. (버그 #29691694)

X Plugin을 사용한 준비된 문장에서 수정 또는 검색 작업에 IN 또는 NOT IN을 사용하면 잘못된 JSON이 생성되어 오류가 발생했습니다. (버그 #29259501)

Windows에서 X Plugin이 불필요하거나 충분히 정보가 없는 메시지를 기록했습니다. 이 메시지들은 적절하게 제거되거나 개선되었습니다. (버그 #27839153)

X Plugin의 SQL 함수 목록이 최신 상태가 아니었으며, 새로운 함수를 추가하고 더 이상 사용되지 않는 함수를 제거하여 업데이트되었습니다. (버그 #26574971)

기능 추가 및 변경 사항

InnoDB; JSON: InnoDB는 이제 JSON 배열에 대한 다중 값 인덱스를 지원합니다. 다중 값 인덱스는 여러 인덱스 레코드가 동일한 데이터 레코드를 가리킬 수 있는 인덱스입니다. 예를 들어, {"user":"Bob","zipcode":[94477,94536]}와 같은 JSON 문서에서 모든 우편 번호를 검색하려면 문서 내의 각 우편 번호에 대해 두 개의 인덱스 레코드가 필요합니다. 다음과 같은 CREATE INDEX 문을 사용하여 zipcode 배열에 대해 이러한 인덱스를 생성할 수 있습니다:

CREATE INDEX zips ON t1( (CAST(data->'$.zipcode' AS UNSIGNED ARRAY)) )

이는 사실상 함수형 인덱스이며, CAST() 함수는 ARRAY 키워드로 확장되어 JSON 배열을 SQL 데이터 유형 배열로 변환할 수 있습니다. 표현식은 유효한 JSON 표현식이어야 하며, 효과적이기 위해서는 JSON 문서의 배열을 가리켜야 합니다. CAST()가 지원하는 모든 유형 지정자는 BINARYJSON을 제외하고 사용할 수 있습니다. 이러한 CAST() 함수의 사용은 InnoDB에 의해서만 지원되며, 오직 JSON 배열에 대한 다중 값 인덱스를 생성하는 경우에만 가능합니다.
이 작업의 일환으로 MySQL은 새로운 함수 JSON_OVERLAPS()와 새로운 MEMBER OF() 연산자를 추가했습니다:

  • JSON_OVERLAPS()는 두 개의 JSON 문서를 비교합니다. 문서가 공통의 키-값 쌍 또는 배열 요소를 포함하는 경우 함수는 TRUE(1)를 반환하고, 그렇지 않으면 FALSE(0)를 반환합니다. 두 값이 스칼라인 경우, 함수는 단순히 동등성을 테스트합니다. 하나의 인수가 JSON 배열이고 다른 하나가 스칼라인 경우, 스칼라는 배열 요소로 취급됩니다. 따라서 JSON_OVERLAPS()는 두 JSON 문서에 모든 키-값 쌍 또는 배열 요소가 존재하는지를 나타내는 JSON_CONTAINS()의 보완 역할을 합니다.
  • MEMBER OF()는 첫 번째 피연산자(스칼라 또는 JSON 문서)가 두 번째 피연산자로 전달된 JSON 배열의 구성원인지 테스트하여 그렇다면 TRUE(1)를 반환하고, 그렇지 않으면 FALSE(0)를 반환합니다. 피연산자의 유형 변환은 수행되지 않습니다.

MySQL 옵티마이저는 적절한 쿼리에 대해 자동으로 다중 값 인덱스를 사용합니다. 즉, WHERE 절에서 JSON_CONTAINS(), JSON_OVERLAPS() 또는 MEMBER OF()를 JSON 열 내의 배열에서 사용하는 쿼리입니다. 주어진 쿼리에 대해 EXPLAIN 출력에서 실제로 이러한 인덱스가 사용되었는지 확인할 수 있습니다.
다중 값 인덱스에서 다중 값 인덱스에 대한 더 자세한 정보와 예제를 확인할 수 있습니다. JSON_OVERLAPS()MEMBER OF()에 대한 자세한 내용과 사용 예제는 JSON 값 검색 함수를 참조하십시오.

참고
ARRAY 및 MEMBER는 이제 예약어가 되어, 식별자로 사용하려면 식별자 인용을 사용해야 합니다.

(WL #8955, WL #8763)

그룹 복제: 분산 복구 중 그룹에 참여하는 멤버에 대해 상태 전송을 위해 원격 복제 작업을 사용할 수 있습니다. 원격 복제 작업을 통해 그룹의 데이터를 서버에 사전에 수동으로 전송하지 않고도 새로운 멤버를 그룹에 추가할 수 있습니다. 이 기능을 사용하려면 도너 및 참여 멤버에 Clone 플러그인을 설치하고, 복제 사용자에게 분산 복구를 위한 BACKUP_ADMIN 권한을 부여한 다음, 새로운 시스템 변수 group_replication_clone_threshold를 적절한 수준으로 설정해야 합니다. Clone 플러그인 설정은 이제 자동으로 처리되며, 원격 복제 작업도 자동으로 수행됩니다. 복제가 완료되고 참여 멤버가 재시작되면 원격 복제 작업이 진행되는 동안 그룹에서 적용된 모든 트랜잭션이 도너의 바이너리 로그에서 복제되어 분산 복구가 완료됩니다. (WL #12827)

Microsoft Windows: 이제 Windows에서 MySQL 명명된 파이프를 사용한 연결에 대해 커넥터가 요청할 수 있는 권한이 제한된다는 경고 메시지가 표시됩니다.
이전에는 named_pipe_full_access_group 시스템 변수가 기본적으로 Windows의 내장 그룹인 Everyone 그룹(SID S-1-1-0)에 매핑된 값으로 설정되었습니다. 그러나 이 그룹은 이상적이지 않으며, MySQL 명명된 파이프에서 더 적은 권한을 요청할 수 없는 커넥터에 대해 회원을 제한하는 그룹으로 대체해야 합니다.
이 새로운 경고는 명명된 파이프가 활성화된 상태에서 named_pipe_full_access_group'*everyone*'(또는 Windows 시스템 언어의 해당 값)이 할당된 문자열 값이 있을 경우 시작 시 오류 로그에 기록됩니다. 또한, 시스템 변수가 런타임에 Everyone 그룹으로 재설정되면 경고가 오류 로그에 기록되고 클라이언트에 전달됩니다. (WL #12670)

JSON: MySQL은 이제 두 가지 함수 JSON_SCHEMA_VALID()JSON_SCHEMA_VALIDATION_REPORT()를 사용한 JSON 스키마 유효성 검사를 지원합니다. 이 두 함수는 JSON 문서를 JSON 스키마 초안 4에 맞춰 유효성 검사를 수행합니다. JSON_SCHEMA_VALID()는 문서가 스키마에 맞는 경우 true를 반환하고, 그렇지 않은 경우 false를 반환합니다. JSON_SCHEMA_VALIDATION_REPORT()는 유효성 검사 결과에 대한 자세한 정보를 포함하는 JSON 문서를 반환합니다.
두 함수에 대해 다음이 적용됩니다:

  • required 속성이 지원됩니다.
  • 정규 표현식이 지원됩니다(유효하지 않은 표현식은 조용히 무시됨).
  • 스키마의 외부 리소스 및 $ref 키워드는 지원되지 않습니다.

더 자세한 내용과 예제는 JSON 스키마 유효성 검사 함수를 참조하십시오. (WL #11999, WL #13005)

time_zone 세션 변수를 이제 SET_VAR 옵티마이저 힌트를 사용하여 힌트할 수 있습니다. (버그 #29776464)

C 클라이언트 라이브러리 libmysqlclient.so의 마이너 버전이 21.0에서 21.1로 증가하여 새로운 심볼이 추가된 것을 알립니다. 이 변경은 MySQL 8.0.16 릴리스에서 간과된 문제를 수정하기 위한 것이었습니다. 호환성 문제를 해결하기 위해 모든 심볼의 버전은 변경되지 않았습니다. 즉, 라이브러리 파일 이름은 libmysqlclient.so.21.1.17이지만, 라이브러리 내부의 모든 심볼은 8.0.16 릴리스와 동일하게 21_0으로 태그되어 있습니다. (버그 #29584073, 버그 #29642146)

Josh Braden, Daniël van Eeden, Simon Mudd, Zhou Mengkang이 MySQL 소스 코드의 주석 및 메시지에 대한 수정 사항을 기여했습니다. (버그 #29403708, 버그 #94464, 버그 #29428435, 버그 #94527, 버그 #29262200, 버그 #94049, 버그 #29468128, 버그 #94625)

mysql 클라이언트 프로그램은 이제 os_useros_sudouser 연결 속성을 전송하여 프로그램을 실행 중인 운영 체제 사용자 이름과 SUDO_USER 환경 변수 값을 각각 나타냅니다. 연결 속성에 대한 일반적인 정보는 성능 스키마 연결 속성 테이블을 참조하십시오. 이 기능의 기여에 대해 Daniël van Eeden에게 감사드립니다. (버그 #29210935, 버그 #93916, WL #12955)

옵티마이저는 이제 NOT IN (subquery), NOT EXISTS (subquery), IN (subquery) IS NOT TRUE, 또는 EXISTS (subquery) IS NOT TRUE와 같은 WHERE 조건을 내부적으로 안티 조인으로 변환하여 서브쿼리를 제거합니다. 이는 기존의 IS NULL(Not exists) 외부 조인 최적화와 유사합니다. 자세한 내용은 EXPLAIN 추가 정보를 참조하십시오.
또한, 이제 IN (subquery) IS TRUE, EXISTS (subquery) IS TRUE가 포함된 WHERE 조건 또는 다음과 같은 좌측 조인에 대해서도 세미 조인 물질화를 사용할 수 있습니다: SELECT * FROM t1 LEFT JOIN t2 ON t2.x IN (SELECT * FROM t3). 자세한 내용은 세미 조인 변환을 사용한 IN 및 EXISTS 서브쿼리 최적화를 참조하십시오.
이 작업의 결과로, MySQL은 이제 x IS NOT TRUE와 같은 조건을 (x IS TRUE) IS FALSE 형태로 내부적으로 단순화할 수 있으며, 이는 원래 작성된 조건보다 더 빠르게 테스트되고 쉽게 최적화될 수 있습니다. (버그 #29027883, WL #4245)

SHOW CREATE USER 출력에서 IDENTIFIED WITH 절에 표시된 비밀번호 해시 값이 터미널 표시 및 기타 환경에서 문제가 되는 비인쇄 문자를 포함할 수 있습니다. 새로운 print_identified_with_as_hex 시스템 변수를 활성화하면 SHOW CREATE USER가 이러한 해시 값을 일반 문자열 리터럴 대신 16진수 문자열로 표시합니다. 비인쇄 문자가 포함되지 않은 해시 값은 이 변수가 활성화되어도 여전히 일반 문자열 리터럴로 표시됩니다. 이 변경 사항에 맞춰 CREATE USERALTER USER는 이제 일반 문자열 리터럴 또는 16진수 문자열로 지정된 해시 값을 허용합니다. (버그 #28053446, 버그 #90947, WL #12803)

MySQL 8.0에서 lower_case_table_names 변수는 MySQL 서버 초기화 시에만 구성할 수 있습니다. 그러나 Debian 및 Ubuntu에서 APT를 사용하여 수행되는 MySQL 서버 설치는 MySQL 서버를 자동으로 초기화하기 때문에 lower_case_table_names를 활성화할 기회가 없었습니다. 이 문제를 해결하기 위해 APT를 사용하여 MySQL을 설치하기 전에 debconf-set-selection 유틸리티를 사용하여 lower_case_table_names를 활성화할 수 있습니다.
MySQL을 설치하기 전에 lower_case_table_names를 활성화하려면 다음 명령을 실행하십시오:

shell> sudo debconf-set-selections <<< "mysql-server mysql-server/lowercase-table-names select Enabled

(버그 #27948395, 버그 #90695)

서버는 이제 시작 시 SSL 서버 인증서를 더 철저히 검사하고 문제가 발견되면 오류 로그에 경고를 기록합니다. (버그 #25945005)

SELECT ... INTO OUTFILE 또는 SELECT ... INTO DUMPFILE을 사용하여 생성된 파일의 umask가 0666에서 0640으로 변경되었습니다. 이제 LOAD_FILE() 함수는 파일이 서버에서 읽을 수 있으면 충분하며, 전역적으로 읽을 수 있을 필요는 없습니다. (버그 #24513720)

mysqldump 옵션 --set-gtid-purgedmysqldump 출력에 SET @@GLOBAL.gtid_purged 문이 추가될지 여부를 제어합니다. 이 문은 덤프 파일을 다시 로드한 서버에서 원본 서버의 gtid_executed 시스템 변수에 있는 GTID 세트를 추가하도록 gtid_purged 값을 업데이트합니다. 이제 새로운 선택 항목 --set-gtid-purged=COMMENTED가 제공됩니다. 이 값이 설정된 경우, 백업 중인 서버에서 GTID가 활성화되어 있으면 SET @@GLOBAL.gtid_purged가 출력에 추가되지만(단, gtid_executed이 비어 있지 않은 경우에 한함), 주석 처리됩니다. 이는 덤프 파일을 다시 로드할 때 자동으로 수행되는 작업 없이 gtid_executed 세트가 출력에 포함된다는 의미입니다. COMMENTED를 사용하면 gtid_executed 세트 사용을 수동으로 또는 자동화를 통해 제어할 수 있습니다. 예를 들어, 이미 활성화된 다른 데이터베이스가 있는 서버로 데이터를 마이그레이션하는 경우에 이 방법을 선호할 수 있습니다. Facebook의 기여에 감사드립니다. (버그 #94332, 버그 #29357665, WL #12959)

MySQL은 이제 DOUBLE, FLOAT, REAL로의 명시적 캐스팅을 지원합니다. 이는 CAST() 또는 CONVERT() 함수 중 하나를 사용하여 수행할 수 있습니다. 자세한 내용은 캐스트 함수 및 연산자를 참조하십시오. (버그 #30524, 버그 #11747058, WL #529)

이제 InnoDB는 리두 로그 아카이빙을 지원합니다. 백업 유틸리티가 백업 작업 중 리두 로그 기록을 복사할 때, 리두 로그 생성 속도를 따라잡지 못해 리두 로그 기록이 덮어쓰여져 손실될 수 있습니다. 리두 로그 아카이빙 기능은 리두 로그 기록을 순차적으로 아카이브 파일에 기록함으로써 이러한 문제를 해결합니다. 백업 유틸리티는 필요할 때 아카이브 파일에서 리두 로그 기록을 복사함으로써 데이터 손실을 방지할 수 있습니다.
자세한 내용은 리두 로그 아카이빙을 참조하십시오. (WL #12009, WL #12329, WL #12348)

JSON 데이터에 대한 추가 인덱싱 옵션을 제공하기 위해, 이제 InnoDB는 다중 값 인덱스를 지원합니다. 다중 값 인덱스는 값 배열을 포함하는 열에 대해 정의된 보조 인덱스입니다. (WL #8763)

MySQL은 이제 InnoDB 데이터를 로컬 또는 원격 MySQL 서버 인스턴스에서 복제할 수 있는 클론 플러그인을 제공합니다. 로컬 복제 작업은 MySQL 인스턴스가 실행되는 동일한 서버 또는 노드에 복제된 데이터를 저장합니다. 원격 복제 작업은 네트워크를 통해 도너 MySQL 서버 인스턴스에서 복제 작업이 시작된 수신 서버 또는 노드로 복제된 데이터를 전송합니다.
클론 플러그인은 복제를 지원합니다. 데이터를 복제하는 것 외에도, 복제 작업은 도너에서 복제 좌표를 추출하고 이를 수신자에게 적용하여 클론 플러그인을 그룹 복제 멤버 및 복제 슬레이브 프로비저닝에 사용할 수 있게 합니다. 클론 플러그인을 사용한 프로비저닝은 대량의 트랜잭션을 복제하는 것보다 훨씬 빠르고 효율적입니다. 그룹 복제 멤버는 복구의 대안적인 방법으로 클론 플러그인을 사용하도록 구성할 수 있으며, 멤버는 자동으로 그룹 데이터를 시드 멤버에서 가장 효율적인 방법으로 검색합니다.
자세한 내용은 클론 플러그인분산 복구를 위한 복제를 참조하십시오. (WL #9209, WL #9210, WL #9211, WL #9212, WL #11636, WL #9682)

그룹 내 멤버 버전에 대한 호환성 정책은 이제 멤버의 MySQL 릴리스 버전을 고려합니다. 이전에는 마이너 버전만 고려되었습니다. 릴리스 버전을 사용하면 그룹 복제가 혼합 버전 그룹의 재구성 및 업그레이드 절차 중 복제 안전성을 더 잘 유지할 수 있습니다.
호환성 정책은 멤버가 그룹에 처음 합류하거나 업그레이드 후 합류할 때, 도너가 상태 전송을 위해 선택될 때, 그리고 기본 멤버 선거가 있을 때 적용됩니다. MySQL 8.0.16 이하를 실행하는 멤버는 이러한 상황에서 기본 버전만 고려합니다. 기본 멤버 선거의 경우, 모든 멤버가 동일한 결정을 내릴 수 있도록 MySQL 8.0.17 이상을 실행하는 멤버는 그룹 내에 낮은 릴리스를 실행하는 멤버가 있는 경우 정책을 해당 멤버에 맞춰 조정합니다.
여러 MySQL 서버 버전을 실행 중인 멀티 프라이머리 모드 그룹에서는, 예를 들어 롤링 온라인 업그레이드 절차 중 그룹 복제가 릴리스의 읽기-쓰기 및 읽기 전용 상태를 자동으로 관리합니다. 멤버가 그룹에서 나가면 이제 가장 낮은 버전을 실행하는 멤버가 자동으로 읽기-쓰기 모드로 설정됩니다. 싱글 프라이머리 모드로 실행 중인 혼합 버전 그룹을 group_replication_switch_to_multi_primary_mode() 함수를 사용하여 멀티 프라이머리 모드로 변경하면 MySQL 서버 버전에 따라 멤버가 자동으로 읽기-쓰기 또는 읽기 전용 모드로 설정됩니다.|
이러한 개선된 호환성 정책은 패치 버전에서 다른 버전으로 온라인 업그레이드 절차를 진행하는 동안 그룹 멤버의 동작에 영향을 미칩니다. 멀티 프라이머리 모드 그룹에서는 업그레이드 절차 동안 읽기-쓰기 모드에 있는 멤버 수가 줄어들며, 업그레이드가 완료된 후에는 그들의 읽기-쓰기 상태가 자동으로 처리됩니다. 싱글 프라이머리 모드 그룹에서는 기본 멤버를 기본으로 유지하려면 마지막에 업그레이드해야 합니다. (WL #12826)

트랜잭션 중 바이너리 로그 트랜잭션 및 문 캐시에 저장된 데이터는 캐시를 저장하는 메모리 버퍼에서 암호화되지 않은 형식입니다. 데이터가 메모리 버퍼에서 사용할 수 있는 공간을 초과하면 디스크의 임시 파일에 기록됩니다. MySQL 8.0.17부터 서버에서 바이너리 로그 암호화가 활성화된 경우(binlog_encryption=ON), 바이너리 로그 캐시를 저장하는 데 사용되는 임시 파일은 이제 AES-CTR(AES 카운터 모드)을 사용하여 스트림 암호화 방식으로 암호화됩니다. 임시 파일은 휘발성이고 단일 프로세스에만 묶여 있으므로 임시 파일은 단일 계층 암호화를 사용하여 암호화됩니다. 암호화는 임의로 생성된 파일 비밀번호와 초기화 벡터를 사용하며, 이 값들은 메모리에만 존재하고 디스크나 키링에 저장되지 않습니다. 각 트랜잭션이 커밋되면 바이너리 로그 캐시가 재설정됩니다: 메모리 버퍼가 초기화되고, 바이너리 로그 캐시를 저장하는 데 사용된 임시 파일이 잘리고, 다음 트랜잭션에 사용할 새로운 파일 비밀번호와 초기화 벡터가 임의로 생성됩니다. 서버가 정상 종료 또는 예기치 않은 중단 후 재시작될 때도 이 재설정이 이루어집니다. (WL #12079)

불완전한 SQL 조건자는 WHERE value 형식을 가지고 있으며, 여기서 value는 열 이름 또는 상수 표현식이며 비교 연산자는 사용되지 않습니다. MySQL은 이제 이러한 유형의 조건자를 내부적으로 WHERE value <> 0으로 다시 작성하여 쿼리 해석기, 쿼리 옵티마이저 및 쿼리 실행기가 완전한 조건자만 처리하도록 합니다. 이 변경의 주요 가시적 효과는 Boolean 값에 대해 EXPLAIN 출력이 이제 10 대신 truefalse를 표시한다는 것입니다. (WL #12358)

InnoDB는 대규모 데이터 세트에 대한 병렬 읽기 스레드 성능을 개선했습니다. 이는 읽기 스레드의 더 나은 활용, 병렬 스캔 중 발생하는 프리페치 활동을 위한 읽기 스레드 I/O 감소, 파티션의 병렬 스캔 지원을 통해 이루어졌습니다.
병렬 읽기 스레드 기능은 innodb_parallel_read_threads 변수로 제어됩니다. 최대 설정 값은 256이며, 이는 모든 클라이언트 연결에 대한 스레드의 총 수입니다. 스레드 한도가 초과되면 연결은 단일 스레드를 사용하는 것으로 돌아갑니다. (WL #12978)

mysqlbinlog는 이제 클라이언트/서버 프로토콜에서 압축을 활성화하기 위한 --compress (또는 -C) 옵션을 지원합니다. (WL #2726)

버그 수정

NDB Cluster: 포함된 compile_cluster 빌드 스크립트를 사용하여 NDB Cluster를 컴파일할 때 소프트웨어 구성 요소 중 MySQL Cluster 실행에 꼭 필요하지 않은 옵션을 제거함으로써 컴파일 시간이 개선되었습니다. (버그 #29355872)

NDB Cluster: NDB 테이블의 열 속성(COLUMN_FORMAT 등)을 ALTER TABLE ALGORITHM=INPLACE를 사용해 변경하려는 시도가 거부되었습니다. 이는 올바른 동작이지만, 잘못된 오류 메시지가 표시되었습니다. (버그 #28929906, 버그 #27645777)

InnoDB: 행 수를 계산하는 프로세스를 종료하려고 할 때 오류가 발생했습니다. (버그 #29939617)

InnoDB: MySQL 8.0.14에서 도입된 회귀로 인해 MySQL 5.7 또는 MySQL 8.0.14 이전의 MySQL 8.0 릴리스에서 MySQL 8.0.16으로의 같은 파일 시스템에서 대소문자를 구분하는 파일 시스템을 사용하는 인스턴스에서 lower_case_table_names=1이 설정된 경우, 분할된 테이블이 있는 경우 제자리 업그레이드가 실패했습니다. 이 문제는 분할된 테이블 파일 이름과 관련된 대소문자 불일치 문제로 인해 발생했습니다. 회귀를 일으킨 수정을 되돌려 MySQL 5.7 또는 MySQL 8.0.14 이전의 MySQL 8.0 릴리스에서 MySQL 8.0.17로의 업그레이드가 정상적으로 작동할 수 있게 되었습니다. 그러나 이 회귀 문제는 MySQL 8.0.14, 8.0.15, 8.0.16 릴리스에서는 여전히 존재합니다.
대소문자를 구분하는 파일 시스템에서 MySQL 8.0.14, 8.0.15 또는 8.0.16에서 MySQL 8.0.17로 업그레이드할 때, 분할된 테이블이 있는 경우 바이너리 또는 패키지를 MySQL 8.0.17로 업그레이드한 후 서버를 시작할 때 다음과 같은 오류가 발생합니다

Upgrading from server version version_number with
partitioned tables and lower_case_table_names == 1 on a case sensitive file
system may cause issues, and is therefore prohibited. To upgrade anyway,
restart the new server version with the command line option 'upgrade=FORCE'.
When upgrade is completed, please execute 'RENAME TABLE part_table_name
TO new_table_name; RENAME TABLE new_table_name
TO part_table_name;' for each of the partitioned tables.
Please see the documentation for further information.
서버 버전 version_number에서 파티셔닝된 테이블을 사용하고, lower_case_table_names == 1로 설정된 경우, 대소문자를 구분하는 파일 시스템에서 업그레이드 시 문제가 발생할 수 있으므로 업그레이드가 금지됩니다. 업그레이드를 강제로 진행하려면, 새로운 서버 버전을 upgrade=FORCE 명령어 옵션과 함께 재시작하십시오. 업그레이드가 완료되면, 각 파티셔닝된 테이블에 대해 RENAME TABLE part_table_name TO new_table_name; RENAME TABLE new_table_name TO part_table_name; 명령을 실행하십시오.

이 오류가 발생한 경우 다음 해결 방법을 수행하십시오:

a. 업그레이드 작업을 강제로 진행하려면 --upgrade=FORCE를 사용하여 서버를 다시 시작하십시오.
b. 소문자 파티션 이름 구분자가 있는 분할 테이블 파일 이름을 식별하십시오:

SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES
    WHERE FILE_NAME LIKE '%#p#%' OR FILE_NAME LIKE '%#sp#%';

c. 식별된 각 파일에 대해 테이블을 임시 이름으로 변경한 다음 테이블을 원래 이름으로 다시 변경하십시오:

mysql> RENAME TABLE table_name TO temporary_table_name;
mysql> RENAME TABLE temporary_table_name TO table_name;

d. 소문자 파티션 이름 구분자가 있는 분할 테이블 파일 이름이 없음을 확인하십시오(빈 결과 집합이 반환되어야 합니다).

mysql> SELECT FILE_NAME FROM INFORMATION_SCHEMA.FILES
    ->     WHERE FILE_NAME LIKE '%#p#%' OR FILE_NAME LIKE '%#sp#%';
Empty set (0.00 sec)

e. 각 이름이 변경된 테이블에 대해 ANALYZE TABLE을 실행하여 mysql.innodb_index_statsmysql.innodb_table_stats 테이블의 옵티마이저 통계를 업데이트하십시오.

MySQL 8.0.14, 8.0.15 및 8.0.16 릴리스에 여전히 존재하는 회귀로 인해, lower_case_table_names=1이 설정된 대소문자를 구분하는 파일 시스템에서 MySQL 8.0.14, 8.0.15 또는 8.0.16에서 MySQL 8.0.17로 분할 테이블을 가져오는 작업은 지원되지 않습니다. 이렇게 하면 “테이블스페이스가 테이블에 대해 누락됨” 오류가 발생합니다. (버그 #29823032, 버그 #29917793, 버그 #95834)
참조: 이 문제는 버그 #26925260의 회귀입니다.

InnoDB: lock_sys 뮤텍스 경쟁이 lock_wait_suspend_thread()lock_wait_table_release_slot() 함수에 의해 발생한 잠금 대기 기능으로 인해 줄어들었습니다. (버그 #29814339)

InnoDB: 세그먼트에서 예약된 페이지 수를 결정하는 fseg_n_reserved_pages_low() 함수는 세그먼트 inode에서 읽은 결과를 검증하지 않았습니다. (버그 #29761998)

InnoDB: 트랜잭션 롤백 목록(hit_list) 생성을 잠금 획득 호출(lock_rec_lock 호출)에서 분리하여 다른 래칭 체계를 사용할 수 있도록 했습니다. (버그 #29753800)

InnoDB: 퍼포먼스 스키마 소비자를 비활성화하면 ALTER TABLESPACE ... ENCRYPTION 작업이 확인되었습니다. (버그 #29646974, 버그 #95005)

InnoDB: 오류 메시지에서 MySQL 8.0에서 사용되지 않는 .frm 파일에 대한 참조가 제거되었습니다. (버그 #29639655)

InnoDB: 백그라운드 스레드가 undo 테이블스페이스가 완전히 초기화되기 전에 undo 테이블스페이스의 암호화 상태를 확인할 수 있었습니다. (버그 #29600309)

InnoDB: 테이블 이름 구문 분석 함수 호출이 직렬화된 사전 정보(SDI) 테이블 이름을 구문 분석할 때 잘못된 값을 반환했으며, 이 테이블 이름에는 데이터베이스 이름이 포함되지 않습니다. 데이터베이스 이름을 보유하는 버퍼가 초기화되지 않아 Valgrind 오류가 발생했습니다. (버그 #29550527)

InnoDB: 미니 트랜잭션(mtr) 로그 버퍼에서 동적 메타데이터 로깅을 위한 공간이 충분하지 않았습니다. (버그 #29524260)

InnoDB: 컨텐션 인식 트랜잭션 스케줄링(CATS) 구현의 부정확성으로 인해 UBSan 빌드의 MySQL에서 부호 있는 정수 오버플로우 오류가 발생했습니다. (버그 #29508517, 버그 #91959)

InnoDB: RW 락 구현에서 충분한 메모리 배리어가 없어서 ARM에서 교착 상태가 발생했습니다.
기여해주신 ARM Technology의 Yibo Cai에게 감사드립니다. (버그 #29508001, 버그 #94699)

InnoDB: INFORMATION_SCHEMA.INNODB_TABLESPACESENCRYPTION 열이 undo 테이블스페이스 암호화를 활성화한 후 업데이트되지 않았습니다. (버그 #29492911, 버그 #94665)

InnoDB: 이름에 슬래시(/) 문자가 포함된 스키마 또는 테이블 이름을 잘못 해석하여 이동된 테이블에 접근할 수 없었습니다. 서버가 이를 디렉터리 구분 기호로 잘못 해석했습니다. (버그 #29492113)

InnoDB: InnoDB memcached 소스 코드에 여러 가지 수정 및 개정이 적용되었습니다. (버그 #29485891)

InnoDB: 글로벌 액세스를 가능하게 하기 위해 innodb_directories 변수 값이 정적 변수가 아닌 글로벌 변수로 내부 저장되도록 수정되었습니다. (버그 #29471990)

InnoDB: 디버그 빌드에서 thd_innodb_tmpdir() 함수가 NULL 인수를 허용하지 않았습니다. (버그 #29471846)

InnoDB: 파일 공간 할당 코드에서 뺄셈 연산이 잘못된 부호 없는 변수로 저장되어 단언 실패가 발생했습니다. (버그 #29466680)

InnoDB: 기본 undo 테이블스페이스를 이동하거나 삭제한 후 새 innodb_undo_directory 값으로 서버를 다시 시작하면 MySQL은 새로운 위치에 undo 테이블스페이스를 다시 생성했지만 데이터 사전의 undo 디렉터리 경로를 업데이트하지 못했습니다. (버그 #29461900)

InnoDB: 트랜잭션을 롤백하는 동안 복구 중에 이전에 해제된 LOB 페이지에 액세스했습니다. (버그 #29440408)

InnoDB: 복구 중 버퍼 풀에 읽을 페이지가 없을 때 페이지 읽기 요청이 발생했습니다. 불필요한 읽기 요청을 방지하기 위해 검사가 추가되었습니다. (버그 #29440208)

InnoDB: MySQL 8.0.14에서 도입된 회귀로 인해 lower_case_table_names=1을 사용하는 MySQL 인스턴스에서 분할된 테이블을 만들 때 “Invalid (old?) table or database name” 오류가 발생했습니다. 회귀를 일으킨 변경 사항이 되돌려졌습니다. (버그 #29426720, 버그 #94519)
참조: 이 문제는 버그 #26925260의 회귀입니다.

InnoDB: MySQL 5.6에서 하이픈이 포함된 데이터베이스에 생성된 FULLTEXT 인덱스 테이블이 MySQL 5.7에서 MySQL 8.0으로 업그레이드한 후 시작 실패를 일으켰습니다. FULLTEXT 보조 테이블의 테이블스페이스 파일 경로가 데이터 사전에 없었고, 데이터베이스 이름에 하이픈이 포함된 경우 경로를 올바르게 처리하지 못했습니다. (버그 #29411899, 버그 #94431)

InnoDB: 리두 로그가 논리적으로 비어 있지 않고 단일 블록으로 구성된 경우, 서버가 복구 후 종료되면 데이터 손실이 발생할 수 있었습니다. 이는 삽입 버퍼 병합이 새로운 리두 레코드를 생성했지만 이러한 레코드가 디스크에 플러시되기 전에 발생했습니다. (버그 #29411832, 버그 #94448)

InnoDB: InnoDB는 경로 및 파일 이름이 MAX_PATH 한도를 초과하는 테이블스페이스를 생성하려고 시도할 때 알 수 없는 일반 오류를 반환했습니다. 이제 InnoDB는 더 의미 있는 오류를 반환합니다. (버그 #29341634)

InnoDB: undo 테이블스페이스 파일이 다른 디렉터리로 이동된 후 찾을 수 없었습니다. (버그 #29328158)

InnoDB: innodb_buffer_pool_size=default 설정으로 서버를 시작하면 실패했습니다. 기본값이 종속 시스템 변수 설정과 호환되는지 확인하지 않았기 때문입니다. (버그 #29267814, 버그 #94065)

InnoDB: CREATE TABLESPACE ... ADD DATAFILE 구문에서 순환 디렉터리 참조가 허용되지 않도록 수정되었습니다. 예를 들어 다음과 같은 순환 디렉터리 참조(../)는 이제 허용되지 않습니다:

CREATE TABLESPACE ts1 ADD DATAFILE ts1.ibd 'any_directory/../ts1.ibd';

다만, Linux에서는 앞 디렉터리가 심볼릭 링크인 경우 순환 디렉터리 참조가 허용됩니다. 이 경우 위의 예는 여전히 허용됩니다(단, 경로가 ../로 시작하는 것은 여전히 허용됩니다).
업그레이드 문제를 방지하려면 MySQL 8.0.17 이상으로 업그레이드하기 전에 테이블스페이스 데이터 파일 경로에서 순환 디렉터리 참조를 제거하십시오. 테이블스페이스 경로를 확인하려면 INFORMATION_SCHEMA.INNODB_DATAFILES 테이블을 조회하십시오. (버그 #29157265)

InnoDB: MySQL 서버가 실행 중일 때 시스템 시간을 수동으로 변경하면 페이지 클리너 스레드 지연이 발생했습니다. (버그 #29138644, 버그 #93708)

InnoDB: UPDATE 문이 오류를 만났을 때, 반일관성 읽기가 항상 제대로 비활성화되지 않아서 디버그 모드에서 단언 오류가 발생할 수 있었습니다. (버그 #29047894)

InnoDB: 삭제된 행을 정리할 때, 활성 트랜잭션의 제약 조건 확인을 충족하기 위해 상속해야 할 잠금 유형을 제대로 결정하지 못했습니다. (버그 #29004362)

InnoDB: 준비된 문을 실행할 때 LOCK TABLES 모드에서 암묵적으로 열리는 데이터 사전 테이블에 대해 불필요한 읽기 잠금이 걸렸습니다. (버그 #28875646)

InnoDB: OPTIMIZE TABLE 작업 후 로그 적용 중에 InnoDB는 가상 열을 채우기 전에 가상 열 인덱스 업데이트를 확인했습니다. (버그 #28834208)

InnoDB: 클러스터된 인덱스에서 데이터를 복사하는 작업이 잘못 수행되어 공간 인덱스가 클러스터된 인덱스에 대한 오래된 포인터가 있는 공간 행을 사용했습니다. (버그 #28758961)

InnoDB: 생성된 가상 BLOB 열이 포함된 INSERT 작업으로 인해 잘못된 값으로 보조 인덱스가 업데이트되었습니다. (버그 #28652826)

InnoDB: innodb_data_file_pathinnodb_temp_data_file_pathSET PERSIST_ONLY 명령어로 default로 설정할 때 변수 값이 잘못되게 NULL로 설정되었습니다. (버그 #28590014)

InnoDB: CREATE TABLE ... REPLACE SELECT 작업이 lock_rec_get_rec_not_gap(lock) 단언 오류를 일으켰습니다. 이 작업은 트랜잭션 객체에 REPLACE 작업이 요청되었다는 플래그를 설정했지만, 의존하는 뷰를 업데이트하기 전에 플래그를 지우지 않았습니다. 그로 인해 후속 INSERT 작업이 REPLACE 작업으로 잘못 해석되어 잘못된 행 잠금이 발생했습니다. (버그 #28523025, 버그 #92068)

InnoDB: super_read_only가 활성화된 상태에서 임시 테이블에 대해 RENAME TABLE 작업을 시도하면 오류를 반환하는 대신 단언 오류가 발생했습니다. (버그 #28490368, 버그 #91975)

InnoDB: 가상 인덱스 접두사를 검색하는 동안 Valgrind 오류가 보고되었습니다. (버그 #28184025)

InnoDB: InnoDB 초기화가 2GB보다 큰 시스템 테이블스페이스를 생성하려고 할 때 실패했습니다. (버그 #27538464)

InnoDB: 동기화할 때 데이터가 동기화되면 해제되지 않는 풀 텍스트 캐시 잠금이 있었습니다. 이 문제는 풀 텍스트 캐시 크기가 풀 텍스트 캐시 크기 한도를 초과했을 때 발생했습니다. (버그 #25289359)

InnoDB: INNODB_METRICSmetadata_table_reference_count 카운터가 음수를 보고했습니다. (버그 #20584149, 버그 #75966)

InnoDB: 서로 다른 auto_increment_increment 값을 사용하는 클라이언트 세션이 동시에 삽입 작업을 수행하면 중복 키 오류가 발생할 수 있었습니다. (버그 #15851528, 버그 #67526)
참조: 패치 되돌림: 버그 #14049391, 버그 #65225.

파티셔닝: 파티션 테이블에 대해, 다음 조건이 충족될 때 ALTER TABLE 문이 잘못된 쿼리 결과를 발생시킬 수 있었습니다:

  • 문이 열 이름을 바꾸면서 열을 교체합니다(RENAME COLUMN을 통해 직접 또는 DROP COLUMN/ADD COLUMN으로 대체).
  • 교체된 열이 파티션 표현식에서 사용되었습니다.
  • 변경 작업이 파티션 간의 행을 재분배하지 않는 제자리 작업으로 수행되었습니다.

이제 동일한 ALTER TABLE 문이 다음 조건 중 하나를 만족하지 않는 한 열 이름 변경이 금지됩니다:

  • 문이 테이블을 비파티션 테이블로 만듭니다.
  • 문이 테이블 파티셔닝 또는 파티셔닝 표현식을 다시 정의합니다(이로 인해 행을 재분배하는 테이블이 다시 빌드됩니다). 이 방식으로 열 이름 바꾸기를 따르는 파티션 표현식 업데이트가 가능합니다.
  • 파티셔닝이 빈 열 목록을 사용하여 PARTITION BY KEY()로 지정됩니다. 이 경우 기본 키를 사용하여 파티션을 나누며 열 이름 변경을 추적합니다.

(버그 #29541665, 버그 #94792)

파티셔닝: 파티션된 테이블에서 서로 다른 행 형식을 사용하는 파티션이 있을 때, 파티션을 교환하려는 파티션과 비파티션 테이블이 동일한 행 형식을 사용하더라도 ALTER TABLE ... EXCHANGE PARTITION 구문이 ROW_FORMAT 속성이 일치하지 않는다는 오류와 함께 실패했습니다. (버그 #28687608)

복제: 한 MySQL 서버 인스턴스에서 생성된 이벤트가 다른 인스턴스의 바이너리 로그에 기록될 때, 두 번째 서버는 첫 번째 서버가 자신과 동일한 수의 바이너리 로그 이벤트 유형을 지원한다고 가정했습니다. 이 가정이 틀릴 경우, 이벤트 헤더가 잘못 처리되었습니다. 이 문제가 수정되었습니다. Facebook에 감사드립니다. (버그 #29417234, 버그 #94500)

복제: 인스턴스 수준의 백업 잠금을 얻기 위해 LOCK INSTANCE FOR BACKUP 문이 사용된 후 STOP SLAVE 문이 발행되면, SQL 스레드는 백업 잠금을 기다리고, STOP SLAVE 문은 SQL 스레드가 현재 작업을 완료할 때까지 대기하여 교착 상태가 발생할 수 있었습니다. 이제 STOP SLAVE 프로세스는 진행하기 전에 백업 잠금을 획득하려고 시도하며, 잠금을 획득할 수 없으면 오류를 반환합니다. (버그 #29386503, 버그 #93649)

복제: MySQL 8.0.13부터 복제 채널에 열린 임시 테이블이 있는 경우, SET @@global.binlog_format 또는 SET @@persist.binlog_format을 사용하여 바이너리 로그 형식을 변경할 수 없게 되었습니다. 이 제한이 적용된 후 이 작업을 시도하면, 실행 중인 복제 채널 적용기(applier)를 문제로 언급하는 잘못된 오류 메시지가 클라이언트에 반환되었습니다. 이제 적절한 오류 메시지가 반환됩니다. (버그 #29370024, 버그 #94340)

복제: 바이너리 로그 체크섬이 포맷 설명 이벤트를 역직렬화할 때 잘못 처리되었습니다. (버그 #29355110)

복제: 행 기반 복제를 사용할 때, 복제 적용 스레드가 행 변경 이벤트를 해제할 때, 기능적 인덱스에 대한 인덱스 값이 “이전” 이미지와 “이후” 이미지 모두에 대해 계산되었습니다. 그러나 “이전” 이미지에 대해서는 이러한 값이 필요하지 않았습니다. 따라서 행 해제 최적화를 위해 “이전” 이미지에 대한 이 계산이 제거되었습니다. (버그 #29304076)

복제: 마스터가 서버 재시작 후 MEMORY 테이블을 암시적으로 삭제할 때, 마스터는 바이너리 로그에 DELETE 문을 기록하여 슬레이브들도 테이블을 비우도록 합니다. 이제 생성된 이벤트는 이 DELETE 문에 대해 설명하는 주석을 바이너리 로그에 포함시켜, 해당 문이 생성된 이유를 쉽게 식별할 수 있도록 합니다. Daniël van Eeden에게 이 기여에 감사드립니다. (버그 #29157796, 버그 #93771)

복제: SHOW BINLOG EVENTS FROM 문에서 잘못된 시작 오프셋이 제공된 경우, 잘못된 오프셋이 반환되어 첫 번째 반환된 이벤트의 올바른 시작 위치 대신 표시되었습니다. (버그 #29039732, 버그 #93544)

복제: 복제는 slave_rows_search_algorithms 시스템 변수가 INDEX_SCAN,HASH_SCAN으로 설정된 경우(이는 MySQL 8.0의 기본값) 고유 키가 없는 테이블에서 동일한 행에 대해 두 번의 업데이트가 포함된 업데이트 이벤트가 발생할 때 “레코드를 찾을 수 없음” 오류로 중지될 수 있습니다. 이 상황에서 행 변경으로 인해 해시 스캔이 두 번째 업데이트를 놓쳤습니다. 이제 행을 업데이트한 후 해시 스캔 작업이 해시 맵에서 업데이트된 행을 검색하고 추가 업데이트를 적용합니다.
slave_rows_search_algorithms 시스템 변수가 TABLE_SCAN,HASH_SCAN으로 설정되어 검색에 인덱스를 사용할 수 없는 경우, 위의 상황에서 테이블에 고유 키가 있든 없든 “레코드를 찾을 수 없음” 오류가 발생할 수 있습니다. 또한, 이 설정을 사용할 때 고유 키가 있는 테이블에서 해시 스캔이 사용되면, 순서에 의존하는 두 행 업데이트가 포함된 업데이트 이벤트에서 업데이트가 순서가 어긋나서 중복 키 오류로 인해 복제가 중단될 수 있습니다. 이러한 문제를 피하기 위해 문서가 업데이트되어 TABLE_SCAN,HASH_SCAN 값을 사용하지 말아야 한다고 명시했습니다. (버그 #28846386)

복제: 복제 슬레이브에서 바이너리 로깅이 활성화된 경우, 슬레이브의 --replicate-same-server-id--log-slave-updates 옵션 조합은 서버가 순환 복제 토폴로지의 일부인 경우 복제에서 무한 루프를 유발할 수 있습니다. (MySQL 8.0에서는 바이너리 로깅이 기본적으로 활성화되어 있으며, 바이너리 로깅이 활성화된 경우 슬레이브 업데이트 로깅이 기본값입니다.) 그러나 글로벌 트랜잭션 식별자(GTID)를 사용하면 이미 적용된 트랜잭션의 실행을 건너뛰어 이러한 상황을 방지할 수 있습니다. 따라서 이제 gtid_mode=ON으로 설정된 경우 이 옵션 조합에 대한 제한이 제거되었습니다. 다른 GTID 모드에서는 이 옵션 조합을 사용할 때 서버가 시작되지 않습니다. 서버가 시작된 후 문제 상황을 방지하기 위한 안전 장치로, 이 옵션 조합이 설정된 실행 중인 서버에서 GTID 모드를 ON 이외의 값으로 변경할 수 없도록 했습니다. Facebook에 이 기여에 감사드립니다. (버그 #28782370, 버그 #92754)

복제: 바이너리 로그의 쿼리 로그 이벤트에서 DROP TABLEDELETE 문을 실행하는 데 사용된 스레드 ID가 잘못 식별되었거나 전혀 식별되지 않았습니다. 멀티 스레드 복제 슬레이브에서 임시 테이블이 관련된 경우(이는 세션별로 특정 스레드 ID가 필요합니다), 이 누락으로 인해 포인트 인 타임 복구를 위해 바이너리 로그를 재생하는 mysqlbinlog 사용 시 오류가 발생했습니다. 이제 스레드 ID가 올바르게 설정됩니다. (버그 #28642318, 버그 #92398)

복제: 트리거가 열을 기본값으로 설정하는 INSERT 또는 UPDATE 문을 호출하고 해당 열의 DEFAULT 표현식이 비결정적인 경우, 트리거가 문 기반 복제에서 실행될 때 예상되는 경고가 발생하지 않았습니다. 또한 바이너리 로그 형식이 MIXED인 경우 비결정적 문은 ROW 형식이 아닌 STATEMENT 형식으로 기록되었습니다.
트리거를 실행하는 문은 해결 시간에 트리거된 문 중 어느 것이 비결정적인지 확인합니다. 이 시점에서 트리거된 문은 구문 분석되었지만 아직 해결되지 않았으므로, 수행할 수 있는 유일한 확인은 트리거된 문이 직접 비결정적 연산자를 참조하는지 여부입니다. 비결정적 연산자가 DEFAULT 표현식에서 사용되는 경우, 트리거된 문이 실행될 때 해결되므로 비결정성은 이 시점까지는 나타나지 않습니다.
이는 로그 형식을 결정할 때 추가 확인을 추가하여 해결되었습니다. 이 확인에서는 하위 문 중 하나가 비결정적 DEFAULT 표현식을 가진 열에 쓸 수 있는 경우 해당 문을 안전하지 않은 것으로 플래그합니다. 이 시점에서 하위 문이 해당 열에 명시적 값을 제공하는지 여부를 알 수 없으므로, 하위 문이 비결정적 DEFAULT 표현식을 가진 열에 대해 명시적 값을 제공하더라도 이 확인은 문을 안전하지 않은 것으로 플래그합니다. (버그 #28297486)

복제: 슬레이브 서버가 상태와 연결 정보를 테이블(master_info_repository=TABLE)에 기록할 때(이는 MySQL 8.0의 기본값), 서버가 super 읽기 전용 모드(super_read_only=ON)에 있는 경우 종료 시 mysql.slave_master_info 테이블이 업데이트되지 않았습니다. 이 시점에서 오류 로그에 오류가 기록되지 않았지만, 서버 시작 후 복제가 실패하여 마스터 로그 파일 및 마스터 로그 위치 정보가 최신이 아니었습니다. 이제 종료 시 마스터 정보 로그를 업데이트하는 스레드는 다른 복제 스레드와 마찬가지로 읽기 전용 검사를 제외하여, 서버가 super 읽기 전용 모드일 때에도 테이블을 업데이트할 수 있도록 했습니다. 종료 중인 슬레이브의 오류 처리도 개선되어 슬레이브 상태 로그 기록에 실패할 경우 오류 로그에 오류가 기록되도록 했습니다. (버그 #27675107, 버그 #89987)

복제: 복제 슬레이브가 마스터에 잘못된 사용자 이름, 호스트 또는 포트를 사용하여 연결을 시도할 경우, 연결 실패의 원인을 지정하는 원래 오류 메시지가 일반 메시지로 덮어씌워졌습니다. 이제 SHOW SLAVE STATUS 문과 퍼포먼스 스키마 테이블 replication_connection_status에서 출력이 수정되었습니다. (버그 #26580064)

그룹 복제: 대용량 그룹 복제 메시지에 대해 메시지 단편화가 사용 중일 때(이는 MySQL 8.0.16부터 가능하며 기본값임), XCom에서 가장 높은 노드 식별자를 가진 그룹 구성원이 보낸 단편화된 메시지가 부분적으로만 전달된 후, 나머지 메시지 단편이 전달되기 전에 한 명 이상의 구성원이 그룹을 떠나면 메시지 재조립으로 인해 그룹 복제가 중단되었습니다. 구성원 손실로 인해 원래 발신자의 노드 식별자가 그룹의 새로운 보기에서 더 이상 유효하지 않게 되었습니다. 이 문제를 해결하기 위해, 이제 단편화된 메시지의 재조립은 보기 변경 후 상황을 반영하는 마지막으로 전달된 단편의 전달 정보를 사용하도록 변경되었습니다. (버그 #29716639)

그룹 복제: 그룹 구성원 수와 자동 증가 간격(auto-increment interval) 간의 불일치에 대해 발생하는 오류 메시지가 group_replication_auto_increment_increment 시스템 변수가 아닌, auto_increment_increment 시스템 변수를 잘못 참조하고 있었습니다. Group Replication이 시작될 때, auto_increment_incrementauto_increment_offset이 기본값인 경우에만 group_replication_auto_increment_increment로 설정된 값으로 변경되며, MySQL 8.0부터는 다중 주(primary) 모드에서만 적용됩니다. 이제 이 오류 메시지에서 정확한 시스템 변수 이름을 제공하도록 수정되었습니다. (버그 #29542425)

그룹 복제: MINIMAL 옵션(--upgrade=MINIMAL)을 사용하여 MySQL 서버를 업그레이드한 후, 시스템 테이블이 업그레이드되지 않아 그룹 복제를 시작할 수 없었습니다. 이 상황에서 서버는 그룹 복제를 시작하려고 무기한 대기했습니다. 이제 대기 중인 스레드를 차단 해제하고 예상되는 오류 메시지 ER_GRP_RPL_START_GRP_RPL_FAILED를 출력하도록 수정되었습니다. (버그 #29423358, 버그 #94515)

그룹 복제: 그룹을 떠나는 구성원의 의심 처리 과정에서의 변경으로 인해 복구 실패와 보기 변경 알림 사이의 순환 의존성이 발생하여 복구가 실패했습니다. 이제 오류로 인해 복구가 불가능한 경우, 그룹 통신 시스템은 다음과 같이 처리합니다:

  1. 해당 구성원이 그룹을 떠납니다.
  2. 보기 변경이 적용됩니다.
  3. 복구 스레드가 종료됩니다.

(버그 #29417365, 버그 #29628909)

그룹 복제: 그룹 복제에서 그룹에 합류하는 구성원이, 이미 같은 버전의 구성원이 그룹에 있음에도 불구하고 자신이 기존 복제 그룹과 호환되지 않는다고 잘못 식별할 수 있었습니다. 이는 해당 구성원이 그룹 내 모든 구성원, 특히 가장 높은 버전을 가진 구성원과 자신을 비교했기 때문입니다. 이제 합류하는 구성원은 기존 그룹 구성원 중 가장 낮은 버전을 가진 구성원과만 자신을 비교하며, 자신의 버전은 포함하지 않습니다. (버그 #29390946, 버그 #94429)

그룹 복제: 온라인 그룹을 구성하는 함수가 실행 중에 문제가 발생했을 때 오류를 반환하지 않을 수 있었습니다. 이제 이러한 함수는 그룹 복제 플러그인이 중지되기 전에 초기화 작업을 시작하는지 확인합니다. (버그 #28978767, 버그 #93372)

그룹 복제: XCom 그룹 통신 엔진이 메모리 부족 오류를 적절하게 처리하지 못했습니다. 메시지의 페이로드 복사본을 만들기 위해 메모리를 할당할 수 없는 경우, 오류가 기록되었지만 null 페이로드로 메시지가 여전히 전송되었습니다. 수신 구성원의 그룹 통신 시스템(GCS)은 이 메시지를 비어 있는 것으로 간주하고 폐기했으며, 수신 구성원의 XCom 인스턴스는 이 동작을 수락하고 재시도하지 않았습니다. 이로 인해 수신 구성원의 GTID 세트가 그룹과 달라져 복제 오류가 발생했습니다. 이제 XCom은 메모리 부족 오류가 발생하면 정상적으로 종료되어 이러한 상황이 발생하지 않도록 합니다. (버그 #28702320)

macOS: DMG 패키지를 사용하여 macOS에 설치된 MySQL의 launchd 동작에서 문제가 발생했습니다:

  • 이전에는 MySQL이 시작 시 부팅되도록 설정된 경우 SHUTDOWN 명령이 재시작을 유발했습니다. 이는 mysqladmin shutdown 명령에도 영향을 미쳤습니다. 이제 이러한 방식으로 서버 종료가 정상적으로 작동합니다.
  • 이전에는 RESTART 명령이 작동하지 않았습니다. 이제 정상적으로 작동합니다.
  • 이전에는 예기치 않은 서버 종료 시 부팅 시 자동 시작이 설정되지 않은 경우 자동 재시작이 발생하지 않았습니다. 이제 비정상 종료 상태로 종료되면 부팅 시 시작 여부와 관계없이 서버가 다시 시작됩니다.

(버그 #29789857)

JSON: MAX()MIN()을 JSON 데이터를 반환하는 표현식에 사용할 때 이러한 값이 JSON 값이 아닌 문자열로 비교되어 예상치 못한 결과를 초래할 수 있었습니다. 이는 숫자형 JSON 값일 때 특히 두드러졌습니다.
이러한 문제는 인덱스가 있는 임시 테이블을 사용할 때 GROUP BY가 JSON 값을 올바르게 비교하지 않았기 때문에 발생했습니다. (버그 #28947381)

JSON: JSON_TABLE()를 저장 함수 내에서 실행할 때 Unknown database '' 오류가 반환되었습니다.
이 문제의 근본 원인은 JSON_TABLE()을 사용하는 선택(select)에서 테이블을 병합할 때 MySQL이 파생 테이블만 확인했기 때문입니다. 이로 인해 JSON_TABLE()이 반환한 결과 테이블이 일반 테이블로 인식되었고, 쿼리를 실행하려 할 때 서버가 이를 열 수 없었습니다. 이제 MySQL은 추가할 테이블이 파생 테이블이나 JSON_TABLE() 결과 테이블 또는 재귀적 공통 테이블 식에 대한 참조가 아닌지 확인합니다. (버그 #92976, 버그 #28851656)

WITH ADMIN 옵션을 사용하는 GRANT 문이 제대로 처리되지 않던 경우가 있었습니다. (버그 #29900772)

외래 키 오류 메시지가 사용자의 권한에 따라 달라지는 문제가 있었습니다. (버그 #29868844)

업그레이드 중 자동 커밋이 비활성화된 경우 도움말 테이블 업그레이드가 실패하는 문제가 있었습니다. (버그 #29865428, 버그 #95620)

작은 table_open_cache 설정으로 업그레이드 중 동적으로 할당된 사전 개체를 벡터에 가져올 때 데이터 사전 테이블이 다시 열리며, 수집된 개체가 잘못 해제되어 세그멘테이션 오류가 발생하던 문제가 있었습니다. (버그 #29823053)

MySQL 5.7에서 8.0으로 업그레이드할 때, mysql 시스템 스키마 내의 innodb_*_stats_backup57.ibd 파일이 제거되기 전에 닫히지 않아 파일 시스템 작업 오류가 발생하는 문제가 있었습니다. (버그 #29791350)

mysqld –initialize가 데이터 디렉터리 마운트 포인트에 파일 시스템이 마운트되고 lost+found 파일 또는 디렉터리가 존재하는 경우 실패하던 문제가 있었습니다. 이제 데이터 디렉터리 초기화 중 lost+found 파일 또는 디렉터리는 무시됩니다. (버그 #29780434)

MySQL 업그레이드 시 SUPER 권한이 있는 계정에 AUDIT_ADMIN 권한이 할당되지 않던 문제가 있었습니다. (버그 #29770732)

REGEXP_REPLACE() 함수가 모든 경우에 빈 문자열을 올바르게 처리하지 못하던 문제가 있었습니다. (버그 #29763554)

저장 프로그램 로컬 개체의 정렬 중 과도하게 엄격한 단언이 발생할 수 있었습니다. (버그 #29759547, 버그 #95062)

그룹의 통신 프로토콜 버전을 쿼리하는 데 사용되는 group_replication_get_communication_protocol() 함수가 그룹 멤버가 RECOVERING 상태인 경우 실패하던 불필요한 제한이 있었습니다. 이제 이 함수는 실행된 멤버가 ONLINE 상태이고 그룹의 대다수와 통신 중인 경우에 사용할 수 있습니다. (버그 #29754967, 버그 #95306)

REPEAT() 함수에 대한 일부 인수에 대해 최대 길이 계산이 항상 올바르게 처리되지 않았습니다. (버그 #29739778)

UPDATE 문이 CHECK 제약 조건이 있는 테이블에 대해 제약 조건을 강제하지 못할 수 있던 문제가 있었습니다. (버그 #29706621, 버그 #95189)

RPM 또는 Debian 패키지를 사용하여 설치할 때, 데이터 디렉터리 내의 mysql_upgrade_info 파일이 존재하지만 root 소유인 경우 파일의 소유자가 데이터 디렉터리 소유자와 일치하도록 수정됩니다. 적절한 SELinux 파일 컨텍스트도 설정됩니다. (버그 #29704041)

RPM 패키지를 설치할 때 오류 로그의 권한이 잘못 설정될 수 있던 문제가 있었습니다. (버그 #29702462)

복제 그룹 멤버가 group_replication_unreachable_majority_timeout 설정이 도달하기 전에 그룹의 대다수와 연락할 수 없고, group_replication_autorejoin_tries 시스템 변수가 지정한 자동 재가입 시도가 모두 실패한 후에 group_replication_exit_state_action 시스템 변수로 지정된 작업을 수행할 수 없던 문제가 있었습니다. 이제 멤버는 작업을 수행하기 전에 세션을 초기화하여 서버에 연결할 수 있도록 합니다. (버그 #29698754, 버그 #95151)

업그레이드 작업을 수행할 때, 데이터 사전 테이블을 업데이트하는 서버 측 SQL 문이 비기본(collation) 정렬을 사용하여 업그레이드 실패를 초래하던 문제가 있었습니다. (버그 #29697670, 버그 #95144)

서버를 --skip-grant-tables 옵션으로 시작하고 ROLES_GRAPHML() 함수를 호출하면 서버가 종료되던 문제가 있었습니다. (버그 #29681975)

SELECT DISTINCT가 고정 길이 키를 사용할 때 모든 경우에 레코드를 올바르게 중복 제거하지 못하던 문제가 있었습니다. (버그 #29628699)

비동기 C API 함수를 사용하는 클라이언트 프로그램이 치명적인 오류 발생 후 해제된 메모리에 접근할 수 있던 문제가 있었습니다. (버그 #29596244)

ST_AsWKB() 함수가 적절한 오류 검사를 수행하지 못하던 문제가 있었습니다. (버그 #29594287)

데이터 디렉터리 초기화 실패 시, 서버는 데이터 디렉터리가 제거될 수 있다고 메시지를 표시할 수 있었으나, 서버 자체가 해당 디렉터리를 생성하지 않은 경우에도 메시지가 표시되었습니다. 이제 메시지는 서버가 생성한 파일만 제거될 수 있음을 나타냅니다. (버그 #29594082, 버그 #94880)

MySQL 8.0에서 keyring_encrypted_file 플러그인이 MySQL 5.7에서 생성된 파일을 읽을 수 없던 문제가 있었습니다. (버그 #29588345)

Undefined Behavior Sanitizer가 활성화된 빌드에서 my_strtoll10_mb2()val_decimal() 함수에서 런타임 오류가 발생하던 문제가 있었습니다. (버그 #29585648, 버그 #29594951)

서버가 시작 시 권한 테이블 구조를 확인하는 동안 생성된 일부 진단 정보가 경고 대신 오류로 기록되던 문제가 있었습니다. (버그 #29558993)

comp_err 유틸리티가 초기화되지 않은 데이터를 읽을 수 있던 문제가 있었습니다. (버그 #29550442)

감사 로그 암호화를 활성화하면 서버가 종료될 수 있던 문제가 있었습니다. (버그 #29549327)

RPM 패키지의 의존성 해결(obsoletes)이 업데이트되어 EL8에서 MariaDB에서 MySQL로의 업그레이드를 성공적으로 수행할 수 있게 되었습니다. (버그 #29549127, 버그 #29623146, 버그 #29623201, 버그 #29659212)

LEFT JOIN t ON column WHERE t.x=0 IS NOT TRUE 형식의 조인에서, MySQL은 null-보완 행의 NULL 인수에 대해 IS NOT TRUE를 FALSE로 평가하고 이를 거부했습니다. 이로 인해 LEFT JOIN이 내부 조인으로 잘못 변환되어 결과에서 행이 누락되었습니다. 동일한 문제가 WHERE 조건에 IS NOT FALSE를 사용하는 동일한 형식의 조인에도 영향을 미쳤습니다. (버그 #29540230)

read_only 시스템 변수가 활성화된 경우, 해당 값이 잘못하여 캐릭터셋 및 데이터 정렬 테이블 업데이트에 적용되던 문제가 있었습니다. (버그 #29533590, 버그 #94769)

STATEMENT_DIGEST()STATEMENT_DIGEST_TEXT() 함수가 인수의 캐릭터셋 대신 **character_set_client**을 사용하여 인수를 분석하던 문제가 있었습니다. (버그 #29526571)

서버가 데이터 사전 업그레이드를 추적하여 데이터 사전 테이블이 변경될 때 INFORMATION_SCHEMA 뷰가 다시 생성되도록 했습니다. (버그 #29513265)

STATEMENT_DIGEST() 또는 STATEMENT_DIGEST_TEXT() 의 실행이 performance_schema.events_statements_summary_by_digest 테이블의 데이터에 예상치 못한 부작용을 일으킬 수 있었습니다. (버그 #29512067)

CREATE TABLE 구현이 테이블에 대한 탐색 또는 쓰기가 수행되지 않을 때 명확한 시작 커서를 제공하지 않았습니다. (버그 #29511318)

테이블이 const로 최적화될 때, 조인의 ON 조건에 있는 모든 술어 항목도 const로 표시된 테이블에서 평가되어야 해당 행이 ON 조건을 충족하는지 확인할 수 있습니다.
옵티마이저는 ON 조건이 불가능한 것으로 처리되는 경우 테이블을 const로 표시하지 못했고, 이로 인해 해당 테이블에서 반환된 행은 NULL 확장 행이 되었습니다.
이 수정은 테이블에 대해 const_table 플래그를 설정하고 행을 NULL 행으로 표시합니다. 또한 불가능한 ON 조건을 가진 테이블에 대한 EXPLAIN 출력도 변경되어, 이 테이블에서 반환된 NULL 값이 다른 const 행과 마찬가지로 열 값으로 전파되도록 했습니다. (버그 #29493830)

IN 서브쿼리를 포함한 쿼리가 optimizer_switchfirstmatch=on이 포함되지 않은 경우 불필요한 행을 반환할 수 있었습니다. (버그 #29493026)

EL6 또는 EL7 운영 체제를 감지하는 RPM 패키지가 일부 시스템에서 실패하던 문제가 있었습니다. (버그 #29492896)

스토리지 엔진이 데이터 사전의 스토리지 엔진 전용 데이터 필드에 저장된 키를 추가할 수 있도록 SQL 레이어의 키 유효성 검사가 비활성화되었습니다. 스토리지 엔진은 이제 키 유효성 검사를 직접 수행해야 합니다. (버그 #29491593, 버그 #94667)

NULL 체크가 행 비교와 관련된 일부 표현식에 대해 잘못된 결과를 반환하던 문제가 있었습니다. (버그 #29491083)

테이블 조인을 최적화할 때 ORDER BYLIMIT이 포함된 경우, 옵티마이저는 전체 조인의 팬아웃을 고려하여 첫 번째 테이블의 선택 제한을 수정했습니다. 팬아웃은 각 테이블의 filter_effect를 사용해 계산되었으며, COND_FILTER_STALE (-1)로 설정하여 알 수 없는 값을 나타낼 수 있습니다. 옵티마이저는 이 값을 실제로 확인하지 않아 팬아웃이 음수로 계산될 수 있었고, 이는 EXPLAIN 출력에서 예상치 못한 행 수 0을 초래할 수 있었습니다.
이제 COND_FILTER_STALE (filter_effect가 알 수 없음) 값을 명시적으로 확인하며, 이 값이 발견되면 팬아웃도 알 수 없는 것으로 가정하고, 따라서 첫 번째 테이블에서 선택될 행 수는 전체 조인의 팬아웃에 의해 수정되지 않습니다. (버그 #29487181, 버그 #29531472)

LEAST()GREATEST() 함수가 모든 인수를 부호 있는 값 또는 부호 없는 값으로 가정하던 문제가 있었습니다. (버그 #29467577)

BIT_OR() 함수의 일부 인수가 항상 올바르게 처리되지 않던 문제가 있었습니다. (버그 #29459549)

디버그 빌드에서, mysql.user 시스템 테이블의 user_attributes 열을 잘못 처리하여 서버가 종료될 수 있었습니다. (버그 #29451897)

MySQL Cluster용 Debian 디버그 패키지가 잘못된 디버그 심볼 경로를 포함하고 있었습니다. (버그 #29446947)

Protobuf 3.7.0으로 빌드할 때 컴파일 실패가 발생하던 문제가 있었습니다. (버그 #29436791, 버그 #94543)

Debian 및 Ubuntu에서 MySQL 패키지가 기본 MySQL 패키지에서 업그레이드 후 mysql.service를 활성화하지 않던 문제가 있었습니다. (버그 #29435592)

오류가 발생할 경우 서버가 공유 메모리 연결을 제대로 닫지 않아 예상치 못한 서버 동작이 발생할 수 있었습니다. (버그 #29435426)

내부 JOIN_CACHE::join_record() 메서드는 has_rownull_row 플래그와 관련하여 작업한 모든 테이블을 동일한 상태로 유지하려고 했으며, 이를 위해 진입 시 상태를 저장하고 완료 시 적절한 플래그를 복원했습니다.
여기서 다루는 문제는 이 플래그들이 복원된 후 발생했는데, 이는 이미 처리된 레코드를 복원하기 위해 restore_last_record()가 호출되었기 때문입니다. 이로 인해 저장된 상태를 기반으로 방금 복원된 null_row 플래그가 다시 설정될 수 있었습니다. 이 문제는 저장된 상태를 복원하기 전에 restore_last_record()를 호출하고, 초기 상태에서 null_row 플래그가 설정되지 않았음을 나타내는 경우 reset_null_row()도 호출하도록 수정되었습니다. (버그 #29435133)

ALTER TABLE 문이 ADD COLUMN을 사용할 때 예상대로 동작하지 않던 문제가 있었습니다. (버그 #29428288)
참고: 이 문제는 버그 #28333657의 회귀 문제입니다.

MySQL 5.7에서 MySQL 8.0으로 업그레이드하는 동안 비원시 파티션 테이블을 처리할 때 잘못된 오류 메시지가 보고되었습니다. 오류 메시지가 MySQL 8.0에서 지원되지 않는 -DWITH_PARTITION_STORAGE_ENGINE CMake 빌드 옵션을 참조하고 있었습니다. (버그 #29426632, 버그 #94518)

서버 시작 시, 지속된 변수에서 사용자 이름 및 호스트 이름의 길이를 적절하게 확인하지 않았습니다. (버그 #29420141)

특정 다중문 쿼리에 대해 구문 분석기가 메모리 누수를 일으킬 수 있었습니다. (버그 #29419820)

EL8에서 RPM 패키지를 사용하여 MySQL을 설치할 때 설치된 MeCab 라이브러리와 충돌이 발생할 수 있었습니다. (버그 #29413115)

FreeBSD에서 치명적인 신호에 대한 스택 추적 덤프가 올바르게 작동하지 않던 문제가 있었습니다. (버그 #29408039)

derived_merge 스위치가 비활성화된 상태에서 INFORMATION_SCHEMA.TABLES에서 기본 테이블에 대한 정보를 검색할 때 TABLE_COMMENT 열에 부적절한 정보가 표시되던 문제가 있었습니다. (버그 #29406053, 버그 #94468)

서브쿼리에서 ORDER BY 사용이 예상한 결과를 생성하지 않던 경우가 있었습니다. (버그 #29402943)

ROLLUP 쿼리가 와일드카드를 포함하거나 특정 와일드카드 쿼리가 단언 오류를 일으킬 수 있었습니다. (버그 #29396628)

상수 값이 TRUE로 평가되는 IF 함수 내의 조건이 항상 올바르게 처리되지 않던 문제가 있었습니다. (버그 #29394833)

MySQL 8.0.13에서 전체 텍스트 검색과 관련된 코드 변경으로 인해 세그멘테이션 오류가 발생하던 문제가 있었습니다. (버그 #29393105)

mysqlpump--result-file 인수의 파일이 올바르게 열렸는지 확인하지 않아 오류가 발생할 경우 예기치 않게 종료되던 문제가 있었습니다. (버그 #29389828)

조인이 없는 쿼리에서, 배치 모드가 초기화 완료 후에만 활성화되어 OFFSET 행이 배치 모드 외부에서 읽혀 배치 모드의 성능 이점을 누리지 못하던 문제가 있었습니다. (버그 #29373972)

함수형 인덱스를 이름 변경할 때, 서버가 중복된 인덱스 이름을 확인하지 않던 문제가 있었습니다. (버그 #29360763)

시스템 변수 서비스가 일부 작업에서 입력 버퍼 크기를 확인하지 않던 문제가 있었습니다. (버그 #29343505)

mysql 시스템 스키마 덤프에서, mysqlpump가 특정 테이블을 계정 관리 문이 아닌 행으로 덤프하던 문제가 있었습니다. (버그 #29343073)

UNION 서브쿼리에 함수형 인덱스를 생성하면 디버그 빌드에서 단언이 발생하던 문제가 있었습니다. (버그 #29342245)

AVG() 함수에서 숫자가 아닌 인수를 올바르게 처리하지 않던 문제가 있었습니다. (버그 #29321764)

열 수가 매우 많은 결과 집합이 클라이언트 프로그램에서 사용 가능한 모든 메모리를 사용하게 할 수 있던 문제가 있었습니다. 이제 클라이언트 라이브러리는 결과 집합 메타데이터에 대해 max_allowed_packet 바이트를 초과하지 않도록 할당하며, 이 제한이 초과되면 치명적인 오류가 발생하고 클라이언트가 연결을 끊도록 합니다. (버그 #29316814)

서버와 클라이언트가 다른 MySQL 시리즈에 있을 때, mysql_shutdown() 호출이 패킷 페이로드 오해로 인해 클라이언트 종료를 초래할 수 있었습니다. (버그 #29315393)

MySQL 4.1 이전 프로토콜을 사용하여 서버와 통신할 때 클라이언트 프로그램이 결과 집합 메타데이터를 읽는 중 실패할 수 있던 문제가 있었습니다. (버그 #29304864)

HANDLER 문이 생성된 열이 있는 테이블에서 항상 올바르게 작동하지 않던 문제가 있었습니다. (버그 #29300049)

클라이언트/서버 프로토콜의 세션 추적 정보가 잘못 처리될 수 있던 문제가 있었습니다. (버그 #29297652)

libmysqlclient C 클라이언트 라이브러리를 사용하는 클라이언트 프로그램이 잘못된 세션 추적 정보를 포함하는 OK 패킷을 수신할 경우 종료될 수 있던 문제가 있었습니다. (버그 #29297620, 버그 #29630735)

PAD_CHAR_TO_FULL_LENGTH SQL 모드가 활성화된 상태에서 암호 변경이 실패하고 경고나 오류가 보고되지 않던 문제가 있었습니다. (버그 #29287785)

keyring_aws 플러그인의 로드 가능한 함수 초기화 코드가 플러그인이 초기화되었는지 제대로 확인하지 않던 문제가 있었습니다. (버그 #29278153)

스칼라 서브쿼리가 집계 함수나 윈도우 함수와 비교될 때 항상 올바르게 식별되고 처리되지 않던 문제가 있었습니다. (버그 #29276063)

Ubuntu 패키지가 초기화 스크립트에 대해 바이너리 로그를 비활성화하지 않던 문제가 있었습니다. (버그 #29263771)

잘못된 정렬 이름을 사용할 때 내부 정렬 맵이 손상될 수 있던 문제가 있었습니다. (버그 #29258979)

인덱스된 표현식을 사용하는 단일 테이블 UPDATEDELETE 문이 준비된 문으로 실행될 때 서버가 종료될 수 있던 문제가 있었습니다. (버그 #29257254)

audit_log 플러그인이 UNINSTALL PLUGIN audit_log 문을 기록하지 않던 문제가 있었습니다. (버그 #29248047)

MySQL이 즉시 언링크되는 임시 파일을 생성할 때 open(O_TMPFILE)을 사용하는 방식으로 변경되었습니다. 이는 이전보다 효율적이며 경합 상태의 가능성을 줄여줍니다. Daniel Black에게 기여에 대한 감사를 전합니다. (버그 #29215177, 버그 #93937)

audit_log 필터링 작업에서 메모리 누수가 발생할 수 있던 문제가 있었습니다. (버그 #29201747)

GRANT OPTION 권한이 일부 경우 잘못 처리될 수 있던 문제가 있었습니다. (버그 #29179334)

이전에는 LIKE 비교에서 _ 또는 % SQL 와일드카드 문자가 ESCAPE 문자로 사용될 때 비교가 잘못될 수 있었습니다. 이제 이러한 문자를 사용할 수 있습니다. (버그 #29175461, 버그 #93811)

component_sys_variable 서비스가 특정 시스템 변수를 읽지 못해 서버가 종료될 수 있던 문제가 있었습니다. (버그 #29162657)

다중 테이블 UPDATE 문이 어떤 행을 업데이트할지 결정할 때 생성된 열 값을 잘못 검색할 수 있던 문제가 있었습니다. (버그 #29154379)

퍼포먼스 스키마 매개변수로 인해 메모리 부족 상태가 발생할 경우 서버 시작이 실패하던 문제가 있었습니다. (버그 #29140212, 버그 #93726)

표준 SQL과의 일관성과 준수를 위해, 이제 ISNULL() 함수가 EXPLAIN 문에서 경고를 생성할 때 **IS NULL**로 인쇄됩니다. (버그 #29119455)

일부 보조 유니코드 문자가 잘못된 경고 메시지로 플래그 지정될 수 있던 문제가 있었습니다. (버그 #29110613, 버그 #93626)

MySQL 5.7에서 8.0으로 업그레이드할 때, root 사용자가 모든 동적 권한을 받지 못하던 문제가 있었습니다. (버그 #29043233)

하위 파티셔닝을 사용할 때 테이블 직렬화된 사전 정보(SDI)가 테이블스페이스 파일에 저장되지 않던 문제가 있었습니다. (버그 #29020745, 버그 #93499)

일부 퍼포먼스 스키마 테이블을 삭제할 때 권한이 잘못 확인되던 문제가 있었습니다. (버그 #29010031)

mysqldumpSET NAMES utf8mb4SET character_set_client = utf8mb4 문을 버전별 주석으로 래핑하지 않아 호환성 문제가 발생할 수 있었습니다. (버그 #29007506, 버그 #93450)

NULL로 정의된 하나 이상의 열에 대해 생성된 고유 인덱스에서 옵티마이저가 해당 인덱스를 사용하는 조인을 eq_ref로 처리하지 못하던 문제가 있었습니다.
이 수정의 일환으로, 이제 NULL과의 비교를 잠재적인 동일성 매치로 처리하지 않기 위해 늦은 NULL 필터링이 수행됩니다. (버그 #28965762, 버그 #29337233)

디버그 빌드에서 예상되는 정렬과 실제 정렬이 다른 문자열 비교로 인해 단언 오류가 발생할 수 있던 문제가 있었습니다. (버그 #28960901)

세미조인으로 변환되기 전에, 외부 참조가 있는 WHERE 절을 포함하는 병합된 파생 테이블 또는 공통 테이블 식이 포함된 서브쿼리가 올바르게 처리되지 않던 문제가 있었습니다. (버그 #28955216)

ORDER BY가 포함된 파생 테이블을 사용하는 쿼리가 항상 올바르게 처리되지 않던 문제가 있었습니다. (버그 #28942965)

wait_timeout 값을 초과한 비활성으로 인해 클라이언트가 종료되면, 오류 로그에 작성된 메시지가 명확하지 않았습니다. 이제 ER_NET_WAIT_ERROR가 기록되어 문제의 원인에 대해 더 구체적으로 설명됩니다. Mattias Jonsson에게 기여에 대한 감사를 전합니다. (버그 #28940167, 버그 #93240)

FLUSH PRIVILEGESCREATE USER, ALTER USER를 동시에 실행할 경우 서버가 멈출 수 있던 문제가 있었습니다. (버그 #28937018, 버그 #93085)

인덱스 접두사를 사용하는 CASE 문 비교가 잘못된 결과를 생성할 수 있던 문제가 있었습니다. (버그 #28934315, 버그 #93215)

정렬 제거 후 쿼리 비용을 조정할 때 원래의 비용 추정에서 고려되지 않은 정렬을 보상하기 위해 때때로 비용 추정치가 너무 낮거나 심지어 음수일 수 있었습니다.
Optimize_table_order::consider_plan()에서 총 비용에 정렬 비용을 추가하고, 정렬이 필요하지 않은 경우 JOIN::optimize()에서 총 비용에서 이를 차감합니다.
만약 consider_plan()에서 정렬이 필요하지 않다고 판단되면, 정렬 비용을 총 비용에 추가하지 않지만 JOIN::sort_cost()에 여전히 정렬 비용을 기록합니다. 이는 이전에 고려된 후보 계획의 정렬 비용으로 설정됩니다. 이후 JOIN::optimize()에서 JOIN 객체에 연관된 정렬 비용이 있다고 보고 총 비용에서 이 비용을 차감합니다. 그러나 정렬 비용은 선택된 계획과 동일하지 않은 후보 계획에서 온 것이므로 추정이 잘못되었습니다.
이 문제를 해결하기 위해, consider_plan()이 총 비용에 정렬 비용을 추가하지 않을 경우, JOIN::optimize()에서 잘못된 비용 조정이 수행되지 않도록 JOIN::sort_cost를 0으로 설정합니다. (버그 #28884359)

일부 GIS 코드가 Visual Studio 2017 15.5.6에서 컴파일되지 않았습니다. (버그 #28861188)
참고: 이 문제는 버그 #28842878의 회귀 문제입니다.

생성된 열 값 및 가상 생성된 열에 대한 인덱스가 이러한 생성된 열이 의존하는 열이 ALTER TABLE을 사용하여 RENAME COLUMN 또는 CHANGE COLUMN을 통해 교환된 후에도 올바르게 업데이트되지 않았습니다.
이제 생성된 열, 생성된 기본값, 기능 인덱스에 대한 기본 열의 이름 변경이 금지되었으며, 동일한 ALTER TABLE 문이 다음 조건 중 하나를 충족하는 경우에만 허용됩니다:

  • 해당 문이 생성된 열, 생성된 기본값, 또는 기능 인덱스를 제거합니다.
  • 해당 문이 종속된 표현식을 업데이트합니다. 이를 통해 기본 열 이름 변경을 따르는 생성 표현식이 업데이트되는 기존 시나리오를 지원합니다.

생성된 열, 생성된 기본값 또는 기능 인덱스가 의존하는 열을 삭제하는 데 대한 제한도 이와 유사하게 완화되었습니다. (버그 #28772251, 버그 #92727)

기본 열은 생성된 열에 의해 인덱스 전용 액세스에서 제외되지 않았습니다. (버그 #28652733)
참고: 버그 #29664369 참조. 이 문제는 버그 #23169112의 회귀 문제입니다.

SET PERSIST_ONLYversion_tokens_session 시스템 변수를 올바르게 처리하지 않았습니다. (버그 #28542569)

디버그 빌드에서 CREATE TABLE 문에 대한 잘못된 오류 검사로 인해 어설션이 발생할 수 있었습니다. (버그 #28490361, 버그 #91976)

MySQL 5.7에서는 참조 열의 일부가 숨겨진 경우에도 InnoDB 테이블의 외래 키를 지원했지만, MySQL 8.0에서는 지원하지 않았습니다. MySQL 8.0은 이제 이 기능을 지원합니다. (버그 #28480149, 버그 #91952)

INSERT ... ON DUPLICATE KEY UPDATE는 활성 역할에 의해 부여된 권한을 고려하지 않았습니다. (버그 #28395115)

언로드된 컴포넌트의 경우, 시작 시 --loose- 접두어가 있는 컴포넌트 옵션이 나중에 런타임에 컴포넌트를 로드할 때 처리되지 않았습니다. (버그 #28341329)

클라이언트 프로그램에서 상호작용적으로 요청된 긴 비밀번호가 널로 종료되지 않을 수 있었습니다. (버그 #28121400)

MySQL 빌드 시, CMakeBoost 다운로드 프로세스를 시작할 때 대상 디렉터리에 0바이트 tarball을 생성한 후 다운로드가 완료되면 이를 제거합니다. 다운로드가 중단되거나 시간이 초과되면 이 파일이 존재하여 다음번 CMake 실행 시 다운로드를 시도하지 못하게 했습니다. 이제 0바이트 tarball이 있으면 다운로드를 시작하기 전에 제거됩니다. (버그 #28089173)

스레드 풀 그룹이 스레드 프로세스 틱 시간이 허용된 최대 값을 초과할 때 차단될 수 있었습니다. 이제 틱 시간은 더 큰 데이터 유형을 사용하여 더 큰 값을 허용합니다. (버그 #28072609)

ALTER USER ... IDENTIFIED WITH ... BY에 대한 권한이 올바르게 확인되지 않았습니다. (버그 #27923149, 버그 #29882299)

MySQL은 OpenSSL 세션 티켓을 지원하지 않지만, OpenSSL에 이를 알리기 위해 SSL_OP_NO_TICKET 플래그를 설정하지 않았습니다. 이제 이 플래그가 설정됩니다. (버그 #27655493)

audit_null 플러그인이 null 이벤트 레코드를 제대로 검사하지 않았습니다. (버그 #27638290)

UpdateXML()이 특정 경우 메모리를 적절하게 해제하지 못했습니다. (버그 #27312862)

mysql.plugin 시스템 테이블의 name 열에 빈 값이 있으면 서버가 시작 중에 종료되었습니다. (버그 #27302459)

서버가 CACHE INDEX 문에 대한 권한을 적절히 확인하지 않았습니다. (버그 #26173827)

thread_pool 플러그인이 활성화된 경우 퍼포먼스 스키마 status_by_thread 테이블에 데이터가 포함되지 않았습니다. (버그 #25933891)

GRANT OPTION 권한이 데이터베이스 작업과 관련된 것으로 처리되었습니다. (버그 #25203933, 버그 #34159579)

ARCHIVE 테이블에 대한 REPAIR TABLE 실행 시 서버가 종료될 수 있었습니다. (버그 #23304911)

INSTALL PLUGIN 문에 잘못된 UTF-8 문자가 포함된 경우 서버가 멈추거나(디버그 빌드에서 어설션 발생) 멈출 수 있었습니다. (버그 #14653594, 버그 #23080148, 버그 #27167197)

mysql.slow_log 시스템 테이블에 로그 기록 시 테이블 열에 너무 큰 값이 있을 때 실패할 수 있었습니다. 이제 기록 가능한 정보는 작성하고, 그렇지 않으면 해당 행은 폐기되며 오류 로그에 메시지가 기록됩니다. (버그 #11748692, 버그 #37132)

WHERE date_column LIKE 'year_value'를 사용하는 쿼리가 Windows 플랫폼에서 오류 1525 Incorrect DATE value로 실패했습니다. (버그 #95780, 버그 #29904751)
참고: 이 문제는 버그 #29368521의 회귀 문제입니다.

이전 문제에 대한 수정으로 인해 YEAR 값이 부호 없는 값으로 처리되었지만, 이는 뺄셈을 포함한 계산에서 발생할 수 있는 음수 값을 허용하지 않았습니다. 이로 인해 데이터 잘림 오류가 발생할 수 있었습니다. (버그 #95045, 버그 #29668676)
참고: 이 문제는 버그 #92209, 버그 #28562930의 회귀 문제입니다.

입력 행이 0인 집계를 포함하는 유도 테이블을 사용하여 작업할 때, 집계 함수의 결과가 임시 테이블에 올바르게 복사되지 않았습니다. 이는 유도 테이블이 여러 번 평가된 경우, 예를 들어 lateral join을 수행할 때 잘못된 결과를 초래했습니다. (버그 #94721, 버그 #29514504)

ORDER BY를 포함하는 창이 없는 창이 잘못된 결과를 초래했습니다. (버그 #94251, 버그 #29328529)

REGEXP_REPLACE()REGEXP_SUBSTR() 함수가 검색된 표현식의 문자 집합과 정렬이 아닌 UTF-16을 사용하여 결과를 반환했습니다. (버그 #94203, 버그 #29308212)

SUM(constant)를 포함하는 UNION ALL 쿼리가 SUM(column)을 사용하는 동일한 쿼리보다 매우 느리게 처리되었습니다. (버그 #93922, 버그 #29227464)

JSON_OBJECTAGG()는 중복 키가 있을 때 비결정적인 동작을 보이며, 키에 대한 정렬이 없을 경우 창 프레임에 더 이상 포함되지 않은 키-값 쌍이 결과에 계속 나타나는 문제가 있었습니다. (버그 #93822, 버그 #29175262)

서브쿼리가 포함된 쿼리에서 LIMITHAVING보다 먼저 적용되었습니다. (버그 #93214, 버그 #28934388)
참고: 이 문제는 버그 #25466100의 회귀 문제입니다.

TIMESTAMP 열을 기준으로 GROUP BY를 사용하는 쿼리가 동일한 키에 대한 중복 항목 오류(ER_DUP_ENTRY)를 발생시켰습니다. 이 문제는 특정 시간대 설정을 사용하여 테이블에 TIMESTAMP 값을 삽입한 후, 시간대 설정이 변경된 상태에서 값을 다시 가져올 때 발생했습니다. 특히 시간대 변경으로 인해 일부 TIMESTAMP 값이 표준 시간에서 일광 절약 시간(DST)으로 변경된 동안 두 번 존재할 수 있습니다. 이제 서버는 이러한 경우 중복 키 오류 대신 Grouping on temporal is non-deterministic for time zones having DST. Please consider switching to UTC for this query.라는 오류를 발생시킵니다.
또한 이 문제를 방지하기 위해 explicit_defaults_for_timestampON으로 설정하고, 서버 SQL 모드의 일부로 MODE_NO_ZERO_IN_DATE, MODE_NO_ZERO_DATE, 또는 MODE_INVALID_DATES 중 하나 이상을 사용하는 것이 권장됩니다. (버그 #90398, 버그 #27970159)

Leave a Comment



이 문서 공유

8.0.17 변경 사항 (2019-07-22 GA)

링크 복사

CONTENTS