카테고리 : MySQL/릴리스노트/8.0

MySQL 8.0.13 릴리스 노트

MySQL 8.0.13 Community Server 릴리스 노트를 한국어로 번역하고, DBA가 참고해야 할 핵심 내용을 함께 정리하였습니다.

저자: Oracle 작성: 2018.10.22 약 63분 37,489자

DBA를 위한 핵심 내용

MySQL 8.0.13은 단순 버그 수정판이라기보다 운영 정책·복제·InnoDB 임시 공간·Optimizer 동작이 함께 바뀐 릴리스입니다. 업그레이드 전에는 비호환 SQL 문법, 시스템 테이블 변경, 복제 포맷 제약, 공간 함수 결과 차이를 점검해야 하며, 확인 가능한 범위의 외부 검색에서는 이 버전에 대해 광범위하게 알려진 단일 대형 회귀 이슈는 두드러지게 확인되지 않았습니다.

  1. password_require_current와 계정별 PASSWORD REQUIRE 정책이 추가되었고, mysql.user 구조가 바뀌므로 이전 버전에서 업그레이드한 뒤 mysql_upgrade와 재시작을 완료하지 않으면 비밀번호 변경이 불가능할 수 있습니다.
  2. GROUP BY ... ASC|DESC 문법이 제거되어 기존 쿼리나 저장 프로그램, 8.0.13 이상 레플리카로의 복제가 실패할 수 있습니다. utf8mb3, 중첩 주석, PAD_CHAR_TO_FULL_LENGTH, 비-SET 문에서 사용자 변수 할당도 향후 제거 대상이므로 애플리케이션 SQL을 정리해야 합니다.
  3. 세션 임시 tablespace 풀 도입으로 ibtmp1 비대화 문제가 완화되고, general tablespace 암호화가 지원됩니다. sql_require_primary_key는 로우 기반 복제에서 primary key 없는 테이블로 인한 레플리카 테이블 스캔을 예방하는 데 유용하지만, 기존 DDL 배포 절차에는 영향을 줄 수 있습니다.
  4. GTID 사용 시 binlog_format=ROW|MIXED에서는 트랜잭션·루틴·트리거 내부의 임시 테이블 DDL 제한이 완화되지만, 열린 임시 테이블이나 실행 중인 applier가 있으면 binlog_format 변경이 제한됩니다. PREPARED 상태 XA 트랜잭션의 MDL은 연결 종료·재시작 후에도 XA COMMIT/ROLLBACK까지 유지됩니다.
  5. Skip Scan, functional index, 단순 SELECT COUNT(*) 개선, BLOB 포함 내부 임시 테이블의 TempTable 사용이 추가되었습니다. JSON·GIS·윈도우 함수·filesort·InnoDB redo/LOB/잠금 관련 다수의 crash 및 잘못된 결과 버그도 수정되었으므로, 해당 기능을 쓰는 워크로드는 업그레이드 리허설에서 결과와 실행계획을 비교하는 것이 좋습니다.

