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

MySQL 8.0.0 릴리스 노트

MySQL 8.0.0 Community Server 릴리스 노트 한국어 번역본

저자: Oracle 작성: 2016.09.12 약 82분 48,634자

계정 관리 관련 사항

  • 호환되지 않는 변경: mysql 시스템 데이터베이스의 grant 테이블은 이제 InnoDB(트랜잭션) 테이블입니다. 이전에는 이 테이블들이 MyISAM(비트랜잭션) 테이블이었습니다. 이 변경은 다음 테이블에 적용됩니다: user, db, tables_priv, columns_priv, procs_priv, proxies_priv.

    grant 테이블 스토리지 엔진 변경은 계정 관리 구문의 동작에 수반되는 변경의 기반이 됩니다. 이전에는 여러 사용자를 명명하는 계정 관리 구문이 일부 사용자에 대해서는 성공하고 다른 사용자에 대해서는 실패할 수 있었습니다. 이제 각 구문은 트랜잭션 방식이며, 명명된 모든 사용자에 대해 성공하거나 오류가 발생하면 롤백되어 아무 효과도 없습니다. 구문이 성공하면 바이너리 로그에 기록되지만, 실패하면 기록되지 않습니다. 이 경우 롤백이 발생하고 변경 사항은 적용되지 않습니다. 앞의 동작은 다음 구문에 적용됩니다: ALTER USER, CREATE ROLE, CREATE USER, DROP ROLE, DROP USER, GRANT, RENAME USER, REVOKE. (SET PASSWORD는 최대 한 명의 사용자에게만 적용되고 이미 사실상 트랜잭션 방식이므로 목록에 포함되지 않습니다.) 이러한 동작 변경의 부수 효과는 MySQL 5.7 마스터에서 부분적으로 완료된 계정 관리 구문이 MySQL 8.0 슬레이브에서 복제될 때 실패한다는 것입니다. 자세한 내용은 Atomic Data Definition Statement Support를 참조하십시오.

    이전 버전에서 이 MySQL 릴리스로 업그레이드하는 경우, 이러한 변경 사항을 mysql 시스템 데이터베이스에 반영하려면 mysql_upgrade를 실행하고 서버를 다시 시작해야 합니다.

    MySQL이 이전 버전에서 업그레이드되었지만 grant 테이블이 MyISAM에서 InnoDB로 업그레이드되지 않은 경우, 서버는 해당 테이블을 읽기 전용으로 간주하며 계정 관리 구문은 오류를 발생시킵니다.

    스토리지 엔진이 MyISAM에서 InnoDB로 변경됨에 따라, 권한 부여 테이블에서 ORDER BY 없이 SELECT를 수행하면 이전과 다른 로우 순서가 생성될 수 있습니다. 쿼리 결과에 특정 로우 정렬 특성이 필요하면 ORDER BY 절을 포함하십시오. (WL #7158, WL #9045)

  • MySQL은 이제 이름이 지정된 권한 모음인 역할을 지원합니다. 역할을 사용하면 권한 집합을 계정에 할당할 수 있으며, 원하는 권한 할당을 개념화하고 이를 구현하는 데 모두 개별 권한 부여의 편리한 대안을 제공합니다:

    • 역할을 생성하고 삭제할 수 있습니다.
    • 역할에 권한을 부여하고 역할에서 권한을 회수할 수 있습니다.
    • 역할을 사용자 계정에 부여하고 사용자 계정에서 회수할 수 있습니다.
    • 계정의 활성 역할은 해당 계정에 부여된 역할 중에서 선택할 수 있으며, 해당 계정의 세션 중에 변경할 수 있습니다.

    자세한 내용은 Using Roles를 참조하십시오.

    이제 ROLE은 예약어이며 식별자 따옴표 처리 없이 식별자로 사용할 수 없습니다.

    (WL #988)

C API 관련 사항

  • libmysqlclient 공유 라이브러리의 주 버전 번호가 MySQL 5.7에서 사용된 20에서 MySQL 8.0의 21로 증가했습니다. (Bug #77600, Bug #21363863)

캐릭터셋 지원

  • utf8mb4 유니코드 캐릭터셋에는 utf8mb4_0900_ai_ci라는 새 general 콜레이션이 있습니다. utf8mb4에는 또한 언어별 규칙이 적용 가능한 경우 우선한다는 점을 제외하고 utf8mb4_0900_ai_ci와 유사한 특성을 가진 여러 새 언어별 콜레이션이 있습니다. 언어별 콜레이션은 다음 표에 표시된 것처럼 콜레이션 이름의 ISO 639-1 언어 코드로 표시됩니다. 두 경우에는 언어 코드에 변형을 나타내는 추가 항목이 있습니다(독일어 전화번호부 순서, 전통 스페인어).

    Table 5 utf8mb4 UCA 9.0.0 언어별 콜레이션

    언어 콜레이션
    크로아티아어 utf8mb4_hr_0900_ai_ci
    체코어 utf8mb4_cs_0900_ai_ci
    덴마크어 utf8mb4_da_0900_ai_ci
    에스페란토 utf8mb4_eo_0900_ai_ci
    에스토니아어 utf8mb4_et_0900_ai_ci
    독일어 전화번호부 순서 utf8mb4_de_pb_0900_ai_ci
    헝가리어 utf8mb4_hu_0900_ai_ci
    아이슬란드어 utf8mb4_is_0900_ai_ci
    라트비아어 utf8mb4_lv_0900_ai_ci
    리투아니아어 utf8mb4_lt_0900_ai_ci
    폴란드어 utf8mb4_pl_0900_ai_ci
    고전 라틴어 utf8mb4_la_0900_ai_ci
    루마니아어 utf8mb4_ro_0900_ai_ci
    슬로바키아어 utf8mb4_sk_0900_ai_ci
    슬로베니아어 utf8mb4_sl_0900_ai_ci
    현대 스페인어 utf8mb4_es_0900_ai_ci
    전통 스페인어 utf8mb4_es_trad_0900_ai_ci
    스웨덴어 utf8mb4_sv_0900_ai_ci
    터키어 utf8mb4_tr_0900_ai_ci
    베트남어 utf8mb4_vi_0900_ai_ci

    utf8mb4_0900_ai_ci는 또한 다음 표의 언어에 대해 accent-insensitive, case-insensitive 콜레이션으로 동작합니다.

    Table 6 utf8mb4_0900_ai_ci가 적합한 언어

    언어 이름 언어 코드
    독일어(사전 순서) de
    영어 en
    캐나다 프랑스어(locale fr_CA) fr
    아일랜드 게일어 ga
    인도네시아어 id
    이탈리아어 it
    룩셈부르크어 lb
    말레이어 ms
    네덜란드어 nl
    포르투갈어 pt
    스와힐리어 sw
    줄루어 zu

    utf8mb4_da_0900_ai_ci는 또한 다음 표의 언어에 대해 accent-insensitive, case-insensitive 콜레이션으로 동작합니다.

    Table 7 utf8mb4_da_0900_ai_ci가 적합한 언어

    언어 이름 언어 코드
    노르웨이어 no
    노르웨이어 보크몰 nb
    노르웨이어 뉘노르스크 nn

    비언어별 utf8mb4_0900_ai_ci 및 언어별 utf8mb4_LANG_0900_ai_ci 유니코드 콜레이션은 각각 다음 특성을 가집니다:

    • 이 콜레이션은 Unicode Collation Algorithm (UCA) 9.0.0 및 Common Locale Data Repository (CLDR) v30을 기반으로 하며, 악센트 비구분이고 대소문자 비구분입니다. 이러한 특성은 콜레이션 이름의 _0900, _ai, _ci로 표시됩니다. 예외: utf8mb4_la_0900_ai_ci는 Classical Latin이 CLDR에 정의되어 있지 않기 때문에 CLDR을 기반으로 하지 않습니다.
    • 이 콜레이션은 [U+0, U+10FFFF] 범위의 모든 문자에 대해 작동합니다.
    • 이 콜레이션이 언어별이 아닌 경우, 보조 문자를 포함한 모든 문자를 기본 순서(아래 설명)로 정렬합니다. 이 콜레이션이 언어별인 경우, 해당 언어의 문자는 언어별 규칙에 따라 올바르게 정렬하고, 해당 언어에 속하지 않는 문자는 기본 순서로 정렬합니다.
    • 기본적으로 이 콜레이션은 DUCET 테이블(Default Unicode Collation Element Table)에 나열된 코드 포인트가 있는 문자를 해당 테이블에 할당된 가중치 값에 따라 정렬합니다. 이 콜레이션은 DUCET 테이블에 나열된 코드 포인트가 없는 문자를 UCA에 따라 구성된 암시적 가중치 값을 사용하여 정렬합니다.
    • 비언어별 콜레이션의 경우 축약 시퀀스의 문자는 별도의 문자로 처리됩니다. 언어별 콜레이션의 경우 축약이 문자 정렬 순서를 변경할 수 있습니다.

    자세한 내용은 Unicode Character Sets를 참조하십시오. (WL #9125, WL #9108, WL #9479)

컴파일 관련 사항

  • Microsoft Windows: Windows에서 MySQL을 빌드할 때 툴체인은 이제 가능한 경우 64비트 도구를 우선 사용합니다(이전에는 32비트). 이렇게 하면 링크 속도가 빨라지고 32비트 링커의 제한된 주소 공간과 관련된 문제를 방지합니다. (Bug #80675, Bug #22900585)

  • CMake는 이제 GNU gold 링커를 사용할 수 있고 명시적으로 비활성화되지 않은 경우 빌드 프로세스가 해당 링커로 링크하도록 합니다. 이 링커 사용을 비활성화하려면 -DUSE_LD_GOLD=OFF CMake 옵션을 지정하십시오. (Bug #23759968, Bug #82163)

  • WITH_EXTRA_CHARSETS CMake 옵션이 제거되었습니다. MySQL 빌드는 이제 기본적으로 모든 캐릭터셋으로 구성됩니다. 더 적은 캐릭터셋을 원하는 사용자는 cmake/character_sets.cmake를 직접 편집하고 서버를 다시 컴파일할 수 있습니다. (Bug #80005, Bug #22552125)

  • 서버 빌드를 위한 Boost 라이브러리의 최소 버전은 이제 1.60.0입니다. (Bug #79380, Bug #22253921)

  • 소스 코드 베이스를 정리하는 작업이 수행되었으며, 여기에는 다음이 포함됩니다: 불필요한 CMake 검사를 제거하고, 소스 파일에서 사용되지 않는 매크로를 제거하고, 의존성 수를 줄이고 더 모듈화되도록 헤더 파일을 재구성하고, 정의가 없는 함수 선언을 제거하고, 로컬로 작성된 함수를 업계 표준 라이브러리의 동등한 함수로 대체했습니다.

  • MySQL 소스 코드는 이제 C++11 기능을 허용하고 사용합니다. 지원되는 모든 플랫폼에서 양호한 수준의 C++11 지원을 활성화하기 위해, 이제 다음 최소 컴파일러 버전이 적용됩니다:

    • GCC: 4.8 이상
    • Clang: 3.4 이상(OS X의 Xcode 7)
    • Solaris Studio: 12.4 이상(Solaris 클라이언트 빌드만 해당)
    • Visual Studio: 2015
    • CMake: Windows에서는 필요한 Visual Studio 버전으로 인해 필요한 CMake 버전이 3.2.3 이상이 됩니다

    Solaris에서는 stlport 라이브러리가 더 이상 사용되지 않습니다. 이로 인해 SUNPRO_CXX_LIBRARY CMake 옵션은 쓸모없게 되었으므로 제거되었습니다. (WL #8896)

컴포넌트 관련 사항

  • MySQL Server에는 이제 서버 확장성을 개선하기 위한 컴포넌트 기반 인프라가 포함됩니다:

    • 컴포넌트는 서버와 다른 컴포넌트에서 사용할 수 있는 서비스를 제공합니다. (서비스 사용과 관련하여, 서버는 다른 컴포넌트와 동등한 하나의 컴포넌트입니다.) 컴포넌트는 자신이 제공하는 서비스를 통해서만 서로 상호작용합니다.
    • INSTALL COMPONENTUNINSTALL COMPONENT 문은 런타임에 컴포넌트를 조작하기 위한 SQL 인터페이스를 제공합니다.
    • 로더 서비스는 설치된 컴포넌트를 mysql.component 시스템 테이블에 등록하고, 이후 서버 재시작을 위해 시작 시퀀스 중에 등록된 컴포넌트를 설치합니다.

    컴포넌트 인프라 및 해당 SQL 수준 인터페이스에 대한 일반 정보는 MySQL Components를 참조하십시오. 컴포넌트의 내부 구현에 대한 정보는 https://dev.mysql.com/doc/index-other.html에서 제공되는 MySQL Server Doxygen 문서를 참조하십시오. (WL #4102)

설정 관련 사항

  • 호환되지 않는 변경; InnoDB: 이전에는 innodb_read_only 시스템 변수를 활성화하면 InnoDB 스토리지에 대해서만 테이블 생성 및 삭제가 방지되었습니다. MySQL 8.0부터는 innodb_read_only를 활성화하면 모든 스토리지 엔진에 대해 이러한 작업이 방지됩니다. 테이블 생성 및 삭제 작업은 mysql 시스템 데이터베이스의 데이터 딕셔너리 테이블을 수정하지만, 해당 테이블은 InnoDB 스토리지 엔진을 사용하며 innodb_read_only가 활성화된 경우 수정할 수 없습니다. 동일한 원칙은 데이터 딕셔너리 테이블 수정을 필요로 하는 다른 테이블 작업과, 권한 부여 테이블 및 funcplugin 테이블처럼 InnoDB 스토리지 엔진을 사용하는 mysql 데이터베이스의 다른 테이블을 수정하는 작업에도 적용됩니다. (Bug #21611899)

  • 메모리 매핑된 트랜잭션 코디네이터에 대해 하드코딩된 8KB 메모리 페이지 크기는 페이지 크기가 훨씬 더 큰 ARM64 및 PowerPC 같은 플랫폼에는 너무 작았습니다. 이제 서버는 하드코딩된 값을 사용하는 대신 현재 플랫폼의 페이지 크기를 가져오기 위해 시스템 호출을 실행합니다. --log-tc-size 옵션에 대한 결과로, 최소값과 기본값은 이제 페이지 크기의 6배입니다. 또한 값은 페이지 크기의 배수여야 합니다. 패치를 제공해 주신 Alexey Kopytov에게 감사드립니다. (Bug #23014086, Bug #80818, Bug #26931470, Bug #87995)

  • MySQL은 이제 SET 문 구문의 SET PERSIST 변형을 지원하여, 런타임에 설정 변경을 수행하고 해당 변경이 서버 재시작 후에도 지속되도록 합니다. SET GLOBAL과 마찬가지로, SET PERSIST는 동적(런타임에 설정 가능)인 모든 글로벌 시스템 변수에 대해 허용됩니다. 이 문은 런타임 변수 값을 변경하지만, 또한 변수 설정을 데이터 디렉터리의 mysqld-auto.cnf라는 옵션 파일에 기록합니다. 시작 시 서버는 다른 모든 옵션 파일 이후에 이 파일을 처리합니다. 자세한 내용은 Persisted System Variables를 참조하십시오.

    각 시스템 변수가 가장 최근에 어떻게 설정되었는지를 보여 주는 정보를 제공하기 위해, Performance Schema에는 이제 각 시스템 변수와 해당 변수가 값을 가져온 소스를 나열하는 variables_info 테이블이 있습니다. Performance Schema variables_info Table을 참조하십시오.

    이전 버전에서 이 MySQL 릴리스로 업그레이드하는 경우, 이 변경 사항을 Performance Schema에 반영하려면 mysql_upgrade를 실행하고 서버를 재시작해야 합니다. (WL #8688)

데이터 딕셔너리 관련 사항

  • 호환되지 않는 변경: MySQL Server는 이제 트랜잭션 테이블에 있는 데이터베이스 객체에 대한 정보를 포함하는 전역 데이터 딕셔너리를 통합합니다. 이전 MySQL 릴리스에서는 딕셔너리 데이터가 메타데이터 파일 및 비트랜잭션 시스템 테이블에 저장되었습니다.

    데이터 딕셔너리가 활성화된 서버는 데이터 딕셔너리가 없는 서버와 비교하여 몇 가지 일반적인 운영상 차이를 수반합니다. Data Dictionary Usage Differences를 참조하십시오. 또한 MySQL 8.0으로 업그레이드하는 경우, 업그레이드 절차는 이전 MySQL 릴리스와 다소 다르며 특정 선행 조건을 확인하여 설치의 업그레이드 준비 상태를 검증해야 합니다. 자세한 내용은 Upgrading MySQL, 특히 Preparing Your Installation for Upgrade를 참조하십시오.

    InnoDB는 MySQL 8.0.0 릴리스에서 계속 자체 데이터 딕셔너리를 사용합니다.

    다음 목록은 이 변경의 주요 영향을 간략히 설명합니다:

    • 이전에 베이스 테이블 및 뷰와 연결되었던 .frm 메타데이터 파일은 더 이상 존재하지 않습니다. 이전에 .frm 파일에 저장되었던 메타데이터는 이제 데이터 딕셔너리 테이블에 저장됩니다.

      마찬가지로, 이전에 .TRG.TRN 파일에 저장되었던 트리거 메타데이터는 데이터 딕셔너리 테이블에 저장되며, 해당 파일은 더 이상 존재하지 않습니다.

    • .frm 파일이 제거됨에 따라, .frm 파일 구조가 부과하던 64KB 테이블 정의 크기 제한이 제거됩니다.

    • .frm 파일이 제거됨에 따라, INFORMATION_SCHEMA.TABLES VERSION 필드는 이제 MySQL 5.7에서 사용된 마지막 .frm 파일 버전인 10의 하드코딩된 값을 보고합니다.

    • .frm 파일이 제거됨에 따라, sync_frm 시스템 변수가 제거됩니다.

    • MySQL 데이터 딕셔너리를 제공하는 새로운 딕셔너리 객체 캐시는 이전에 접근한 데이터 딕셔너리 객체를 메모리에 저장하여 객체 재사용을 가능하게 하고 디스크 I/O를 최소화합니다. 가장 최근에 사용되지 않은 객체를 메모리에서 제거하기 위해 LRU 기반 제거 전략이 사용됩니다. 이 캐시는 서로 다른 객체 타입을 저장하는 여러 파티션으로 구성됩니다. 자세한 내용은 Dictionary Object Cache를 참조하십시오.

    • 새로운 내부 데이터 딕셔너리 API를 통해 서버, 내부 스토리지 엔진 및 플러그인이 MySQL 데이터 딕셔너리에 접근하고 데이터를 저장할 수 있습니다. 스키마, 테이블스페이스, 테이블스페이스 파일, 테이블, 파티셔닝된 테이블, 테이블 파티션 데이터, 트리거, 저장 루틴, 이벤트, 테이블 객체, 뷰, 캐릭터셋 및 콜레이션을 처리하기 위한 내부 데이터 딕셔너리 API가 도입되었습니다.

      이 변경으로 CREATE TRIGGERDROP TRIGGER 작업에 대한 데이터 딕셔너리 업데이트와 바이너리 로그 쓰기가 단일 원자적 트랜잭션으로 결합됩니다.

    • 데이터 딕셔너리 테이블은 보이지 않지만, 대부분의 경우 대신 쿼리할 수 있는 대응되는 INFORMATION_SCHEMA 테이블이 있습니다. 이를 통해 애플리케이션 사용을 위한 안정적인 INFORMATION_SCHEMA 인터페이스를 유지하면서, 서버 개발이 진행됨에 따라 기반 데이터 딕셔너리 테이블을 변경할 수 있습니다.

      일부 INFORMATION_SCHEMA 테이블은 데이터 딕셔너리 테이블에 대한 뷰로 완전히 다시 구현되었습니다:

      CHARACTER_SETS
      COLLATIONS
      COLLATION_CHARACTER_SET_APPLICABILITY
      COLUMNS
      KEY_COLUMN_USAGE
      SCHEMATA
      STATISTICS
      TABLES
      TABLE_CONSTRAINTS
      VIEWS
      

      해당 테이블에 대한 쿼리는 이제 다른 더 느린 수단이 아니라 데이터 딕셔너리 테이블에서 정보를 가져오기 때문에 더 효율적입니다. 특히, 데이터 딕셔너리 테이블에 대한 뷰인 각 INFORMATION_SCHEMA 테이블에 대해 다음이 적용됩니다:

      • 서버는 더 이상 INFORMATION_SCHEMA 테이블의 각 쿼리에 대해 임시 테이블을 생성할 필요가 없습니다.
      • 기반 데이터 딕셔너리 테이블이 이전에는 디렉터리 스캔(예: 데이터베이스 내에서 데이터베이스 이름 또는 테이블 이름을 열거하기 위한 경우) 또는 파일 열기 작업(예: .frm 파일에서 정보를 읽기 위한 경우)으로 얻었던 값을 저장하는 경우, 해당 값에 대한 INFORMATION_SCHEMA 쿼리는 이제 대신 테이블 조회를 사용합니다. (또한, 뷰가 아닌 INFORMATION_SCHEMA 테이블의 경우에도 데이터베이스 및 테이블 이름과 같은 값은 데이터 딕셔너리에서 조회하여 가져오며 디렉터리 또는 파일 스캔이 필요하지 않습니다.)
      • 기반 데이터 딕셔너리 테이블의 인덱스를 통해 Optimizer가 효율적인 쿼리 실행 계획을 구성할 수 있으며, 이는 쿼리마다 임시 테이블을 사용하여 INFORMATION_SCHEMA 테이블을 처리했던 이전 구현에는 해당하지 않았습니다.

      앞의 개선 사항은 데이터 딕셔너리 테이블에 대한 뷰인 INFORMATION_SCHEMA 테이블에 대응하는 정보를 표시하는 SHOW 문에도 적용됩니다. 예를 들어, SHOW DATABASESSCHEMATA 테이블과 동일한 정보를 표시합니다.

      INFORMATION_SCHEMA 쿼리가 테이블 통계를 검색하는 경우, 서버는 이제 INFORMATION_SCHEMA 테이블에 캐시된 통계를 사용하거나 스토리지 엔진에서 직접 최신 통계를 가져올 수 있습니다. information_schema_stats 시스템 변수는 서버가 사용하는 통계 소스를 제어합니다.

      • information_schema_statsCACHED(기본값)인 경우, 서버는 STATISTICSTABLES 테이블에 저장된 캐시된 통계를 사용합니다.

      • information_schema_statsLATEST인 경우, 서버는 스토리지 엔진에서 직접 통계를 가져옵니다. 이 경우 서버는 STATISTICSTABLES에 대한 쿼리를 STATISTICS_DYNAMICTABLES_DYNAMIC 테이블에 저장된 최신 통계에 대한 쿼리로 처리합니다.

        영향을 받는 INFORMATION_SCHEMA 테이블 통계 컬럼은 다음을 포함합니다:

        STATISTICS.CARDINALITY
        TABLES.AUTO_INCREMENT
        TABLES.AVG_ROW_LENGTH
        TABLES.CHECKSUM
        TABLES.CHECK_TIME
        TABLES.CREATE_TIME
        TABLES.DATA_FREE
        TABLES.DATA_LENGTH
        TABLES.INDEX_LENGTH
        TABLES.MAX_DATA_LENGTH
        TABLES.TABLE_ROWS
        TABLES.UPDATE_TIME
        

      자세한 내용은 Optimizing INFORMATION_SCHEMA Queries를 참조하십시오.

    • foreign_keysforeign_key_column_usage 테이블은 이제 외래 키 정보를 저장합니다. 외래 키 정보를 가져오는 표준 SQL 방식은 INFORMATION_SCHEMA REFERENTIAL_CONSTRAINTSKEY_COLUMN_USAGE 테이블을 사용하는 것입니다. 이러한 테이블은 이제 foreign_keys, foreign_key_column_usage 및 기타 데이터 딕셔너리 테이블에 대한 뷰로 구현됩니다.

      일부 외래 키 오류에 대해, 서버는 이제 더 적절하고 더 많은 정보를 제공하는 오류 메시지를 생성합니다.

    비호환성: 이전에는 MySQL이 64자를 초과하는 외래 키 이름을 지원했습니다. foreign_keysforeign_key_column_usage 테이블에 저장되는 외래 키 이름은 SQL 표준에 따라 최대 64자이므로, 더 긴 외래 키 이름은 더 이상 허용되지 않습니다.

    • 데이터 딕셔너리는 데이터베이스 객체에 대한 정보를 제공하므로, 서버는 더 이상 데이터베이스를 찾기 위해 데이터 디렉터리의 디렉터리 이름을 검사하지 않습니다. 따라서 --ignore-db-dir 옵션과 ignore_db_dirs 시스템 변수는 불필요해졌으며 제거되었습니다. 이에 따라 시스템 설정과 애플리케이션 프로그램을 업데이트하십시오.

    • 이전에는 CREATE TEMPORARY TABLE을 사용하여 존재하지 않는 데이터베이스의 이름으로 테이블 이름을 한정함으로써 존재하지 않는 데이터베이스에 테이블을 생성할 수 있었습니다. 이는 더 이상 허용되지 않습니다.

    • 시스템 테이블 변경 사항:

      • 많은 시스템 테이블이 MyISAM(비트랜잭션) 테이블에서 InnoDB(트랜잭션) 테이블로 변환되었습니다. 예를 들어, 이 릴리스 노트의 다른 곳에서 설명한 것처럼 grant 테이블은 이제 InnoDB 테이블입니다. 다른 예시는 다음과 같습니다.

      • mysql 시스템 데이터베이스에서 로드 가능한 함수 정보를 저장하는 func 테이블은 이제 InnoDB(트랜잭션) 테이블입니다. 이전에는 MyISAM(비트랜잭션) 테이블이었습니다.

        이 변경의 결과로, CREATE FUNCTIONDROP FUNCTION 문은 로드 가능한 함수에 사용되는 경우에도 암시적 커밋을 발생시킵니다(암시적 커밋을 발생시키는 문 참조). 이전에는 저장 함수에 사용될 때 암시적 커밋을 발생시켰지만, 로드 가능한 함수에 대해서는 그렇지 않았습니다.

      • 이전에는 저장 루틴 및 이벤트에 대한 정보가 mysql 시스템 데이터베이스의 procevent 테이블에 저장되었습니다. 이러한 테이블은 더 이상 사용되지 않습니다. 대신 저장 루틴 및 이벤트에 대한 정보는 mysql 시스템 데이터베이스의 routines, events, parameters 데이터 딕셔너리 테이블에 저장됩니다. 이전 테이블은 MyISAM(비트랜잭션) 스토리지 엔진을 사용했습니다. 새 테이블은 InnoDB(트랜잭션) 엔진을 사용합니다.

        이전에는 잘못된 문자가 포함된 저장 루틴을 생성하면 경고가 발생했습니다. 이제는 오류가 발생합니다.

      • 시스템 테이블(예: 시간대 또는 로그 테이블)에 대한 접근을 비시스템 테이블에 대한 접근과 구분할 수 있도록, 서버는 System lockOpening tables 스레드 상태 대신 Locking system tablesOpening system tables 스레드 상태를 사용합니다. General Thread States를 참조하십시오.

    • InnoDB 변경 사항:

      • 지속 InnoDB 테이블스페이스에는 이제 직렬화된 형식의 딕셔너리 객체 데이터인 Serialized Dictionary Information (SDI)을 위한 트랜잭션 스토리지가 포함됩니다. 앞에서 언급한 .frm 및 트리거 메타데이터 파일이 사라지는 것과 함께, .SDI 파일이 나타나는 것을 볼 수 있습니다. 이러한 파일은 직렬화된 딕셔너리 정보 파일입니다. SDI 트랜잭션 스토리지는 아직 완전히 구현되지 않은 진행 중인 기능을 위해 예약되어 있습니다.
      • 새 명령줄 유틸리티인 ibd2sdi는 지속 InnoDB 테이블스페이스에서 직렬화된 딕셔너리 정보(SDI)를 추출하는 데 사용됩니다. 이 릴리스의 지속 InnoDB 테이블스페이스에는 SDI 데이터가 없습니다. ibd2sdi 유틸리티는 향후 사용을 위해 예약되어 있습니다.
      • InnoDB 시작 코드는 MySQL 데이터 딕셔너리 기능과 관련된 MySQL 초기화 변경 사항을 지원하도록 리팩터링되었습니다.
    • 업그레이드 및 다운그레이드 관련 영향:

      • MySQL 5.7에서 MySQL 8.0으로 업그레이드하려면 Upgrading MySQL에 설명된 업그레이드 절차를 수행해야 합니다.
      • MySQL 8.0에서 MySQL 5.7로 다운그레이드하는 것은 논리적 다운그레이드 방법(mysqldump 다운그레이드)을 사용하는 경우에만 지원됩니다. 인플레이스 다운그레이드는 지원되지 않습니다.

    (Bug #80481, Bug #22811659, WL #6378, WL #6383, WL #7896, WL #6384, WL #7897, WL #6388, WL #7898, WL #7284, WL #7630, WL #7836, WL #6390, WL #6382, WL #6389, WL #6387, WL #6385, WL #7053, WL #7158, WL #8980, WL #8150, WL #7488, WL #7066, WL #6929, WL #6391, WL #6392, WL #6599)

데이터 타입 관련 사항

  • 비트 함수 및 연산자는 BIT_COUNT(), BIT_AND(), BIT_OR(), BIT_XOR(), &, |, ^, ~, <<, 및 >>로 구성됩니다. MySQL 8.0 이전에는 비트 함수 및 연산자가 BIGINT(64비트 정수) 인수를 요구하고 BIGINT 값을 반환했으므로, 최대 범위가 64비트였습니다. BIGINT가 아닌 인수는 연산을 수행하기 전에 BIGINT로 변환되었으며 잘림이 발생할 수 있었습니다. 이제 비트 함수 및 연산자는 바이너리 문자열 타입 인수(BINARY, VARBINARY, 및 BLOB 타입)를 허용하고 같은 타입의 값을 반환하므로, 64비트보다 큰 인수를 받고 반환 값을 생성할 수 있습니다. 비바이너리 문자열 인수는 이전과 같이 BIGINT로 변환되어 그에 따라 처리됩니다.

    비트 함수 및 연산자에 대해 바이너리 문자열 인수를 허용하면 더 큰 값을 조작하기 쉬워질 뿐만 아니라, UUID 및 IPv6 값과 같은 특정 타입의 데이터에 대해 이전에는 쉽게 수행할 수 없었던 비트 연산을 수행하기도 쉬워집니다. 예시는 Bit Functions and Operators를 참조하십시오.

    이 동작 변경의 한 가지 영향은 바이너리 문자열 인수에 대한 비트 연산이 MySQL 8.0에서 5.7과 다른 결과를 생성할 수 있다는 점입니다. MySQL 5.7과 8.0 사이의 잠재적 비호환성에 대해 MySQL 5.7에서 준비하는 방법에 대한 정보는 MySQL 5.7 Reference ManualBit Functions and Operators를 참조하십시오. (WL #8699)

사용 중단 및 제거 관련 사항

  • 중요한 변경; InnoDB: 다음 InnoDB 파일 형식 설정 옵션은 MySQL 5.7.7에서 deprecated 되었으며 이제 제거되었습니다:

    • innodb_file_format
    • innodb_file_format_check
    • innodb_file_format_max
    • innodb_large_prefix

    파일 형식 설정 옵션은 MySQL 5.1의 이전 InnoDB 버전과 호환되는 테이블을 생성하는 데 필요했습니다. 이제 MySQL 5.1이 제품 수명 주기의 끝에 도달했으므로, 이러한 옵션은 더 이상 필요하지 않습니다.

    FILE_FORMAT 컬럼은 INNODB_SYS_TABLESINNODB_SYS_TABLESPACES Information Schema 테이블에서 제거되었습니다. (WL #7704)

  • InnoDB: innodb_stats_sample_pages 시스템 변수가 제거되었습니다. innodb_stats_sample_pages는 MySQL 5.6.3에서 deprecated 되었으며 innodb_stats_transient_sample_pages로 대체되었습니다. (WL #8903)

  • InnoDB: innodb_locks_unsafe_for_binlog 시스템 변수가 제거되었습니다. innodb_locks_unsafe_for_binlog는 MySQL 5.6.3에서 deprecated 되었습니다. READ COMMITTED 격리 수준은 유사한 기능을 제공합니다. (WL #8894)

  • InnoDB: XA 트랜잭션에서 2단계 커밋 지원을 활성화하는 innodb_support_xa 시스템 변수가 제거되었습니다. MySQL 5.7.10부터 XA 트랜잭션에서 2단계 커밋에 대한 InnoDB 지원은 항상 활성화됩니다. (WL #8843)

  • Deprecated된 mysql_install_db 프로그램이 MySQL 배포판에서 제거되었습니다. 데이터 디렉터리 초기화는 대신 --initialize 또는 --initialize-insecure 옵션과 함께 mysqld를 호출하여 수행해야 합니다. 또한 mysql_install_db에서 사용하던 mysqld의 Deprecated된 --bootstrap 옵션이 제거되었으며, mysql_install_db의 설치 위치를 제어하던 INSTALL_SCRIPTDIR CMake 옵션이 제거되었습니다.

    이전에는 버전 1 테스트 스위트 코드가 MySQL 소스 배포판의 mysql-test/lib/v1 디렉터리에 있었습니다. 이 코드는 mysql_install_db를 사용했으며 제거되었습니다. MYSQL_INSTALL_DB 환경 변수와 MTR_VERSION 환경 변수 값 1은 더 이상 지원되지 않습니다. (WL #9071)

  • mysql_plugin 유틸리티가 제거되었습니다. 대안으로는 --plugin-load 또는 --plugin-load-add 옵션을 사용하여 서버 시작 시 플러그인을 로드하거나, INSTALL PLUGIN 문을 사용하여 런타임에 로드하는 방법이 있습니다. (WL #8927)

  • Deprecated된 mysql_shutdown() C API 함수와 해당 COM_SHUTDOWN 클라이언트/서버 프로토콜 명령이 제거되었습니다. 대신 mysql_query()를 사용하여 SHUTDOWN 문을 실행하십시오. (WL #9014)

Doxygen 관련 사항

  • MySQL 소스 코드는 내부 문서화에 Doxygen을 사용하도록 업데이트되었습니다. 이 작업은 진행 중입니다. 새 MySQL 버전이 배포됨에 따라 Doxygen 문서는 업데이트되며, 최신 버전은 항상 https://dev.mysql.com/doc/index-other.html에서 사용할 수 있습니다.

    또한 Generating MySQL Doxygen Documentation Content의 지침을 사용하여 MySQL 소스 배포판에서 Doxygen 콘텐츠를 로컬로 생성할 수도 있습니다. (WL #8493)

Optimizer 관련 사항

  • InnoDB: 스토리지 엔진 인터페이스는 이제 Optimizer가 여러 로우를 읽을 것으로 예상하는 스캔에 사용할 레코드 버퍼의 크기에 대한 정보를 제공할 수 있게 합니다. 버퍼 크기는 예상 크기에 따라 달라질 수 있습니다. InnoDB는 이 가변 크기 버퍼링 기능을 사용하여 로우 프리페칭을 활용하고, 래칭 및 B-tree 탐색의 오버헤드를 줄입니다. 이전에는 InnoDB가 작은 고정 크기 버퍼를 사용했습니다. (WL #7093)

  • Optimizer는 이제 파생 테이블 또는 뷰를 외부 쿼리 블록에 병합할지, 아니면 내부 임시 테이블을 사용하여 구체화할지를 지정하기 위한 테이블 수준 MERGENO_MERGE 힌트를 지원합니다. 예:

    SELECT /*+ MERGE(dt) */ * FROM (SELECT * FROM t1) AS dt;
    SELECT /*+ NO_MERGE(dt) */ * FROM (SELECT * FROM t1) AS dt;
    

    자세한 내용은 Optimizer Hints를 참조하십시오. (Bug #79554, Bug #22328100, WL #9307)

  • MySQL은 이제 보이지 않는 인덱스를 지원합니다. 보이지 않는 인덱스는 Optimizer가 전혀 사용하지 않지만, 그 외에는 일반적으로 유지됩니다. 인덱스는 기본적으로 보이는 상태입니다. 보이지 않는 인덱스를 사용하면 해당 인덱스가 필요한 것으로 판명될 경우 되돌려야 하는 파괴적인 변경을 수행하지 않고도, 인덱스 제거가 쿼리 성능에 미치는 영향을 테스트할 수 있습니다. 이 기능은 기본 키가 아닌 인덱스에 대해 InnoDB 테이블에 적용됩니다.

    새 인덱스에 대해 인덱스가 보이지 않는지 여부를 명시적으로 제어하려면 CREATE TABLE, CREATE INDEX 또는 ALTER TABLE의 인덱스 정의 일부로 VISIBLE 또는 INVISIBLE 키워드를 사용하십시오. 기존 인덱스의 보이지 않음 상태를 변경하려면 ALTER TABLE... ALTER INDEX 작업에 VISIBLE 또는 INVISIBLE 키워드를 사용하십시오. 자세한 내용은 Invisible Indexes를 참조하십시오. (WL #8697)

  • mysql 시스템 데이터베이스에는 이제 컬럼 값에 대한 통계를 저장하도록 설계된 column_stats 테이블이 포함됩니다. 자세한 내용은 Optimizer Statistics를 참조하십시오. (WL #8706)

패키징 관련 사항

  • 이전 MySQL 시리즈의 Development Milestone 릴리스는 development milestone N을 나타내기 위해 -mN 접미사를 사용하여 번호가 지정되었습니다. MySQL 8.0에서는 development 릴리스가 -dmr 접미사를 사용합니다. 예를 들어, 이 MySQL 릴리스는 8.0.0-dmr로 번호가 지정되었습니다. (Bug #80408, Bug #22748154)

  • 이 릴리스 노트의 다른 곳에서 설명한 C++11 기능 사용의 결과로, 다음 패키징 변경이 적용되었습니다:

    • Red Hat Enterprise Linux 5 및 Oracle Linux 5 RPM에 대한 지원이 중단되었습니다
    • Generic binary tarball 빌드가 Red Hat Enterprise Linux 6으로 이동되었습니다

    (WL #8896)

Parser 관련 사항

  • 비호환 변경: SELECTUNION에 대한 Parser 규칙이 더 일관되도록(동일한 SELECT 문법이 이러한 각 컨텍스트에서 균일하게 적용됩니다) 그리고 중복을 줄이도록 리팩터링되었습니다. 이 작업으로 인해 사용자에게 보이는 여러 효과가 발생했으며, 특정 구문을 다시 작성해야 할 수 있습니다:

    • NATURAL JOIN은 표준 SQL을 준수하여 선택적 INNER 키워드(NATURAL INNER JOIN)를 허용합니다.

    • 괄호가 없는 right-deep 조인이 표준 SQL을 준수하여 허용됩니다(예: ... JOIN... JOIN... ON... ON).

    • 이제 STRAIGHT_JOIN은 다른 내부 조인과 유사하게 USING 절을 허용합니다.

    • Parser는 쿼리 표현식 주위의 괄호를 허용합니다. 예를 들어 (SELECT... UNION SELECT...)가 허용됩니다.

    • Parser는 SQL_CACHESQL_NO_CACHE 쿼리 수정자의 문서화된 허용 배치 위치를 더 잘 따릅니다.

    • 이전에는 서브쿼리에서만 허용되었던 UNION의 왼쪽 중첩이 이제 최상위 구문에서도 허용됩니다. 예를 들어 이제 이 구문은 유효한 것으로 허용됩니다:

      (SELECT 1 UNION SELECT 1) UNION SELECT 1;
      
    • 잠금 절(FOR UPDATE, LOCK IN SHARE MODE)은 비-UNION 쿼리에서만 허용됩니다. 이는 잠금 절을 포함하는 SELECT 구문에 괄호를 사용해야 함을 의미합니다. 이 구문은 더 이상 유효한 것으로 허용되지 않습니다:

      SELECT 1 FOR UPDATE UNION SELECT 1 FOR UPDATE;
      

      대신, 구문을 다음과 같이 작성하십시오:

      (SELECT 1 FOR UPDATE) UNION (SELECT 1 FOR UPDATE);
      

    (Bug #11746363, Bug #25734, WL #8083, WL #8907)

  • CREATE TABLE에 대한 Parser 규칙이 컨텍스트에 독립적이도록, 그리고 유지 관리성과 확장성을 개선하도록 리팩터링되었습니다. 이 작업으로 인해 사용자에게 보이는 여러 효과가 발생했습니다:

    • 생성 컬럼의 경우 NOT NULL NULL을 포함하면 NOT NULL 속성을 포함하는 컬럼이 되었으며, 이는 비생성 컬럼과 달랐습니다. 이제 이러한 정의는 최종 속성 NULL을 사용하며, 그 결과 nullable 컬럼이 됩니다(비생성 컬럼과 일관됩니다).
    • CREATE TEMPORARY TABLE은 더 이상 TEMPORARY의 여러 인스턴스를 허용하지 않습니다.
    • 이전에는 PARSE_GCOL_EXPR가 키워드였으며 저장 프로그램에서 레이블로 사용할 수 없었습니다. 이제 더 이상 키워드가 아니며 레이블로 사용할 수 있습니다.
    • 일부 문법 오류에 대한 메시지는 구문 내 오류 위치와 관련하여 더 정밀해졌습니다.

    (WL #7840, WL #8067, WL #8433, WL #8434, WL #8345)

Performance Schema 관련 사항

  • 비호환 변경: Performance Schema는 이제 서버 오류(및 경고)를 계측하고, 일련의 요약 테이블을 통해 이에 대한 통계 정보를 노출합니다:

    자세한 내용은 Error Summary Tables를 참조하십시오

    이전 버전에서 이 MySQL 릴리스로 업그레이드하는 경우, 이러한 변경 사항을 performance_schema 데이터베이스에 반영하려면 mysql_upgrade를 실행하고 서버를 재시작해야 합니다.

    앞선 변경 사항의 결과로 두 개의 서버 오류 심볼 이름이 변경되었습니다: ER_CANT_SET_ENFORCE_GTID_CONSISTENCY_ON_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS는 이제 ER_CANT_ENFORCE_GTID_CONSISTENCY_WITH_ONGOING_GTID_VIOLATING_TX이고, ER_SET_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TRANSACTIONS는 이제 ER_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TX입니다.

    또한 여러 서버 오류 코드는 더 이상 서버에서 사용되지 않는 것으로 확인되어 obsolete로 제거되었습니다. 이러한 오류 중 하나라도 구체적으로 테스트하는 애플리케이션은 업데이트해야 합니다:

    ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE
    ER_BINLOG_ROW_RBR_TO_SBR
    ER_BINLOG_ROW_WRONG_TABLE_DEF
    ER_CANT_ACTIVATE_LOG
    ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION
    ER_CANT_CREATE_FEDERATED_TABLE
    ER_CANT_CREATE_SROUTINE
    ER_CANT_DELETE_FILE
    ER_CANT_GET_WD
    ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF
    ER_CANT_SET_WD
    ER_CANT_WRITE_LOCK_LOG_TABLE
    ER_CREATE_DB_WITH_READ_LOCK
    ER_CYCLIC_REFERENCE
    ER_DB_DROP_DELETE
    ER_DELAYED_NOT_SUPPORTED
    ER_DIFF_GROUPS_PROC
    ER_DISK_FULL
    ER_DROP_DB_WITH_READ_LOCK
    ER_DROP_USER
    ER_DUMP_NOT_IMPLEMENTED
    ER_ERROR_DURING_CHECKPOINT
    ER_ERROR_ON_CLOSE
    ER_EVENTS_DB_ERROR
    ER_EVENT_CANNOT_DELETE
    ER_EVENT_CANT_ALTER
    ER_EVENT_COMPILE_ERROR
    ER_EVENT_DATA_TOO_LONG
    ER_EVENT_DROP_FAILED
    ER_EVENT_MODIFY_QUEUE_ERROR
    ER_EVENT_NEITHER_M_EXPR_NOR_M_AT
    ER_EVENT_OPEN_TABLE_FAILED
    ER_EVENT_STORE_FAILED
    ER_EXEC_STMT_WITH_OPEN_CURSOR
    ER_FAILED_ROUTINE_BREAK_BINLOG
    ER_FLUSH_MASTER_BINLOG_CLOSED
    ER_FORM_NOT_FOUND
    ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF__UNUSED
    ER_FRM_UNKNOWN_TYPE
    ER_GOT_SIGNAL
    ER_GRANT_PLUGIN_USER_EXISTS
    ER_GTID_MODE_REQUIRES_BINLOG
    ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST
    ER_HASHCHK
    ER_INDEX_REBUILD
    ER_INNODB_NO_FT_USES_PARSER
    ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR
    ER_LOAD_DATA_INVALID_COLUMN_UNUSED
    ER_LOGGING_PROHIBIT_CHANGING_OF
    ER_MALFORMED_DEFINER
    ER_MASTER_KEY_ROTATION_ERROR_BY_SE
    ER_NDB_CANT_SWITCH_BINLOG_FORMAT
    ER_NEVER_USED
    ER_NISAMCHK
    ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR
    ER_NO_FILE_MAPPING
    ER_NO_GROUP_FOR_PROC
    ER_NO_RAID_COMPILED
    ER_NO_SUCH_KEY_VALUE
    ER_NO_SUCH_PARTITION__UNUSED
    ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE
    ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED
    ER_ORDER_WITH_PROC
    ER_PARTITION_SUBPARTITION_ERROR
    ER_PARTITION_SUBPART_MIX_ERROR
    ER_PART_STATE_ERROR
    ER_PASSWD_LENGTH
    ER_QUERY_ON_MASTER
    ER_RBR_NOT_AVAILABLE
    ER_SKIPPING_LOGGED_TRANSACTION
    ER_SLAVE_CHANNEL_DELETE
    ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT
    ER_SLAVE_MUST_STOP
    ER_SLAVE_WAS_NOT_RUNNING
    ER_SLAVE_WAS_RUNNING
    ER_SP_GOTO_IN_HNDLR
    ER_SP_PROC_TABLE_CORRUPT
    ER_SQL_MODE_NO_EFFECT
    ER_SR_INVALID_CREATION_CTX
    ER_TABLE_NEEDS_UPG_PART
    ER_TOO_MUCH_AUTO_TIMESTAMP_COLS
    ER_UNEXPECTED_EOF
    ER_UNION_TABLES_IN_DIFFERENT_DIR
    ER_UNSUPPORTED_BY_REPLICATION_THREAD
    ER_UNUSED1
    ER_UNUSED2
    ER_UNUSED3
    ER_UNUSED4
    ER_UNUSED5
    ER_UNUSED6
    ER_VIEW_SELECT_DERIVED_UNUSED
    ER_WRONG_MAGIC
    ER_WSAS_FAILED
    

    (WL #8058)

  • 이전에는 Performance Schema events_statements_current 테이블의 DIGESTDIGEST_TEXT 컬럼이 명령문 실행이 끝난 후에만 채워졌습니다. 이제 해당 컬럼은 파싱 직후와 명령문 실행이 시작되기 전에 채워집니다. 이를 통해 모니터링 애플리케이션은 명령문 실행 중에 명령문 다이제스트 정보에 액세스할 수 있습니다. (Bug #23336542)

  • 이전에는 Performance Schema 최적화가 모니터링 데이터 수집에 수반되는 오버헤드를 줄이는 데 중점을 두었습니다. 이러한 이전 작업을 보완하여, 이제 해당 데이터를 가져오는 Performance Schema 쿼리에 대해서도 오버헤드가 줄어듭니다. 이는 대부분의 Performance Schema 테이블에 인덱스를 추가함으로써 달성되며, 이를 통해 optimizer는 전체 테이블 스캔 이외의 실행 계획에 액세스할 수 있습니다. 이러한 인덱스는 해당 테이블을 사용하는 sys 스키마 뷰와 같은 관련 객체의 성능도 향상시킵니다. 자세한 내용은 Performance Schema 쿼리 최적화를 참조하십시오. (WL #6616)

  • setup_actors Performance Schema 테이블의 ROLE 컬럼 크기가 16자에서 32자로 증가했습니다. (WL #9262)

보안 관련 사항

  • validate_password_check_user_name 시스템 변수는 이제 비활성화되는 대신 기본적으로 활성화됩니다. 이는 validate_password 플러그인이 활성화되어 있을 때, 이제 기본적으로 현재 세션 사용자 이름과 일치하는 비밀번호를 거부함을 의미합니다. (WL #9480)

  • 클라이언트 측 --ssl--ssl-verify-server-cert 옵션이 제거되었습니다. --ssl=1 또는 --enable-ssl 대신 --ssl-mode=REQUIRED를 사용하십시오. --ssl=0, --skip-ssl 또는 --disable-ssl 대신 --ssl-mode=DISABLED를 사용하십시오. --ssl-verify-server-cert 옵션 대신 --ssl-mode=VERIFY_IDENTITY를 사용하십시오. (서버 측 --ssl 옵션은 변경되지 않습니다.)

    C API의 경우, mysql_options()에 대한 MYSQL_OPT_SSL_ENFORCEMYSQL_OPT_SSL_VERIFY_SERVER_CERT 옵션은 클라이언트 측 --ssl--ssl-verify-server-cert 옵션에 해당하며 제거되었습니다. 대신 옵션 값으로 SSL_MODE_REQUIRED 또는 SSL_MODE_VERIFY_IDENTITY를 사용하는 MYSQL_OPT_SSL_MODE를 사용하십시오. (WL #9091)

공간 데이터 지원

  • Well-Known Text (WKT) 값의 가져오기 및 내보내기를 위한 공간 함수가 OpenGIS 'GEOMETRYCOLLECTION EMPTY' 표준 문법이 아니라 MySQL 'GEOMETRYCOLLECTION()' 비표준 문법을 사용했습니다. 이제 가져오기에서는 두 문법을 모두 인식하며, 내보내기에서는 표준 문법을 사용합니다. WKT 값에서 Geometry 값을 생성하는 함수를 참조하십시오. (Bug #23632147, Bug #81964)

  • ST_X()ST_Y() 공간 함수는 이제 각각 X 또는 Y 좌표 값을 지정하는 선택적 두 번째 인수를 허용합니다. 두 인수를 사용하는 경우, 함수 결과는 첫 번째 인수의 포인트 값에서 해당 좌표가 수정된 값입니다. 또한 단일 인수를 사용하는 ST_X()ST_Y()는 이제 더 엄격해져서, 인수가 유효한 geometry이지만 포인트가 아닌 경우 NULL을 반환하는 대신 ER_UNEXPECTED_GEOMETRY_TYPE 에러를 생성합니다. 자세한 내용은 포인트 속성 함수를 참조하십시오. (WL #8606)

  • ST_SRID() 공간 함수는 이제 SRID 값을 지정하는 선택적 두 번째 인수를 허용합니다. 두 인수를 사용하는 경우, 함수 결과는 두 번째 인수에 따라 SRID가 수정된 첫 번째 인수의 geometry 값입니다. 자세한 내용은 일반 Geometry 속성 함수를 참조하십시오. (WL #8543)

  • MySQL은 이제 공간 데이터에 사용하기 위해 SRID 0 이외의 공간 참조 시스템에 대한 정보를 저장합니다. 이 정보는 st_spatial_reference_systems 데이터 딕셔너리 테이블에 저장되며 EPSG Dataset 8.7을 기반으로 합니다. 공간 참조 시스템에 대한 정보는 Spatial Reference System Support를 참조하십시오.

    이전에는 ST_IsValid(), ST_MakeEnvelope(), ST_Validate() 함수가 SRID 0인 지오메트리 인수를 요구했습니다. 이제 이 함수들은 투영 공간 참조 시스템에 대한 SRID가 있는 지오메트리 인수를 허용합니다. (WL #8579)

  • MySQL 5.7에서는 여러 이름으로 사용할 수 있던 여러 공간 함수가 공간 함수 네임스페이스를 더 일관성 있게 만드는 방향으로 나아가기 위해 deprecated되었으며, 목표는 각 공간 함수 이름이 정확한 연산을 수행하는 경우 ST_로 시작하고, 최소 경계 사각형을 기반으로 하는 연산을 수행하는 경우 MBR로 시작하도록 하는 것이었습니다. deprecated된 함수는 이제 제거되어, 대응하는 ST_MBR 함수만 남았습니다:

    • 다음 함수는 MBR 이름을 위해 제거되었습니다: Contains(), Disjoint(), Equals(), Intersects(), Overlaps(), Within().
    • 다음 함수는 ST_ 이름을 위해 제거되었습니다: Area(), AsBinary(), AsText(), AsWKB(), AsWKT(), Buffer(), Centroid(), ConvexHull(), Crosses(), Dimension(), Distance(), EndPoint(), Envelope(), ExteriorRing(), GeomCollFromText(), GeomCollFromWKB(), GeomFromText(), GeomFromWKB(), GeometryCollectionFromText(), GeometryCollectionFromWKB(), GeometryFromText(), GeometryFromWKB(), GeometryN(), GeometryType(), InteriorRingN(), IsClosed(), IsEmpty(), IsSimple(), LineFromText(), LineFromWKB(), LineStringFromText(), LineStringFromWKB(), MLineFromText(), MLineFromWKB(), MPointFromText(), MPointFromWKB(), MPolyFromText(), MPolyFromWKB(), MultiLineStringFromText(), MultiLineStringFromWKB(), MultiPointFromText(), MultiPointFromWKB(), MultiPolygonFromText(), MultiPolygonFromWKB(), NumGeometries(), NumInteriorRings(), NumPoints(), PointFromText(), PointFromWKB(), PointN(), PolyFromText(), PolyFromWKB(), PolygonFromText(), PolygonFromWKB(), SRID(), StartPoint(), Touches(), X(), Y().
    • GLength()ST_Length()를 위해 제거되었습니다.

    (WL #8157)

테스트 스위트 관련 사항

  • mysql-test-run.pl은 이제 --do-suite 옵션을 지원합니다. 이 옵션은 --do-test와 유사하지만 실행할 테스트의 전체 스위트를 지정할 수 있습니다. (Bug #24350345)

  • mysqltest rmdir 명령은 제거할 디렉터리에 파일이나 디렉터리가 하나라도 포함되어 있으면 실패합니다. 디렉터리와 그 내용(있는 경우)의 재귀적 제거를 가능하게 하기 위해, mysqltest는 이제 force-rmdir 명령을 지원합니다. (Bug #24316799)

  • 두 가지 새로운 테스트 스위트 옵션을 통해 테스트 케이스를 더 쉽게 디버그할 수 있습니다:

    • mysql-test-run.pl은 옵션을 mysqltest에 전달할 수 있게 하는 --mysqltest=options 옵션을 지원합니다.
    • mysqltest는 실행된 프로그램의 출력을 즉시 stdout에 출력하게 하는 --trace-exec 옵션을 지원합니다.

    mysql-test-run.pl은 이제 MTR_CTEST_TIMEOUT 환경 변수를 인식합니다. 이 변수가 설정되면, 값은 ctest 유닛 테스트 명령에 전달할 초 단위 제한 시간입니다. (Bug #21821049, Bug #21278845)

  • MySQL 테스트 스위트의 테스트 케이스에서, 이전에는 서버 오류에 대해서만 --error 명령에 심볼릭 오류 이름을 사용할 수 있었습니다. 이제 클라이언트 오류에 대해서도 이 작업이 가능합니다. 예를 들면 다음과 같습니다:

    --error CR_SERVER_GONE_ERROR
    

    (Bug #21048973, Bug #76972)

  • mysqltest 프로그램에는 이제 소스 디렉터리에서 대상 디렉터리로 패턴과 일치하는 모든 파일을 복사하는 copy_files_wildcard 명령이 있습니다. https://dev.mysql.com/doc/index-other.html에서 제공되는 MySQL Server Doxygen 문서를 참조하십시오. (Bug #82111, Bug #23743035)

X 플러그인 관련 사항

  • Protobuf 디코더 클래스는 중첩 객체 수를 50개(기본값)로 제한했습니다. (Bug #23707238, Bug #82025)
  • list_objects 문은 테이블을 컬렉션으로 잘못 보고했습니다. (Bug #23631240)
  • create_collection 문은 primary key 대신 '_id' 컬럼에 unique key 인덱스가 있는 컬렉션 테이블을 생성했습니다. (Bug #23284569)

추가되거나 변경된 기능

  • 호환되지 않는 변경; 파티셔닝: MySQL 서버에서 일반 파티셔닝 핸들러가 제거되었습니다. 이 변경의 일부로, mysqld는 더 이상 --partition--skip-partition 옵션을 지원하지 않으며, 서버는 더 이상 -DWITH_PARTITION_STORAGE_ENGINE을 사용하여 빌드할 수 없습니다. 또한 partition은 더 이상 SHOW PLUGINS의 출력에 표시되지 않거나, INFORMATION_SCHEMA.PLUGINS 테이블에 표시되지 않습니다.

    지정된 테이블의 파티셔닝을 지원하려면, 이제 해당 테이블에 사용되는 스토리지 엔진이 자체 (“네이티브”) 파티셔닝 핸들러를 제공해야 합니다. InnoDB는 네이티브 파티셔닝 핸들러를 포함하는 MySQL 8.0에서 지원되는 유일한 스토리지 엔진입니다. 다른 스토리지 엔진을 사용하여 MySQL 8.0에서 파티셔닝된 테이블을 생성하려는 시도는 실패합니다. (MySQL NDB Cluster에서 사용하는 NDB 스토리지 엔진도 자체 파티셔닝 핸들러를 제공하지만, 현재 MySQL 8.0에서는 지원되지 않습니다.)

    업그레이드에 미치는 영향. InnoDB가 아닌 스토리지 엔진(예: MyISAM)을 사용하는 파티셔닝된 테이블을 MySQL 5.7(또는 이전 버전)에서 MySQL 8.0으로 직접 업그레이드하는 것은 지원되지 않습니다. 이러한 테이블을 MySQL 8.0과 호환되도록 업그레이드하는 옵션은 두 가지이며, 여기에 나열되어 있습니다:

    • 테이블의 파티셔닝을 제거하십시오. ALTER TABLE... REMOVE PARTITIONING 문을 실행하여 데이터 손실 없이 이 작업을 수행할 수 있습니다.

    • ALTER TABLE... ENGINE=INNODB를 사용하여 테이블에 사용되는 스토리지 엔진을 InnoDB로 변경하십시오. 이렇게 하면 테이블의 파티셔닝은 그대로 유지됩니다. 서버를 MySQL 8.0으로 업그레이드하기 전에, 파티셔닝된 모든 비-InnoDB 테이블에 대해 이러한 작업 중 적어도 하나를 수행해야 합니다. 그렇지 않으면 업그레이드 후 이러한 테이블을 사용할 수 없습니다.

      MyISAM 테이블을 InnoDB로 변환하는 방법에 대한 자세한 내용은 Converting Tables from MyISAM to InnoDB를 참조하십시오.

    MySQL 5.7 또는 그 이전 버전에서 mysqldump를 사용하여 생성한 덤프 파일에서 MySQL 8.0 서버로 데이터베이스를 가져올 때도 이와 유사한 상황이 발생합니다. 이는 그러한 지원이 없는 스토리지 엔진을 사용하는 파티셔닝된 테이블을 생성하게 되는 테이블 생성문이 MySQL 8.0에서 오류와 함께 실패하기 때문입니다. 이러한 이유로 덤프 파일에서 파티셔닝된 테이블을 생성하는 모든 문이 지원되지 않는 스토리지 엔진도 함께 지정하지 않도록 해야 합니다. InnoDB가 아닌 STORAGE ENGINE 옵션 값을 사용하는 CREATE TABLE 문에서 파티셔닝에 대한 모든 참조를 제거하거나, 스토리지 엔진을 InnoDB로 지정하거나(InnoDB가 기본값으로 사용되도록 허용하거나) 하여 이를 수행할 수 있습니다.

    자세한 내용은 Partitioning Limitations Relating to Storage Engines를 참조하십시오. (WL #8971, WL #9457)

  • InnoDB: innodb_buffer_pool_debug 옵션은 버퍼 풀이 1GB보다 작은 크기일 때 여러 버퍼 풀 인스턴스를 허용하며, innodb_buffer_pool_instances에 적용되는 1GB 최소 버퍼 풀 크기 제약 조건을 무시합니다. (Bug #24287290)

  • InnoDB: 새로운 동적 설정 옵션인 innodb_deadlock_detect를 사용하여 데드락 감지를 비활성화할 수 있습니다. 높은 동시성 시스템에서는 많은 스레드가 같은 잠금을 기다릴 때 데드락 감지가 속도 저하를 일으킬 수 있습니다. 경우에 따라 데드락 감지를 비활성화하고 데드락이 발생했을 때 트랜잭션 롤백에 innodb_lock_wait_timeout 설정을 사용하는 것이 더 효율적일 수 있습니다. (Bug #23477773, WL #9383)

  • InnoDB: libinnodb_zipdecompress.a 라이브러리는 외부 도구가 page_zip_decompress_low() 함수를 사용하여 InnoDB 페이지를 압축 해제할 수 있도록 합니다. (Bug #21405300, Bug #77664)

  • InnoDB: 일부 워크로드에서 발생할 수 있는 경합을 해결하기 위해 버퍼 풀 뮤텍스가 제거되고 여러 리스트 및 해시 보호 뮤텍스로 대체되었습니다. 또한 여러 버퍼 풀 관련 변수는 더 이상 버퍼 풀 뮤텍스 보호가 필요하지 않습니다. 패치를 제공한 Yasufumi Kinoshita와 Laurynas Biveinis에게 감사드립니다. (Bug #20381905, Bug #75534, WL #8423)

  • InnoDB: InnoDB는 이제 ALTER TABLE ALGORITHM=COPY 작업 중 10000 로우마다 발생하던 중간 커밋을 피합니다. 중간 커밋의 목적은 중단된 ALTER TABLE ALGORITHM=COPY 작업의 경우 복구 속도를 높이는 것이었습니다. ALTER TABLE ALGORITHM=COPY 작업이 중단되면, 이제 undo 로그가 롤백되기 전에 DDL 로그 복구 중 새 커밋되지 않은 테이블이 삭제되므로 커밋되지 않은 테이블에 대한 시간이 많이 소요되는 데이터 롤백을 피합니다. 이제 ALTER TABLE ALGORITHM=COPY 작업에 대해서는 IGNORE 절이나 롤백 기능이 필요한 다른 요소가 없는 한 undo 로깅이 억제됩니다.

    변경 중인 테이블에 전문 인덱스가 있는 경우, ALTER TABLE ALGORITHM=COPY 작업이 새 커밋되지 않은 테이블에 로우를 삽입할 때 전문 데이터가 전문 보조 테이블에 삽입됩니다. 이전에는 전문 데이터가 트랜잭션 커밋 시에만 처리되었습니다. (Bug #17479594)

  • InnoDB: 동일한 테이블에서 여러 purge 스레드가 로우를 purge하여 발생할 수 있는 읽기-쓰기 잠금 경합을 줄이기 위해, 이제 undo 레코드는 테이블 ID별로 그룹화되어 서로 다른 purge 스레드에 할당됩니다. (WL #9387)

  • InnoDB: 이제 InnoDB 코드는 스레드 관리를 위해 C++ std::thread 라이브러리를 사용합니다. (WL #9359)

  • InnoDB: 압축 및 비압축 BLOB 데이터에 대한 작업을 위한 내부 C++ 인터페이스를 제공하도록 BLOB 코드가 리팩터링되었습니다. (WL #8985, WL #9141)

  • InnoDB: 이제 InnoDB memcached 플러그인은 여러 get 작업(단일 memcached 쿼리에서 여러 키/값 쌍 가져오기) 및 범위 쿼리를 지원합니다. InnoDB memcached Multiple get and Range Query Support를 참조하십시오. (WL #6650)

  • InnoDB: 인덱스 트리 손상이 발생하면 InnoDB는 손상 플래그를 redo 로그에 기록하며, 이로 인해 손상 플래그는 크래시 세이프가 됩니다. 또한 InnoDB는 각 체크포인트에서 인메모리 손상 플래그 데이터를 엔진 전용 시스템 테이블에 기록합니다. 복구 중에 InnoDB는 두 위치 모두에서 손상 플래그를 읽고 결과를 병합한 뒤 인메모리 테이블 및 인덱스 객체를 손상된 것으로 표시합니다. (WL #7816)

  • InnoDB: MySQL 데이터 디렉터리 외부에 테이블스페이스 데이터 파일을 생성할 때 InnoDB는 더 이상 .isl 파일(InnoDB 심볼릭 링크 파일)을 생성하지 않습니다.

    이 변경으로 인해 서버가 오프라인 상태일 때 .isl 파일을 수동으로 수정하여 원격 테이블스페이스를 이동하는 것은 지원되지 않습니다. (WL #6416)

  • InnoDB: InnoDB는 더 이상 압축된 임시 테이블을 지원하지 않습니다. innodb_strict_mode가 활성화된 경우(기본값), CREATE TEMPORARY TABLEROW_FORMAT=COMPRESSED 또는 KEY_BLOCK_SIZE가 지정되면 오류를 반환합니다. innodb_strict_mode가 비활성화된 경우, 경고가 발생하고 임시 테이블은 압축되지 않은 로우 형식을 사용하여 생성됩니다.

    이 변경으로 모든 임시 테이블은 공유 임시 테이블스페이스인 ibtmp1에 생성됩니다.

    PER_TABLE_TABLESPACEIS_COMPRESSED 컬럼은 INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO에서 제거되었습니다. (WL #7899)

  • InnoDB:INFORMATION_SCHEMA.INNODB_CACHED_INDEXES 테이블은 각 인덱스에 대해 InnoDB 버퍼 풀에 캐시된 인덱스 페이지 수를 보고합니다. (WL #7170)

  • InnoDB: innodb_checksums 시스템 변수가 제거되었습니다. innodb_checksums는 MySQL 5.6.3에서 innodb_checksum_algorithm으로 대체되었습니다. (WL #8893)

  • InnoDB: InnoDB 시작 코드가 리팩터링되었습니다. (WL #7488)

  • InnoDB: innodb_flush_method의 기본값은 더 이상 NULL이 아닙니다. Unix 계열 시스템에서 기본값은 fsync입니다. Windows 시스템에서 기본값은 unbuffered입니다.

    Windows에서 innodb_flush_method 설정은 더 이상 innodb_use_native_aio 설정에 영향을 주지 않습니다. 이제 Windows에서 innodb_flush_method에 가능한 설정은 unbuffered(버퍼링되지 않은 I/O) 및 normal(버퍼링된 I/O) 두 가지입니다. 이 변경으로 버퍼링된 I/O와 함께 비동기 I/O를 활성화할 수 있으며, 이는 새로운 조합(innodb_use_native_aio=ONinnodb_flush_method=normal)입니다. async_unbuffered 설정이 제거되었습니다.

    이제 innodb_flush_methodinnodb_change_buffering 설정 옵션을 숫자 값으로 설정할 수 있습니다. (WL #7488)

  • InnoDB: InnoDB는 더 이상 MySQL 데이터 디렉터리 외부에 file-per-table 테이블스페이스 데이터 파일을 생성할 때 .isl 파일(InnoDB Symbolic Link 파일)을 생성하지 않습니다. 이제 InnoDB는 원격 테이블스페이스 데이터 파일을 찾는 데 redo 로그를 사용합니다.

    .isl 파일을 수정하여 MySQL 데이터 디렉터리 외부에 생성된 file-per-table 테이블스페이스 데이터 파일을 오프라인으로 재배치하는 것은 더 이상 지원되지 않습니다. (WL #6416)

  • InnoDB: 현재 최대 자동 증가 카운터 값은 이제 값이 변경될 때마다 redo 로그에 기록되고, 각 체크포인트에서 엔진 전용 시스템 테이블에 저장됩니다. 이러한 변경으로 현재 최대 자동 증가 카운터 값이 서버 재시작 후에도 유지됩니다. 추가로:

    • 서버 재시작은 더 이상 AUTO_INCREMENT = N 테이블 옵션의 효과를 취소하지 않습니다. 자동 증가 카운터를 특정 값으로 초기화하거나 자동 증가 카운터 값을 더 큰 값으로 변경하면, 새 값은 서버 재시작 후에도 유지됩니다.
    • ROLLBACK 작업 직후 서버를 재시작해도 더 이상 롤백된 트랜잭션에 할당되었던 자동 증가 값이 재사용되지 않습니다.
    • 예를 들어 UPDATE 작업에서 AUTO_INCREMENT 컬럼 값을 현재 최대 자동 증가 값보다 큰 값으로 수정하면, 새 값이 유지되고, 이후 INSERT 작업은 새롭고 더 큰 값부터 자동 증가 값을 할당합니다.

    자세한 내용은 AUTO_INCREMENT Handling in InnoDBInnoDB AUTO_INCREMENT Counter Initialization을 참조하십시오. (Bug #199, Bug #13726455, WL #6204)

  • Replication: CHANGE MASTER TO 문이 에러 로그(mysqld.log)에 기록되는 방식에 두 가지 개선 사항이 있습니다:

    • 이전에는 옵션 지정(예: MASTER_USER =MASTER_PASSWORD =) 사이에 쉼표가 들어가지 않았으므로, 복사하여 붙여넣는 방식으로 해당 문을 사용하려는 사용자는 쉼표를 수동으로 삽입해야 했습니다. 이제 해당 문이 에러 로그에 기록될 때 쉼표가 삽입됩니다.
    • MASTER_PASSWORD 값의 자리 표시자로 리터럴 “”이 삽입될 때 이제 따옴표가 사용되지 않으므로, 복사하여 붙여넣기 전에 리터럴을 실제 비밀번호로 바꾸는 것을 잊은 사용자는 다른 문제가 발생하는 대신 즉시 문법 에러를 받습니다.

    (Bug #18194384)

  • Replication: gtid_executed가 비어 있는지 여부와 관계없이 gtid_purged에 GTID를 추가할 수 있으므로, 이제 GTID 기반 복제 서버의 백업을 복원할 수 있습니다. 이를 통해 기존 GTID 정보와 바이너리 로그를 잃지 않고 GTID 기반 복제 서버의 백업을 복원할 수 있습니다. 추가할 GTID는 백업을 수행한 시점에 gtid_executed에 존재했던 GTID입니다. SET GTID_PURGED의 문법이 확장되어 SET GTID_PURGED ="+gtid_set"이 기존 gtid_purged GTID 세트에 gtid_set을 추가합니다. (WL #6591)

  • Replication: 로우 기반 복제의 진행 상황을 표시하기 위해 새로운 Performance Schema stage가 추가되었습니다. 이러한 stage를 사용하여 로우 기반 복제에서 느린 작업의 진행 상황을 확인할 수 있습니다. 또한 변경 사항이 어느 데이터베이스에 적용되고 있는지 확인할 수 있습니다. 이는 로우 기반 복제 문제 해결에 도움이 되며 성능 튜닝을 위한 더 많은 정보를 제공합니다. 자세한 내용은 Monitoring Row-based Replication을 참조하십시오. (WL #7364)

  • JSON: 이 릴리스에서는 MySQL에 저장된 JSON 문서와 함께 사용할 수 있도록, 때때로 인라인 경로 연산자라고도 하는 unquoting 추출 연산자 ->>가 추가되었습니다. 새 연산자는 -> 연산자와 유사하지만, 값의 JSON unquoting도 수행합니다. JSON 컬럼 mycol과 JSON 경로 표현식 mypath에 대해, 다음 세 표현식은 동등합니다:

    ->> 연산자는 JSON_UNQUOTE(JSON_EXTRACT())가 허용되는 모든 SQL 문에서 사용할 수 있습니다. 여기에는 SELECT 목록, WHEREHAVING 절, ORDER BYGROUP BY 절이 포함되지만 이에 국한되지는 않습니다.

    자세한 내용은 Functions That Search JSON ValuesJSON Path Syntax를 참조하십시오. (Bug #78736, Bug #21980346, WL #9124)

  • 더 정확한 추정치를 생성하기 위해, MEMORY 스토리지 엔진은 이제 정수 산술이 아니라 부동소수점 산술을 사용하여 인덱스 통계(키당 레코드 추정치)를 계산합니다. (Bug #23024059)

  • 새로운 CMake 옵션인 INSTALL_STATIC_LIBRARIES는 정적 라이브러리 설치 여부에 대한 제어를 가능하게 합니다. 기본값은 ON입니다. OFF로 설정하면 다음 라이브러리가 설치되지 않습니다: libmysqlclient.a, libmysqld.a, libmysqlservices.a. (Bug #22891432)

  • 내부 mysql_prepare_create_table() 서버 함수는 코드 유지보수성과 명확성을 개선하기 위해 리팩터링되었습니다. 이 코드 개정으로 인해 CREATE TABLEALTER TABLE에 대해 다음과 같은 사소한 동작 변경이 발생합니다:

  • 이전에는 임베디드 서버인 libmysqld에 대해 Performance Schema가 빌드되지 않았습니다. 이로 인해 show_compatibility_56=OFF와 함께 SHOW STATUSSHOW VARIABLES 문을 사용할 수 없었습니다. 그 설정에서는 해당 문이 Performance Schema 테이블에서 결과를 가져오기 때문입니다. 이제 libmysqld의 경우 필요한 Performance Schema 테이블이 빌드되므로(수집되는 계측은 없음), 이러한 SHOW 문이 show_compatibility_56=OFF와 함께 지원될 수 있습니다. (Bug #22809694)

  • JSON_CONTAINS(), JSON_SEARCH() 및 기타 MySQL JSON 함수에서 사용하는 여러 내부 함수는 JSON 객체를 검사할 때 키, 값 또는 둘 모두의 로컬 복사본을 과도하게 많이 생성했습니다. 이러한 복사는 많은 경우 제거되었거나 줄어들었습니다. 또한 이러한 함수 중 일부에서 사용하는 임시 객체의 수명이 줄어들었습니다. 이러한 변경으로 인해 이러한 JSON 함수 및 관련 JSON 함수는 이전보다 더 효율적으로 수행되고, 필요한 리소스도 더 적어질 것입니다. (Bug #22602142)

  • 시스템 lz4openssl zlib 명령을 사용할 수 있으면 lz4_decompresszlib_decompress 유틸리티는 불필요합니다. 두 가지 변경으로 해당 유틸리티가 빌드되지 않도록 할 수 있습니다: 새 WITH_LZ4 CMake 옵션이 system으로 설정되면 lz4_decompress가 빌드되거나 설치되지 않습니다. WITH_ZLIB CMake 옵션이 system으로 설정되면 zlib_decompress가 빌드되거나 설치되지 않습니다. (Bug #22329851)

  • MySQL 문자열 라이브러리의 소스 파일이 C(.c 접미사)에서 C++(.cc 접미사)로 변환되었습니다. 이를 통해 라이브러리 코드에서 더 엄격한 컴파일 검사와 C++ 기능 사용이 가능해집니다. (Bug #22124719)

  • mysys 라이브러리의 소스 코드는 이제 더 엄격한 컴파일 검사를 활용하고 C++ 기능 사용을 허용하기 위해 C가 아닌 C++를 사용합니다. (Bug #21881278)

  • 성능 향상 및 다른 플랫폼과의 더 나은 호환성을 위해 OS X의 my_sync()는 이제 F_FULLSYNC 플래그와 함께 fcntl()을 사용하는 대신 fsync()를 사용합니다. (Bug #20742269)

  • CMake 옵션인 WITH_TSAN은 이를 지원하는 컴파일러에서 ThreadSanitizer를 활성화할 수 있게 합니다. (Bug #80409, Bug #23171902)

  • 이전에 단일 mutex로 보호되던 전역 연결 목록이 8개 부분으로 파티셔닝되었으며, 각 부분은 자체 mutex 인스턴스로 보호됩니다. 그 결과 연결 처리의 오버헤드가 감소하고 성능이 향상됩니다. 이 변경이 모니터링 목적에 대해 가지는 의미는 Performance Schema가 이제 LOCK_thd_list mutex, LOCK_thd_remove mutex, COND_thd_list condition variable 각각에 대해 8개의 서로 다른 인스턴스를 노출한다는 것입니다. (WL #9250)

  • MySQL은 이제 UUID 값을 조작하고 더 쉽게 다룰 수 있도록 하는 함수를 제공합니다:

    • UUID_TO_BIN()BIN_TO_UUID()는 문자열 및 바이너리 형식의 UUID 값(각각 16진수 문자 및 VARBINARY(16)로 표현됨) 간에 변환합니다. 이를 통해 문자열 UUID 값을 더 적은 저장 공간을 사용하는 바이너리 값으로 변환할 수 있습니다. 바이너리로 변환된 UUID 값은 향상된 인덱싱 효율성을 허용하는 방식으로 표현될 수 있습니다.

    • IS_UUID()는 인수가 유효한 문자열 형식 UUID 값인지 여부를 나타내기 위해 1 또는 0을 반환합니다.

      자세한 내용은 기타 함수를 참조하십시오. (WL #8920)

  • 서버는 이제 이전 서버 실행에서 남은 임시 테이블을 정리하기 위해 스토리지 엔진에 의존합니다. InnoDB는 재시작 시 임시 테이블스페이스를 폐기하여 이를 수행합니다. MyISAM 및 기타 유사한 스토리지 엔진은 여전히 특정 이름 패턴을 가진 이러한 엔진에 속한 파일을 찾아 남은 테이블을 감지하기 위해 임시 디렉터리를 스캔하는 방식에 의존합니다. (WL #7784)

  • 서버는 더 이상 특수 문자가 포함된 pre-MySQL 5.1 데이터베이스 이름을 #mysql50# 접두사를 추가한 5.1 형식으로 변환하지 않습니다. 이러한 변환이 더 이상 수행되지 않으므로 mysqlcheck--fix-db-names--fix-table-names 옵션, ALTER DATABASE 문의 UPGRADE DATA DIRECTORY NAME 절, 그리고 Com_alter_db_upgrade 상태 변수가 제거되었습니다.

    업그레이드는 한 메이저 버전에서 다른 메이저 버전으로만 지원되므로(예: 5.0에서 5.1로, 또는 5.1에서 5.5로), 이전 5.0 데이터베이스 이름을 현재 MySQL 버전으로 변환해야 할 필요성은 거의 남아 있지 않습니다. 우회 방법으로, 더 최근 릴리스로 업그레이드하기 전에 MySQL 5.0 설치를 MySQL 5.1로 업그레이드하십시오. (WL #8186)

수정된 버그

  • 호환되지 않는 변경: 공간 값의 연결은 별 의미가 없으므로, 이제 CONCAT()CONCAT_WS() 함수는 공간 인수에 대해 오류를 생성합니다. (Bug #22893669)

  • 중요한 변경; JSON: 이제 JSON 함수(예: JSON_EXTRACT())와 함께 사용할 때 빈 문자열 값을 키로 사용할 수 있습니다. 이러한 경우에는 따옴표로 묶어야 합니다. (Bug #79643, Bug #22366102)

  • NDB Cluster: 이전에는 서버가 NDB 없이 빌드된 경우에도 mysql.ndb_binlog_index 테이블이 생성되었습니다. 이제 이 테이블은 서버가 NDB와 함께 빌드된 경우에만 생성됩니다. (Bug #22874872)

  • InnoDB; Microsoft Windows: 지정되지 않은 블록 크기로 인해 클러스터 페이지 크기가 8K 이상인 Windows NTFS에서 INFORMATION_SCHEMA.TABLESPACES 테이블이 비어 있었습니다. (Bug #23598872)

  • InnoDB; Microsoft Windows: Visual Studio 2015 Update 2로 InnoDB를 컴파일하면 경고가 반환되었습니다. (Bug #23056963)

  • InnoDB: 외래 키 제약 조건을 추가하는 ALTER TABLE... ALGORITHM=COPY 작업은 10000개의 로우가 복사된 후 발생한 중간 커밋으로 인해 실패했습니다. 중간 커밋은 외래 키 검사 플래그를 재설정하여 작업이 실패하게 했습니다. 더 이상 중간 커밋이 발생하지 않습니다. (Bug #28662255, Bug #92471)

    참조: 다음도 참조하십시오: Bug #17479594.

  • InnoDB: CPU에 대한 정보를 가져오는 데 사용되는 ut_cpuid() 함수에서 불필요한 검사가 제거되었습니다. (Bug #24405292)

  • InnoDB: 삭제된 테이블스페이스에 대한 비동기 읽기 작업에서 오류가 발생했습니다. (Bug #24388498)

  • InnoDB: dict_col_t 접근자가 InnoDB 코드에 추가되었습니다. (Bug #24363566)

  • InnoDB: InnoDB 코드의 dict_col 함수가 접근자로 대체되었습니다. (Bug #24361098)

  • InnoDB: InnoDB 코드의 dict_index_t 함수가 접근자로 대체되었습니다. (Bug #24361023)

  • InnoDB: 예약된 adaptive hash index 검색 래치를 확인하고 해제하던 불필요한 코드가 제거되었습니다. (Bug #24300175)

  • InnoDB: 32비트 운영 체제에서 4G보다 큰 시스템 테이블스페이스 데이터 파일 크기는 오버플로우 조건을 초래할 수 있었습니다. (Bug #23753625)

  • InnoDB: 테이블 객체 데이터에 접근하기 위한 내부 메서드가 dict_table_t에 추가되었습니다. (Bug #23748128)

  • InnoDB: 업그레이드 중 기존 테이블스페이스와의 space_id 충돌을 피하기 위해 첫 번째 undo 테이블스페이스가 space_id 1을 사용해야 한다는 제한이 제거되었습니다. 이제 첫 번째 undo 테이블스페이스는 1이 아닌 space_id를 사용할 수 있습니다. undo 테이블스페이스의 space_id 값은 여전히 연속된 순서로 할당됩니다. (Bug #23517560)

  • InnoDB: 테이블의 인덱스를 반복하기 위한 내부 접근자 함수가 접근자 메서드로 대체되었습니다. 사용되지 않는 코드가 제거되었습니다. (Bug #23336108)

  • InnoDB: 이전에는 SQL 스크립트로 생성되던 mysql.innodb_index_statsmysql.innodb_table_stats 테이블 정의가 이제 하드 코딩됩니다. 그 결과 dict_table_schema_check 함수는 더 이상 필요하지 않으며 제거되었습니다. (Bug #23336079)

  • InnoDB: ut_snprint 함수가 C++11 snprintf 함수로 대체되었습니다. (Bug #23329353)

  • InnoDB: 일관성을 위해 InnoDB 코드의 ulint 인스턴스가 space_id_tpage_no_t 데이터 타입으로 대체되었습니다. (Bug #23297169)

  • InnoDB: InnoDB 코드에서 boost::atomic 사용이 std::atomic으로 대체되었습니다. (Bug #23280649)

  • InnoDB: MySQL 바이너리가 NUMA 기능과 함께 빌드되지 않았습니다. (Bug #23259754)

  • InnoDB: UNIV_NONINLUNIV_MUST_NOT_INLINE에 대한 참조가 제거되었습니다. UNIV_NONINL이 정의된 경우에만 필요했던 fut0fut.ccut0byte.cc 파일도 제거되었습니다. (Bug #23150562)

  • InnoDB: mutex_own() 매핑은 Clang 또는 최신 GCC 컴파일러로 컴파일할 때 경고를 발생시켰습니다. (Bug #23090278)

  • InnoDB: InnoDB 메모리 할당 이벤트 데이터를 확인하기 위해 Performance Schema를 쿼리하면 값이 0으로 잘못 보고되었습니다. (Bug #23020280)

  • InnoDB: DBUG_OFF 컴파일 시점 플래그가 UNIV_DEBUG 플래그로 대체되었습니다. 오류 로그 출력을 개선하기 위해, ut_dbg_assertion_failed()는 이제 sql_print_error()를 사용하여 파일 이름, 라인 번호, 메시지를 한 줄에 표시합니다. 스레드 ID는 그 다음 줄에 표시됩니다. (Bug #22996442, Bug #23028144)

  • InnoDB: SHOW ENGINE INNODB STATUS 출력에 음수인 대기당 spin rounds 값이 표시되었습니다. 패치를 제공해 준 Laurynas Biveinis에게 감사드립니다. (Bug #22844987, Bug #79703)

  • InnoDB: innodb_disable_resize_buffer_pool_debug 옵션이 제거되었습니다. 이 변경에 대한 패치는 코드 변수도 제거하고 buf_pool_resize() 함수를 단순화했습니다. (Bug #22755053)

  • InnoDB: 전역 카운터(ut_rnd_ulint_counter)가 멀티 코어 시스템에서 확장 가능하도록 스레드 로컬 카운터로 변경되었습니다. (Bug #22733635, Bug #80354)

  • InnoDB: 성공적인 ALTER TABLE... ALGORITHM=COPY 작업 후, 클러스터형 인덱스 레코드의 이전 버전을 빌드하는 동안 어설션이 발생했습니다. (Bug #22707367)

  • InnoDB: 가상 인덱스가 있는 테이블의 카운터를 업데이트한 DML 작업이 row_parse_int()에서 어설션을 발생시켰습니다. (Bug #22650195)

  • InnoDB: libevent 2.0으로 컴파일된 경우 InnoDB memcached 플러그인이 로드되지 않았습니다. (Bug #22646919)

  • InnoDB: 정수 기반 rec_per_key 값에 대한 사용되지 않는 계산이 InnoDB에서 제거되었습니다. 정수 기반 rec_per_key 정보는 이전 릴리스에서 부동 소수점 인덱스 통계로 대체되었습니다. (Bug #22625348)

  • InnoDB: 느린 종료 시, 백그라운드 롤백 스레드가 종료되기 전에 purge 스레드 종료가 시작되어 어설션 실패가 발생했습니다. (Bug #22561332)

  • InnoDB: 해제되지 않은 힙으로 인해 row_vers_old_has_index_entry()에서 블록이 손실되었습니다. (Bug #22543834, Bug #79973)

  • InnoDB: 전송 가능한 테이블스페이스 디버그 테스트에서 경합 조건으로 인한 어설션이 발생했습니다. (Bug #22453668)

  • InnoDB: undo 테이블스페이스가 누락되어 서버가 시작되지 않았습니다. (Bug #22452992)

  • InnoDB: 복구 프로세스에 의해 도입된 버퍼링된 undo 테이블스페이스 변경으로 인해 undo 테이블스페이스를 닫으려고 시도하는 동안 InnoDB 복구에서 어설션이 발생했습니다. (Bug #22361764)

  • InnoDB: memcached가 참조하는 메모리의 재할당에서 어설션이 발생했습니다. (Bug #22304250, Bug #79500)

  • InnoDB: C++11로 InnoDB를 빌드하면 “register” 지원 중단 경고가 반환되었습니다. 지원 중단된 “register” 키워드가 제거된 후에도 “register” 지원 중단 경고 처리가 코드에 남아 있었습니다. 또한, 사용되지 않는 yyset_extra() 선언이 제거되었습니다. (Bug #22292704)

  • InnoDB: 파티셔닝된 테이블에 대한 SHOW CREATE TABLE 출력이 테이블 파티션의 테이블스페이스 할당 정보를 정확하게 표시하지 않았습니다. (Bug #22245554)

  • InnoDB: ALTER TABLE...TRUNCATE PARTITION 작업이 테이블의 KEY_BLOCK_SIZE 속성을 무시하고 대신 기본값을 사용했으며, 이 값은 innodb_page_size 값의 절반입니다. (Bug #22186558, Bug #79223)

  • InnoDB: innochecksum의 메모리 누수가 수정되었습니다. (Bug #22179518)

  • InnoDB: INNODB_CACHED_INDEXES 테이블에 SPACE_ID 컬럼이 추가되었습니다. INDEX_ID 값은 더 이상 전역 고유 식별자가 아닙니다. (Bug #22172026)

  • InnoDB: 가상 컬럼에 대한 purge 스레드 open table 콜백에서 예기치 않은 데이터 딕셔너리 테이블 래치로 인해 어설션이 발생했습니다. 임시 해결 방법으로, 가상 생성 컬럼에 대해 purge가 일시적으로 비활성화됩니다. 이 임시 해결 방법은 가상 컬럼의 인덱스에 대해 purge되지 않은 삭제 표시 레코드로 인해 b-tree 확장을 유발할 수 있습니다. (Bug #22153217)

  • InnoDB: foreign_key_checks가 비활성화된 경우 full-text 인덱스와 외래 키 제약 조건이 있는 테이블 생성이 실패했습니다. (Bug #22094601, Bug #78955)

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

  • InnoDB: ha_innobase::m_primary_key 필드가 제거되었습니다. 이 필드는 중복되었습니다. 부울 조건자 TABLE_SHARE::is_missing_primary_key()가 추가되었습니다. (Bug #21928734, Bug #78662)

  • InnoDB: 초기화되지 않은 페이지를 로드하려고 시도한 버퍼 풀 로드 작업으로 인해 Valgrind 실패가 발생했습니다. (Bug #21747906)

  • InnoDB: InnoDB memcached 플러그인에 의해 도입된 사용되지 않는 함수가 제거되었습니다. (Bug #21625760)

  • InnoDB: innodb_buffer_pool_size 설정 옵션에서 사용되는 내부 전역 변수가 제거되었습니다. (Bug #21512749)

  • InnoDB: 버퍼 풀 크기 조정 작업 중 InnoDB page cleaner 스레드에서 assertion이 발생했습니다. (Bug #21473497)

  • InnoDB: 두 번째 버퍼가 추가되어 동시 로그 버퍼 쓰기와 플러시가 가능해짐에 따라 로그 버퍼 경합이 줄었습니다. 로그 버퍼 플러시를 보호하기 위해 새 mutex가 추가되었습니다. 패치를 제공해 주신 Zhai Weixiang에게 감사드립니다. (Bug #21352937, Bug #77094)

  • InnoDB: 사용되지 않는 InnoDBlibsql 함수와 변수가 제거되었으며, 가능한 경우 전역 심볼이 static 키워드로 변환되었습니다. (Bug #21153166, Bug #21141390, Bug #77146, Bug #21178589)

  • InnoDB: full-text 인덱스 구현, 데이터 딕셔너리 업데이트, persistent statistics 업데이트에 사용되는 내부 SQL parser에서 사용되지 않는 여러 사전 정의 함수가 제거되었습니다. (Bug #21126390, Bug #77111)

  • InnoDB: 이제 SysTablespace::parse_units() 함수는 메가바이트 수 대신 파일의 페이지 수를 반환합니다. SysTablespace::normalize_size() 함수가 제거되었습니다. SysTablespace::parse_params()의 오류 메시지가 수정되었습니다. (Bug #21040199, Bug #76949)

  • InnoDB: 영구 테이블의 경우, InnoDB 인덱스의 내부 고유 식별자(index_id)가 이제 테이블스페이스 식별자(space_id,index_id)를 포함합니다. 이 변경으로 인덱스 식별자가 InnoDB 인스턴스 수준뿐만 아니라 테이블스페이스 수준에서도 고유해지며, 인덱스 식별자 할당과 관련된 향후 작업을 지원합니다. (Bug #20737524, Bug #76392)

  • InnoDB: mtr0mtr.cc에서 중복 함수가 제거되었고, ReleaseBlocks 함수의 이름이 AddDirtyBlocksToFlushList로 변경되었습니다. (Bug #20735882, Bug #76343)

  • InnoDB: innochecksum과 관련된 코드가 정리되고 재구성되었습니다. 체크섬 기능은 이제 buf0checksum.cc에 위치합니다. (Bug #20518099)

  • InnoDB: __attribute__((nonnull))InnoDB 코드에서 제거되었습니다. 이 속성은 더 이상 InnoDB 코딩 지침에서 허용되지 않습니다. (Bug #20468234)

  • InnoDB: 외부 BLOB 필드 참조를 처리하고 조작하기 위한 논리적 인터페이스를 제공하도록 새 struct가 추가되었습니다. (Bug #18195972)

  • InnoDB: TRUNCATE TABLE이 이제 DROP TABLECREATE TABLE에 매핑됩니다. 이 변경에는 다음과 같은 영향이 있습니다:

    • 대형 버퍼 풀과 활성화된 innodb_adaptive_hash_index가 있는 시스템에서, 이전에는 TRUNCATE TABLE 작업이 테이블의 adaptive hash index 항목을 제거할 때 발생하는 LRU 스캔 때문에 일시적인 시스템 성능 저하를 일으켰습니다. TRUNCATE TABLEDROP TABLECREATE TABLE에 다시 매핑하면 문제가 되는 LRU 스캔을 피할 수 있습니다.

    • TRUNCATE TABLE은 일시적으로 원자적이지 않습니다. TRUNCATE TABLE 작업 중 서버 종료가 발생하면 테이블이 삭제되고 InnoDB SYS_FOREIGNSYS_FOREIGN_COLS 시스템 테이블에 고아 외래 키 제약 조건이 남을 수 있습니다.

    • InnoDB memcached 플러그인 flush_all 명령은 TRUNCATE TABLE 대신 DELETE를 호출합니다. DELETE는 삭제된 각 로우에 대해 undo-logging, delete-marking, 그리고 최종적으로 purge를 포함하므로 FLUSH TABLES보다 오버헤드 비용이 더 높습니다.

    • file-per-table 테이블스페이스의 내부 truncate table 작업에 대해 발생하던 로그 체크포인트가 로그 플러시로 대체되었습니다.

      (Bug #16834993, Bug #68184, Bug #16207919, WL #6795)

  • InnoDB: InnoDB는 조각 페이지에 사용되는 익스텐트의 대부분 페이지를 낭비했습니다. (Bug #16204823, Bug #67963)

  • Partitioning: 일부 경우에는 모든 파티션이 이미 파싱 시점에 프루닝된 뒤 최적화 중 파티션 프루닝이 두 번째로 시도되는 문제로 인해 assert가 발생했습니다. (Bug #23194259)

  • Partitioning: 테이블 이름과 임의의 파티션 이름의 결합 길이가 61자를 초과하는 파티션된 테이블은 mysqldump를 사용하여 생성된 백업에서 가져올 수 없었습니다. 테이블이 서브파티셔닝도 사용하는 경우에는 테이블 이름, 임의의 파티션 이름, 그리고 이 파티션의 임의의 서브파티션 이름의 결합 길이가 57자를 초과하면 동일한 문제가 트리거되었습니다.

    이는 내부 mysql.innodb_table_stats 테이블이 테이블 이름을 저장하는 데 사용되는 컬럼에 대해 최대 64자만 허용했기 때문입니다. 하지만 InnoDB는 파티션된 또는 서브파티션된 테이블에 대해 각 파티션 또는 서브파티션마다 innodb_table_stats에 로우를 저장하며, 여기서 테이블 이름을 나타내는 데 실제로 사용되는 값은 각각 table_name#P#partition_name 또는 table_name#P#partition_name#SP#subpartition_name 패턴을 따릅니다. 이 문제는 이러한 속성의 최대 결합 길이에 #P##SP#를 더한 길이(199자)를 수용하도록 innodb_table_stats의 정의를 변경하여 수정되었습니다. (Bug #72061, Bug #18416479)

  • Replication: Slave_worker::write_info()에서 DBUG_ENTER()는 인수로 “Slave_worker::write_info” 대신 “Master_info::write_info”를 사용했습니다. 이 수정은 해당 인수를 바로잡습니다. 패치를 제공해 주신 Stewart Smith에게 감사드립니다. (Bug #21658067, Bug #78133)

  • Replication: 멀티스레드 슬레이브와 함께 START SLAVE UNTIL position 문을 사용할 때 사용할 수 있었던 유일한 UNTIL 절은 SQL_BEFORE_GTIDS였습니다. 이제 멀티스레드 슬레이브는 START SLAVE UNTIL MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_positionSTART SLAVE UNTIL RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_position 문과 호환됩니다. (Bug #75843, Bug #20513547)

  • Microsoft Windows: Windows에서 여러 스레드에서 전역 log_syslog 시스템 변수를 설정하면 서버 종료가 발생할 수 있었습니다. (Bug #22180046)

  • Solaris: 클라이언트 라이브러리가 Cstd 라이브러리를 사용하여 Solaris에서 빌드되지 않았습니다. (Bug #24353920, Bug #82347)

  • JSON: CHECKSUM TABLEJSON 값 자체가 아니라 값의 메모리 주소를 사용하여 체크섬을 계산했으며, 이로 인해 체크섬이 달라졌습니다. 이제 이러한 경우 계산은 해당 값의 주소가 아니라 실제 JSON 값을 기반으로 합니다. (Bug #23535703)

  • JSON: JSON 매개변수를 기대하는 저장 프로시저에 NULL을 전달하면 디버그 빌드에서 어설션 실패가 발생했습니다. (Bug #23209914)

  • JSON: JSON 경로 인수의 파싱은 NULL 경로와 문법적으로 유효하지 않은 경로를 구분하지 못했습니다.

    이제 이러한 경로의 파싱이 유효한 non-NULL 경로, NULL 경로, 유효하지 않은 경로를 명확히 구분하도록 변경되었습니다. (Bug #22816576)

  • JSON: 디버그 빌드에서 서버가 JSON 객체를 보관하기 위해 임시 테이블을 생성할 때 어설션이 발생할 수 있었습니다. (Bug #22782948)

  • JSON: 오류를 발생시킨 JSON 함수를 실행한 쿼리가 서버 종료를 유발할 수 있었습니다. (Bug #22253965)

  • 존재하지 않는 데이터베이스의 일부가 되도록 테이블 이름을 변경하는 작업은 실패했지만(정상 동작), Unknown 오류 메시지가 표시되었습니다. 이제 적절한 오류 메시지가 생성되며, 이는 데이터 딕셔너리 구현의 일부로 수정되었습니다. (Bug #25167507, Bug #84000)

  • FreeBSD에서 세그멘테이션 폴트가 발생한 경우, 서버가 스택 추적을 생성하지 않았습니다. (Bug #24566529, Bug #23575445, Bug #81827)

  • macOS에서 Clang을 사용하여 컴파일된 빌드에 대해, GCC의 경우와 마찬가지로 이제 스택 추적 디맹글링이 수행됩니다. (Bug #23606094, Bug #81908)

  • libevent가 필요하지 않은 경우에도 macOS에서 빌드되었습니다. (Bug #23228287, Bug #81311)

  • JSON 값을 반환하는 함수가 저장 프로시저의 CASE 문의 일부로 호출되는 경우 서버 종료를 유발할 수 있었습니다. (Bug #23212765)

  • 이전에는 Performance Schema에서 사용된 전체 메모리에 대해 SHOW ENGINE PERFORMANCE_SCHEMA STATUSSELECT * FROM performance_schema.memory_summary_global_by_event_name이 서로 다른 값을 보고했습니다. memory/performance_schema/scalable_buffer로 계측되는 확장 가능한 버퍼 페이지용 메모리가 SHOW ENGINE STATUS 출력에서 누락되었습니다. 이제 해당 문에는 누락된 메모리가 포함되며, (pfs_buffer_scalable_container).memory로 표시됩니다. (Bug #23104498)

  • GCC의 -fexpensive-optimizations 옵션으로 인해 ARM64 및 PowerPC 빌드가 다른 플랫폼과 약간 다르게 부동 소수점 연산을 계산했습니다. 이 옵션은 -O2 및 더 높은 최적화 레벨에 의해 활성화되었습니다. 이제 이 옵션은 이로 인해 부정적인 영향을 받는 플랫폼에서 비활성화됩니다. (Bug #23046775)

  • ALTER TABLE... OPTIMIZE PARTITION과 같은 관리 작업이 실패한 후, lock-tables 모드에서 Performance Schema에서 선택하면 중단될 수 있었습니다. (Bug #23044286)

  • AddressSanitizer가 활성화된 빌드에서 CAST(... AS BINARY)가 서버 종료를 일으킬 수 있었습니다. (Bug #22900560)

  • 일부 공간 함수가 오류 메시지에서 다른 공간 함수 이름을 사용하여 보고되었습니다. (Bug #22883056, Bug #80627)

  • 최적화 모드에서 Clang을 사용할 때 my_strtod_int() 함수에 대한 Valgrind 경고를 수정했습니다. (Bug #22839888)

  • 소수점 이하 64자리 값을 대상으로 하는 정밀 수학 연산이 0 결과를 생성할 수 있었습니다. (Bug #22828692)

  • ST_GeomFromGeoJSON()가 유효한 인수를 사용해도 오류를 반환할 수 있었습니다. (Bug #22804853)

  • STRICT_TRANS_TABLES SQL 모드가 활성화된 디버그 빌드에서 롤백할 수 없는 변경을 수행한 후 이어서 ER_NO_DEFAULT_FOR_FIELD 오류를 생성한 INSERT 또는 REPLACE 문이 어설션을 발생시킬 수 있었습니다. (Bug #22635253)

  • Optimizer에 원본과 대상이 겹치는지 확인하지 않는 memcpy() 호출이 포함되어 있었습니다. (Bug #22537196)

  • 디버그 빌드에서 JSON 값에 접근한 서브쿼리 결과에 대한 오류 검사가 누락되어 어설션이 발생할 수 있었습니다. (Bug #22522073)

  • CREATE TABLE... SELECT 문을 준비한 다음 테이블을 플러시하여 테이블을 닫고 준비된 문을 실행하면 서버 종료가 발생할 수 있었습니다. (Bug #22393309)

  • 조인의 일부인 파생 테이블의 select 목록에서 매개변수를 사용한 준비된 문이 서버 종료를 일으킬 수 있었습니다. (Bug #22392374, Bug #24380263)

  • 일부 grant 테이블은 MySQL 5.7.8에서 최대 사용자 이름 길이가 16자에서 32자로 증가한 것을 고려하지 않았습니다. (Bug #22379607, Bug #79680)

  • 생성된 컬럼 표현식을 재평가하면 이전에 해제된 메모리에 접근하고 서버가 종료될 수 있었습니다. (Bug #22346120)

  • 대상 인덱스 값이 로우 버퍼에 성공적으로 저장되지 않은 상태에서 인덱스를 검색하는 HANDLER read 문은 서버 종료를 유발할 수 있었습니다. (Bug #22321965)

  • NULL 값에 대한 숫자에서 ZEROFILL로의 변환을 부적절하게 처리하면 서버 종료로 이어질 수 있었습니다. (Bug #22281205)

  • SET 문에서 변수를 설정하기 위해 로우 생성자를 포함하는 서브쿼리를 사용하면 서버 종료가 발생할 수 있었습니다. (Bug #22276843)

  • SQL 모드에 ALLOW_INVALID_DATES가 포함되지 않은 경우, invalid_date IN (subquery)를 포함하고 서브쿼리 구체화로 처리된 쿼리는 서버 종료를 유발할 수 있었습니다. (Bug #22262843)

  • 임베디드 서버의 경우, 유효하지 않은 인수에 대한 검사 뒤의 코드가 누락되거나 올바르지 않은 인수로 호출되었으며, 이는 부적절한 종료로 이어질 수 있었습니다. (Bug #22262706)

  • OS X에서 vio_io_wait()select()를 사용하여 파일 디스크립터 수가 1024개로 제한되었습니다. 이제 이 제한을 피하기 위해 대신 kqueue 이벤트 알림이 사용됩니다. FreeBSD도 kqueue를 사용하도록 변경되었습니다. (Bug #22244911)

  • 저장 루틴 로딩에 기본 데이터베이스를 임시로 변경하는 작업이 포함되고 원래 기본 데이터베이스를 복원하는 중 오류가 발생하면 메모리 누수가 발생할 수 있었습니다. (Bug #22179795)

  • CMake 설정은 -Wno-xxx 대신 -Wxxx 컴파일러 옵션을 검사하도록 조정되었습니다. 이는 후자가 GCC에서 false positive를 생성하기 때문입니다. (Bug #21881753)

  • INFORMATION_SCHEMA.EVENTS.LAST_EXECUTEDmysql.event.last_executed의 값 사이에 불일치가 있을 수 있었습니다. 더 이상 이러한 문제가 발생하지 않습니다. 이벤트 정보는 보이지 않는 mysql.events 데이터 딕셔너리 테이블에 저장되므로, INFORMATION_SCHEMA.EVENTS가 이벤트 메타데이터에 대한 유일한 인터페이스가 됩니다. (Bug #21374010)

  • 뷰가 뷰 정의의 제한을 평가하기 전에 사용자 정의 함수 또는 SQL 함수를 평가할 수 있었습니다. (Bug #20933307)

  • -DENABLE_DTRACE=ON을 사용할 때 CMake가 동작하는 DTrace 설치가 있는지 확인하지 않았습니다. 이제 이를 확인하고, DTrace를 찾을 수 없으면 중단합니다. (Bug #20671056)

  • SHOW CREATE USER가 예상치 못한 결과를 반환했습니다. (Bug #20625566)

  • --log-error 옵션에 상대 경로 이름이 지정된 경우, mysqldstdoutstderr를 잘못된 위치로 보낼 수 있었습니다. (Bug #20609063)

  • LEAST()GREATEST()의 평가가 datetime 및 문자열 리터럴에 대해 너무 작은 정렬 버퍼를 사용할 수 있었으며, 이로 인해 어설션이 발생했습니다. (Bug #20565160)

  • MySQL 8.0에서 새로 추가된 오류에 대한 오류 번호 범위는 3500부터 시작하도록 지정되었습니다. (Bug #20538173)

  • Debian 패키징은 my.cnf에서 sql_mode 시스템 변수를 설정하지 않도록 업데이트되었습니다. (Bug #20535729)

  • PAD_CHAR_TO_FULL_LENGTH SQL 모드가 활성화된 경우, mysql.event 시스템 테이블에서 이벤트를 로드하는 작업이 실패할 수 있었습니다. (Bug #20073523, Bug #74947)

  • 중복 레코드를 처리하기 위해 REPLACE 또는 IGNORE 키워드를 사용하는 INSERTLOAD DATA와 같은 문장이 후속 작업에 영향을 줄 수 있었습니다. (Bug #20017428)

  • 소스 테이블의 non-BIT 데이터가 대상 테이블의 BIT 컬럼으로 선택되는 CREATE TABLE... SELECT가 서버 종료를 유발할 수 있었습니다. (Bug #19930894)

  • MySQL이 -DMYSQL_MAINTAINER_MODE=1로 설정되고 clang/Xcode 6.0으로 컴파일될 때 OS X에서 컴파일이 실패했습니다. (Bug #19694515, Bug #74100)

  • 일반 쿼리 로그에 기록되기 전에 비밀번호를 필터링하도록 다시 작성된 CHANGE MASTER TO 문에서 MASTER_AUTO_POSITION 절이 손실되었습니다. (Bug #19622609)

  • SELECT 절에서 VALUES() 함수를 사용하면 서버 종료가 발생할 수 있었습니다. (Bug #19601973)

  • 테이블 이름 변경 코드의 잠재적인 null-pointer 역참조 및 메모리 누수가 수정되었습니다. (Bug #18194270)

  • 문자 컬럼과 집계 함수를 비교하기 위해 MATCH... AGAINST를 사용하면 서버 종료가 발생할 수 있었습니다. (Bug #17865492)

  • Connections 상태 변수, Performance Schema threadsglobal_status 테이블, SHOW PROCESSLIST 문과 같은 다양한 정보 소스에서 연결 수에 대해 약간 다른 값이 보고될 수 있었습니다. (Bug #17666696)

  • set operation과 외부 참조가 포함된 서브쿼리가 있는 쿼리는 서버 종료를 일으킬 수 있었습니다. (Bug #17270896)

  • 유효하지 않은 사용자의 비밀번호를 변경하기 위해 GRANT를 사용하면 오류가 발생했지만, mysql.user 시스템 테이블도 업데이트되었습니다. (Bug #17180985)

  • 공간 WKT 데이터의 Parser는 0.23과 같은 숫자는 허용했지만, 앞의 0이 없는 동등한 값인 .23은 허용하지 않았습니다. 이제 두 형식이 모두 허용됩니다. (Bug #17167633)

  • 이전에는 클라이언트가 집계 크기가 performance_schema_session_connect_attrs_size 시스템 변수의 값보다 큰 연결 속성 키/값 쌍을 전송하려고 하면, Performance Schema가 속성 데이터를 잘랐습니다. 또한 log_warnings 시스템 변수가 0보다 큰 경우 Performance Schema는 이 메시지를 오류 로그에 기록했습니다:

    [Warning] Connection attributes of length N were truncated
    

    이 메시지는 DBA가 문제가 있는 클라이언트를 확인하려고 할 때 도움이 되지 않았으므로, 연결 속성 처리에 몇 가지 변경 사항이 적용되었습니다:

    • 과도한 데이터에 대해서는 연결 속성 잘림이 여전히 발생하지만, 로그 메시지가 더 유용한 정보를 제공합니다. 이 메시지에는 손실된 바이트 수, 연결 식별자, 클라이언트 사용자에 대한 정보가 포함됩니다. 추가 정보는 DBA가 속성 잘림이 발생한 클라이언트를 더 쉽게 식별할 수 있게 해야 합니다.

    • 잘림이 발생하면, 속성 버퍼에 충분한 공간이 있는 경우 손실된 바이트 수를 나타내는 값을 가진 _truncated 속성이 세션 속성에 추가됩니다. 이를 통해 Performance Schema는 연결 속성 테이블에서 연결별 잘림 정보를 노출할 수 있습니다.

    • 새 상태 변수 Performance_schema_session_connect_attrs_longest_seen는 서버가 확인한 64KB보다 작은 가장 긴 연결 속성 버퍼를 나타냅니다. 이 값이 performance_schema_session_connect_attrs_size보다 크면 속성 잘림이 발생한 것이며, DBA는 후자의 값을 늘리거나, 또는 어떤 클라이언트가 많은 양의 속성 데이터를 전송하는지 조사할 수 있습니다.

      자세한 내용은 Performance Schema Connection Attribute Tables를 참조하십시오. (Bug #16576959)

  • 데이터 딕셔너리 도입으로 여러 INFORMATION_SCHEMA 문제를 해결할 수 있습니다:

    • INFORMATION_SCHEMA.STATISTICS에 대한 쿼리는 select 목록의 컬럼 순서에 따라 다른 결과를 반환할 수 있었습니다.

    • 일부 INFORMATION_SCHEMA 테이블에는 최적이 아닌 컬럼 타입과 크기가 있었습니다. 이제 mysql 시스템 데이터베이스의 데이터 딕셔너리 테이블에 대한 뷰가 된 이러한 테이블에는 더 적절한 컬럼 정의가 있습니다.

    • 데이터베이스 또는 파일 이름을 확인하기 위해 디렉터리 스캔을 초래했던 INFORMATION_SCHEMA 테이블에 대한 쿼리는 더 이상 그렇게 하지 않고, 대신 데이터 딕셔너리에서 데이터베이스 및 테이블 이름을 읽습니다.

    • 테이블 메타데이터를 얻기 위해 .frm 파일을 열었던 INFORMATION_SCHEMA 테이블에 대한 쿼리는 더 이상 그렇게 하지 않고, 대신 데이터 딕셔너리에서 이 정보를 읽습니다.

    • INFORMATION_SCHEMA 쿼리에서 데이터베이스 또는 테이블 이름을 비교할 때, 특정 콜레이션을 강제하기 위해 COLLATE를 사용하는 것은 INFORMATION_SCHEMA 테이블 컬럼에 적용된 경우에만 작동했으며, 비교 값에 적용된 경우에는 작동하지 않았습니다.

      이러한 비교 수행에 대한 추가 정보는 Using Collation in INFORMATION_SCHEMA Searches를 참조하십시오.

    (Bug #14017351, Bug #65121, Bug #17559183, Bug #70462, Bug #23259470, Bug #81347, Bug #20372562, Bug #75532, Bug #13878164, Bug #11756519, Bug #48445)

  • Windows에서 서버가 비정상적으로 종료되는 경우, 이전에는 서버가 module_name.dmp라는 이름의 미니덤프 파일을 생성했으며, 여기서 module_name은 서버 실행 파일의 이름입니다. 이전 미니덤프 파일이 덮어써지는 것을 방지하기 위해, 이제 미니덤프 파일 이름에는 프로세스 ID가 포함되며 module_name..piddmp 형식을 가집니다. 예를 들어 mysqld.exe.7296.dmp입니다. (Bug #12779463)

  • INFORMATION_SCHEMA 테이블에 대한 쿼리의 경우, 스키마 및 테이블 이름 비교는 기반 파일 시스템의 특성과 lower_case_table_names 시스템 변수 값에 따라 대소문자를 구분하거나 구분하지 않을 수 있었습니다. 또한 COLLATE 절이 무시되었기 때문에 비교 속성을 변경하기 위해 COLLATE 절을 제공해도 효과가 없었습니다. 이제 COLLATE가 더 이상 무시되지 않고 원하는 비교 속성을 얻는 데 사용할 수 있도록 변경되었습니다. (Bug #11748044, Bug #34921)

  • FLOOR(CEIL())은 큰 BIGINT UNSIGNED 인수를 잘랐습니다. (Bug #80873, Bug #23013359)

  • JSON_MERGE() 함수가 반환한 값을 JSON_SET()을 사용하여 조작하면 때때로 잘못된 결과가 생성되었습니다. (Bug #80787, Bug #22961128)

  • 사용자 정의 변수를 사용하여 geometry 인수가 제공된 경우 ST_AsGeoJSON()가 실패했습니다. (Bug #80697, Bug #22912800)

  • CAST(expr AS BINARY(N))N의 일부 유효한 값에 대해 예기치 않게 NULL을 반환했습니다. (Bug #80630, Bug #22885819)

  • SRID 매개변수를 받는 Geometry import 함수는 경고나 오류 없이 이를 unsigned 32-bit integer로 캐스트했으므로, 음수 값이나 unsigned 32-bit integer 범위보다 큰 값은 범위 내의 숫자로 조용히 변환되었습니다. 이제 SRID를 매개변수로 받는 모든 geometry 함수는 해당 값이 unsigned 32-bit integer 범위 내에 있는지 확인하고, 그렇지 않으면 ER_DATA_OUT_OF_RANGE 오류를 생성합니다. 이는 이전에 매개변수가 범위 내에 있는지 확인했지만 다른 오류 코드를 반환했던 GeoJSON 및 GeoHash 함수에도 적용됩니다. (Bug #80499, Bug #22819614)

  • predicate 값을 저장하는 동안 rounding이 발생하면, range optimizer가 <<= 연산자에 대해 올바른 결과를 반환하지 않을 수 있었습니다. (Bug #80244, Bug #22661012)

  • mf_iocache unit test에 대해 누락된 va_end()를 추가하고, my_end()를 호출하여 메모리 누수를 수정하며, 해당 테스트의 target을 추가했습니다. 이러한 변경 사항의 기반이 된 패치를 제공한 Daniel Black에게 감사드립니다. (Bug #80085, Bug #22578670)

  • SELECT DISTINCT SUBSTR()는 큰 position 또는 length 인수에 대해 값을 중복으로 잘못 폐기할 수 있었습니다. 동일한 문제는 LEFT()RIGHT()에도 영향을 주었습니다. (Bug #80047, Bug #22565155)

  • SUBSTRING_INDEX(str, delim, count)는 32비트보다 큰 count 값을 올바르게 처리하지 않았습니다. (Bug #79978, Bug #22545429)

  • CONVERT() 호출의 경우, literal string 인수가 실행 중 수정되어 잘못된 결과를 생성할 수 있었습니다. (Bug #79924, Bug #22531111)

  • REPLACE('a', BINARY 'b', NULL)NULL이 아니라 'a'를 반환했습니다. (Bug #79912, Bug #22523836)

  • 트랜잭션 상태 추적은 이제 비표준 캐릭터셋과의 향상된 호환성을 위해 8비트에 안전하지 않은 함수를 사용하지 않습니다. (Bug #79905, Bug #22523383)

  • GREATEST()LEAST()는 모든 정수 입력을 signed로 처리했습니다. (Bug #79902, Bug #22523685)

  • 일반 쿼리 로그의 행에서 타임스탬프와 스레드 ID 사이의 탭이 누락되었습니다. 패치를 제공한 Tsubasa Tanaka에게 감사드립니다. (Bug #79868, Bug #22508563)

  • unsigned 값과 음수 상한 사이의 일부 비교가 잘못된 결과를 반환할 수 있었습니다(예: CAST(100 AS UNSIGNED) BETWEEN 1 AND -1). (Bug #79857, Bug #22501606)

  • REPEAT() 함수가 SUBSTR() 함수의 출력을 올바르게 처리하지 않았습니다. (Bug #79695, Bug #22391186)

  • JSON_TYPE() 함수는 이제 JSON으로 캐스트된 BIT 리터럴의 타입을 BIT가 아니라 BLOB로 표시합니다. (Bug #79308, Bug #22297987)

  • -DWITH_UBSAN=ON CMake 옵션으로 MySQL을 설정하면 완전하게 작동하지 않는 서버가 생성되었습니다. (Bug #79238, Bug #22194071)

  • MySQL 배포판에 포함된 헤더 파일인 sql_common.h는 MySQL 배포판에 포함되지 않은 헤더 파일인 hash.h를 include했으므로 이에 의존했습니다. 이로 인해 컴파일 실패가 발생했습니다. 이 의존성을 제거하기 위해 sql_common.h가 더 이상 hash.h를 include하지 않도록 수정되었습니다. (Bug #79237, Bug #22187997, Bug #70672, Bug #17633467)

  • 최대 문 실행 시간을 확인하는 데 사용되는 타이머가 서버가 --help 옵션으로 시작된 경우에도 초기화되었습니다. --help가 지정된 경우에는 더 이상 이 작업을 수행하지 않습니다. (Bug #79182, Bug #22172389)

  • Optimizer가 IF(true, '2015-01-01', '2015-01-01') IS NOT NULL 형식의 표현식을 제거하도록 최적화하려고 할 때 실패했습니다. (Bug #79114, Bug #22148586)

  • unsigned decimal의 뺄셈은 음수 값을 반환할 수 있었지만, UNSIGNED BINARY의 메타데이터 타입 정보를 사용했습니다. unsigned decimal 뺄셈의 뺄셈은 이제 unsigned integer와 동일한 방식으로 처리됩니다: 결과가 음수이면 NO_UNSIGNED_SUBTRACTION SQL 모드가 활성화된 경우를 제외하고 ER_DATA_OUT_OF_RANGE 오류를 생성합니다. (Bug #78914, Bug #22083757)

  • 264보다 큰 숫자에 대한 HEX() 함수의 처리가 개선되었습니다. (Bug #78828, Bug #22297983)

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

  • -Wstrict-prototypes로 컴파일할 때 경고를 피하기 위해 클라이언트 측 플러그인 deinitialization 함수 시그니처가 int (*deinit)()에서 int (*deinit)(void)로 변경되었습니다. (Bug #78177, Bug #21680094, Bug #81419, Bug #23282498)

  • DATA DIRECTORY 또는 INDEX DIRECTORY 테이블 옵션에 매우 길거나 잘못된 경로 이름이 지정된 경우 CREATE TABLE이 잘못된 오류를 보고했습니다. 이제 이러한 경우에는 ER_PATH_LENGTH 또는 ER_WRONG_VALUE가 보고됩니다. (Bug #76635, Bug #20857556)

  • 서버는 이제 다음 오류 코드에 대해 더 자세한 정보를 제공하는 메시지를 제공하려고 시도합니다: ER_CANT_CREATE_DB, ER_CANT_CREATE_TABLE, ER_DB_DROP_RMDIR, ER_ERROR_DURING_COMMIT, ER_ERROR_DURING_ROLLBACK, ER_GET_ERRNO. (Bug #76298, Bug #20694494)

  • XA 트랜잭션 준비 실패의 일부 사례에서, 불완전한 트랜잭션 정리가 assertion을 발생시킬 수 있었습니다. (Bug #75809, Bug #20488921)

  • mysqld가 유효하지 않은 소켓 파일 디스크립터를 닫으려고 시도할 수 있었습니다. 패치를 제공해 준 Zhai Weixiang에게 감사드립니다. (Bug #75778, Bug #20504513)

  • 다음 형식의 문은 테이블 데이터를 latin1로 변환했지만, 테이블 기본 캐릭터셋도 latin1로 변경하고 utf8 절을 무시했습니다:

    ALTER TABLE tbl_name CHARACTER SET utf8, CONVERT TO CHARACTER SET latin1;
    

    패치를 제공해 준 Daniel Black에게 감사드립니다. (Bug #75320, Bug #20279241)

  • mysqld.cc에서 abort_loop 변수는 volatile로 한정되어 있었으며, 일부 플랫폼에서는 이로 인해 다른 코어에서 실행 중인 스레드에서 변경 사항이 즉시 보이지 않을 수 있었습니다. 패치를 제공해 준 Stewart Smith에게 감사드립니다. (Bug #74846, Bug #20134637)

  • 트리거에서 뷰를 생성하는 프로시저를 호출하거나, RENAME TABLE을 실행하는 프로시저를 호출하는 함수를 생성하면, 특정 상황에서 assertion이 발생할 수 있었습니다. (Bug #74740, Bug #19988193, Bug #21198646)

  • 서버 측 프리페어드 스테이트먼트의 타임스탬프가 대응하는 비프리페어드 스테이트먼트의 타임스탬프보다 최대 1초 뒤처진 상태로 바이너리 로그에 기록될 수 있었으며, 이로 인해 마스터 서버와 슬레이브 서버 간에 시간 값 차이가 발생했습니다. (Bug #74550, Bug #19894382, Bug #25187670)

  • 동적 스토리지 엔진 플러그인의 경우, .frm 파일에서 엔진을 잘못 확인했기 때문에 DROP TABLE, TRUNCATE TABLE, 및 RENAME TABLE이 작동하지 않았습니다. (Bug #74277, Bug #19902868)

  • 실행된 프리페어드 스테이트먼트는 ? 파라미터 마커가 데이터 값으로 대체되어 기록됩니다. 기록된 문자열을 구성하는 방식이 비효율적이었으며 개선되었습니다. (Bug #73056, Bug #20955496)

  • 플러그인이 문자열 타입의 스레드 변수에 값을 할당할 때 메모리 누수가 발생할 수 있었습니다. (Bug #71759, Bug #19917521)

  • 뷰를 사용한 그룹화에서, 베이스 테이블에서 선택할 때는 발생하지 않던 ER_INVALID_GROUP_FUNC_USE 오류(“Invalid use of group function”)가 발생할 수 있었습니다. (Bug #70220, Bug #17406425)

  • 여러 LIMIT 절을 가진 쿼리가 항상 SQL 표준에 따라 해석되지는 않았습니다.

    예를 들어, 다음 각 쿼리는 이제 예상대로 두 개의 로우를 반환합니다:

    SELECT * FROM t LIMIT 2;
    
    (SELECT * FROM t LIMIT 2) LIMIT 4;
    
    ((SELECT * FROM t LIMIT 2) LIMIT 4) LIMIT 3;
    

    이는 또한 FROM DUAL을 사용하는 UNION 서브셀렉트 관련 문제도 수정합니다. 예를 들어, 다음 쿼리는 오류를 발생시켰습니다:

    SELECT 'A' AS `x` FROM DUAL
      UNION
    SELECT 'B' FROM DUAL
      UNION
    SELECT 'C' FROM DUAL
      ORDER BY `x` ASC;
    

    (Bug #50510, Bug #74251, Bug #11758322, Bug #19774083)

  • 스토리지 엔진에 의존하지 않도록 의도되었지만 실제로는 특정 엔진을 사용하던 테스트 케이스가 수정되었습니다. (WL #7264)