MySQL 8.0 Release Note

8.0.22 변경 사항 (2020-10-19 GA)

Estimated reading: 7 minutes 75 views

공식 문서: Changes in MySQL 8.0.22 (2020-10-19, General Availability)

계정 관리 관련 사항

grant 테이블을 포함하는 명령문에 대한 잠금 처리 방식이 개선되었습니다. (버그 #31291237, 버그 #31576185, WL #14084)

이제 mysql.infoschemamysql.sys 예약 계정을 수정하려면 SYSTEM_USER 권한이 필요합니다. (버그 #31255458)

CREATE USER, DROP USER, 그리고 RENAME USER 계정 관리 명령문에 대해 서버는 이제 저장된 객체가 고아가 되거나 현재 고아 상태인 저장된 객체를 채택하는 작업을 방지하기 위한 추가 보안 검사를 수행합니다. 이러한 작업은 이제 오류로 실패합니다. 그러나 SET_USER_ID 권한이 있으면 이 검사를 무시할 수 있으며, 이 경우 작업이 오류 대신 경고를 발생시키므로 관리자가 의도적으로 작업을 수행할 수 있습니다. 자세한 내용은 고아 저장 객체를 참조하십시오. (WL #14073)

감사 로그 관련 사항

JSON 형식 로그 파일에 대해 MySQL Enterprise Audit는 audit_log_read() 사용자 정의 함수를 사용하여 로그 읽기 작업을 지원합니다. 이전에는 특정 이벤트의 정확한 타임스탬프 및 이벤트 ID를 나타내는 북마크를 전달하여 audit_log_read() 함수 호출 시 읽기 시작 위치를 지정할 수 있었습니다. 보다 유연한 처리를 위해 이제 이 함수의 인수는 타임스탬프를 지정하는 시작 지정자가 될 수 있으며, 해당 타임스탬프 이후에 발생하는 첫 번째 이벤트부터 읽기가 시작됩니다. 자세한 내용은 감사 로그 파일 읽기를 참조하십시오. (WL #13936)

C API 관련 사항

MySQL 클라이언트 라이브러리는 이제 mysql_real_connect_dns_srv() C API 함수를 포함하며, 이 함수는 mysql_real_connect()와 유사하지만 명시적인 호스트, 포트, 소켓 인수를 사용하지 않고 DNS SRV 레코드를 사용하여 MySQL 서버에 대한 연결을 설정할 후보 호스트를 결정합니다.
C API를 사용하는 애플리케이션은 이 새 함수를 직접 호출할 수 있습니다. 또한 mysql 클라이언트 프로그램은 DNS SRV 기능을 사용하도록 수정되었으며, 이제 --dns-srv-name 옵션을 지원하여 --host보다 우선적으로 적용되며, DNS SRV 레코드를 기반으로 연결을 설정합니다. 자세한 내용은 mysql_real_connect_dns_srv()를 참조하십시오.
복제본이 설정한 연결, FEDERATED 스토리지 엔진에서의 연결, mysql 외의 클라이언트 프로그램에서의 연결에는 영향을 주지 않습니다. (WL #13905)

컴파일 관련 사항

Windows에서 MySQL 컴파일에 필요한 최소 Visual Studio 버전이 이제 Visual Studio 2019 Update 4로 변경되었습니다. (버그 #31655401)

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

구성 관련 사항

새로운 WITH_TCMALLOC CMake 옵션은 -ltcmalloc과 링크할지를 지정합니다. 이 옵션이 활성화되면 기본 제공 malloc(), calloc(), realloc(), 그리고 free() 루틴이 비활성화됩니다. 기본값은 OFF입니다. WITH_TCMALLOCWITH_JEMALLOC은 상호 배타적입니다. (버그 #31785166)

새로운 COMPRESS_DEBUG_SECTIONS CMake 옵션은 바이너리 실행 파일의 디버그 섹션을 압축할지를 지정합니다(리눅스 전용). 실행 파일 디버그 섹션을 압축하면 빌드 과정에서 CPU 시간을 더 소모하지만 공간을 절약할 수 있습니다. 기본값은 OFF입니다. 이 옵션이 명시적으로 설정되지 않았지만 COMPRESS_DEBUG_SECTIONS 환경 변수가 설정된 경우, 이 옵션은 해당 변수의 값을 따릅니다. (버그 #31498296)

WITH_DEFAULT_FEATURE_SET CMake 옵션이 제거되었습니다. (버그 #31122507)

네트워크 네임스페이스를 구현하는 플랫폼(예: 리눅스)에서 MySQL은 이제 클라이언트 프로그램이 MySQL 서버 또는 X Plugin에 TCP/IP 연결을 할 때 사용할 네트워크 네임스페이스를 구성할 수 있도록 합니다:

  • 서버 측에서 bind_address, admin_address, 그리고 mysqlx_bind_address 시스템 변수는 특정 IP 주소 또는 호스트 이름에 대해 사용할 네트워크 네임스페이스를 지정할 수 있도록 확장된 문법을 제공합니다.
  • 클라이언트 연결의 경우, mysql 클라이언트와 mysqlxtest 테스트 스위트 클라이언트는 네트워크 네임스페이스를 지정하기 위한 --network-namespace 옵션을 지원합니다.
  • 복제본 서버에서 소스 서버로의 복제 연결의 경우, CHANGE MASTER TO 문은 네트워크 네임스페이스를 지정하는 NETWORK_NAMESPACE 옵션을 지원합니다.

복제 모니터링 목적으로는 퍼포먼스 스키마 replication_connection_configuration 테이블, 복제본 서버 연결 메타데이터 저장소(자세한 내용은 복제 메타데이터 저장소를 참조), 그리고 SHOW REPLICA | SLAVE STATUS 문에 새 열이 추가되어 해당 연결에 대한 네트워크 네임스페이스를 표시합니다.
이 기능을 사용하려면 충족해야 하는 호스트 시스템의 필수 조건을 포함한 자세한 내용은 네트워크 네임스페이스 지원을 참조하십시오. (WL #12720)

사용 중단 및 제거 관련 사항

MySQL 8.0.22부터 group_replication_ip_whitelist 시스템 변수가 사용 중단(deprecated)되었으며, 이를 대체하기 위해 group_replication_ip_allowlist 시스템 변수가 추가되었습니다. 이 시스템 변수는 이전과 동일한 방식으로 작동하며, 단지 용어만 변경되었습니다.
두 시스템 변수 모두 기본값은 AUTOMATIC입니다. 두 변수 중 하나가 사용자 정의 값으로 설정되고 다른 하나가 설정되지 않은 경우, 변경된 값이 사용됩니다. 두 변수 모두 사용자 정의 값으로 설정된 경우, group_replication_ip_allowlist의 값이 사용됩니다. (WL #14175)

MySQL 8.0.22부터 START SLAVE, STOP SLAVE, SHOW SLAVE STATUS, SHOW SLAVE HOSTSRESET SLAVE 명령어가 사용 중단(deprecated)되었습니다. 다음 별칭을 대신 사용해야 합니다:

  • START SLAVE 대신 START REPLICA를 사용
  • STOP SLAVE 대신 STOP REPLICA를 사용
  • SHOW SLAVE STATUS 대신 SHOW REPLICA STATUS를 사용
  • SHOW SLAVE HOSTS 대신 SHOW REPLICAS를 사용
  • RESET SLAVE 대신 RESET REPLICA를 사용

명령어는 이전과 동일한 방식으로 작동하며, 각 명령어와 출력에서 사용된 용어만 변경되었습니다.
관련 상태 변수에 대한 별칭으로 새로운 상태 변수가 추가되었습니다. 기존 및 새로운 명령어는 기존 및 새로운 상태 변수를 모두 업데이트합니다:

  • Com_slave_startCom_replica_start와 동일합니다.
  • Com_slave_stopCom_replica_stop와 동일합니다.
  • Com_show_slave_statusCom_show_replica_status와 동일합니다.
  • Com_show_slave_hostsCom_show_replicas와 동일합니다.

(WL #14171)

InnoDB memcached 플러그인은 사용 중단(deprecated)되었으며, 향후 MySQL 버전에서 지원이 제거될 예정입니다. (WL #14131)

INFORMATION_SCHEMA.TABLESPACES 테이블은 사용되지 않으며, 이제 사용 중단(deprecated)되었고 향후 MySQL 버전에서 제거될 예정입니다. 관련 정보는 다른 INFORMATION_SCHEMA 테이블에서 제공될 수 있으며, 자세한 내용은 The INFORMATION_SCHEMA TABLESPACES Table을 참조하십시오. (WL #14064)

키링 관련 사항

MySQL Enterprise Edition에는 이제 Oracle Cloud Infrastructure Vault를 키링 저장소의 백엔드로 사용하는 keyring_oci 플러그인이 포함됩니다. 키 정보는 MySQL 서버 로컬 저장소에 영구적으로 저장되지 않으며, 모든 키는 Oracle Cloud Infrastructure Vault에 저장되므로 이 플러그인은 Oracle Cloud Infrastructure MySQL 고객에게 MySQL Enterprise Edition 키 관리에 적합합니다. 자세한 내용은 The MySQL Keyring을 참조하십시오. (WL #9770)

옵티마이저 관련 사항

중요 변경 사항: 이제 준비된 문장은 PREPARE 명령을 실행할 때 한 번만 준비되며, 더 이상 매번 실행할 때마다 준비되지 않습니다. 또한, 저장 프로시저 내의 명령문도 이제 저장 프로시저가 처음 실행될 때 한 번만 준비됩니다. 이 변경 사항은 반복적인 준비와 준비 구조의 롤백으로 인한 추가 비용을 피하여 해당 명령문들의 성능을 향상시킵니다. 이러한 롤백은 여러 버그의 원인이 되었습니다.
이 작업의 일환으로, 준비된 문장에서 동적 매개변수가 해결되는 방식이 변경되었으며, 준비된 문장 사용 사례에 대한 변경 사항은 다음과 같습니다:

  • 준비된 문장에서 사용된 매개변수의 데이터 유형은 문장이 준비될 때 결정되며, 문장이 다시 준비되지 않는 한 이후의 실행에서도 동일한 유형이 유지됩니다(이 경우에 대한 자세한 내용은 PREPARE 문을 참조하십시오).
  • SELECT expr1expr2, ... FROM table ORDER BY ? 형식의 준비된 문장에서 매개변수로 정수값 _N_을 전달해도 더 이상 결과가 선택 목록의 _N_번째 표현식으로 정렬되지 않으며, 결과는 더 이상 정렬되지 않습니다. 이는 ORDER BY constant에서 예상되는 동작입니다.
  • 매개변수를 통해(또는 사용자 변수를 통해) LIMIT 또는 OFFSET 절에 부동 소수점 값을 삽입하는 것이 가능했으나 지원되지 않았습니다. 이제 이러한 값은 명시적으로 허용되지 않으며, 해당 값은 반드시 정수여야 합니다.
  • 창 함수 NTILE(NULL), NTH_VALUE(expr, NULL), LEAD(exprnn), 및 LAG(exprnn)에서 _nn_이 음수일 경우 이제 SQL 표준을 준수하기 위해 허용되지 않습니다.
  • 준비된 문장에서 읽히는 사용자 변수는 문장이 준비될 때 그 유형이 결정되며, 문장이 다시 준비되지 않는 한 이후의 실행에서도 동일한 유형이 유지됩니다.
  • 저장 프로시저 내에서 읽히는 사용자 변수는 명령문이 처음 실행될 때 그 유형이 결정되며, 이후의 모든 호출에서도 동일한 유형이 유지됩니다.
  • 매개변수 유형을 결정할 수 있는 맥락적 정보가 없는 경우, 서버는 해당 매개변수를 이진 문자열이 아닌 기본 문자셋을 사용하는 문자 문자열로 간주합니다. 이와 다르게 처리해야 하는 매개변수는 CAST() 표현식 내에 둘 수 있습니다.

준비된 문장에서 사용된 매개변수와 사용자 변수의 유효한 데이터 유형이 결정되는 규칙에 대한 자세한 내용은 PREPARE 문을 참조하십시오.
또한, 창 함수 LAG(), LEAD(), NTILE()rows (_N_) 인수는 이제 다음 형식 중 하나로 범위 0에서 263 사이의 정수여야 합니다:

  • 부호 없는 정수 상수 리터럴
  • 위치 매개변수 마커 (?)
  • 사용자 정의 변수
  • 저장 루틴의 로컬 변수

또한, 이 인수는 더 이상 NULL일 수 없습니다. 추가 정보는 참조된 함수 설명을 참조하십시오. (버그 #48612, 버그 #99601, 버그 #100150, 버그 #105166, 버그 #11756670, 버그 #23599127, 버그 #31119132, 버그 #31365678, 버그 #31393719, 버그 #31592822, 버그 #31810577, 버그 #33448735, WL #9384)

filesort 알고리즘은 이제 단일 테이블뿐만 아니라 여러 테이블에 대한 조인 정렬을 지원합니다. (버그 #31310238, 버그 #31559978, 버그 #31563876)

RIGHT JOIN을 사용할 때 일부 내부 객체가 의도한 대로 LEFT JOIN에 적합한 객체로 변환되지 않았습니다. 여기에는 구문 분석 시에 작성된 일부 테이블 목록이 포함되며, 이 목록은 그 순서가 역전되지 않았습니다. 이로 인해 원래 RIGHT JOIN이었던 경우를 특별한 경우로 처리하는 코드를 유지해야 했으며, 이는 여러 버그의 원인이 되었습니다. 이제 서버는 구문 분석 시 필요한 모든 역전을 수행하므로, 구문 분석 후에는 RIGHT JOIN이 실제로 모든 면에서 LEFT JOIN으로 처리됩니다. (버그 #30887665, 버그 #30964002, WL #6509)
참고: 관련 버그: 버그 #12567331, 버그 #21350125

SELECT INTO DUMPFILESELECT INTO OUTFILE 명령문을 사용하여 파일에 쓸 때 주기적인 동기화 지원이 추가되었습니다. 이 기능은 select_into_disk_sync 시스템 변수를 ON으로 설정하여 활성화할 수 있으며, 쓰기 버퍼 크기는 서버 시스템 변수 select_into_buffer_size를 사용하여 설정할 수 있습니다. 기본 버퍼 크기는 131072(217) 바이트입니다. 동기화 후 선택적으로 지연 시간을 설정할 수 있으며, 이 지연 시간은 select_into_disk_sync_delay 시스템 변수를 통해 설정할 수 있습니다. 기본 동작은 지연 시간을 허용하지 않는 것입니다(즉, 지연 시간이 0밀리초입니다).
자세한 내용은 참조된 시스템 변수 설명을 참조하십시오.
기여해주신 Facebook에 감사드립니다. (버그 #30284861, WL #13926)

MySQL은 이제 적격한 쿼리에 대해 유도 조건 푸시다운을 구현합니다. 예를 들어, SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i > constant와 같은 쿼리에서 많은 경우 외부 WHERE 조건을 유도 테이블로 푸시다운할 수 있습니다. 이 경우 SELECT * FROM (SELECT i, j FROM t1 WHERE i > constant) AS dt로 변환됩니다. 이전에는 유도 테이블이 물질화되고 병합되지 않으면 MySQL은 전체 테이블(이 경우 t1)을 물질화한 다음 WHERE 조건으로 행을 필터링했습니다.
유도 테이블을 외부 쿼리와 병합할 수 없는 경우(예: 유도 테이블이 집계를 사용하는 경우), 외부 WHERE 조건을 유도 테이블로 푸시다운하면 처리해야 하는 행의 수를 줄여 쿼리 성능을 향상시킬 수 있습니다.
유도 테이블이 집계 또는 창 함수를 사용하지 않는 경우 외부 WHERE 조건을 물질화된 유도 테이블로 직접 푸시다운할 수 있습니다. 또한, 유도 테이블이 GROUP BY를 사용하고 창 함수를 사용하지 않는 경우 외부 WHERE 조건을 유도 테이블의 HAVING 조건으로 푸시다운할 수 있습니다. 유도 테이블이 창 함수를 사용하고 외부 WHERE가 창 함수의 PARTITION 절에서 사용된 열을 참조하는 경우에도 WHERE 조건을 푸시다운할 수 있습니다.
유도 테이블이 UNION 또는 LIMIT 절을 포함하는 경우에는 이 최적화를 사용할 수 없습니다.
유도 조건 푸시다운을 활성화하려면 optimizer_switch 시스템 변수의 derived_condition_pushdown 플래그가 on으로 설정되어야 합니다. 이것이 기본 설정입니다. 이 최적화가 옵티마이저 스위치 설정에 의해 비활성화된 경우, 해당 쿼리에 대해 DERIVED_CONDITION_PUSHDOWN 옵티마이저 힌트를 사용하여 이를 활성화할 수 있습니다. 특정 쿼리에서 이 최적화를 비활성화하려면 NO_DERIVED_CONDITION_PUSHDOWN 옵티마이저 힌트를 사용하십시오.
자세한 정보와 예시는 유도 조건 푸시다운 최적화를 참조하십시오. (버그 #59870, 버그 #88381, 버그 #11766303, 버그 #27590273, WL #8084)

패키징 관련 사항

RPM 및 Debian 패키지의 경우 클라이언트 측 플러그인이 별도의 client-plugins 패키지로 이동되었습니다. (버그 #31584093)

MySQL 소스 배포판의 VERSION 파일은 Boost와의 이름 충돌로 인해 이제 MYSQL_VERSION으로 이름이 변경되었습니다. (버그 #31466846)

MySQL을 실행하는 데 systemd를 사용하는 플랫폼에서는 패키지에 더 이상 레거시 System V 파일이 포함되지 않습니다: mysqld_multi.servermysql.server 스크립트, 그리고 mysql.server.1, mysqld_multi.1, mysqld_safe.1 매뉴얼 페이지가 제거되었습니다. (버그 #31450888)

Performance Schema 관련 사항

SHOW PROCESSLIST 명령문은 모든 활성 스레드에서 스레드 데이터를 수집하여 프로세스 정보를 제공합니다. 그러나 구현 시 글로벌 뮤텍스를 보유한 상태로 스레드 관리자를 통해 활성 스레드를 반복 처리하기 때문에 특히 바쁜 시스템에서 성능 저하가 발생합니다.
이제 새로운 퍼포먼스 스키마 processlist 테이블을 기반으로 한 대체 SHOW PROCESSLIST 구현이 제공됩니다. 이 구현은 스레드 관리자가 아닌 퍼포먼스 스키마에서 활성 스레드 데이터를 조회하며, 뮤텍스를 필요로 하지 않습니다:

  • 대체 구현을 활성화하려면 performance_schema_show_processlist 시스템 변수를 활성화하십시오.
  • 대체 SHOW PROCESSLIST 구현은 mysqladmin processlist 명령에도 적용됩니다.
  • 대체 구현은 INFORMATION_SCHEMA PROCESSLIST 테이블이나 MySQL 클라이언트/서버 프로토콜의 COM_PROCESS_INFO 명령에는 적용되지 않습니다.
  • 기본 및 대체 구현이 동일한 정보를 제공하도록 보장하려면 특정 구성 요구 사항을 충족해야 합니다. 자세한 내용은 processlist 테이블을 참조하십시오.

(WL #9090)

MySQL 서버 에러 로그에 기록된 가장 최근 이벤트에 대한 SQL 인터페이스가 이제 새로운 퍼포먼스 스키마 error_log 테이블에서 쿼리를 통해 제공됩니다. 이 테이블은 고정 크기를 가지며, 새 이벤트가 들어설 공간이 필요할 때 오래된 이벤트는 자동으로 삭제됩니다. 테이블은 에러 로그 구성에 log_sink_internal과 JSON 형식의 log_sink_json 로그 싱크를 포함하는 구성 요소가 있을 때 채워집니다. 여러 새로운 상태 변수는 error_log 테이블 작동에 대한 정보를 제공합니다. 자세한 내용은 error_log 테이블을 참조하십시오. (WL #13681)

플러거블 인증

LDAP 인증 플러그인에 대한 다음 변경 사항이 적용되었습니다:

  • SASL LDAP 인증 플러그인에서 SCRAM-SHA-1 인증 방법은 SLES 12 및 15와 EL6 시스템에서 지원되지 않습니다. 이러한 시스템에서 기본 인증 방법은 이제 GSSAPI입니다.
  • LDAP 호스트가 설정되지 않은 경우 LDAP 연결 풀은 초기화되지 않으며, 이는 이전에 실패했던 인증 플러그인 설치가 성공할 수 있도록 합니다. (이는 사이트가 플러그인을 먼저 설치한 후 나중에 구성하는 경우일 수 있습니다.)
  • LDAP 연결 매개변수가 런타임에 변경된 경우, LDAP 연결 풀은 최초의 후속 인증 시도가 이루어질 때 다시 초기화됩니다.
  • LDAP 서버가 재시작되면 연결 풀의 기존 연결이 무효화됩니다. LDAP 인증 플러그인은 이러한 상황을 감지하여 연결 풀을 다시 초기화하며, (SASL LDAP 플러그인의 경우) SASL 챌린지를 다시 전송합니다.

(버그 #31664270, 버그 #31219323)

SQL 구문 관련 사항

이제 구문 분석기는 다음 구문을 사용하여 괄호로 묶인 쿼리 표현식을 지원합니다:

( query_expression )
  [order_by_clause]
  [limit_clause]
  [into_clause]

다른 변형도 가능합니다. 자세한 내용은 괄호로 묶인 쿼리 표현식을 참조하십시오. (버그 #30592703)

이제 CAST() 함수 또는 CONVERT() 함수를 사용하여 다른 유형의 값을 YEAR로 변환할 수 있습니다. 이러한 함수는 0-99 범위의 1자리 또는 2자리 YEAR 값과 1901-2155 범위의 4자리 값을 지원합니다. 정수 0은 0년으로 변환되며, 0으로 구성된 문자열은(가능한 절단 후) 2000년으로 변환됩니다. 1-69 범위의 값에는 2000이 추가되며, 70-99 범위의 값에는 1900이 추가됩니다.
숫자가 아닌 문자로 시작하는 문자열은 변환되기 전에 절단되며, 이 경우 서버는 절단 경고를 발생시킵니다. 부동 소수점 값은 변환되기 전에 반올림됩니다. 예를 들어, CAST(1944.5 AS YEAR)는 반올림되어 1945를 반환하고, CAST("1944.5" AS YEAR)는 절단되어 1944를 반환합니다(경고 포함).
DATE, DATETIME, 그리고 TIMESTAMP 값은 해당 값의 YEAR 부분으로 변환됩니다. TIME 값은 현재 연도로 변환됩니다. TIME 값으로 지정되지 않은 값은 예상과 다른 결과를 반환할 수 있습니다. 예를 들어, CAST("13:47" AS YEAR)는 2013년을 반환하며, CAST(TIME "13:47" AS YEAR)는 2020년을 반환합니다(이 릴리스 기준).
GEOMETRY 값을 YEAR로 변환하는 것은 지원되지 않습니다. 호환되지 않는 유형 또는 범위를 벗어난 값이나 유효하지 않은 값은 NULL을 반환합니다.
YEAR는 또한 JSON_VALUE() 함수의 반환 유형으로 사용할 수 있습니다. 이 함수는 4자리 연도만 지원하며, 그 외에는 CAST()CONVERT() 함수가 YEAR로 캐스팅할 때 적용되는 규칙을 따릅니다.
자세한 내용은 CONVERT() 함수 설명을 참조하십시오. (WL #14015)

이제 TIMESTAMP 열 값을 선택할 때 AT TIME ZONE 연산자를 사용하여 시스템 시간대에서 UTC DATETIME으로 변환할 수 있습니다.
구문은 CAST(value AT TIME ZONE specifier AS DATETIME[(precision)])입니다. 여기서 _value_는 TIMESTAMP이고, _specifier_는 INTERVAL '+00:00' 또는 'UTC' 중 하나입니다. (INTERVAL은 첫 번째 형식에서 선택 사항이며 'UTC'에서는 사용할 수 없습니다.) 반환된 DATETIME 값의 _precision_은 선택적으로 최대 6자리까지 지정할 수 있습니다.
시간대 오프셋을 사용하여 테이블에 삽입된 값도 지원됩니다.
AT TIME ZONECONVERT() 함수나 CAST() 함수 호출 이외의 컨텍스트에서는 사용할 수 없습니다. ARRAY 키워드 및 다중 값 인덱스 생성도 AT TIME ZONE을 사용할 때 지원되지 않습니다.
다음은 간단한 예입니다:

mysql> SELECT @@system_time_zone;
+--------------------+
| @@system_time_zone |
+--------------------+
| EDT                |
+--------------------+
1 row in set (0.00 sec)

mysql> CREATE TABLE ex (ts TIMESTAMP);
Query OK, 0 rows affected (0.81 sec)

mysql> INSERT INTO ex VALUES
     >     ROW(CURRENT_TIMESTAMP),
     >     ROW('2020-07-31 21:44:30-08:00');
Query OK, 2 rows affected (0.09 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> TABLE ex;
+---------------------+
| ts                  |
+---------------------+
| 2020-07-28 21:39:31 |
| 2020-08-01 01:44:30 |
+---------------------+
2 rows in set (0.00 sec)

mysql> SELECT ts, CAST(ts AT TIME ZONE 'UTC' AS DATETIME) AS ut FROM ex;
+---------------------+---------------------+
| ts                  | ut                  |
+---------------------+---------------------+
| 2020-07-28 21:39:31 | 2020-07-29 01:39:31 |
| 2020-08-01 01:44:30 | 2020-08-01 05:44:30 |
+---------------------+---------------------+
2 rows in set (0.00 sec)

자세한 내용과 예시는 CAST() 함수 설명을 참조하십시오. (WL #12535)

X Plugin 관련 사항

특정 조건에서 X 프로토콜 연결을 종료하면 MySQL 서버가 예기치 않게 중지될 수 있었습니다. (버그 #31671503)

기능 추가 및 변경 사항

뷰에 대한 LOCK TABLES 권한 검사가 개선되었습니다. (버그 #31304432, WL #14092)

MySQL 서버의 새로운 비동기 연결 장애 조치 메커니즘을 사용하여 기존 복제본에서 소스로의 연결이 실패한 후 새로운 소스로 자동으로 비동기 복제 연결을 설정할 수 있습니다. 소스가 중지되거나 네트워크 장애로 인해 복제 I/O 스레드가 중지되면 연결이 자동으로 전환됩니다. 이 메커니즘은 복제본이 데이터를 공유하는 여러 MySQL 서버 또는 서버 그룹과 동기화 상태를 유지하도록 사용할 수 있습니다. 복제 채널에 대해 비동기 연결 장애 조치를 활성화하려면, 해당 채널의 CHANGE MASTER TO 문에서 SOURCE_CONNECTION_AUTO_FAILOVER=1을 설정하고, asynchronous_connection_failover_add_sourceasynchronous_connection_failover_delete_source 함수를 사용하여 소스 목록을 설정하십시오. (WL #12649)

새로운 innodb_extend_and_initialize 변수는 Linux에서 InnoDB가 파일당 테이블 및 일반 테이블스페이스에 공간을 할당하는 방법을 구성할 수 있게 해줍니다. 기본적으로, 작업 시 테이블스페이스에 추가 공간이 필요하면 InnoDB는 테이블스페이스에 페이지를 할당하고 해당 페이지에 NULL을 물리적으로 기록합니다. 이 동작은 새로운 페이지가 자주 할당될 때 성능에 영향을 미칠 수 있습니다. MySQL 8.0.22부터 Linux 시스템에서 innodb_extend_and_initialize를 비활성화하여 새로 할당된 테이블스페이스 페이지에 물리적으로 NULL을 기록하는 것을 방지할 수 있습니다. 이 변수가 비활성화된 경우, 공간은 posix_fallocate() 호출을 사용하여 예약되며, 이는 NULL을 물리적으로 기록하지 않고 공간을 할당합니다.
posix_fallocate() 작업은 원자적이지 않으므로, 테이블스페이스 파일에 공간을 할당하는 작업과 파일 메타데이터를 업데이트하는 작업 사이에 실패가 발생할 수 있습니다. 이러한 실패는 새로 할당된 페이지를 초기화되지 않은 상태로 남겨 InnoDB가 해당 페이지에 액세스하려 할 때 오류를 일으킬 수 있습니다. 이를 방지하기 위해, InnoDB는 새 테이블스페이스 페이지를 할당하기 전에 리두 로그 기록을 작성합니다. 페이지 할당 작업이 중단되면, 복구 중에 리두 로그 기록에서 작업이 재생됩니다. (WL #13782)

MySQL 그랜트 테이블에서 동시 DML 및 DDL 작업을 허용하기 위해, 이전에 MySQL 그랜트 테이블에서 행 잠금을 획득했던 읽기 작업이 이제 비잠금 읽기(non-locking read)로 실행됩니다. 이제 MySQL 그랜트 테이블에서 비잠금 읽기로 수행되는 작업은 다음과 같습니다:

  • SELECT 문 및 조인 목록과 서브쿼리를 통해 그랜트 테이블에서 데이터를 읽는 다른 읽기 전용 문, SELECT ... FOR SHARE 문을 포함한 모든 트랜잭션 격리 수준을 사용하는 문.
  • 조인 목록 또는 서브쿼리를 통해 그랜트 테이블에서 데이터를 읽지만 수정하지 않는 DML 작업, 모든 트랜잭션 격리 수준에서 실행.

그랜트 테이블에서 데이터를 읽을 때 더 이상 행 잠금을 획득하지 않는 명령문은 명령문 기반 복제를 사용하는 동안 경고를 보고합니다.
binlog_format=mixed를 사용하는 경우, 그랜트 테이블에서 데이터를 읽는 DML 작업은 혼합 모드 복제를 안전하게 만들기 위해 바이너리 로그에 행 이벤트로 기록됩니다.
그랜트 테이블에서 데이터를 읽는 SELECT ... FOR SHARE 문은 이제 경고를 보고합니다. FOR SHARE 절을 사용하는 경우 그랜트 테이블에서 읽기 잠금은 지원되지 않습니다.
SERIALIZABLE 격리 수준을 사용하여 그랜트 테이블에서 데이터를 읽는 DML 작업은 이제 경고를 보고합니다. SERIALIZABLE 격리 수준을 사용할 때 일반적으로 획득되는 읽기 잠금은 그랜트 테이블에서 지원되지 않습니다. (WL #14087)

ALTER DATABASE 문은 이제 데이터베이스 및 그 안의 객체를 수정할 수 있을지를 제어하는 READ ONLY 옵션을 지원합니다. 이 옵션은 데이터베이스 마이그레이션에 유용합니다. READ ONLY가 활성화된 데이터베이스는 작업 중에 데이터베이스가 변경될 염려 없이 다른 MySQL 인스턴스로 마이그레이션할 수 있습니다. 자세한 내용은 ALTER DATABASE 문을 참조하십시오.
새로운 INFORMATION_SCHEMA 테이블 SCHEMATA_EXTENSIONS는 데이터베이스 옵션을 표시합니다. 현재 이 테이블은 읽기 전용 데이터베이스에 대해 READ ONLY=1을 표시합니다. 자세한 내용은 INFORMATION_SCHEMA SCHEMATA_EXTENSIONS 테이블을 참조하십시오. (WL #13369)

버그 수정

InnoDB: 히스토그램 샘플링을 위한 트랜잭션 지원과 관련된 코드가 제거되었으며, 이로 인해 테스트 실패를 유발한 관련 단언 코드도 제거되었습니다. 히스토그램 샘플링에는 트랜잭션 지원이 필요하지 않습니다. (버그 #31787736)

InnoDB: 리두 로그 아카이브 로그 작성 스레드의 쓰기 작업에 대해 암호화 정보가 설정되지 않았습니다. (버그 #31690196)

InnoDB: TTASEventMutex::exit 함수가 ARM64를 위해 최적화되었습니다. Krunal Bauskar에게 감사드립니다. (버그 #31589019, 버그 #100132)

InnoDB: DISABLE_PSI_RWLOCK CMake 옵션이 활성화된 상태에서 InnoDB가 컴파일되지 못했습니다. (버그 #31578289)

InnoDB: 샘플링 작업이 완료된 후에 히스토그램 샘플링을 위해 설정된 트랜잭션 격리 수준 READ UNCOMMITTED이 리셋되지 않았습니다. (버그 #31564407)

InnoDB: 내부 임시 테이블의 클러스터드 인덱스를 업데이트하는 쿼리가 잘못된 결과를 반환했습니다. 클러스터드 인덱스의 수정된 페이지가 플러시 목록에 추가되지 않아 수정된 페이지가 버퍼 풀에서 제거될 때 변경 사항이 손실되었습니다. (버그 #31560679)
참고: 이 문제는 버그 #29207450의 회귀입니다.

InnoDB: TempTable 스토리지 엔진에 정의된 Boost 라이브러리의 빌드 종속성이 제거되었습니다. (버그 #31505048)

InnoDB: 32비트 빌드에서 Clang 컴파일러 문제를 처리하기 위한 해결 방법이 구현되었습니다. 이 문제는 ATOMIC_LLONG_LOCK_FREE 값이 “때때로 잠금 없음”으로 정의되지만 동일한 플랫폼에서 동일한 유형에 대해 __atomic_always_lock_free가 true를 반환하는 경우 발생했습니다. (버그 #31504609)

InnoDB: 이전 버전의 MySQL에서 명시적으로 정의되지 않은 REDUNDANT 행 형식 테이블이 REDUNDANT 행 형식 인덱스 열 크기 제한을 초과하는 인덱스 추가를 허용했습니다. (버그 #31479542, 버그 #99791)

InnoDB: 다중 값 인덱스로 정의된 열에 대한 DML 작업이 실패했습니다. (버그 #31479282)

InnoDB: 마스터 키 회전 중 오류가 발생했습니다. 언두 테이블스페이스 메모리 객체가 너무 일찍 해제되었습니다. (버그 #31467626)

InnoDB: 병렬 읽기 인터페이스에서 사용되지 않는 물리적 선행 읽기 코드를 제거했습니다. (버그 #31429385)

InnoDB: 마스터 키 회전 작업이 이미 잘린 언두 테이블스페이스를 건너뛰지 못하여 서버 종료 시 단언 실패가 발생했습니다. (버그 #31400195)

InnoDB: 페이지 압축된 테이블의 테이블스페이스를 가져온 후 페이지가 더 이상 압축되지 않았으며 INFORMATION_SCHEMA.INNODB_TABLESPACES 메타데이터는 잘못된 페이지가 압축된 것으로 표시되었습니다. 가져오기 작업 중 테이블의 압축 정보가 제공되지 않았습니다. (버그 #31396947)

InnoDB: 즉시 DDL 작업을 수행한 후 롤백 및 업데이트 작업이 단언을 발생시켰습니다. (버그 #31391126)

InnoDB: 로그 시스템(log_sys)의 샤드화된 읽기-쓰기 잠금이 CPU 바인딩 작업에서 성능 회귀를 일으켰습니다. (버그 #31389135)

InnoDB: UNIV_ENCRYPT_DEBUG 옵션을 활성화한 상태에서 컴파일 오류가 발생했습니다. (버그 #31369540)

InnoDB: 파티션된 테이블에 대한 DDL 작업이 실패할 수 있었습니다. TABLE_SHARE 및 테이블 인스턴스 객체가 불필요하게 모든 파티션에 대해 열렸습니다. (버그 #31365127)

InnoDB: 제자리 ALTER TABLE 작업으로 VARCHAR 열의 정렬을 utf8mb4에서 utf8mb4_bin으로 변경하고 동일한 열에 인덱스를 추가한 후, VARCHAR 열에 대한 대소문자 구분 쿼리가 잘못된 결과를 반환했습니다. 데이터 사전에서 VARCHAR 열의 정렬이 변경되었지만 메모리 내 테이블 객체에서는 변경되지 않았습니다. 결과적으로, VARCHAR 열에 생성된 인덱스는 이전에 정의된 정렬을 사용하여 비교를 수행했습니다. (버그 #31361838)

InnoDB: 큰 암호화된 압축 테이블에서 ALTER TABLE ... IMPORT TABLESPACE 작업이 “디스크에서 읽은 후 페이지 압축 해제 실패” 오류로 실패했습니다. 복호화 작업에서 암호화 블록 크기를 사용하지 않았습니다. 또한 암호화 과정에서 압축된 길이를 고려하지 않았으나, 복호화 과정에서는 압축된 길이만으로 데이터를 복호화했습니다. (버그 #31313533)

InnoDB: 동시 업데이트 작업 중 오류가 발생했습니다. 이 오류는 잘못된 이전 레코드 값으로 인해 발생했습니다. (버그 #31205266, 버그 #99286)

InnoDB: 일반 테이블스페이스에 생성된 테이블에 대해 FULLTEXT 인덱스를 정의한 인스턴스에서 MySQL 5.7에서 MySQL 8.0으로의 업그레이드가 실패했습니다. 테이블의 올바른 데이터 사전 공간 ID를 결정할 수 없었습니다. (버그 #31154128, 버그 #99211)

InnoDB: SHOW ENGINE INNODB MUTEX 명령문을 처리하는 함수가 다른 스레드에서 새 뮤텍스를 동시에 추가하는 경우에 대해 충분히 격리되지 않았습니다. (버그 #31105262)

InnoDB: 버퍼 풀 페이지 I/O 완료 루틴을 호출하지 않아 고아 버퍼 풀 I/O 쓰기 페이지가 발생했습니다. (버그 #31073853)

InnoDB: 버퍼 풀 플러시 목록의 끝에 있는 많은 시스템 임시 테이블 페이지가 성능 저하를 일으켰습니다. 플러시 목록 스캔이 시스템 임시 테이블 페이지를 제외하도록 수정되었습니다. (버그 #31060470, 버그 #98974)

InnoDB: 버퍼 풀이 축소되는 동안 버퍼 제어 블록 구조(buf_block_t)가 해제되어 단언 실패가 발생했습니다. 이 버그 수정에는 버그 #20735882 / #76343의 중요한 수정 사항이 포함되며, 내부 buf_block_is_uncompressed() 함수를 buf_pointer_is_block_field_instance() 함수로 대체합니다. buf_block_is_uncompressed() 함수는 너무 많은 경우에 false를 반환하여 OLTP 쿼리 처리량에 영향을 미쳤습니다. (버그 #31036301, 버그 #31389823)

InnoDB: 병렬 읽기 스레드가 명시적인 트랜잭션 중단에 응답하지 못했습니다. (버그 #31016076)

InnoDB: START TRANSACTION WITH CONSISTENT SNAPSHOT으로 시작된 세션에서 범위 쿼리가 잘린 결과를 반환했습니다. 인덱스 읽기의 시작 시 끝 범위 플래그가 재설정되지 않아 읽기가 중단되고 누락된 행이 발생했습니다. (버그 #30950714, 버그 #98642)
참고: 이 문제는 버그 #23481444의 회귀입니다.

InnoDB: 전체 텍스트 구문 검색이 단언 실패를 발생시켰습니다. 기여해주신 TXSQL(Tencent MySQL)에게 감사드립니다. (버그 #30933728, 버그 #31228694)
참고: 이 문제는 버그 #22709692의 회귀입니다.

InnoDB: 원시 디스크 파티션에서 시스템 테이블스페이스를 초기화하는 동안 오류가 발생했습니다. 또한, 원시 디스크 파티션 테이블스페이스에서 INPLACE DDL 작업이 COPY 알고리즘으로 전환되지 않고 오류로 실패했습니다. (버그 #30867065, 버그 #98091)

InnoDB: LOB 정리 코드(lob::purge())가 B-트리 미니 트랜잭션(btr_mtr) 커밋 및 복원 작업 중에 획득된 래치를 제대로 처리하지 않아 B-트리와 LOB 미니 트랜잭션 간에 충돌이 발생할 수 있었습니다. (버그 #30620011)

InnoDB: 대용량 테이블에서 실행되는 장시간의 통계 계산 작업이 테이블 통계에 대한 액세스를 필요로 하는 다른 작업을 차단하여 실패하게 했습니다. 새로운 통계 계산 뮤텍스가 도입되어 테이블 통계에 대한 동시 액세스를 허용합니다. 기여해주신 Kamil Holubicki에게 감사드립니다. (버그 #30607708)

InnoDB: 두 개의 연결이 동일한 트랜잭션 핸들러 객체를 사용하려 시도하여 쿼리가 중단되었습니다. (버그 #30594501)

InnoDB: innodb_fast_shutdown 설정이 0보다 큰 상태에서 서버를 종료하면 단언 실패가 발생했습니다. 이 단언은 롤백되지 않은 복구된 트랜잭션이 남아 있었기 때문에 발생했습니다. 빠른 종료 중 복구된 트랜잭션을 무시하도록 단언 코드를 수정했습니다. 빠른 종료로 인해 롤백되지 않은 복구된 트랜잭션이 남겨지면 이제 오류 로그에 메시지가 기록됩니다. 느린 종료는 복구된 트랜잭션이 롤백될 때까지 대기합니다. 다양한 다른 종료 로직 개선 사항도 구현되었습니다. (버그 #30226841)

InnoDB: MySQL 8.0.11에 도입된 전용 로그 작성 스레드가 낮은 동시성 시스템에서 CPU 성능 회귀를 일으켰습니다. 이 문제를 해결하기 위해 새로운 innodb_log_writer_threads 변수를 사용해 전용 로그 작성 스레드를 비활성화할 수 있습니다. (버그 #30088404, 버그 #30003849)

InnoDB: 실패 후 잘못된 lower_case_table_names 설정으로 서버를 재시작하면 중단 상태가 발생했습니다. (버그 #29833945)

패키징; 그룹 복제: MySQL 서버 Docker 이미지가 그룹 복제 권장 포트(33061)를 노출하지 않았습니다. (버그 #31627536)

패키징: client 패키지에서 분리된 client-plugins RPM이 추가되었습니다. 이 패키지에는 MySQL 클라이언트 애플리케이션용 공유 플러그인이 포함됩니다. (버그 #35162346)

복제: 이제 gtid_purged 시스템 변수를 저장 프로시저에서 설정할 수 있습니다. (버그 #31571427)

복제: 복제 소스 서버가 종료 및 재시작될 때, MEMORY 테이블이 비어 있습니다. 이제 소스가 시작된 후 처음으로 사용하는 MEMORY 테이블은 TRUNCATE TABLE로 복제됩니다. (버그 #29848785, 버그 #95496)

복제: 시스템 변수 session_track_gtidsOWN_GTID로 설정한 경우, 다중 스레드 복제본의 성능이 시간이 지남에 따라 저하될 수 있었습니다. 이제 다중 스레드 복제본의 워커 스레드에서 세션 상태 추적이 비활성화되었습니다. 기여해주신 Facebook에 감사드립니다. (버그 #29049207, 버그 #92964)

복제: 행 기반 복제를 사용할 때, 복제본이 동기화할 행을 검색할 때 보이지 않는 인덱스를 사용할 수 있었습니다. (버그 #96148, 버그 #30072179)

그룹 복제: 새 X 프로토콜 연결이 생성된 후 세션이 생성되기 전에 그룹 복제 알림이 발행되면 X 플러그인이 예상치 않게 중지될 수 있었습니다. (버그 #31742798)

그룹 복제: 트랜잭션 쓰기 세트를 추가할 때 메모리 할당 문제에 대한 그룹 복제 처리가 개선되었습니다. (버그 #31586243)

그룹 복제(Group Replication): 원격 클로닝 절차가 분산 복구 중에 합류하는 멤버에서 진행 중일 때, 그룹 복제는 합류하는 멤버의 사전 클로닝 gtid_executed 값을 기반으로 모든 멤버에 적용된 트랜잭션의 공통 집합을 식별했습니다. 이로 인해 원격 클로닝 절차 동안 그룹의 인증 정보 집합에서 적용된 트랜잭션에 대한 가비지 컬렉션(퍼포먼스 스키마 테이블 replication_group_member_stats에서 count_transactions_rows_validating 필드로 표시됨)이 수행되지 않았습니다. 원격 클로닝 절차가 오래 걸리면 인증 정보가 너무 커져서 클로닝 절차가 완료된 후 멤버가 재시작할 때 인증 정보를 합류하는 멤버에 전송할 수 없었으며, 이 경우 오류가 발생하고 해당 멤버는 그룹에 합류할 수 없었습니다.
이 문제를 피하기 위해, 그룹 복제는 이제 모든 멤버에 적용된 트랜잭션의 공통 집합을 식별할 때 ONLINE 상태인 멤버만 고려합니다. 합류하는 멤버가 분산 복구 후 ONLINE 상태로 진입하면 합류 시점에 도너(donor)로부터 받은 인증 정보로 업데이트되며, 이후 라운드에서 가비지 컬렉션이 수행됩니다.
이전 릴리스에서 이 문제를 해결하기 위한 임시 해결책으로, 원격 클로닝 작업이 완료된 후 2분을 기다려 가비지 컬렉션 라운드를 실행하여 그룹의 인증 정보 크기를 줄입니다. 그런 다음 합류하는 멤버에서 다음 명령을 실행하여 이전 인증 정보를 적용하려고 시도하지 않도록 합니다:

RESET SLAVE FOR CHANNEL group_replication_recovery;

(버그 #31446381, 버그 #99778)


그룹 복제(Group Replication): 통신 오류로 인해 그룹에서 이탈한 멤버가 자동 재합류(auto-rejoin) 시도 중에 재합류 절차가 완료되기 전에 다시 연결될 수 있었으며, 이로 인해 그룹 복제가 해당 멤버에서 제대로 작동하지 않는 문제가 있었습니다. 이제 그룹 복제의 오류 관리 및 멤버 상태 처리가 수정되어 이러한 상황이 발생하지 않도록 개선되었습니다. (버그 #31401797)

Microsoft Windows: Windows에서 파일 시스템 루트에 빌드 타겟이 있을 경우 빌드가 실패할 수 있었습니다. (버그 #31315467)

JSON: JSON_OBJECT()NULL 값을 제대로 검사하지 않았습니다. (버그 #31393934)

새로운 WITH_SYSTEMD_DEBUG CMake 옵션을 사용하면 systemd 디버그 정보를 추가로 생성합니다. 기본값은 OFF입니다. (버그 #31788834)

RPM 및 Debian 패키지에서 클라이언트 측 플러그인이 서버 패키지에서 클라이언트 패키지로 이동했습니다. 이로 인해 업그레이드 시 LDAP 인증 플러그인과 관련된 문제가 발생할 수 있었습니다. (버그 #31782612)
참고: 이 문제는 버그 #31123564 및 버그 #31336340의 회귀입니다.

log_sink_json JSON 형식 오류 로그 싱크에 기록된 ts 키의 타임스탬프가 동일한 로그 메시지의 다른 타임스탬프와 일치하지 않았습니다. (버그 #31749103)

SASL LDAP 인증 플러그인의 Kerberos 인증이 티켓 발급 티켓을 얻는 데 실패한 경우를 잘못 처리했습니다. (버그 #31727195)

일부 서드파티 라이브러리에서 링크 타임 최적화 활성화 시 빌드 실패가 발생했습니다. (버그 #31701553, 버그 #100410)

과도하게 긴 진단 메시지를 출력하면 서버가 예상치 않게 종료될 수 있었습니다. (버그 #31686926)

페이지 압축된 테이블이 압축되지 않은 테이블로 복제되었습니다. 클로닝 작업 이전에 테이블스페이스 객체가 초기화되지 않았습니다. (버그 #31677990, 버그 #100243)

성공한 LDAP 인증의 특정 경우에 서버가 중단될 수 있었습니다. (버그 #31661437)

그룹화된 쿼리를 유도된 테이블로 변환할 때, WHERE 절과 HAVING 절이 유도된 테이블의 일부가 되었을 때 조건 개수가 유도된 테이블에 대해 업데이트되지 않았습니다. 이로 인해 ref 접근을 위한 키를 생성하는 동안 메모리 할당이 줄어들었습니다. (버그 #31661309)

테이블 열이 MySQL 문자열 타입으로 정의되지 않은 경우, LIKE를 사용한 값 비교에서 서버가 예상되는 오류를 발생시키지 않았습니다. (버그 #31659015)

acquire_related() 서비스 함수가 오류를 반환해야 하는 경우 기본 서비스를 반환했습니다. (버그 #31655906)

부트스트랩 모드에서 특정 다중 명령문 트랜잭션이 예기치 않은 서버 동작을 일으킬 수 있었습니다. (Bug버그 #31650096)

원격 클로닝 작업 중, 수신자가 이전에 제공자로부터 제거된 플러그인의 가용성을 확인했습니다. 제거된 플러그인에 대한 참조가 해제되지 않았습니다. 플러그인 불일치 및 가용성과 관련된 오류 보고 문제가 해결되었습니다. (버그 #31639732, 버그 #100244)

디버그 빌드에서, 뷰를 생성하는 동안 서버가 서브쿼리를 평가하려고 시도했습니다. (버그 #31590301)
참고: 이 문제는 버그 #25466100의 회귀입니다.

RAND()를 사용하는 조건이 윈도우 함수나 GROUP BY가 사용되지 않는 경우에도 안전하게 푸시될 수 있음에도 불구하고 푸시되지 않았습니다. (버그 #31587575)

상수 조건인 WHERE FALSE 또는 WHERE TRUE와 같은 조건이 파생 테이블에 대해 푸시될 때, 해당 조건이 파생 테이블과 관련이 없음에도 불구하고 첫 번째 테이블에 푸시되었습니다. 이제 MySQL은 이러한 경우 상수 조건을 파생 테이블로 푸시하지 않도록 수정되었습니다.
또한 코드 검사를 통해 조건의 컬럼이 파생 테이블 표현식으로 대체된 후 사용된 테이블이 업데이트되지 않았던 문제가 확인되었으며, 이제 파생 테이블로 푸시해야 하는 조건에 대해 사용된 테이블이 업데이트됩니다. (버그 #31587493)

WHERE _column_ > (... IN (SELECT ...))를 사용하는 쿼리가 범위 최적화기에서 어설션을 유발할 수 있었습니다. (버그 #31586906)
참고: 이 문제는 버그 #30473261의 회귀입니다.

ANALYZE TABLE이 실행 중에, 행 존재 여부를 확인하고 삽입을 수행하는 사이에 다른 행이 삽입되고 통계 테이블이 동시에 업데이트될 경우 중복 키 오류가 발생할 수 있었습니다. 이제 ANALYZE TABLE은 이 상황에서 오류를 무시합니다. (버그 #31582758)

범위 옵티마이저가 병합된 스캔을 수행하는 데 필요한 핸들러를 복제한 후 올바른 잠금 유형을 사용하지 않고 무조건 읽기 잠금을 사용하여, 여러 시나리오에서 다양한 부작용이 발생했습니다.
예를 들어, FOR UPDATE가 있는 SELECT 문은 쓰기 잠금을 요청하지만, 인덱스 병합 스캔을 위한 핸들러를 복제한 후 범위 옵티마이저는 잘못된 읽기 잠금을 요청하여 불일치가 발생했습니다. 마찬가지로 데이터 사전 테이블의 경우 특별한 처리가 필요하여 잠금 유형이 LOCK_NONE으로 설정되었습니다.|
이러한 문제가 발생하지 않도록, 이제 복제된 핸들러에서도 항상 원래 핸들러의 잠금 유형이 사용되도록 보장합니다. (버그 #31582383)

subquery_to_derived 옵티마이저 스위치가 활성화된 경우, ANY 서브쿼리를 사용하는 쿼리가 때때로 잘못된 결과를 반환했습니다. (버그 #31566339)

FALSE AND _조건_FALSE로 단순화되었을 때, _조건_에 할당된 임시 테이블 리소스가 항상 해제되지 않았습니다. (버그 #31565009)

ULLONG_MAX 값이 BIT(64) 열에 삽입될 수 있었지만, 이후 검색할 수 없었습니다. (버그 #31564742, 버그 #100053)

사용되지 않은 윈도우 정의를 제거하는 동안 ORDER BY의 일부인 서브쿼리가 제거되지 않았습니다. 옵티마이저가 테이블을 잠그지 않고 서브쿼리를 최적화하려 했습니다. 이제 사용되지 않는 윈도우 정의를 제거할 때 해당 정의의 일부로 존재하는 모든 서브쿼리가 제대로 정리됩니다. (버그 #31518806)
참고: 이 문제는 버그 #27062031의 회귀입니다.

MySQL 8.0.20에 도입된 코딩 문제로 인해 클라이언트 애플리케이션이 종료 중에 예기치 않게 종료될 수 있었습니다. (버그 #31515752)
참고: 이 문제는 버그 #27045306의 회귀입니다.

ICU U_REGEX_NUMBER_TOO_BIG 오류 코드를 MySQL ER_REGEX_NUMBER_TOO_BIG로 변환하는 데 누락된 항목이 추가되었습니다. (버그 #31514995)

filesort 작업 중 병합이 DISTINCT를 사용하는 쿼리에 대해 중복을 제거하지 못할 수 있었습니다. (버그 #31498664, 버그 #99900)

MySQL의 내부 DYNAMIC_STRING 클래스는 이전에 선형 방식으로 메모리를 할당했으며, 이는 미리 정해진 바이트 수에 따라 이루어졌습니다. 이제 이 클래스는 반복적인 문자열 추가 작업이 더 효율적으로 이루어지도록 메모리를 지수적으로 할당하도록 수정되었습니다. (버그 #31491799)

LOCK_mutex 처리 오류로 인해 메모리 누수가 발생할 수 있었습니다. (버그 #31491146)

새로 추가된 콜레이션이 추가되지 않아 종료 중 예기치 않은 종료를 유발할 수 있었습니다. (버그 #31470422)

Windows에서 GetTempFileName() 함수의 파일 이름 재사용이 어설션을 발생시킬 수 있었습니다. (버그 #31468590)

LATERAL 서브쿼리가 잘못된 반조인으로 변환되었습니다. (버그 #31465717)

NATURAL JOIN 평가가 함수 인덱스에 의해 생성된 숨겨진 가상 열을 의도치 않게 일치시킬 수 있었습니다. (버그 #31463511, 버그 #99807)

1024바이트 이상의 문자열 해시 조인 키에 대한 정렬 키가 서버에서 제대로 처리되지 않았습니다. (버그 #31437753)

HAVING 절이 상수이고 참으로 평가될 때 정의에 HAVING이 포함된 뷰에서 삭제를 시도했습니다. 그러나 HAVING이 정의의 일부인 뷰는 업데이트할 수 없어야 합니다. (버그 #31429865)

INFORMATION_SCHEMA.USER_ATTRIBUTES 테이블에 대한 권한 요구 사항이 잘못 확인되었습니다. (버그 #31427410)

내부 함수 replace_index_subquery()가 실패할 때 서버는 여전히 영향을 받는 서브쿼리에 대해 반복자를 생성하려 했습니다. 이제 이 함수는 명확한 오류를 발생시킵니다. (버그 #31427072)

WHERE NOT EXISTS (SELECT const FROM table WHERE column=FROM_UNIXTIME(value)를 사용하는 쿼리가 제대로 처리되지 않았습니다. (버그 #31425664)

일부 경우 key_hint 처리가 파생 및 내부 임시 테이블에 잘못 적용되었습니다. (버그 #31424455)

준비된 INSERT 문을 재실행하면 뷰를 통해 삽입하는 경우 실패할 수 있었습니다. (버그 #31417951)

JSON 스칼라 평가가 무한 루프에 빠질 수 있었습니다. (버그 #31406724)

mysql.user 테이블의 user_attributes 열이 부분 취소로 인해 잘못 영향을 받을 수 있었습니다. (버그 #31405985)

윈도우 함수 초기화가 잘못되어 서버 종료를 유발할 수 있었습니다. (버그 #31389573, 버그 #31437834)

LDAP 인증 플러그인 시스템 변수에서 민감한 정보가 SQL 문의 결과에 별표로 표시되도록 수정되었습니다. (버그 #31388444, 버그 #31391864)

mysql-test-run.pl이 ASAN 빌드에서 리소스 그룹 초기화 문제로 인해 스레드 없는 연결 처리 시 실패했습니다. 이 문제가 해결되었습니다. Xiaoyu Wang, Tencent Technology에게 감사드립니다. (버그 #31378900, 버그 #99609)

authentication_ldap_simple 인증 플러그인이 SSL과 함께 사용될 때 종료 중에 세그멘테이션 오류를 유발할 수 있었습니다. (버그 #31364927)

쿼리를 강제 종료하면 해시 조인 반복자에서 잘못된 어설션이 발생할 수 있었습니다. (버그 #31361354)

일부 경우, LATERAL이 아닌 외부 참조가 예상대로 읽기 전용으로 표시되지 않았습니다. (버그 #31359965)

MySQL 5.7에서 MySQL 8.0으로 업그레이드하는 동안 고아 이벤트(데이터베이스가 더 이상 존재하지 않는 이벤트)에 대한 잘못된 참조로 인해 오류가 발생했습니다. 이제 서버는 업그레이드 중 고아 이벤트를 만날 경우 적절한 오류 메시지를 출력하고 실패합니다. 고아 저장 루틴에 대한 오류 메시지도 수정되었습니다. (버그 #31335554)

create_admin_listener_thread 시스템 변수를 활성화하면 서버가 시작 중에 종료될 수 있었습니다. (버그 #31335279)

ALTER TABLE로 컬럼에 표현식 기본값을 추가한 후, 첫 번째 삽입 시 값이 삽입 시점이 아닌 변경 시점에 평가된 것처럼 삽입되었습니다. (버그 #31330789, 버그 #99513)

LDAP 인증 플러그인이 사용자가 제공한 인증 방법을 허용된 방법과 제대로 비교하지 못했습니다. (버그 #31320532)

특정 뷰가 그 뒤에 나오는 USE 문을 예기치 않게 종료시킬 수 있었습니다. (버그 #31311312)

LIMIT가 활성화된 경우, filesort가 버퍼를 정렬하고 나서 제한을 벗어난 행을 삭제했는데, 이 경우 나중에 삭제될 것이 확실한 많은 행을 정렬해야 했습니다. 이제 옵티마이저는 실제로 필요한 행만 정렬합니다. 내부 테스트에 따르면 이 변경 사항은 단순 문자열 정렬 벤치마크의 정렬 단계 속도를 최대 15%까지 향상시킬 수 있습니다(EXPLAIN ANALYZE로 측정). (버그 #31303537)

동적 범위 스캔은 첫 번째 테이블에서 페치된 각 행에 대해 범위 옵티마이저를 실행하여, 해당 행의 값으로 두 번째 테이블에 대해 범위 스캔을 선택할 수 있는지 여부를 결정합니다. 행에 사용 가능한 인덱스가 없으면 테이블 스캔이 선택될 수 있습니다. 문제를 발생시킨 쿼리의 경우, 테이블 스캔이 한 번 선택된 후, 비포함 인덱스에 대한 범위 스캔이 선택되었으며, 동적 범위 반복자는 이 두 가지 경우 모두에 사용되는 두 개의 읽기 세트를 가지고 있었습니다. 이 중 테이블 스캔에 사용되는 것은 쿼리를 처리하는 데 필요한 생성된 열의 기본 열을 포함합니다. 나머지 읽기 세트는 범위 스캔에 사용되며, 포함 인덱스의 경우 해시 조인이나 배치 키 액세스에 불필요한 열을 추가하지 않기 위해 기본 열을 포함하지 않습니다. 이 문제는 두 번째 읽기 세트가 비포함 인덱스에도 사용되어 어설션이 발생하면서 발생했습니다.
이러한 문제가 발생하지 않도록 하기 위해, 이제 동적 범위 반복자에서 테이블 읽기 세트를 초기화할 때 범위 옵티마이저가 비포함 인덱스를 선택하는 경우 기본 열이 포함되도록 보장합니다. (버그 #31280526)
참고: 이 문제는 버그 #30417361의 회귀입니다.

타임존 오프셋을 포함한 TIMESTAMP 값의 범위를 벗어난 값을 삽입할 수 있었습니다. (버그 #31239157)

keyring_hashicorp 키링 플러그인이 키 작업에 대해 키 크기를 제한하지 않았습니다. (버그 #31205715)

-DWITH_ZSTD=system으로 구성하는 경우 오래된 버전의 zstd 라이브러리에서 실패했습니다. CMake는 이제 zstd 버전을 확인하고, 압축 검사를 실행하려면 최소 1.2.0, 컴파일하려면 1.0.0을 요구합니다. (버그 #31174920, 버그 #99241)

일부 경우, 퍼포먼스 스키마 테이블에서 상태 변수 정보를 가져오고 일시적 값을 포함하는 열을 기준으로 정렬하는 SELECT 쿼리가 제대로 처리되지 않았습니다. (버그 #31168097)

일부 경우, ROUND()TRUNCATE() 함수가 첫 번째 인수의 데이터 유형을 예상대로 반환하지 않았습니다. 이 수정 사항은 이러한 함수의 반환 유형이 다음 규칙을 따르도록 보장합니다. 첫 번째 인수가 아래에 표시된 유형일 때:

  • 정수형의 경우, 반환 유형은 BIGINT입니다.
  • 부동 소수점 또는 비숫자형의 경우, 반환 유형은 DOUBLE입니다.
  • DECIMAL의 경우, 반환 유형도 DECIMAL입니다.
  • 반환 값의 형식 속성은 첫 번째 인수에서 복사됩니다. 단, 두 번째 인수가 상수 값일 때는 DECIMAL의 경우 예외입니다.
  • 원하는 소수 자릿수가 인수의 스케일보다 적을 때는 결과의 스케일 및 정밀도가 그에 맞게 조정됩니다. 또한 ROUND() 함수의 경우 반올림으로 인해 유효 자릿수가 증가할 수 있으므로 정밀도가 한 자리 늘어납니다. 두 번째 인수가 음수인 경우, 반환 유형은 스케일이 0이 되도록 조정되며, 이에 상응하는 정밀도도 조정됩니다.

자세한 내용은 ROUND() 함수 설명을 참조하십시오. (버그 #31128028)

SELECT ... FOR SHARE 문은 이제 SELECT 권한만 필요합니다. 이전에는 SELECT 권한 외에도 DELETE, LOCK TABLES, 또는 UPDATE 권한 중 하나 이상이 필요했습니다. (버그 #31096384, 버그 #99101)

첫 번째 행 이외의 행을 필요로 하는 LIMIT 절을 가진 상관 서브쿼리의 조인에 반조인 전략이 선택되어 LIMIT 절이 무시되고 잘못된 행이 반환되었습니다. 이제 이 유형의 조인에서 LIMIT이 첫 번째 행이 아닌 행을 지정하거나 여러 행을 지정할 때 반조인 전략이 더 이상 사용되지 않습니다. (버그 #31096309)

버그 #81009 수정 이후, 퍼포먼스 스키마 테이블을 잘못된 권한 검사로 인해 read_only 또는 super_read_only 모드에서 자르려고 하면 적절한 테이블 권한이 있는 사용자도 실패할 수 있었습니다. (버그 #31080309, 버그 #99072)
참고: 이 문제는 버그 #81009의 회귀입니다.

ORDER BY가 윈도우 함수를 사용하는 ROLLUP 쿼리에서 예상대로 작동하지 않았습니다. (버그 #31073133)

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

날짜 간격 계산이 오버플로만 검사했으며 언더플로는 검사하지 않았습니다. 이제 두 가지 모두를 검사합니다. (버그 #31054071)

XA 준비된 트랜잭션 롤백 XID가 잘못된 형식일 경우, 트랜잭션이 복구된 상태로 유지되어 XA COMMITXA ROLLBACK 문이 실패하거나 디버그 빌드에서 어설션을 발생시켰습니다. 이제 이러한 경우에는 오류가 보고됩니다. (버그 #31030205)

와일드카드 문자가 포함된 데이터베이스 이름에 대해 역할을 통해 상속된 데이터베이스 수준 권한이 제대로 처리되지 않았습니다. (버그 #31013538, 버그 #98876)

--local 옵션이 지정되었을 때, mysqlimportmysql_options()에 대해 MYSQL_OPT_LOAD_DATA_LOCAL_DIR 옵션을 잘못 처리하여 효과가 없었습니다. (버그 #31001550)

특정 준비된 문이 서버 예기치 않은 종료를 유발할 수 있었습니다. (버그 #30943963)

OPTIMIZE TABLE을 실행하면 MyISAM 테이블의 크기가 증가하고 쿼리 성능이 저하될 수 있었습니다. REPAIR TABLE을 실행하면 이전에 OPTIMIZE TABLE로 인한 “테이블이 이미 최신 상태입니다”라는 상태가 손실될 수 있었습니다. (버그 #30869674, 버그 #98511, 버그 #29755517)

mysqlpump 개체 유효성 검사가 제외된 데이터베이스의 개체를 포함했습니다. (버그 #30819012)

0인 월, 일 또는 두 값을 포함하는 타임존 오프셋을 가진 TIMESTAMP 값을 삽입하면 어설션이 발생했습니다. 이러한 값은 현재 SQL 모드 설정과 상관없이 거부되며 이제는 거부됩니다. (버그 #30786762)
참고: 버그 #31239157도 참조하십시오.

역할을 사용하여 부여된 권한이 열 권한 수준에서 잘못 처리될 수 있었습니다. (버그 #30660403, 버그 #97971)

일부 경우, NULL과의 TIME 값 비교가 어설션을 발생시켰습니다. (버그 #30324587)
참고: 이 문제는 버그 #25949639의 회귀입니다.

LDAP 인증 플러그인이 CA 검증을 잘못 강제하여 잘못된 CA를 사용할 수 있었습니다. (버그 #30220357)

ORDER BY 쿼리가 sort_buffer_sizemax_sort_length 값이 내부적으로 허용되는 최대 키 수를 0으로 설정하는 값으로 설정된 경우 제대로 실행되지 않았습니다. (버그 #30175483)

다수의 중첩된 인수를 사용하는 전체 텍스트 검색 쿼리가 오류를 발생시켰습니다. (버그 #29929684)

퍼포먼스 스키마의 메모리 사용량이 잘못 보고될 가능성이 수정되었습니다. (버그 #29912403)

explicit_defaults_for_timestamp가 비활성화된 상태에서 NOT NULL로 선언된 생성된 열에 NULL을 삽입하면 서버가 삽입된 값을 CURRENT_TIMESTAMP으로 변환하려 했습니다. 이제 이러한 삽입은 ER_BAD_NULL_ERROR로 거부됩니다. (버그 #29449518)

SET_VAR 힌트는 시스템 변수 설정으로 지정된 부동 소수점 값을 허용하지 않았습니다. (버그 #29349748)

이전에는 STR_TO_DATE() 함수의 형식 인수로 NULL이 사용되었을 때 관련 없는 경고가 출력되었습니다. 이제 NULL이 함수에 전달되면 함수는 NULL을 반환합니다. (버그 #27265863)

일부 경우, IS NULL을 잘못 사용하면 유효하지 않은 인수에 대한 경고가 여러 번 발생했습니다. (버그 #27264652)

파생 테이블의 SELECT 목록 열을 참조하는 ORDER BY 열을 해결하는 과정이 특정 준비된 문 실행 시 제대로 수행되지 않았습니다. (버그 #26808862)

EXPLAIN로 다중 테이블 UPDATE 문에서 조건에 참조된 생성된 열의 출력이 항상 해당 테이블이 실제로 업데이트되지 않았더라도 업데이트된 것으로 표시되었습니다. (버그 #22671310)

SQL 레이어가 임시 테이블에서 수행할 작업 유형에 대한 잘못된 정보를 InnoDB에 전달할 때 어설션이 발생할 수 있었습니다. (버그 #22503696)

기본값을 사용하여 행을 삽입하는 이 구조가 기본 테이블에서 작동했지만 뷰에서는 실패했습니다:

INSERT INTO name () VALUES ();

(버그 #15988466, 버그 #67863)

use_invisible_indexes 옵티마이저 스위치가 OFF로 설정되지 않은 경우에도 인덱스 힌트에서 보이지 않는 인덱스가 사용될 때 서버가 오류를 발생시켰습니다. (버그 #100024, 버그 #31550839)

REGEXP_LIKE()와 같은 정규 표현식 함수가 바이너리 문자열 인수로 일관성 없는 결과를 반환했습니다. 이제 이러한 함수는 바이너리 문자열을 오류로 거부합니다. (버그 #98950, 버그 #98951, 버그 #31031886, 버그 #31031888)

조건에 지정된 범위 값이 비교되는 열의 데이터 유형과 호환되지 않는 경우, 범위 옵티마이저는 범위 값을 반올림하고, 반올림으로 인해 범위에서 제외되는 행이 없도록 특정 플래그를 할당합니다. 보고된 문제를 일으킨 특정 쿼리에서 INT 유형의 id 열이 id NOT IN (-0.1, 0.1)로 테스트되었으며, 테스트된 값은 정수로 반올림되어, 조건이 NOT IN (0,0)으로 처리되었습니다. 이후 옵티마이저는 이를 id < 00 < id < 0 간격으로 처리했으나, 이 경우 값 비교를 위해 0이 포함된 행 뒤에서 읽기를 시작해야 함을 나타내는 플래그도 설정되었습니다. 이제 이러한 경우 값이 올바르게 처리되도록 플래그가 설정됩니다. (버그 #98826, 버그 #30988735)
참고: 이 문제는 버그 #80244, 버그 #22661012의 회귀입니다.

일부 업데이트 가능한 부분과 그렇지 않은 부분이 있는 조인 기반 뷰에 대해 업데이트할 수 없는 이 뷰의 열을 업데이트하려고 할 때 생성된 오류 메시지가 실제로 문제가 된 UPDATE 문에서 지정한 뷰 대신 소스 테이블이나 뷰를 참조했습니다. (버그 #80655, 버그 #22891840)

Leave a Comment



이 문서 공유

8.0.22 변경 사항 (2020-10-19 GA)

링크 복사

CONTENTS