계정 관리 관련 사항

  • 이제 계정 비밀번호 변경 시도에서 교체할 현재 비밀번호를 지정하여 검증하도록 요구할 수 있습니다. 이를 통해 DBA는 사용자가 현재 비밀번호를 알고 있음을 증명하지 않고 비밀번호를 변경하지 못하도록 방지할 수 있습니다. password_require_current 시스템 변수를 사용하여 전역적으로, 그리고 CREATE USERALTER USER 문장의 PASSWORD REQUIRE 옵션을 사용하여 계정별로 비밀번호 검증 정책을 설정할 수 있습니다. 기존 비밀번호 관리 기능과 함께, 검증을 요구하는 새로운 기능은 DBA에게 비밀번호 관리에 대한 더 완전한 제어를 제공합니다. 자세한 내용은 Password Management를 참조하십시오.

    비밀번호 검증 기능의 구현에는 mysql.user 시스템 테이블 구조 변경이 포함됩니다. 이전 버전에서 이 MySQL 릴리스로 업그레이드하는 경우, 이 시스템 데이터베이스 변경 사항을 반영하려면 mysql_upgrade를 실행하고 서버를 재시작해야 합니다. 이 작업이 완료될 때까지는 비밀번호 변경이 불가능합니다.

    (WL #11544)

컴파일 관련 사항

  • Solaris: 이제 MySQL은 gcc를 사용하여 Solaris에서 컴파일할 수 있습니다. (Bug #27802681)

설정 관련 사항

  • 새로운 WITH_LTO CMake 옵션은 링크 타임 최적화를 활성화할지 여부를 제어합니다. 현재 이는 GCC 7 및 8에서만 지원됩니다. (Bug #28184537, Bug #28211382)
  • 새로운 WITH_RAPIDJSON CMake 옵션은 번들 RapidJSON 라이브러리 또는 시스템 RapidJSON 라이브러리로 컴파일할지 여부를 제어합니다. (Bug #28024992, Bug #90867)
  • CMAKE_BUILD_TYPE CMake 옵션은 이제 Release 빌드 타입을 지원하며, 이는 RelWithDebInfo 빌드 타입과 유사하지만 빌드 크기를 줄이기 위해 디버깅 정보를 생략합니다. (Bug #27874068, Bug #32287863)
  • 새로운 sql_require_primary_key 시스템 변수는 새 테이블을 생성하거나 기존 테이블의 구조를 변경하는 명령문이 테이블에 프라이머리 키가 있어야 한다는 요구사항을 적용할 수 있게 합니다. 이 변수를 활성화하면 테이블에 프라이머리 키가 없을 때 발생할 수 있는 로우 기반 복제의 성능 문제를 방지하는 데 도움이 됩니다. 어떤 테이블에 프라이머리 키가 없고 업데이트 또는 삭제가 여러 로우를 수정한다고 가정합니다. 마스터 서버에서는 이 작업을 단일 테이블 스캔으로 수행할 수 있지만, 로우 기반 복제를 사용하여 복제될 때는 슬레이브에서 수정할 각 로우마다 테이블 스캔이 발생합니다. 프라이머리 키가 있으면 이러한 테이블 스캔이 발생하지 않습니다. (Bug #17468242, Bug #69845, Bug #17005592, Bug #69223, WL #11807)
  • 서버가 주소 집합에서 수신 대기할 수 있도록, bind_address 시스템 변수는 이제 단일 주소나 이름뿐만 아니라 쉼표로 구분된 IP 주소 또는 호스트 이름 목록도 허용합니다. 자세한 내용은 Server System Variables를 참조하십시오. (WL #11652)

데이터 타입 관련 사항

  • MySQL은 이제 데이터 타입 명세에서 표현식을 기본값으로 사용하는 것을 지원합니다. 여기에는 이전에는 기본값을 전혀 할당할 수 없었던 BLOB, TEXT, GEOMETRY, JSON 데이터 타입에 대해 표현식을 기본값으로 사용하는 것이 포함됩니다. 자세한 내용은 Data Type Default Values를 참조하십시오. (WL #9418)

사용 중단 및 제거 관련 사항

  • 중요한 변경 사항: 이제 SET 이외의 문에서 사용자 변수를 설정하는 것은 더 이상 권장되지 않습니다. 이는 여기에 나열된 항목을 포함한 문제들 때문입니다:

    • 사용자 변수가 포함된 표현식의 평가 순서는 정의되어 있지 않았습니다.
    • 변수의 기본 결과 타입은 문 시작 시점의 해당 변수 타입을 기준으로 하며, 이로 인해 문 시작 시점에 한 타입의 값을 보유한 변수가 같은 문에서 다른 타입의 새 값으로 할당될 때 의도하지 않은 영향이 발생할 수 있었습니다.
    • HAVING, GROUP BY, ORDER BY 절은 select 표현식 목록에서 값이 할당된 변수를 참조할 때, 해당 표현식이 클라이언트에서 평가되었기 때문에 예상대로 동작하지 않았으며, 따라서 이전 로우의 오래된 컬럼 값이 사용될 수 있었습니다.

    SELECT @var, @var:=@var+1과 같은 문법은 하위 호환성을 위해 MySQL 8.0에서 계속 허용되지만, 향후 MySQL 버전에서 제거될 수 있습니다. (WL #12131)

  • InnoDB; 파티셔닝: 공유 테이블스페이스에 테이블 파티션을 배치하는 지원이 제거되었습니다. 공유 테이블스페이스에는 시스템 테이블스페이스와 일반 테이블스페이스가 포함됩니다. 공유 테이블스페이스의 파티션을 식별하고 이를 file-per-table 테이블스페이스로 이동하는 방법에 대한 자세한 내용은 업그레이드를 위한 설치 준비를 참조하십시오. (WL #11571, WL #9286)

  • InnoDB: CREATE TEMPORARY TABLE에서 TABLESPACE = innodb_file_per_tableTABLESPACE = innodb_temporary 절에 대한 지원은 사용 중단되었으며 향후 MySQL 버전에서 제거될 예정입니다. (WL #12179)

  • utf8mb3 캐릭터셋은 사용 중단되었으며 향후 MySQL 버전에서 제거될 예정입니다. 대신 utf8mb4를 사용하십시오. (WL #11109)

  • 중첩 주석은 지원된 적이 없지만(일부 조건에서는 허용되었을 수 있음), 이제 사용 중단된 것으로 간주되며 향후 MySQL 버전에서 제거될 예정입니다. (WL #12099)

  • 사용 중단된 metadata_locks_cache_sizemetadata_locks_hash_instances 시스템 변수가 제거되었습니다. (WL #12212)

  • PAD_CHAR_TO_FULL_LENGTH SQL 모드는 사용 중단되었으며 향후 MySQL 버전에서 제거될 예정입니다. (WL #12129)

오류 처리

  • 이제 MySQL 클라이언트 라이브러리는 OpenSSL 오류에 대해 더 나은 오류 메시지를 반환합니다. 패치를 제공한 Facebook에 감사드립니다. (Bug #27855668, Bug #90418)

  • 이전에는 사용자가 부모 테이블 접근 권한을 가지고 있지 않은 경우에도, 외래 키 작업에 대한 ER_NO_REFERENCED_ROW_2ER_ROW_IS_REFERENCED_2 오류 메시지가 표시되고 부모 테이블에 대한 정보를 노출했습니다. 이 상황에 대한 오류 처리가 다음과 같이 개정되었습니다:

    예외적으로, DEFINER 권한으로 실행되도록 정의된 저장 프로그램의 경우 권한이 평가되는 사용자는 호출 사용자가 아니라 프로그램 DEFINER 절의 사용자입니다. 해당 사용자가 테이블 수준 부모 테이블 권한을 가지고 있으면, 부모 테이블 정보는 계속 표시됩니다. 이 경우 적절한 조건 핸들러를 포함하여 해당 정보를 숨기는 것은 저장 프로그램 작성자의 책임입니다. (Bug #19477611, WL #8910)

INFORMATION_SCHEMA 관련 사항

로깅 관련 사항

  • 호환되지 않는 변경: 이전에 시스템 로그(Windows의 Event Log 및 Unix와 Unix 계열 시스템의 syslog)에 대한 오류 로깅을 설정하던 시스템 변수가 제거되었습니다. 해당되는 경우, 제거된 시스템 변수는 log_sink_syseventlog 오류 로그 컴포넌트가 관리하는 새 시스템 변수로 대체되었습니다. 다음 표는 이전 변수 이름과 새 변수 이름을 보여 줍니다.

    이전 시스템 변수 새 시스템 변수
    log_syslog_facility syseventlog.facility
    log_syslog_include_pid syseventlog.include_pid
    log_syslog_tag syseventlog.tag
    log_syslog 없음

    이전 시스템 변수 이름을 사용하던 설치는 새 변수 이름을 사용하도록 설정을 업데이트해야 합니다. 자세한 내용은 시스템 로그로의 오류 로깅을 참조하십시오.

    (WL #11828)

    참조: 함께 참조하십시오: Bug #27534089.

  • 새 시스템 변수 log_error_suppression_list는 심각도가 WARNING 또는 INFORMATION인 상태로 발생할 때 오류 로그에 기록되지 않아야 하는 진단을 지정합니다. 예를 들어, 특정 유형의 경고가 자주 발생하지만 관심 대상이 아닌 경우(따라서 오류 로그에서 바람직하지 않은 “노이즈”로 간주될 수 있는 경우), 이제 이를 억제할 수 있습니다. (WL #11393)

  • 계정 관리 문장의 재작성을 처리하는 코드는 유지 관리와 확장을 더 쉽게 하기 위해 리팩터링되었습니다. 이 작업으로 인해 Audit Log, general 로그 및 slow query 로그에서 사용자가 볼 수 있는 몇 가지 사소한 영향이 발생했습니다:

    • 평문 비밀번호는 '<string>'이 아니라 <string>으로 대체됩니다.
    • 기본 절은 사용자가 지정하지 않는 한 기록되지 않습니다.

    (WL #12007)

  • 이전에는 여러 내부 서버 메서드가 오류 로그에 기록한 메시지가 ER_LOG_PRINTF_MSG 오류 코드를 사용하여 로깅되었습니다. 이제 이러한 각 메시지는 고유한 오류 코드를 사용하여 로깅됩니다.

Optimizer 관련 사항

  • Optimizer는 이제 이전에는 적용할 수 없었던 상황에서 range access를 사용하여 쿼리 성능을 향상할 수 있게 하는 Skip Scan 액세스 방식을 지원합니다. 자세한 내용은 Skip Scan Range Access Method를 참조하십시오. 이 액세스 방식의 기반이 된 패치를 제공한 Facebook에 감사드립니다. (Bug #26976512, Bug #88103, WL #11322)
  • MySQL은 이제 컬럼 값이 아니라 표현식 값을 인덱싱하는 functional index 키 파트 생성을 지원합니다. Functional 키 파트는 JSON 값과 같이 다른 방식으로는 인덱싱할 수 없는 값의 인덱싱을 가능하게 합니다. 자세한 내용은 CREATE INDEX Statement를 참조하십시오. (WL #1075)
  • InnoDB 테이블에 대한 SELECT COUNT(*) FROM tbl_name 쿼리의 성능은 단일 스레드 워크로드와 WHERE 또는 GROUP BY 같은 추가 절을 사용하지 않는 경우 개선되었습니다. (WL #10398)

패키징 관련 사항

  • MySQL에 번들로 포함된 libevent 라이브러리가 버전 2.1.8로 업그레이드되었습니다. (Bug #28207237, Bug #29041505, Bug #29055011)
  • 시스템 curl 라이브러리에 링크하지 않고 curl을 포함하는 바이너리 패키지는 이제 7.45.0 대신 curl 7.60.0을 사용합니다. (Bug #28043702)
  • Debian 패키징은 yaSSL 제거와 OpenSSL이 모든 빌드의 기본 SSL 라이브러리라는 점을 반영하도록 업데이트되었습니다. (Bug #28025599)
  • 테스트 플러그인이 서버 패키지에서 테스트 패키지로 이동되었습니다. (Bug #27860172)
  • 이제 MySQL Router가 MySQL 서버 소스 및 모놀리식 바이너리 패키지에 포함됩니다.

Performance Schema 관련 사항

  • 트랜잭션 커밋을 거치는 스레드를 감지할 수 있도록 새로운 Performance Schema stage인 waiting for handler commit이 제공됩니다. 패치를 제공해 준 Facebook에 감사드립니다. (Bug #27855592, Bug #90417)

    참조: 함께 참조하십시오: Bug #28950397.

Pluggable Authentication 관련 사항

  • Microsoft Windows: Windows에서 MySQL Enterprise Edition 배포판은 이제 Cyrus SASL 라이브러리 파일 libsasl.dllsaslSCRAM.dll을 번들로 제공하므로, LDAP 인증 플러그인이 SCRAM-SHA-1 인증 방식을 사용할 수 있습니다. (WL #11927)

플러그인 관련 사항

  • 이전에는 MySQL 플러그인을 C 또는 C++로 작성할 수 있었습니다. 이제 플러그인이 사용하는 MySQL 헤더 파일에 C++ 코드가 포함되어 있으며, 이는 플러그인을 C가 아니라 C++로 작성해야 함을 의미합니다. (Bug #87725, Bug #26781567)

보안 관련 사항

  • MySQL Enterprise Edition은 이제 플러그인과 로드 가능한 함수 집합을 포함하는 플러그인 라이브러리로 구현된 데이터 마스킹 및 비식별화 기능을 제공합니다. 데이터 마스킹은 실제 값을 대체값으로 바꾸어 민감한 정보를 숨깁니다. MySQL Enterprise Data Masking and De-Identification 함수는 난독화(식별 특성 제거), 형식이 지정된 랜덤 데이터 생성, 데이터 교체 또는 대체와 같은 여러 방법을 사용하여 기존 데이터를 마스킹할 수 있게 합니다. 예를 들면 다음과 같습니다:

    mysql> SET @ssn = gen_rnd_ssn();
    mysql> SET @masked_ssn1 = mask_ssn(@ssn);
    mysql> SET @masked_ssn2 = mask_outer(mask_inner (@ssn,4,5,'A'), 3,0,'B');
    mysql> SELECT @ssn, @masked_ssn1, @masked_ssn2;
    +-------------+--------------+--------------+
    | @ssn        | @masked_ssn1 | @masked_ssn2 |
    +-------------+--------------+--------------+
    | 980-31-2838 | XXX-XX-2838  | BBB-AA-2838  |
    +-------------+--------------+--------------+
    

    자세한 내용은 MySQL Enterprise Data Masking and De-Identification을 참조하십시오. (WL #7722)

공간 데이터 지원

  • 호환되지 않는 변경: 이전에는 ST_Area()가 Cartesian 공간 참조 시스템(SRS)을 가진 geometry 인자만 지원했으며, geographic SRS를 지정한 geometry 인자로 호출되면 오류를 생성했습니다. 이제 ST_Area()는 geographic SRS를 가진 geometry 인자를 지원하며, 제곱미터 단위의 측지 면적을 반환합니다.

    공간 데이터에 이제 ST_Area()에 의해 다르게 해석되는 geometry 값이 포함된 경우, 이 함수를 사용하는 기존 쿼리는 이전 MySQL 버전과 비교하여 다른 결과를 반환합니다.

    (WL #10726)

  • CREATE SPATIAL REFERENCE SYSTEM 문에서 공간 참조 시스템(SRS) 정의를 위한 파서는 이제 유효하지 않은 구문을 거부하는 데 더 엄격합니다.

    OGC 01-009 WKT 문법은 GEOGCS 공간 참조 시스템 정의에서 AXIS 절을 필수로 만들지 않습니다. 그러나 AXIS 절이 없으면 MySQL은 정의가 latitude-longitude 순서의 축을 가지는지, longitude-latitude 순서의 축을 가지는지 확인할 수 없습니다. 이제 MySQL은 각 GEOGCS 정의가 두 개의 AXIS 절을 포함해야 한다는 비표준 요구 사항을 적용합니다. 하나는 NORTH 또는 SOUTH여야 하며, 다른 하나는 EAST 또는 WEST여야 합니다. AXIS 절 순서는 정의가 latitude-longitude 순서의 축을 가지는지, longitude-latitude 순서의 축을 가지는지를 결정합니다. (Bug #28186073, Bug #28147723)

  • 이전에는 ST_Validate()가 Cartesian 공간 참조 시스템(SRS)을 가진 geometry 인자만 지원했으며, geographic SRS를 지정한 geometry 인자로 호출되면 오류를 생성했습니다. 이제 ST_Validate()는 geographic SRS를 가진 geometry 인자를 지원합니다.

    공간 데이터에 이제 ST_Validate()에 의해 다르게 해석되는 geometry 값이 포함된 경우, 이 함수를 사용하는 기존 쿼리는 이전 MySQL 버전과 비교하여 다른 결과를 반환합니다.

    (WL #11087)

  • MySQL은 이제 지오메트리 값을 하나의 공간 참조 시스템(SRS)에서 다른 공간 참조 시스템으로 변환하는 데 사용할 수 있도록 ST_Transform() 공간 함수를 구현합니다. 현재 이 함수는 지리적 SRS 간 변환을 지원합니다. 자세한 내용은 Spatial Operator Functions를 참조하십시오. (WL #8684)

SQL 문법 관련 사항

  • 호환되지 않는 변경: GROUP BY 절에 사용되던 더 이상 사용되지 않는 ASC 또는 DESC 한정자가 제거되었습니다. 이전에 GROUP BY 정렬에 의존하던 쿼리는 이전 MySQL 버전과 다른 결과를 생성할 수 있습니다. 지정된 정렬 순서를 생성하려면 ORDER BY 절을 제공하십시오.

    GROUP BY 절에 ASC 또는 DESC 한정자를 사용하는 MySQL 8.0.12 이하의 쿼리 및 저장 프로그램 정의는 수정해야 합니다. 그렇지 않으면 MySQL 8.0.13 이상으로 업그레이드하는 데 실패할 수 있으며, MySQL 8.0.13 이상의 슬레이브 서버로 복제하는 데도 실패할 수 있습니다. (WL #8693)

XA Transaction 관련 사항

  • 이전에는 PREPARED 상태인 XA 트랜잭션의 메타데이터 잠금이 트랜잭션을 수행하는 클라이언트의 연결이 끊기거나 서버가 재시작될 때 해제될 수 있었습니다. 이로 인해 한 세션이 다른 세션에서 진행 중인 XA 트랜잭션이 사용하는 테이블을 삭제할 수 있는 동작 등이 발생할 수 있었습니다. 이제 PREPARED 상태인 XA 트랜잭션의 메타데이터 잠금은 XA COMMIT 또는 XA ROLLBACK이 실행될 때까지 클라이언트 연결 해제 및 서버 재시작 전반에 걸쳐 유지됩니다. (Bug #22710164, Bug #79940, WL #9335)

X 플러그인 관련 사항

  • 중요한 변경: X Protocol은 이제 연결 풀링 옵션을 제공하며, 이 옵션은 작은 웹 페이지나 REST API 엔드포인트처럼 MySQL 서버에 많은 연결을 여는 애플리케이션의 오버헤드를 줄일 수 있습니다. Client 객체를 반환하는 새 mysqlx.getClient(connection, options) 연산을 사용하십시오. Client 객체를 사용하면, 열린 세션 연산을 실행할 때 풀에서 기존의 현재 사용되지 않는 네트워크 연결을 가져오고, 이를 재설정한 뒤 사용합니다. 세션을 닫으면 기본 연결이 사용되지 않는 것으로 표시되고 Client 객체의 연결 풀로 반환됩니다. 연결 풀은 옵션 데이터 딕셔너리를 사용하여 구성되며, 이는 배포된 애플리케이션이 연결 문자열만 변경하여 연결 풀링 사용 여부를 전환할 수 있음을 의미합니다. (WL #11824)
  • 많은 수의 세션이 열리고 닫힐 때 여러 X Plugin 클라이언트 세션 간의 충돌을 방지하기 위해 mutex 잠금이 추가되었습니다. (Bug #28637947)
  • X Plugin 클라이언트가 서버에 존재하지 않는 데이터베이스를 지정하여 MySQL 서버에 연결을 시도하면, 오류 메시지는 해당 데이터베이스를 알 수 없다는 내용이 아니라 접근이 거부되었다는 내용을 표시했습니다. 이제 올바른 오류 메시지가 반환됩니다. (Bug #28110957)
  • X Plugin이 정수 값을 잘못 복사하여 정렬되지 않은 메모리 접근과 관련된 오류가 발생했습니다. 이제 이 문제가 수정되었습니다. (Bug #28070946, Bug #90983)
  • 이제 X Plugin이 기본적으로 로드되고 활성화되므로, 오류 로그의 기본 상세 출력 설정에서는 MySQL 서버에서 X Plugin을 사용할 수 있음을 나타내는 메시지가 표시되지 않았습니다. 이제 시스템 시작 중에 X Plugin이 로드되었음을 확인하는 메시지가 발행됩니다. (Bug #27287340)
  • X Protocol은 이제 정보 요청 없이도 관심 있는 클라이언트에 정보를 브로드캐스트할 수 있는 기능을 제공합니다. 또한 Group Replication과 관련된 변경 사항도 브로드캐스트됩니다. 이 작업은 Mysqlx_notified_by_group_replicationMysqlx_notice_global_sent 상태 변수도 추가합니다. (WL #10655)

추가되거나 변경된 기능

  • 중요한 변경; NDB Cluster; NDB 클라이언트 프로그램: perror에 대해 사용 중단된 --ndb 옵션이 제거되었습니다. 대신 NDB 오류 코드에서 오류 메시지 정보를 얻으려면 ndb_perror를 사용하십시오. (Bug #81705, Bug #23523957)

    참조: 다음도 참조하십시오: Bug #81704, Bug #23523926.

  • InnoDB: innodb_fsync_threshold 시스템 변수는 운영 체제 캐시에서 디스크로 데이터를 플러시하기 위한 임계값을 바이트 단위로 정의할 수 있게 합니다. 기본적으로 InnoDB가 새 로그 파일이나 테이블스페이스 파일과 같은 새 데이터 파일을 생성할 때, 해당 파일은 디스크로 플러시되기 전에 운영 체제 캐시에 완전히 기록되며, 이로 인해 많은 양의 디스크 쓰기 작업이 한 번에 발생할 수 있습니다.

    더 작고 주기적인 플러시를 강제하도록 임계값을 지정하는 것은 여러 MySQL 인스턴스가 동일한 스토리지 장치를 사용하는 경우에 유용할 수 있습니다. 예를 들어 새 MySQL 인스턴스와 그 관련 데이터 파일을 생성하면 디스크 쓰기 작업이 크게 급증하여 동일한 스토리지 장치를 사용하는 다른 MySQL 인스턴스의 성능을 저해할 수 있습니다. 임계값을 설정하면 이러한 쓰기 작업 급증을 방지하는 데 도움이 됩니다. (Bug #27724600)

  • InnoDB: 사용자가 생성한 임시 테이블과 Optimizer가 생성한 내부 임시 테이블은 이제 임시 테이블스페이스 풀에서 세션에 할당되는 세션 임시 테이블스페이스에 저장됩니다. 세션의 연결이 끊어지면 해당 세션의 임시 테이블스페이스가 잘리고 풀로 다시 반환됩니다. 이전 릴리스에서는 임시 테이블이 전역 임시 테이블스페이스(ibtmp1)에 생성되었으며, 이 테이블스페이스는 임시 테이블이 삭제된 후에도 디스크 공간을 운영 체제에 반환하지 않았습니다.

    innodb_temp_tablespaces_dir 변수는 세션 임시 테이블스페이스가 생성되는 위치를 정의합니다. 기본 위치는 데이터 디렉터리의 #innodb_temp 디렉터리입니다.

    INNODB_SESSION_TEMP_TABLESPACES 테이블은 세션 임시 테이블스페이스에 대한 메타데이터를 제공합니다.

    전역 임시 테이블스페이스(ibtmp1)는 이제 사용자가 생성한 임시 테이블에 대한 변경 사항의 롤백 세그먼트를 저장합니다. (WL #11613)

  • InnoDB: InnoDB 저장 데이터 암호화 기능이 이제 general tablespace를 지원합니다. 이전에는 file-per-table 테이블스페이스만 암호화할 수 있었습니다. general tablespace 암호화를 지원하기 위해 CREATE TABLESPACEALTER TABLESPACE 문법이 ENCRYPTION 절을 포함하도록 확장되었습니다.

    이제 INFORMATION_SCHEMA.INNODB_TABLESPACES 테이블에는 테이블스페이스가 암호화되었는지 여부를 나타내는 ENCRYPTION 컬럼이 포함됩니다.

    general tablespace 암호화 작업 모니터링을 허용하기 위해 stage/innodb/alter tablespace (encryption) Performance Schema stage instrument가 추가되었습니다. (WL #9286)

  • Replication: 그룹이 응답하지 않는 멤버를 그룹에서 제거하기 전에 기다려야 하는 기간을 정의하기 위해 group_replication_member_expel_timeout 옵션이 추가되었습니다. 이를 통해 멤버에 대한 연결이 신뢰할 수 없을 때 제거 프로세스를 설정할 수 있습니다. (WL #11570)

  • Group Replication: 이제 그룹에 대한 최대 consensus instance 수를 언제든지 검사하고 설정할 수 있습니다. 이 최대값은 그룹의 event horizon이라고 하며, 시스템이 병렬로 실행할 수 있는 최대 consensus instance 수입니다. 이를 통해 Group Replication 배포의 성능을 세밀하게 조정할 수 있습니다.

    런타임에 그룹의 event horizon 값을 검사하려면 다음 문을 실행하십시오:

    SELECT group_replication_get_write_concurrency()
    

    최대 write consensus instance 수를 설정하려면 여기에 표시된 문을 실행하십시오:

    SELECT group_replication_set_write_concurrency(instances);
    

    instances는 consensus에 사용되는 최대 instance 수입니다.

    자세한 내용은 Using Group Replication Group Write Consensus를 참조하십시오. (Bug #27260096, WL #11512)

  • Group Replication: 이제 모든 멤버를 중지하여 변경하지 않아도, 그룹이 실행 중인 동안 그룹의 설정을 변경할 수 있습니다. 이 기능은 이 버전의 플러그인과 함께 설치되는 로드 가능 함수에 의존하며, 그룹의 모든 멤버에 이러한 함수가 설치되어 있어야 합니다. 함수를 사용하려면 온라인 멤버에 연결하고 SELECT function_name;을 실행하십시오.

    group_replication_set_as_primary() 함수를 사용하여 단일 프라이머리 그룹에서 특정 멤버를 새 프라이머리로 선출하도록 트리거하고, 일반적인 선출 절차를 재정의할 수 있습니다. 자세한 내용은 Changing the Primary를 참조하십시오.

    또한 그룹이 온라인 상태인 동안 그룹이 사용 중인 모드를 설정하여 단일 프라이머리 모드와 다중 프라이머리 모드 간에 변경할 수 있습니다. 온라인 그룹의 모드를 변경하려면 다음 옵션 중 하나를 선택하십시오:

    자세한 내용은 Changing the Group Mode를 참조하십시오. (WL #10378)

  • Solaris: Solaris에서 이제 MySQL을 Developer Studio 12.6으로 빌드할 수 있습니다. (Bug #27055190, Bug #88316, Bug #28165246, Bug #91214)

  • 데이터 잘림 테스트가 정의되지 않은 동작을 피하도록 다시 작성되었습니다. (Bug #28255956, Bug #91445)

  • float 값에 대한 범위 초과 검사가 개선되었습니다. (Bug #28225635)

  • 서버가 시작 프로세스 중 실행하는 업그레이드 검사는 이제 파티셔닝된 InnoDB 테이블이 공유 테이블스페이스를 사용하지 않는지 확인합니다. (Bug #28204431)

  • 이전에는 mysys 라이브러리의 I/O 캐시에서 수행되는 파일 I/O가 계측되지 않았으며, 특히 바이너리 로그 인덱스 파일에 대해 Performance Schema가 보고하는 파일 I/O 통계에 영향을 주었습니다. 이제 이 I/O가 계측되며 Performance Schema 통계가 정확합니다. 기여해 주신 Yura Sorokin에게 감사드립니다. (Bug #27788907, Bug #90264)

  • 메모리 내 권한 구조에서 사용자 계정 엔트리를 찾는 성능이 개선되었습니다. 기여해 주신 Eric Herman에게 감사드립니다. (Bug #27772506, Bug #90244)

  • mysqld --initialize가 완료되지 못했지만 사용할 수 없는 데이터 디렉터리를 생성한 경우, 이제 데이터 디렉터리를 사용할 수 없으며 안전하게 제거할 수 있다는 메시지를 표시합니다. (Bug #27675647)

  • 단일 스레드 또는 멀티스레드 슬레이브에서 개별 applier 스레드에 의한 트랜잭션 재시도에 대해 이제 Performance Schema에서 계측이 제공됩니다. 이전에는 Performance Schema 테이블 replication_applier_status_by_worker가 applier 스레드를 중지시킨 오류에 대한 정보를 표시했지만, 트랜잭션이 결국 적용되기 전에 발생한 일시적 오류에 대한 정보는 표시하지 않았습니다. 이 정보를 사용하면 복제 슬레이브 또는 Group Replication 그룹 멤버에서 복제 지연을 유발하는 일시적 오류를 식별할 수 있습니다.

    Performance Schema replication_applier_status_by_worker 테이블에 여덟 개의 새 컬럼이 추가되었습니다:

    • LAST_APPLIED_TRANSACTION_RETRIES_COUNT - 처음 시도 이후 마지막으로 적용된 트랜잭션이 worker에 의해 재시도된 횟수입니다. 트랜잭션이 처음 시도에서 적용된 경우 이 숫자는 0입니다.

    • LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_NUMBER - 트랜잭션이 재시도되도록 한 마지막 일시적 오류의 오류 번호입니다.

    • LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_MESSAGE - 트랜잭션이 재시도되도록 한 마지막 일시적 오류의 메시지 텍스트입니다.

    • LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_TIMESTAMP - 트랜잭션이 재시도되도록 한 마지막 일시적 오류에 대한 'YYYY-MM-DD hh:mm:ss[.fraction]' 형식의 타임스탬프입니다.

    • APPLYING_TRANSACTION_RETRIES_COUNT - 현재 적용 중인 트랜잭션이 이 시점까지 재시도된 횟수입니다. 트랜잭션이 처음 시도에서 적용된 경우 이 숫자는 0입니다.

    • APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_NUMBER - 현재 트랜잭션이 재시도되도록 한 마지막 일시적 오류의 오류 번호입니다.

    • APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_MESSAGE - 현재 트랜잭션이 재시도되도록 한 마지막 일시적 오류의 메시지 텍스트입니다.

    • APPLYING_TRANSACTION_LAST_TRANSIENT_ERROR_TIMESTAMP - 현재 트랜잭션이 재시도되도록 한 마지막 일시적 오류에 대한 'YYYY-MM-DD hh:mm:ss[.fraction]' 형식의 타임스탬프입니다.

      기존 컬럼 APPLYING_TRANSACTION_START_APPLY_TIMESTAMP는 트랜잭션이 재시도될 때마다 더 이상 재설정되지 않습니다. 이제 이 컬럼은 트랜잭션을 적용하려는 worker의 첫 번째 시도 시점의 타임스탬프를 유지합니다. (WL #9131)

  • 이전에는 GTIDs를 사용할 때(즉, enforce_gtid_consistency 시스템 변수가 ON으로 설정된 경우) CREATE TEMPORARY TABLEDROP TEMPORARY TABLE 문이 트랜잭션, 프로시저, 함수 또는 트리거 내부에서 지원되지 않았습니다. GTIDs가 활성화된 상태에서 이러한 문을 사용할 수는 있었지만, 트랜잭션 외부에서만 가능했으며 autocommit=1인 경우에만 가능했습니다.

    MySQL 8.0.13부터는 binlog_formatROW 또는 MIXED로 설정된 경우 이 제한이 제거되었습니다. 로우 기반 로깅을 사용하는 경우, GTIDs가 활성화되어 있을 때 이제 CREATE TEMPORARY TABLEDROP TEMPORARY TABLE 문을 트랜잭션, 프로시저, 함수 또는 트리거 내부에서 사용할 수 있습니다. binlog_formatSTATEMENT로 설정된 경우에는 이 제한이 유지됩니다. 이러한 동작 차이 때문에, 런타임에 binlog_format 설정을 변경하는 데 이제 몇 가지 추가 제한이 적용됩니다:

    • 세션에 열려 있는 임시 테이블이 있는 경우, 해당 세션의 복제 형식을 변경할 수 없습니다(SET @@SESSION.binlog_format).
    • 복제 채널 중 하나라도 열려 있는 임시 테이블을 가진 경우, 복제 형식을 전역으로 변경할 수 없습니다(SET @@GLOBAL.binlog_format 또는 SET @@PERSIST.binlog_format).
    • 복제 채널 applier 스레드 중 하나라도 현재 실행 중인 경우, 복제 형식을 전역으로 변경할 수 없습니다(SET @@GLOBAL.binlog_format 또는 SET @@PERSIST.binlog_format).

    이러한 경우 중 하나에서 복제 형식을 전환하려고 하거나 현재 복제 형식을 설정하려고 하면 오류가 발생합니다. 그러나 PERSIST_ONLY(SET @@PERSIST_ONLY.binlog_format)를 사용하면 언제든지 복제 형식을 변경할 수 있습니다. 이 작업은 런타임 전역 시스템 변수 값을 수정하지 않으며, 서버 재시작 후에만 적용되기 때문입니다.

    binlog_formatROW 또는 MIXED로 설정된 경우, CREATE TEMPORARY TABLEDROP TEMPORARY TABLE 문은 바이너리 로그에 기록되지 않으므로 슬레이브에 복제되지 않습니다. 이러한 문이 트랜잭션에서 사용될 때, 트랜잭션에서 이러한 문을 제거한 결과 빈 트랜잭션이 되면 해당 트랜잭션은 바이너리 로그에 기록되지 않습니다. 이러한 문을 포함하는 트랜잭션이 롤백되면, 임시 테이블의 생성 또는 삭제를 롤백할 수 없었다는 경고 메시지가 발생합니다. (WL #8872)

  • 바이너리 로깅을 위한 MySQL Server 코드는 바이너리 로그 및 릴레이 로그의 이벤트에 접근하기 위한 새 내부 인터페이스를 생성하도록 리팩터링되었습니다. 새 인터페이스는 바이너리 로깅의 쓰기 및 읽기 프로세스를 입력 스트림과 출력 스트림으로 분리하고, 바이너리 로그 이벤트를 캡처하고 검색하는 프로세스를 해당 이벤트를 파일에 쓰는 프로세스로부터 분리합니다. 논리적 바이너리 로그 파일은 스토리지 계층 작업을 감싸는 데 사용됩니다.

    새 내부 인터페이스를 통해 MySQL Server는 표준 바이너리 로그 또는 릴레이 로그 파일 외에도 바이너리 로그 캐시 또는 메모리 버퍼를 포함하여 바이너리 로그 이벤트에 대한 대체 스토리지 방식을 사용할 수 있습니다. 예를 들어, Group Replication은 그룹 내 트랜잭션을 조정하기 위해 새 인터페이스를 사용하여 이벤트를 메모리 버퍼 및 트랜잭션 메시지로 직접 직렬화합니다. mysqlbinlog도 이제 표준 입력에서 바이너리 로그 이벤트를 읽기 위해 이 인터페이스를 사용합니다.

    다음 기존 오류 메시지는 새 내부 인터페이스로 인해 이제 obsolete로 표시됩니다:

    • ER_BINLOG_CANT_OPEN_LOG
    • ER_BINLOG_CANT_CREATE_CACHE_FOR_LOG
    • ER_BINLOG_ERROR_GETTING_NEXT_LOG_FROM_INDEX
    • ER_RPL_RECOVERY_ERROR_FREEING_IO_CACHE
    • ER_GRP_RPL_REINIT_OF_INTERNAL_CACHE_FOR_READ_FAILED
    • ER_GRP_RPL_APPENDING_DATA_TO_INTERNAL_CACHE_FAILED
    • ER_GRP_RPL_REINIT_OF_INTERNAL_CACHE_FOR_WRITE_FAILED
    • ER_GRP_RPL_FAILED_TO_CREATE_COMMIT_CACHE
    • ER_GRP_RPL_REINIT_OF_COMMIT_CACHE_FOR_WRITE_FAILED

    (WL #10956)

  • TempTable 스토리지 엔진은 이제 바이너리 대형 객체(BLOB) 타입 컬럼의 저장을 지원합니다. 이 개선 사항은 BLOB 데이터를 포함하는 임시 테이블을 사용하는 쿼리의 성능을 향상시킵니다. 이전에는 BLOB 데이터를 포함하는 임시 테이블이 internal_tmp_disk_storage_engine에 정의된 온디스크 스토리지 엔진에 저장되었습니다. (WL #11452)

  • 바이너리 로그 이벤트의 역직렬화를 위한 MySQL Server 코드가 복제 중, 그리고 mysqlbinlog를 사용한 처리 중에, 서버에서 바이너리 로그 체크섬을 사용하는지 여부와 관계없이 손상되거나 유효하지 않은 이벤트 데이터의 식별과 탄력적인 처리를 개선하도록 리팩터링되었습니다. (WL #11567)

  • 이전에는 RENAME TABLE을 실행하려면 LOCK TABLES로 잠긴 테이블이 없어야 했습니다. 이제 WRITE 잠금으로 잠긴 테이블이나 다중 테이블 이름 변경 작업의 이전 단계에서 WRITE 잠금이 걸린 테이블의 이름을 변경한 결과로 생성된 테이블의 이름을 변경할 수 있습니다. (WL #9826)

수정된 버그

  • InnoDB; 파티셔닝: .frm 파일을 참조하여 더 이상 목적이 없어진 이전 InnoDB 핸들러 및 파티셔닝 코드를 제거했습니다. (Bug #27995316)

  • InnoDB: DROP TABLE 작업 중 어설션이 발생했습니다. memcached API를 통해 테이블에 접근하던 스레드가 테이블을 해제하기 전에 메타데이터 잠금을 해제했습니다. (Bug #28531148)

  • InnoDB: LOB 참조의 being_modified 비트가 설정되었지만 해당 비트 수정이 로그에 기록되지 않아 어설션 실패가 발생했습니다. (Bug #28443837)

  • InnoDB: Optimizer가 내부 임시 테이블에 InnoDB 스토리지 엔진을 사용할 때 윈도우 함수가 잘못된 결과를 반환했습니다. (Bug #28430650)

  • InnoDB: 서버 시간을 이전 시간으로 조정하면 주기적 redo flush가 누락되었습니다. (Bug #28430358, Bug #90670)

  • InnoDB: 기본 키를 추가하는 ALTER TABLE 작업에서 segmentation fault가 발생했습니다. (Bug #28395278)

    참조: 이 문제는 다음 버그의 회귀입니다: Bug #27753193.

  • InnoDB: ReadView::complete() 함수를 제거하고 그 작업을 다른 함수들에 나누어 배치함으로써 조건부 검사를 제거했습니다. 이 변경 사항은 ARM 64-bit에서 성능을 최적화하는 데 도움이 됩니다. (Bug #28385211, Bug #91759)

  • InnoDB: 남아 있던 thread_mutex 코드가 InnoDB 소스 코드 파일에서 제거되었습니다. (Bug #28363673, Bug #91678)

  • InnoDB: Microsoft Visual Studio 2017로 InnoDB를 컴파일할 때 발생하던 경고를 제거하기 위해 타입 변경이 구현되었습니다. (Bug #28338720)

  • InnoDB: 공유 인덱스 잠금을 표시하는 데 사용되는 B-tree 플래그가 shared-exclusive 인덱스 잠금을 표시하는 데 사용될 때 유효하지 않은 assertion이 발생했습니다. (Bug #28317172)

  • InnoDB: sharp checkpoint 메커니즘은 현재 사용 가능한 LSN에 대한 체크포인트를 요청할 때 더 이상 dirty 페이지의 사전 플러시를 강제하지 않습니다.

    이제 log checkpointer 스레드는 다음 체크포인트 쓰기가 필요한지와 dirty 페이지의 sync-flush를 강제하기 위해 page cleaner를 깨울지 여부를 결정할 때 concurrency margin(로그의 여유 공간에 대한 스레드당 margin)을 고려합니다. Page cleaner 스레드는 dirty 페이지를 플러시할지 여부와 플러시할 페이지 수를 결정할 때 concurrency margin을 고려합니다. (Bug #28297462)

  • InnoDB: 잘못 배치된 debug crash point로 인해 트랜잭션 타임아웃이 발생하여 테스트 실패가 초래되었습니다. (Bug #28295814)

  • InnoDB: 중복 텍스트를 제거하도록 InnoDB 오류 메시지 형식이 수정되었습니다. (Bug #28289789)

  • InnoDB: 불필요한 메모리 해제 및 할당 사이클로 인해 Windows에서 JSON 성능 저하가 발생했습니다. (Bug #28278737)

  • InnoDB: InnoDB는 in-place ALTER TABLE 문을 사용하여 외래 키 제약 조건에 사용되는 인덱스를 삭제하는 것을 잘못 허용했습니다. 이 작업은 이제 SQL 계층에서 차단됩니다. (Bug #28268875)

  • InnoDB: 하드웨어에 최적화된 체크섬이 계산될 때마다 하드웨어 지원을 확인하지 않도록, 어설션이 디버그 전용 어설션으로 변환되었습니다. (Bug #28267334, Bug #91485)

  • InnoDB: Contention-Aware Transaction Scheduling (CATS)을 읽기 잠금을 해제하는 기능과 결합한 패치로 인해 대기 중인 트랜잭션에 잠금을 부여하지 않고 갭 잠금이 제거되어, 트랜잭션 타임아웃이 발생했습니다. (Bug #28261530)

    참조: 이 문제는 다음의 회귀입니다: Bug #28261530.

  • InnoDB: 리두 양이 적을 때 log_checkpointer 스레드가 새 체크포인트를 적시에 쓰지 못했습니다. (Bug #28220222)

  • InnoDB: MySQL 5.7에서 MySQL 8.0으로의 in-place 업그레이드 중 외래 키 관련 테이블을 캐시에서 축출하려는 시도로 인해 서버가 종료되었습니다. 업그레이드 프로세스의 끝에서, FULLTEXT 인덱스가 있는 테이블은 외래 키 관계를 확인하지 않고 축출 준비 완료로 표시되었습니다. (Bug #28212734, Bug #91325)

  • InnoDB: 다음 Performance Schema 및 INFORMATION_SCHEMA 테이블 컬럼의 형식이 수정되었습니다:

  • data_locks.ENGINE_LOCK_ID

    이전 형식은 테이블 잠금의 경우 trx_id:table_id이고 레코드 잠금의 경우 trx_id:space_id:page_no:heap_no였습니다. 새 형식은 테이블 잠금의 경우 trx_immutable_id:table_id:lock_immutable_id이고 레코드 잠금의 경우 trx_immutable_id:space_id:page_no:heap_no:lock_immutable_id입니다.

    lock_immutable_idtrx_immutable_id는 각각 잠금 또는 트랜잭션의 수명 동안 변경되지 않는 64비트 값이며, 다른 인스턴스 객체 ID 사이에서 고유합니다. (Bug #28176910)

  • InnoDB: Performance Schema data_locks 테이블의 LOCK_MODE 컬럼에서 사용하는 허용된 잠금 모드 설명자 목록이 REC_NOT_GAP, INSERT_INTENTION, PREDICATE, PRDT_PAGE를 포함하도록 확장되었습니다. REC_NOT_GAP는 레코드 전용 잠금을 나타냅니다. INSERT_INTENTION은 삽입 의도 잠금을 나타냅니다. PREDICATEPRDT_PAGE 설명자는 공간 인덱스 잠금을 나타냅니다. (Bug #28176805)

  • InnoDB: lower_case_table_names=2 설정이 있는 macOS에서 테이블 이름이 소문자로 비교되지 않았으며, 이로 인해 서버 재시작 후 불안정성이 발생했습니다. (Bug #28170699, Bug #91204)

  • InnoDB: InnoDB 소스 코드에서 상수 값을 정의하는 데 사용되던 매크로가 상수 표현식으로 변경되었습니다. (Bug #28152926)

  • InnoDB: 커밋 중 트랜잭션이 롤백되는 것을 방지하는 플래그가 이제 더 이른 시점에 설정되어, 우선순위가 높은 트랜잭션이 커밋되는 중인 트랜잭션을 중단시킬 수 있는 시나리오를 방지합니다. (Bug #28140462)

  • InnoDB: 테이블의 기본 키를 스캔한 쿼리가 예상한 결과를 반환하지 않았습니다. (Bug #28104394, Bug #91032)

  • InnoDB: InnoDB 소스 코드 파일에서 불필요한 헤더 파일 포함이 제거되었습니다. (Bug #28086759)

  • InnoDB: 로그 작성기가 redo log에서 사용 가능한 공간을 모두 소진하여 발생한 것처럼 보이는 중단으로 인해 서버가 종료되었습니다. (Bug #28072385, Bug #90993)

  • InnoDB: 잠금 대기 중 쿼리 중단으로 인해 오류가 발생했습니다. (Bug #28068293)

  • InnoDB: MySQL 5.7에서 MySQL 8.0으로 업그레이드한 후, undo tablespace ID가 undo tablespace 범위에 없다는 잘못된 경고가 표시되었습니다. 이 경고는 MySQL 5.7 설치가 별도의 undo tablespace를 사용하도록 설정된 경우 발생했습니다. (Bug #28060337)

  • InnoDB: 불완전한 복제된 데이터 디렉터리에서 시작 실패가 발생할 때의 오류 메시지가 개선되었습니다. (Bug #28032131)

  • InnoDB: XA COMMIT 작업 중 세그멘테이션 오류가 발생했습니다. (Bug #27995891)

  • InnoDB: TempTable 스토리지 엔진 소스 코드에서 사용되지 않는 코드가 제거되었습니다. (Bug #27978968)

  • InnoDB: 생성 컬럼에 정의된 보조 인덱스를 업데이트할 때 인덱스 레코드를 찾을 수 없었습니다. (Bug #27968952)

  • InnoDB: IF 조건의 잘못된 부정 연산자로 인해 Contention-Aware Transaction Scheduling (CATS) 알고리즘이 테이블 잠금에 사용되었습니다. (Bug #27944920)

    참조: 이 문제는 다음 버그의 회귀입니다: Bug #27572937.

  • InnoDB: 온라인 ALTER TABLE 작업의 일부로 적용되는 업데이트 로그가 보조 인덱스를 업데이트하는 동안 이전 로우에 있는 생성 컬럼의 계산된 값을 고려하지 않았습니다. (Bug #27921932)

  • InnoDB: 버퍼 풀 메모리 할당이 Performance Schema memory/innodb/buf_buf_pool 통계에 완전히 반영되지 않았습니다. (Bug #27917595, Bug #90561)

  • InnoDB: 외래 키 제약 조건이 관련된 지원되지 않는 DDL 작업에서 assertion이 발생했습니다. (Bug #27912873)

  • InnoDB: 둘 이상의 잠금이 검색 조건과 일치할 때 잠금 관련 디버그 assertion 실패가 발생했으며, 이로 인해 잘못된 잠금이 해제될 수 있었습니다. (Bug #27898384)

  • InnoDB: 온라인 ALTER TABLE 작업의 prepare 단계에서 중단된 인덱스를 제거하는 함수가 해당 변경 사항을 기록하지 않았습니다. (Bug #27879325)

  • InnoDB: 할당된 테이블 없이 MySQL 5.7에서 생성된 general tablespace로 인해 MySQL 8.0으로 업그레이드할 때 실패가 발생했습니다. (Bug #27877485)

  • InnoDB: undo tablespace truncation과 마스터 키 rotation 작업이 동시에 수행될 때 assertion이 발생했습니다. (Bug #27872369)

  • InnoDB: 트랜잭션이 뮤텍스를 보유하는지 여부를 식별하는 boolean marker가 올바른 위치에 배치되지 않았습니다. (Bug #27870035)

  • InnoDB: 삭제된 테이블에서 외래 키 검사를 시도하면 세그멘테이션 오류가 발생했습니다. (Bug #27804668)

  • InnoDB: B-tree bulk load 작업이 페이지를 부분적으로 초기화된 상태로 남길 수 있었습니다. (Bug #27802098)

  • InnoDB: NUMA가 활성화된 운영 체제의 Docker 컨테이너 안에서 서버를 시작하면 “mbind: Operation not permitted” 오류가 발생했습니다. (Bug #27792853)

  • InnoDB: 데이터 딕셔너리의 스토리지 엔진 전용 데이터 필드에 저장된 파티셔닝된 테이블 TABLE_ID 값이 ALTER TABLE... PARTITION 작업 후 올바르게 조정되지 않았습니다. (Bug #27784462)

  • InnoDB: 서버가 “log writer overwriting data after checkpoint - waited too long” 오류와 함께 중단되었습니다. (Bug #27779266)

  • InnoDB: innodb_flush_log_at_trx_commit=2인 경우, log_flusher 스레드가 innodb_flush_log_at_timeout 설정과 동일한 타임아웃 기간으로 이벤트를 기다릴 수 있어 초기화 지연을 유발했습니다. (Bug #27762596)

  • InnoDB: OPTIMIZE TABLE 작업 중 어설션이 발생했습니다. (Bug #27753193)

  • InnoDB: 데드락으로 인한 트랜잭션 롤백이 디버그 빌드에서 어설션 실패를 발생시켰습니다. 데이터 딕셔너리에 접근하기 위한 attachable 트랜잭션의 시작은 트랜잭션 롤백 중에는 예상되지 않았습니다. (Bug #27729974)

  • InnoDB: innodb_flush_log_at_trx_commit=0이고 바이너리 로깅이 활성화된 경우, DDL 작업의 커밋 단계에서 redo 로그가 예상대로 플러시되지 않았습니다. (Bug #27691035)

  • InnoDB: REDUNDANT 또는 COMPRESSED 로우 형식과 READ COMMITTED 격리 수준에서, LOB 값 접두사와 이전 LOB 값의 외부 부분일 수 있는 것만 반환되어 JSON 문서가 손상된 것으로 보일 수 있었습니다. LOB 값 접두사가 없는 경우, 다른 필드의 새 값과 함께 이전 LOB 값이 반환되어 데이터 불일치를 일으킬 수 있었습니다. (Bug #27624990)

  • InnoDB: 주기적 체크포인트를 일시 중지할 수 있게 하는 디버그 옵션은 주기적 체크포인트 소유권이 마스터 스레드에서 로그 checkpointer 스레드로 이동된 후 더 이상 사용되지 않게 되었습니다. 이 디버그 옵션은 주기적 체크포인트를 일시 중지하는 다른 방법으로 대체되었습니다. (Bug #27588328)

  • InnoDB: 공간 참조 식별자(SRID)가 있는 컬럼에 정의된 공간 인덱스를 가진 테이블의 트랜잭션이 다른 트랜잭션이 업데이트 대상으로 선택한 영역에 삽입할 수 있었습니다. (Bug #27577612)

  • InnoDB: rename table 작업 중 외래 키 제약 조건 이름이 중복되어 이후 쿼리 실행 중 실패가 발생했습니다. (Bug #27545888)

  • InnoDB: 직렬화된 딕셔너리 정보(SDI) 삭제 실패로 인해 assertion이 발생했습니다. (Bug #27493634)

  • InnoDB: LOB purge 또는 롤백 중 large object (LOB) 인덱스 엔트리를 해제한 후 서버 종료가 발생했습니다. (Bug #27419474)

  • InnoDB: 저장 프로시저의 문 실행 전에 호출되는 함수에서 trx->lock.start_stmt에 대한 읽기 및 쓰기 작업이 mutex로 보호되지 않았습니다. (Bug #27325898)

  • InnoDB: INFORMATION_SCHEMA.FILESINFORMATION_SCHEMA.INNODB_TABLESPACES 테이블이 MySQL 인스턴스에 존재하는 실제 undo 테이블스페이스를 표시하지 않았습니다. 기본 undo 테이블스페이스 두 개만 표시되었습니다. (Bug #26820406)

  • InnoDB: 온라인 로그의 길이를 결정하는 REDUNDANT 로우 형식 계산의 불일치로 인해 DDL 작업 중 오류가 발생했습니다. (Bug #26375771)

  • InnoDB: innodb_undo_log_truncate를 활성화하면 트랜잭션 처리 성능에 부정적인 영향을 주었습니다. undo 테이블스페이스 truncate 작업 중 두 번의 체크포인트를 수행하는 대신, 이제 테이블스페이스 파일에 속한 페이지가 디스크에서 플러시됩니다. (Bug #26322656)

  • InnoDB: 같은 로우의 여러 버전이 있을 때 보조 키에서 읽는 것과 관련된 성능을 개선하기 위해 helper 클래스가 도입되었습니다.

    기여해 주신 Domas Mituzas에게 감사드립니다. (Bug #25540277, Bug #84958)

  • InnoDB: wait/io/file/innodb/innodb_temp_file Performance Schema instrument가 보고한 Innodb Merge Temp File의 위치가 올바르지 않았습니다. (Bug #21339079, Bug #77519)

  • Partitioning: 유효하지 않은 파티션 정의로 인해 CREATE TABLE... PARTITION BY... 문이 실패했을 때, 서버는 유효하지 않은 PARTITION 절을 만나기 전에 생성되었을 수 있는 파티션 파일을 제거하지 않았습니다. (Bug #27798708)

    참조: 다음도 참조하십시오: Bug #88043, Bug #26945644.

  • Partitioning: innodb_file_per_table=1로 생성된 파티셔닝된 테이블에서 해당 테이블스페이스를 폐기한 후 FLUSH TABLES FOR EXPORT를 수행할 수 있었습니다. 이제 이를 시도하면 ER_TABLESPACE_DISCARDED가 발생합니다. (Bug #90545, Bug #27903881)

    References: 참조 항목: Bug #80669, Bug #22899690.

  • Partitioning: 파티셔닝된 InnoDB 테이블에 대한 업데이트로 불필요한 로우 잠금이 부과되었습니다. (Bug #87253, Bug #26553164)

  • Replication: 복제 슬레이브가 START SLAVE 문으로 재시작될 때, APPLYING_TRANSACTION으로 시작하는 Performance Schema 테이블 replication_applier_status_by_worker의 컬럼이 이제 단일 스레드 모드로 동작하는 슬레이브에서 재설정됩니다. 이러한 컬럼은 기존 워커 스레드가 해당 문에 의해 종료되고 정보를 유지할 수 없었기 때문에, 멀티 스레드 슬레이브에서는 항상 재설정되었습니다. 이제 단일 스레드 슬레이브에 대해서도 컬럼을 재설정하여 슬레이브 설정 전반에서 동작이 표준화되었습니다. (Bug #28248026)

  • Replication: 멀티 스레드 복제 슬레이브가 중지되고, (slave_parallel_workers > 0을 설정하여) 단일 스레드 슬레이브로 변경된 뒤 재시작된 경우, 이전 모니터링 정보가 지워지지 않았기 때문에 Performance Schema 테이블 replication_applier_status_by_worker에 관련 없는 타임스탬프가 표시되었습니다. (Bug #28191382)

  • Replication: binlog_group_commit_sync_delay 시스템 변수가 트랜잭션을 디스크에 동기화하는 것을 지연하기 위한 대기 시간으로 설정되고, binlog_group_commit_sync_no_delay_count 시스템 변수도 트랜잭션 수로 설정된 경우, 지정된 대기 시간에 도달하기 전에 지정된 트랜잭션 수에 도달하면 MySQL 서버는 대기 절차를 종료합니다. 서버는 binlog_group_commit_sync_delay에 지정된 시간의 10분의 1에 해당하는 델타가 경과한 후 트랜잭션 수를 확인한 다음, 남은 대기 시간에서 해당 간격을 차감하여 이 프로세스를 관리합니다.

    델타 계산 중 반올림으로 인해 대기 시간이 델타의 배수가 아니게 되면, 남은 대기 시간에서 델타를 마지막으로 차감할 때 값이 음수가 되고, 따라서 최대 대기 시간으로 래핑되어 커밋이 멈추었습니다. 이제 남은 대기 시간의 데이터 타입이 변경되어 이 상황에서 값이 래핑되지 않으며, 원래 대기 시간이 경과하면 커밋이 진행될 수 있습니다. 기여해 주신 Yan Huang에게 감사드립니다. (Bug #28091735, Bug #91055)

  • Replication: 디버그 빌드에서, MySQL에서 이제 255개를 초과하는 콜레이션을 사용할 수 있기 때문에 assertion이 실패했습니다. (Bug #28015761)

  • Replication: MySQL 서버가 GTID 일관성 위반을 기록했지만 관련 명령문이 성공적으로 실행되지 못한 후 해당 기록을 제거하지 않았기 때문에 디버그 빌드에서 assertion이 발생했습니다. 이제 이 상황의 처리가 개선되어, 서버가 트랜잭션 종료 시 실패한 명령문으로 인해 GTID 일관성 위반이 생성되었는지 확인하고, 해당하는 경우 이전 GTID 일관성 상태를 복원하도록 보장합니다. (Bug #27903831, Bug #90551)

  • 복제: 복제에 GTIDs를 사용하는 경우, 파싱 오류(ER_PARSE_ERROR)를 발생시킨 문을 포함하는 트랜잭션은 동일한 GTID를 가진 빈 트랜잭션 또는 대체 트랜잭션을 주입하는 권장 방법으로 수동으로 건너뛸 수 없었습니다. 이 작업은 슬레이브가 해당 GTID를 이미 사용된 것으로 식별하게 하여, 따라서 해당 GTID를 공유하는 원하지 않는 트랜잭션을 건너뛰게 해야 합니다. 그러나 파싱 오류의 경우, 해당 문이 건너뛰어져야 하는지 확인하기 위해 GTID가 검사되기 전에 문이 파싱되었기 때문에, 어차피 그 트랜잭션을 건너뛰려는 의도였음에도 복제 적용자 스레드가 파싱 오류로 인해 중지되었습니다.

    이 수정으로, 관련 트랜잭션이 GTID가 이미 사용되었기 때문에 건너뛰어져야 하는 경우 복제 적용자 스레드는 이제 파싱 오류를 무시합니다. 이 동작 변경은 mysqlbinlog가 생성한 바이너리 로그 출력으로 구성된 워크로드의 경우에는 적용되지 않습니다. 이 상황에서는 건너뛴 트랜잭션 바로 뒤에 오는 파싱 오류가 있는 트랜잭션이 오류를 발생시켜야 하는 경우에도 함께 조용히 건너뛰어질 위험이 있습니다. (Bug #27638268)

  • Replication: GTID가 사용 중인 복제 슬레이브에서 RESET SLAVE 문이 실행되면, 기존 릴레이 로그 파일은 제거되었지만 대체되는 새 릴레이 로그 파일이 채널에 대해 수신된 GTID 집합이 지워지기 전에 생성되었습니다. 따라서 이전 GTID 집합이 PREVIOUS_GTIDS 이벤트로 새 릴레이 로그 파일에 기록되어, 두 서버의 gtid_executed 집합이 모두 비어 있었음에도 슬레이브가 마스터보다 더 많은 GTID를 가지고 있다는 복제의 치명적 오류가 발생했습니다. 이제 RESET SLAVE가 실행되면 새 릴레이 로그 파일이 생성되기 전에 수신된 GTID 집합이 지워지므로, 이 상황이 발생하지 않습니다. (Bug #27636289)

  • Replication: Semisynchronous replication을 위한 마스터의 수신자 스레드는 슬레이브에서 승인 응답을 읽는 동안 mutex를 보유했지만, 동일한 mutex가 semisynchronous 슬레이브를 추가하거나 제거하는 데 필요했으므로 해당 작업이 승인 응답 활동으로 인해 지연되었습니다. 이제 이 문제는 슬레이브에서 승인 응답을 읽기 위해 mutex를 획득하지 않도록 하여 수정되었습니다. (Bug #27610678, Bug #89370)

  • Replication: 복제 슬레이브 보고 코드에서, 드문 오류 상황이 디버그 빌드에서는 어설션을 발생시켰지만, 릴리스 빌드에서는 mutex가 잠긴 상태로 반환되었습니다. 이제 이 상황에서는 반환하기 전에 mutex가 잠금 해제됩니다. 패치를 제공해 주신 Zsolt Parragi에게 감사드립니다. (Bug #27448019, Bug #89421)

  • Replication: slave_transaction_retries 시스템 변수로 지정되는 복제 슬레이브에서의 트랜잭션 자동 재시도가, 트랜잭션에 재시도 시 반복될 수 있거나 더 광범위한 문제를 나타내는 비임시 오류가 있는 경우에도 발생했습니다. 이제 트랜잭션은 오류가 없거나, 일시적인 오류만 있는 경우에만 자동으로 재시도됩니다. (Bug #27373559, Bug #89143)

  • Replication: 특정 로그 유형에 대한 FLUSH 문(FLUSH SLOW LOGS 등)에서 오류가 발생했을 때도, 해당 문이 여전히 바이너리 로그에 기록되었습니다. 이로 인해 오류가 마스터에서 발생했지만 슬레이브에서는 발생하지 않았기 때문에 복제가 중지되었습니다. 이제 MySQL Server는 이러한 FLUSH 문의 결과를 확인하며, 오류가 발생한 경우 해당 문은 바이너리 로그에 기록되지 않습니다. (Bug #24786290, Bug #83232)

  • Replication: 비밀번호의 해시를 생성하는 PASSWORD() 함수는 MySQL 5.7에서 사용 중단되었고 MySQL 8.0에서 제거되었습니다. 이 함수를 사용한 SET PASSWORD 문이 MySQL 5.6 마스터에서 MySQL 5.7 슬레이브로 복제되거나, log_builtin_as_identified_by_password 시스템 변수가 ON으로 설정된 MySQL 5.7 마스터에서 MySQL 5.7 슬레이브로 복제될 때, 비밀번호 해시 자체도 슬레이브에 저장되기 전에 다시 해시되었습니다. 이제 이 문제가 수정되었으며, 복제된 비밀번호 해시는 슬레이브에 원래 전달된 대로 저장됩니다. (Bug #24687073)

  • Replication: 복제와 관련된 특정 Performance Schema 테이블에서 레코드를 가져올 때 ORDER BY 절이 사용되면 빈 집합이 반환되었습니다. 이제 이 문제가 수정되었습니다. (Bug #22958077, Bug #80777)

  • Replication: multi-source replication을 위해 슬레이브에서 복제 채널을 사용하는 경우, 개별 채널을 지정하지 않는(따라서 FOR CHANNEL 절이 없는) START SLAVE 문은 복제 슬레이브의 모든 채널에 대해 I/O 스레드와 SQL 스레드를 시작해야 합니다. 그러나 이러한 슬레이브에서 RESET SLAVE 문이 사용된 경우, 이후의 START SLAVE 문은 기본값이 아닌 채널을 시작하지 않았습니다. 이제 초기화 프로세스의 오류 결과가 아니라 RESET SLAVE 문의 결과로 초기화 해제된 복제 채널이 식별되며, 모든 채널에 적용되는 START SLAVE 문에 의해 다시 시작됩니다. (Bug #22809607)

  • 복제: 복제 슬레이브에서 RESET SLAVE를 실행해도 메모리에 유지되는 마스터 호스트, 마스터 포트, 마스터 사용자 또는 마스터 비밀번호와 같은 복제 연결 매개변수는 변경되지 않습니다. 그러나 이러한 연결 매개변수는 RESET SLAVE ALL을 실행하면 재설정됩니다. 이전에는 RESET SLAVE를 실행한 직후 슬레이브 mysqld가 재시작된 경우(의도적인 재시작뿐 아니라 서버 크래시도 포함), 연결 매개변수가 RESET SLAVE ALL을 사용한 것처럼 재설정되었습니다.

    이제 서버에서 master_info_repository=TABLE이 설정된 경우(MySQL 8.0부터 기본값), 복제 연결 매개변수는 RESET SLAVE 작업의 일부로 크래시 안전 InnoDB 테이블 mysql.slave_master_info에 보존됩니다. 또한 메모리에도 유지됩니다. RESET SLAVE를 실행한 후 START SLAVE를 실행하기 전에 서버 크래시 또는 의도적인 재시작이 발생하면, 복제 연결 매개변수는 테이블에서 가져와 새 연결에 다시 사용됩니다.

    서버에서 master_info_repository=FILE이 설정된 경우(MySQL 5.7의 기본값), 복제 연결 파라미터는 메모리에만 유지되므로 동작은 이전과 동일하게 유지됩니다. RESET SLAVE를 실행한 직후 서버 크래시 또는 의도적인 재시작으로 인해 슬레이브 mysqld가 재시작되면 연결 파라미터가 손실됩니다. 이 경우 START SLAVE를 실행하기 전에, 서버 시작 후 CHANGE MASTER TO 문을 실행하여 연결 파라미터를 다시 지정해야 합니다.

    연결 파라미터를 의도적으로 재설정하려면 연결 파라미터를 지우는 RESET SLAVE ALL을 사용해야 합니다. 이 경우 새 연결 파라미터를 지정하려면 서버 시작 후 CHANGE MASTER TO 문을 실행해야 합니다. (Bug #20280946)

  • Replication: 그룹 멤버가 일정 시간 동안 일시 중단된 후 재개되고 대기 중인 모든 메시지를 처리할 수 없는 경우, ERROR 상태로 전환됩니다. 그러나 나머지 멤버는 이를 UNREACHABLE로 보고, 해당 멤버를 그룹에서 축출하기 위해 멤버의 의심 기간이 만료될 때까지 기다립니다. 이제 동작이 수정되어, 특정 오류로 인해 중지되는 멤버는 leave view를 설치하기 전에 그룹에서 자신의 제거를 요청하기 위해 알려진 피어에 연결을 시도합니다. (Bug #91433, Bug #28252687)

  • Replication: xdr_utils의 사용되지 않는 함수와 관련된 컴파일 경고가 줄었습니다. 패치를 제공해 준 Zsolt Parragi에게 감사드립니다. (Bug #91071, Bug #28099963)

  • Replication: 멤버가 이미 재연결 시도를 수행하는 동안 group_replication_recovery_retry_count 변수가 수정되면, 연결 시도가 무한 루프에 들어갈 수 있었습니다. (Bug #91057, Bug #28092714)

  • Replication: group_replication_exit_state_action 변수는 멤버가 비자발적으로 그룹을 떠나는 경우 어떤 작업을 수행할지 지정할 수 있게 하지만, group_replication_start_on_boot이 활성화된 상태로 서버를 시작할 때 다음 시나리오에서는 group_replication_exit_state_action 변수가 무시되고 있었습니다:

    • 유효한 그룹 멤버 수를 초과했습니다
    • 멤버 시스템 변수의 호환되지 않는 설정(여러 가지)이 있었습니다
    • 참여하는 멤버가 그룹보다 더 많은 트랜잭션을 가지고 있었습니다
    • 참여하는 멤버의 버전이 그룹과 호환되지 않았습니다

    (Bug #90494, Bug #27881311)

  • Replication: START GROUP_REPLICATION을 실행한 다음, 예를 들어 control-C를 사용하여 mysqld 프로세스를 강제로 중지하면 서버가 예기치 않게 중단될 수 있었습니다. (Bug #90457, Bug #27873419)

  • Group Replication: group_replication_appliergroup_replication_recovery 채널에 대한 relay log info 로그의 엔트리가 RESET SLAVE 또는 RESET SLAVE ALL에 의해 지워지지 않았습니다. (Bug #27411175)

  • Group Replication: 유효하지 않은 group_replication_group_name이 있는 서버에서 Group Replication을 시작하면 서버가 예기치 않게 중지되었습니다. (Bug #91347, Bug #28219136)

  • Group Replication: group_replication_group_seeds에 자체 로컬 주소로 해석되는 DNS 기반 엔트리가 포함된 경우 Group Replication을 시작할 수 없었습니다. (Bug #90483, Bug #27882096, Bug #28074929)

  • Microsoft Windows: 옵션 파일에서 sql_mode 옵션에 NO_AUTO_CREATE_USER 값이 존재하여 MySQL 8.0 서버가 시작되지 못하는 경우 이제 서버 로그에 오류가 기록됩니다. (Bug #28061945, Bug #90967)

  • Microsoft Windows: Windows에서 MySQL Installer를 통해 MySQL Server MSI 패키지를 제거하면 잘못된 팝업 창이 생성되었습니다. (Bug #27463864)

  • Microsoft Windows: Windows에서 DBUG_ABORT가 사용자 지정 스택 추적과 기타 정보를 출력하지 않았습니다. (Bug #21383530)

  • Microsoft Windows: --install 옵션 뒤에 서비스 이름을 지정한 서비스 설치 명령으로 MySQL을 Windows 서비스로 시작하면, my.ini 또는 my.cnf 옵션 파일의 명명된 서비스 그룹에 있는 지시문이 무시되고 대신 기본 옵션이 사용되었습니다. 기본 서비스 이름(mysqld, mysql_cluster, server, mysqld-8.0)만 옵션 파일에서 다른 매개변수를 로드할 수 있었습니다. (Bug #90383, Bug #27852209)

  • JSON: 생성 컬럼이 JSON_TABLE()을 사용하는 생성 컬럼이 있는 테이블 생성을 서버가 거부하지 않았습니다. 생성 컬럼용 표현식에서는 서브쿼리, 매개변수, 변수, 저장 함수, 로드 가능한 함수가 허용되지 않는데도 그러했습니다. 이제 서버는 허용되지 않는 구성 요소(JSON_TABLE() 포함) 중 어느 것이라도 이러한 표현식에서 사용되면 거부되도록 더 적극적으로 검사합니다. (Bug #28518485)

  • JSON: SELECT ... FROM JSON_TABLE()은 MySQL root가 아닌 사용자에 대해 권한 오류와 함께 실패하는 경우가 있었습니다. 이러한 쿼리가 뷰의 기반으로 사용되고, 해당 뷰에서 SELECT가 실패하는 경우에도 이 문제가 발생할 수 있었습니다. (Bug #28255453, Bug #27923406)

    참조: 함께 참조하십시오: Bug #27189940.

  • JSON: JSON_TABLE() 함수는 231보다 크거나 같은 정수 값에 wraparound를 적용했습니다. 예를 들어, 쿼리 SELECT id FROM JSON_TABLE('[{"id":"2147483648"}]', '$[*]' COLUMNS (id BIGINT UNSIGNED PATH '$.id')) AS json-2147483648을 반환했습니다. (Bug #27856835)

  • JSON: 일부 컨텍스트에서 NULLIF() 함수는 첫 번째 인수를 실제 타입이 아니라 boolean 값으로 반환했습니다. 이 문제는 이 함수의 결과가 JSON_ARRAYAGG() 또는 JSON_OBJECTAGG()의 인수로 사용될 때 발견되었지만, NULLIF()가 유사한 방식으로 사용된 다른 경우에도 발생했을 수 있습니다. (Bug #90833, Bug #28007237)

  • JSON: 바이너리 데이터를 포함한 JSON 문서가 표시를 위해 base-64 인코딩된 텍스트로 변환될 때, 인코딩된 문자열의 줄 바꿈 문자가 제대로 이스케이프되지 않아 텍스트 표현을 JSON으로 파싱할 수 없었고, 따라서 잘리거나 손상되거나 둘 다 발생했습니다. 이제 MySQL은 인코딩된 문자열의 모든 줄 바꿈 문자가 이스케이프되도록 보장합니다. (Bug #90503, Bug #27891359)

  • filesort 작업이 서버 종료를 유발할 수 있었습니다. (Bug #28791531, Bug #92777)

  • Debian 패키징은 이제 Ubuntu 18.10 (Cosmic Cuttlefish)을 지원합니다. (Bug #28765706)

  • Fedora 29 플랫폼에서는 OpenSSL 1.1.1 지원이 준비되지 않았기 때문에 패키지를 빌드하는 데 OpenSSL 1.0.x가 사용됩니다. 소스에서 MySQL을 빌드하는 경우 compat-openssl10-devel 패키지를 사용하여 빌드하는 것이 권장됩니다. (Bug #28737143)

  • Fedora 29 플랫폼에서 MariaDB에서 MySQL 8.0.13으로 업그레이드하는 작업이 누락된 obsoletes로 인해 실패했습니다. (Bug #28727698)

  • SLES 12용 MySQL 바이너리 배포판은 이제 GCC 7을 사용하여 빌드됩니다. 이 플랫폼에서 지원되는 가장 낮은 GCC 버전은 이제 5.3입니다(이전에는 4.8.5). (Bug #28542723)

  • 서브쿼리에 함수형 인덱스를 추가하려는 시도는 가능하지 않아야 했으며, 인덱싱된 표현식을 해석하려고 할 때 서버가 assertion에 도달하게 했습니다. 이제 이러한 경우 표현식이 허용되지 않으며, 서버가 적절한 오류 메시지를 반환합니다. (Bug #28526493)

  • 지수를 사용하여 계산을 수행할 때 범위 검사가 추가되었습니다. (Bug #28505423)

  • CMAKE -DWITHOUT_SERVER=1이 빌드 오류를 발생시켰습니다. (Bug #28501563, Bug #92011)

  • 프리픽스 인덱스가 8바이트 길이로 지정된 경우 SHOW INDEXES 출력의 Sub_part 컬럼이 NULL이었습니다. (Bug #28499603)

  • MySQL이 일부 시스템 라이브러리를 사용하도록 설정된 상태에서 GCC 8에 대한 컴파일이 실패했습니다. (Bug #28471072, Bug #91914)

  • 디버그 빌드에서 서버 부트스트래핑 단계가 실패하면, 누락된 정리 코드로 인해 assertion이 발생했습니다. (Bug #28435378, Bug #91847)

  • MySQL 빌드의 숫자 범위가 ARM 및 Intel x64 플랫폼 간에 다를 수 있었습니다. (Bug #28401869)

  • mysqldump --tables 출력의 경우, 파일 이름에 이미 점이 포함되어 있더라도 파일 이름에는 이제 항상 .txt 또는 .sql 접미사가 포함됩니다. 기여해 주신 Facebook에 감사드립니다. (Bug #28380961, Bug #91745)

  • MERGE 테이블에서 동시에 실행되는 INSERTSELECT 문으로 인해 서버가 종료될 수 있었습니다. (Bug #28379285)

  • SLES 15에서 MariaDB 패키지에서 MySQL 패키지로 업그레이드할 때 잘못된 obsoletes 정보로 인해 실패했습니다. (Bug #28292138)

  • 이제 데이터 딕셔너리 auto releaser는 데이터 딕셔너리 객체 타입에 대한 맵을 동적으로 할당합니다. 또한 크기 계산 및 객체 제거에 사용되는 컬럼 통계와 리소스 그룹에 대한 맵이 추가되었으며, ANALYZE TABLE 작업을 위한 auto releaser가 추가되었습니다. (Bug #28245522, Bug #91420)

  • 서로 다른 캐릭터셋을 혼합한 UNION 쿼리가 잘못된 오류와 함께 실패할 수 있었습니다. (Bug #28237675)

    References: 이 문제는 다음의 회귀입니다: Bug #83895, Bug #25123839.

  • 임시 테이블에 대한 CHECK TABLE... FOR UPGRADE가 assertion을 발생시킬 수 있었습니다. (Bug #28220374)

    References: 이 문제는 다음의 회귀입니다: Bug #24741307.

  • range optimizer에서 0으로 나누기 오류가 발생할 수 있었습니다. (Bug #28214186)

  • GCC 8 버그로 인해, 외래 키 검사에서의 재귀가 스택 공간을 모두 소진할 수 있었습니다. (Bug #28200774, Bug #28421040, Bug #91823)

  • sql_mode가 빈 문자열로 설정된 경우, SELECT CONCAT(FORMAT(LPAD(char,2,''), 1)) 형식의 쿼리가 올바르게 처리되지 않았습니다. LPAD() 대신 RPAD()를 사용하는 유사한 형식의 쿼리에서도 동일했습니다. (Bug #28197977)

  • 권한이 없는 사용자가 자신의 계정 password history 및 reuse 속성을 변경할 수 있었습니다. (Bug #28191838)

  • OpenSSL 1.1 OPENSSL_malloc_init() 호출이 Windows에서 제대로 작동하지 않았습니다. 이를 해결하기 위해 OpenSSL의 기본값 대신 대체 할당 래퍼가 사용됩니다. 따라서 OpenSSL 메모리 계측은 꺼집니다. (Bug #28179051)

  • 데이터 딕셔너리 조회 중 특정 객체 타입을 할당하면 스택 버퍼 오버플로가 발생했습니다. (Bug #28176453)

  • INFORMATION_SCHEMA에서 테이블 통계를 가져오는 동안 커밋을 수행하려고 시도한 내부 서버 작업에서 어설션이 발생할 수 있었습니다. (Bug #28165060)

  • 특정 저장 프로시저가 서버 종료를 유발할 수 있었습니다. (Bug #28156802)

  • CREATE USER 문의 출력이 general query log와 audit log에서 다를 수 있었습니다. (Bug #28147710)

  • sql_safe_updates가 활성화되어 오류를 생성하는 UPDATEDELETE 문에서 오류 메시지가 충분한 정보를 제공하지 않았습니다. 이제 이 메시지는 실패 이유에 대한 정보를 제공하기 위해 생성된 첫 번째 진단을 포함합니다. 예를 들어, 이 메시지는 range_optimizer_max_mem_size 값이 초과되었거나 타입 변환이 발생했음을 나타낼 수 있으며, 둘 중 어느 경우든 인덱스 사용을 배제할 수 있습니다.

    추가로: (1) 이러한 문에 EXPLAIN을 사용해도 오류가 생성되지 않으므로, 사용자는 EXPLAINSHOW WARNINGS 출력에서 인덱스가 사용되지 않는 이유를 확인할 수 있습니다. (2) 여러 테이블 삭제 및 업데이트의 경우, 안전 업데이트가 활성화된 상태에서는 대상 테이블 중 하나라도 테이블 스캔을 사용하는 경우에만 오류가 생성됩니다. (Bug #28145710, Bug #91080)

  • MySQL Server 및 테스트 RPM 패키지에 perl-Data-Dumper가 의존성으로 누락되어 있었습니다. (Bug #28144933, Bug #72926)

  • 컴포넌트에 필요한 서비스가 아직 초기화되지 않은 경우 서버 시작이 실패할 수 있었습니다. (Bug #28142250)

  • SHOW CREATE TABLE이 외래 키 RESTRICT 옵션을 누락할 수 있었습니다. 이로 인해 mysqldump로 덤프되고 덤프 파일에서 복원된 테이블에서 외래 키 RESTRICT 옵션이 손실될 수 있었습니다. (Bug #28122781, Bug #91110)

  • mysql 클라이언트가 배치 모드에서 큰 여러 줄 문을 가져오는 속도가 느렸습니다. 이제 이 상황에 대한 메모리 할당이 더 효율적입니다. 패치를 제공해 주신 Sinisa Milivojevic에게 감사드립니다. (Bug #28116512, Bug #85155)

  • SUM()AVG() 함수가 윈도우 함수와 함께 사용된 문자열 인수를 올바르게 처리하지 않았습니다. (Bug #28105241)

  • geometry collection의 과도한 중첩으로 인해 서버의 스택 공간이 고갈되었습니다. 이제 서버는 스택 오버런의 위험이 있는 경우 오류를 발생시킵니다. (Bug #28100563)

  • mysql 클라이언트의 경우 -b 짧은 옵션은 두 개의 긴 옵션인 --no-beep--binary-as-hex와 연결되어 있었습니다. 이제 -b 옵션은 --no-beep에만 연결됩니다. (Bug #28093271)

  • auto-increment 기본 키가 있는 테이블의 경우, 동시에 실행되는 ALTER TABLE... ADD... VIRTUALINSERT 문으로 인해 duplicate-key 오류가 발생할 수 있었습니다. (Bug #28089240)

  • SUM()에 의한 floating-point 값 처리가 개선되었습니다. (Bug #28080199)

  • ST_Simplify()를 사용하는 일부 표현식으로 인해 서버가 종료될 수 있었습니다. (Bug #28079969)

  • Undefined Behavior Sanitizer가 활성화된 빌드에서 테스트가 “member call on null pointer of type 'struct Event_db_repository'” 오류를 반환했습니다. (Bug #28066155)

  • WITH_GMOCK CMake 옵션이 Windows 경로 이름을 올바르게 처리하지 못했습니다. (Bug #28061409, Bug #90964)

  • 테이블 통계를 캐시하려고 시도한 INFORMATION_SCHEMA 쿼리에서 디버깅 어설션이 발생할 수 있었습니다. (Bug #28035207)

  • 계정에 역할이 할당된 경우, 특정 sql_mode 설정으로 인해 서버를 시작할 수 없었습니다. (Bug #28030423)

  • LDAP 인증 플러그인에 대한 그룹 조회는 사용자에게 충분한 권한이 없는 경우 실패할 수 있었습니다. 이제 그룹 검색 작업은 root 자격 증명을 사용할 수 있으면 이를 사용하여 다시 바인드합니다. (Bug #28016008)

  • mysqldump에서 생성한 ANALYZE TABLE... UPDATE HISTOGRAM 문에 문법 오류가 포함되어 있었습니다. (Bug #28014376, Bug #90846)

  • 인덱스가 있고 문자열 함수를 사용한 생성 컬럼이 항상 올바르게 채워지지는 않았습니다. (Bug #27973409)

  • 우선순위 큐에서 사용되는 것과 같은 고정 길이 정렬 키가 정확히 맞는 경우 실패한 것으로 간주되었습니다. (Bug #27970481, Bug #92448, Bug #28654343)

  • 빈 결과에 대해 REPLACE()가 때때로 빈 문자열이 아니라 null 문자열을 반환했습니다. (Bug #27960921)

  • 더 이상 사용할 수 없는 사용자 정의 콜레이션으로 생성된 테이블을 삭제하면 서버 종료가 발생할 수 있었습니다. (Bug #27952999)

  • INFORMATION_SCHEMA REFERENTIAL_CONSTRAINTS 테이블과 TABLE_CONSTRAINTS 테이블을 CONSTRAINT_NAME에서 조인하면 컬럼 콜레이션이 달라 실패했습니다. (Bug #27945704, Bug #90690)

  • DECIMAL 값에 대한 일부 작업이 서버 종료를 유발할 수 있었습니다. (Bug #27942277)

  • 매우 긴 테이블 키가 복제 슬레이브에서 잘못 처리되었습니다. (Bug #27930505)

  • mysqld는 해당 디렉터리가 $PATH에 나열된 마지막 디렉터리인 경우 설치 디렉터리를 올바르게 확인하지 못했습니다. (Bug #27922896)

  • 서버 시작/종료 중에 PID 파일이 잘못 처리될 수 있었습니다. (Bug #27919254)

  • 서버가 --skip-grant-tables로 시작된 경우 일부 계정 관리 문이 비활성화되지 않았습니다. (Bug #27906226)

  • 드문 경우에 savepoint 설정이 assertion을 발생시킬 수 있었습니다. (Bug #27898591)

  • copy_integer() 호출에서 런타임 오류가 발생할 수 있었습니다. myfunc_int(), mysql_sys_var_int() 또는 thd_killed() 호출, MyISAM 정렬 함수 호출, 또는 unsigned long long 타입의 표현 가능한 값 범위를 벗어난 값에서도 런타임 오류가 발생할 수 있었습니다. (Bug #27894901, Bug #90515, Bug #27871951, Bug #27918095, Bug #90609, Bug #27937522, Bug #90661, Bug #27978325, Bug #27962900)

  • 서버가 플러그인 메타데이터를 데이터 딕셔너리에 저장할 수 없는 경우 mysql_install_plugin이 플러그인별 오류를 보고하지 못했습니다. (Bug #27893406)

  • ssl_fips_mode는 OpenSSL 요구 사항이 충족되지 않으면 ON으로 설정할 수 없지만, 실패한 시도 후에도 값이 ON으로 표시되었습니다. (Bug #27891890)

  • mysql_result_metadata() C API 함수의 심볼이 Windows의 클라이언트 라이브러리에서 내보내지지 않았습니다. (Bug #27868095)

  • InnoDB 테이블의 경우, 자기 참조 외래 키가 생성될 수 있었으며, 이로 인해 서버가 잘못 동작했습니다. (Bug #27864515)

  • 서로 다른 캐릭터셋을 혼합하는 UNION 쿼리를 준비된 명령문 또는 저장 프로시저에서 수행할 때 잘못된 출력이 생성되었습니다. (Bug #27849293)

  • Debian 패키지에 libcurl-dev에 대한 의존성이 누락되었습니다. (Bug #27844465)

  • 클라이언트 프로그램의 --help 출력에 현재 --ssl-fips-mode 값이 포함되지 않았습니다. (Bug #27838966)

  • Derived_key_comp() 호출에서 런타임 오류가 발생할 수 있었습니다. (Bug #27830679)

  • MEMORY 테이블의 경우 메모리 오버플로 오류가 발생할 수 있었습니다. (Bug #27799513)

  • BLOB(또는 TEXT) 타입에서 더 작은 BLOB(또는 TEXT) 타입으로 변환할 때, 잘림 또는 데이터 손실에 대해 알리는 경고나 오류가 보고되지 않았습니다. 이제 strict SQL 모드에서는 적절한 오류가 발생하고, nonstrict SQL 모드에서는 경고가 발생합니다. (Bug #27788685, Bug #90266)

  • 디버그 빌드의 경우 my_strnxfrm_unicode_full_bin()이 assertion을 발생시킬 수 있었습니다. (Bug #27752619)

  • Undefined Behavior Sanitizer가 활성화된 빌드에서 GIS 계산 중 signed integer overflow가 발생할 수 있었습니다. (Bug #27751479, Bug #27744399, Bug #27811282)

  • 일부 경우 내부 함수 regexp::EvalExprToCharset()가 정렬되지 않은 주소에 대한 참조를 바인딩할 수 있었습니다. (Bug #27743722)

  • 키 파일을 읽을 수 없다는 서버 메시지의 심각도가 INFORMATION에서 WARNING으로 상향 조정되었습니다. (Bug #27737195)

  • 윈도우 함수와 rollup을 함께 사용하는 표현식에 대해 임시 테이블 필드가 생성되지 않아, 이러한 표현식이 포함된 쿼리가 실패했습니다. (Bug #27735167)

  • FIND_IN_SET(JSON_UNQUOTE(JSON_SET('{}','$','')), 1) 표현식이 올바르게 평가되지 않았습니다. (Bug #27731699)

  • MyISAM 쿼리 중 임시 테이블 생성에 실패하면 서버 종료가 발생할 수 있었습니다. 패치를 제공해 준 Facebook에 감사드립니다. (Bug #27724519, Bug #90145)

  • parser_max_mem_size는 저장 프로그램 정의를 파싱할 때 효과가 없었습니다. (Bug #27714748)

  • 음수 값을 비교하는 BETWEEN 절이 잘못된 결과로 이어질 수 있었습니다. (Bug #27691347)

  • 서버 오류 메시지의 일부 오타가 수정되었습니다. 기여해 준 Thomas Tsiakalakis에게 감사드립니다. (Bug #27688294, Bug #90048)

  • 이 스크립트는 더 이상 RPM 패키지에 포함되지 않습니다(이 스크립트는 mysqld 바이너리에 컴파일되어 있으므로 필요하지 않습니다): fill_help_tables.sql, mysql_sys_schema.sql, mysql_system_tables.sql, mysql_system_tables_data.sql, mysql_system_users.sql. (Bug #27672991)

  • 인덱스 병합 작업을 다시 시작할 때 Unique::io_cache가 올바르게 정리되지 않아, 디버그 빌드에서 assertion이 발생했습니다. (Bug #27599292)

  • ENUM 컬럼에서 바이너리 또는 16진 리터럴 값을 사용하면 데이터 딕셔너리 캐릭터셋에서 허용되지 않는 바이트가 포함된 문자열 타입이 생성되었습니다. (Bug #27592803)

  • 다음 조건에서 CONVERT()가 실패할 수 있었습니다:

    변환 결과의 크기가 max_allowed_packet보다 컸습니다.

    sql_mode가 ''(즉, 비어 있음)였습니다.

    결과의 캐릭터셋이 character_set_connection과 달랐습니다. (Bug #27592714)

  • ENUM 또는 SET 필드를 JSON_TABLE()과 함께 사용하면 예기치 않은 동작이 발생할 수 있었습니다. (Bug #27571251)

  • 호스트 이름 확인 오류로 인해 audit_log 플러그인이 실패할 수 있었습니다. (Bug #27567003)

  • log_error_verbosity=3일 때 실패한 연결 시도가 오류 로그에 기록되지 않았습니다. (Bug #27539838)

  • 값이 NULL인 지속 시스템 변수가 mysqld-auto.cnf에 잘못 기록되었습니다. (Bug #27512616)

  • 이전 코드 정리로 인해 FEDERATED 스토리지 엔진 실패가 발생했습니다. (Bug #27493633, Bug #89537)

    참조: 이 문제는 다음의 회귀입니다: Bug #25943754.

  • max_execution_time을 설정해도 full-text search와 함께 사용할 때 효과가 없는 경우가 있었습니다. (Bug #27155294)

  • 커밋되지 않은 트랜잭션을 읽으려고 시도하면 어설션이 발생했습니다. (Bug #26876608)

  • ALTER TABLE... REORGANIZE PARTITION...는 마지막 파티션이 아닌 파티션에 구문의 VALUES LESS THAN 부분이 누락된 경우 잘못된 동작을 초래할 수 있었습니다. (Bug #26791931)

  • 일부 경우 ER_DATA_TOO_LONG이 적절한 오류였을 때, 대신 ER_TRUNCATED_WRONG_VALUE_FOR_FIELD가 보고되었습니다. (Bug #26475237, Bug #87100)

  • 성공한 CHECK TABLE... FOR UPGRADE 작업을 추적하기 위해 현재 서버 버전 번호를 저장하는 last_checked_for_upgrade 컬럼이 mysql.tables 데이터 딕셔너리 테이블에 추가되었습니다. 이 데이터는 불필요하게 테이블을 다시 검사하지 않도록 이전에는 .frm 파일에 저장되었습니다. (Bug #24741307, Bug #83169)

  • sql_yacc.yy 파일에서 생성된 MYSQLparse() 함수가 Microsoft Visual C++ 컴파일러가 최적화를 포기하게 하는 크기 제한을 초과했습니다. 최적화를 복원하기 위해 /d2OptimizeHugeFunctions 컴파일러 스위치가 활성화되었습니다(Visual Studio 2017 이상에서 사용 가능). (Bug #24600301)

  • 부호 있는 정수와 부호 없는 정수의 곱에 대한 범위 검사가 잘못 수행될 수 있었습니다. (Bug #17081376, Bug #69715)

  • YEAR 컬럼에 대해 가능한 최댓값을 지정할 때 2155.0E00 또는 2.15E3 같은 실수 상수로 표현하면 실패했습니다. (Bug #91226, Bug #28172538)

  • SELECT_LEX 타입의 널 포인터 내에서 잠재적인 멤버 접근이 발생하지 않도록 했습니다. (Bug #90689, Bug #27945614)

  • SELECT 문에서 생성된 경고에 보고되는 라인 번호 계산에 사용되는 기준이 읽은 입력 로우 수에서 사용자가 보는 실제 로우 번호로 변경되었습니다. GROUP BY를 사용하는 문에서는 이 번호가 이제 집계 그룹화 수를 기준으로 합니다. (Bug #90667, Bug #27938507)

  • 테이블의 고유 값 수를 추정하는 데 사용할 수 있는 각 버킷의 고유 값 수에 대해 히스토그램에 포함된 추정값을 이제 Optimizer의 histograms::Histogram 인터페이스에서 사용할 수 있습니다. (Bug #90465, Bug #27872281)

  • 기본 데이터베이스가 선택되지 않은 경우 INFORMATION_SCHEMA.KEYWORDS 테이블에서 선택하는 작업이 실패했습니다. (Bug #90160, Bug #27729859)

  • ANALYZE TABLE UPDATE HISTOGRAM은 명령문 처리 중 lock_wait_timeout이 초과되었을 때 클라이언트에 오류 조건을 반환하지 못했습니다. (Bug #89738, Bug #27574375)

  • 생성 컬럼 g를 가진 테이블 t를 생성한 다음 ALTER TABLE t ALTER COLUMN g SET DEFAULT...를 실행할 수 있었습니다. 이제 이러한 방식으로 생성 컬럼의 기본값을 설정하려고 하면 Error 1221 Incorrect usage of DEFAULT and generated column과 함께 실패합니다. 이는 유사한 CREATE TABLE 명령문과 동일한 동작입니다. (Bug #88619, Bug #27164393)