MySQL 8.0 Release Note

8.0.0 변경 사항 (2016-09-12 Development Milestone)

Estimated reading: 16 minutes 140 views

공식 문서: Changes in MySQL 8.0.0 (2016-09-12, Development Milestone)

계정 관리 관련 사항

비호환 변경: mysql 시스템 데이터베이스의 권한 부여 테이블이 이제 InnoDB(트랜잭션 지원) 테이블로 변경되었습니다. 이전에는 이 테이블들이 MyISAM(비트랜잭션) 테이블이었습니다. 이 변경 사항은 다음 테이블에 적용됩니다: user, db, tables_priv, columns_priv, procs_priv, proxies_priv.권한 부여 테이블 저장 엔진의 변경은 계정 관리 명령문의 동작 변화와 관련이 있습니다. 이전에는 여러 사용자를 지정하는 계정 관리 명령문이 일부 사용자에 대해서는 성공하고 다른 사용자에 대해서는 실패할 수 있었습니다. 이제 각 명령문은 트랜잭션으로 처리되어 모든 지정된 사용자가 성공하거나, 오류가 발생하면 롤백되어 아무런 영향도 미치지 않습니다. 명령문이 성공하면 바이너리 로그에 기록되지만, 실패하면 롤백이 발생하고 아무런 변경도 이루어지지 않습니다. 이 동작은 다음 명령문에 적용됩니다: ALTER USER, CREATE ROLE, CREATE USER, DROP ROLE, DROP USER, GRANT, RENAME USER, REVOKE. (SET PASSWORD는 최대 한 명의 사용자에게만 적용되므로 이미 사실상 트랜잭션 방식입니다.) 이 동작 변화의 부작용으로 MySQL 5.7 마스터에서 일부 완료된 계정 관리 명령문이 MySQL 8.0 슬레이브에서 복제될 때 실패할 수 있습니다. 자세한 내용은 원자 데이터 정의 명령문 지원을 참조하십시오.
이전 버전에서 이 MySQL 릴리즈로 업그레이드하는 경우, 이러한 변경 사항을 mysql 시스템 데이터베이스에 반영하려면 mysql_upgrade를 실행하고 서버를 재시작해야 합니다.

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

저장 엔진이 MyISAM에서 InnoDB로 변경되었기 때문에, 권한 부여 테이블에서 ORDER BY가 없는 SELECT는 이전과 다른 행 순서를 반환할 수 있습니다. 쿼리 결과가 특정 행 순서 특성을 가져야 하는 경우, ORDER BY 절을 포함하십시오. (WL #7158, WL #9045)

MySQL은 이제 권한의 이름이 지정된 모음을 나타내는 역할(role)을 지원합니다. 역할은 계정에 권한 세트를 할당할 수 있게 하며, 개별 권한을 부여하는 것보다 개념적으로나 구현 면에서 편리한 대안을 제공합니다:

참고ROLE은 이제 예약어가 되었으며, 식별자 인용 없이 식별자로 사용할 수 없습니다.

(WL #988)

C API 관련 사항

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

캐릭터셋 지원

utf8mb4 유니코드 캐릭터셋에 새로운 일반 콜레이션인 utf8mb4_0900_ai_ci가 추가되었습니다. utf8mb4는 또한 utf8mb4_0900_ai_ci와 유사한 특성을 가지면서도 특정 언어 규칙이 적용되는 여러 새로운 언어별 콜레이션을 포함하게 되었습니다. 언어별 콜레이션은 ISO 639-1 언어 코드를 콜레이션 이름에 포함하여 표시되며, 두 가지 경우에는 추가 항목이 있어 변형을 나타냅니다(독일어 전화번호부 순서, 전통 스페인어).

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

언어콜레이션
Croatianutf8mb4_hr_0900_ai_ci
Czechutf8mb4_cs_0900_ai_ci
Danishutf8mb4_da_0900_ai_ci
Esperantoutf8mb4_eo_0900_ai_ci
Estonianutf8mb4_et_0900_ai_ci
German phone book orderutf8mb4_de_pb_0900_ai_ci
Hungarianutf8mb4_hu_0900_ai_ci
Icelandicutf8mb4_is_0900_ai_ci
Latvianutf8mb4_lv_0900_ai_ci
Lithuanianutf8mb4_lt_0900_ai_ci
Polishutf8mb4_pl_0900_ai_ci
Classical Latinutf8mb4_la_0900_ai_ci
Romanianutf8mb4_ro_0900_ai_ci
Slovakutf8mb4_sk_0900_ai_ci
Slovenianutf8mb4_sl_0900_ai_ci
Modern Spanishutf8mb4_es_0900_ai_ci
Traditional Spanishutf8mb4_es_trad_0900_ai_ci
Swedishutf8mb4_sv_0900_ai_ci
Turkishutf8mb4_tr_0900_ai_ci
Vietnameseutf8mb4_vi_0900_ai_ci

utf8mb4_0900_ai_ci는 또한 다음 표의 언어들에 대해 악센트와 대소문자를 구분하지 않는 콜레이션으로 동작합니다.

표 6 utf8mb4_0900_ai_ci가 적합한 언어들

언어명언어 코드
German (dictionary order)de
Englishen
Canadian French (locale fr_CA)fr
Irish Gaelicga
Indonesianid
Italianit
Luxembourgianlb
Malayms
Dutchnl
Portuguesept
Swahilisw
Zuluzu

utf8mb4_da_0900_ai_ci는 또한 다음 표의 언어들에 대해 악센트와 대소문자를 구분하지 않는 콜레이션으로 동작합니다.

표 7 utf8mb4_da_0900_ai_ci가 적합한 언어들

언어명언어 코드
Norwegianno
Norwegian Bokmålnb
Norwegian Nynorsknn

언어에 구애받지 않는 utf8mb4_0900_ai_ci 및 언어별로 특정된 utf8mb4_LANG_0900_ai_ci 유니코드 정렬 규칙은 다음과 같은 특성을 가지고 있습니다:

  • 이 정렬 규칙은 유니코드 정렬 알고리즘(UCA) 9.0.0 및 공통 로케일 데이터 저장소(CDLR) v30을 기반으로 하며, 악센트 무시 및 대소문자 구분 무시를 합니다. 이러한 특성은 정렬 규칙 이름의 _0900, _ai, _ci로 표시됩니다. 예외: utf8mb4_la_0900_ai_ci는 고전 라틴어가 CLDR에 정의되어 있지 않기 때문에 CLDR을 기반으로 하지 않습니다.
  • 이 정렬 규칙은 [U+0, U+10FFFF] 범위의 모든 문자에 대해 작동합니다.
  • 정렬 규칙이 특정 언어에 구애받지 않는 경우, 보충 문자를 포함한 모든 문자를 기본 순서(다음에 설명됨)로 정렬합니다. 정렬 규칙이 언어에 구애받는 경우, 해당 언어의 문자는 언어별 규칙에 따라 올바르게 정렬되며, 해당 언어에 속하지 않는 문자는 기본 순서로 정렬됩니다.
  • 기본적으로 이 정렬 규칙은 DUCET(Default Unicode Collation Element Table) 테이블에 나열된 코드 포인트를 가진 문자를 테이블에서 할당된 가중치 값에 따라 정렬합니다. DUCET 테이블에 나열되지 않은 코드 포인트를 가진 문자는 UCA에 따라 구성된 암시적 가중치 값을 사용하여 정렬합니다.
  • 언어에 구애받지 않는 정렬 규칙의 경우, 수축(contraction) 시퀀스의 문자는 별개의 문자로 취급됩니다. 언어에 구애받는 정렬 규칙의 경우, 수축은 문자 정렬 순서를 변경할 수 있습니다.

자세한 내용은 유니코드 캐릭터셋을 참조하세요. (WL #9125, WL #9108, WL #9479)

컴파일 관련 사항

Microsoft Windows: Windows에서 MySQL을 빌드할 때 이제 도구체인이 가능할 경우 64비트 도구를 우선 사용합니다(이전에는 32비트). 이로 인해 링크 속도가 빨라지고 32비트 링커에서 발생하는 제한된 주소 공간 관련 문제가 방지됩니다. (버그 #80675, 버그 #22900585)

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

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

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

소스 코드 정리를 위해 여러 작업이 수행되었습니다. 여기에는 불필요한 CMake 검사 제거, 소스 파일에서 사용되지 않는 매크로 제거, 종속성을 줄이고 모듈화를 위해 헤더 파일 재구성, 정의 없이 선언된 함수 제거, 표준 라이브러리에서 제공되는 함수로 로컬에서 작성된 함수 대체 등이 포함됩니다.

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

  • GCC: 4.8 이상
  • Clang: 3.4 이상(OS X의 경우 Xcode 7)
  • Solaris Studio: 12.4 이상(솔라리스 클라이언트 빌드 전용)
  • Visual Studio: 2015
  • CMake: Windows의 경우, 요구되는 Visual Studio 버전에 따라 요구되는 CMake 버전은 3.2.3 이상입니다.

Solaris에서는 더 이상 stlport 라이브러리를 사용하지 않습니다. 이로 인해 SUNPRO_CXX_LIBRARYCMake 옵션이 더 이상 필요하지 않게 되어 제거되었습니다. (WL #8896)

컴포넌트 관련 사항

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

  • 컴포넌트는 서버 및 다른 컴포넌트에 제공되는 서비스를 제공합니다. (서비스 사용과 관련하여 서버는 다른 컴포넌트와 동일하게 컴포넌트로 취급됩니다.) 컴포넌트는 제공하는 서비스를 통해서만 상호 작용합니다.
  • INSTALL COMPONENTUNINSTALL COMPONENT 명령문은 런타임에 컴포넌트를 조작할 수 있는 SQL 인터페이스를 제공합니다.
  • 로더 서비스는 설치된 컴포넌트를 mysql.component 시스템 테이블에 등록하고, 이후 서버 재시작 시 등록된 컴포넌트를 설치합니다.

컴포넌트 인프라와 SQL 수준 인터페이스에 대한 일반적인 정보는 MySQL 컴포넌트를 참조하십시오. 컴포넌트의 내부 구현에 대한 정보는 MySQL 서버 Doxygen 문서를 참조하십시오. 해당 문서는 https://dev.mysql.com/doc/index-other.html에서 확인할 수 있습니다. (WL #4102)

구성 관련 사항

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

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

MySQL은 이제 SET 문법의 변형인 SET PERSIST 명령문을 지원하여 런타임 시 구성 변경을 하고, 서버 재시작 후에도 지속될 수 있도록 합니다. SET GLOBAL과 마찬가지로, SET PERSIST는 런타임에 설정 가능한 모든 글로벌 시스템 변수에 허용됩니다. 이 명령문은 런타임 변수 값을 변경하는 동시에, 해당 변수 설정을 데이터 디렉토리의 mysqld-auto.cnf라는 옵션 파일에 기록합니다. 서버 시작 시, 이 파일은 다른 모든 옵션 파일 후에 처리됩니다. 자세한 내용은 영구적 시스템 변수를 참조하십시오.
각 시스템 변수가 가장 최근에 어떻게 설정되었는지에 대한 정보를 제공하기 위해, 성능 스키마에는 이제 variables_info 테이블이 추가되어 각 시스템 변수와 그 값의 출처를 나열합니다. 성능 스키마 variables_info 테이블을 참조하십시오.
이전 버전에서 이 MySQL 릴리즈로 업그레이드하는 경우, 이러한 변경 사항을 성능 스키마에 반영하려면 mysql_upgrade를 실행하고 서버를 재시작해야 합니다. (WL #8688)

데이터 딕셔너리 관련 사항

비호환 변경: MySQL 서버는 이제 트랜잭션 테이블에 데이터베이스 객체에 대한 정보를 포함하는 글로벌 데이터 사전을 통합합니다. 이전 MySQL 릴리스에서는 사전 데이터가 메타데이터 파일과 비트랜잭션 시스템 테이블에 저장되었습니다.

중요
데이터 사전이 활성화된 서버는 데이터 사전이 없는 서버와 비교했을 때 일반적인 운영 차이가 있습니다. 자세한 내용은 데이터 사전 사용 차이점을 참조하십시오. 또한 MySQL 8.0으로의 업그레이드 절차는 이전 MySQL 릴리스와 다르며 특정 전제 조건을 확인하여 설치 준비를 확인해야 합니다. 자세한 내용은 MySQL 업그레이드를 참조하십시오. 특히 업그레이드 준비를 참고하십시오.

InnoDB는 MySQL 8.0.0 릴리스에서도 자체 데이터 사전을 계속 사용합니다.

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

  • 기본 테이블 및 뷰와 연결된 .frm 메타데이터 파일이 더 이상 존재하지 않습니다. 이전에 .frm 파일에 저장된 메타데이터는 이제 데이터 사전 테이블에 저장됩니다.마찬가지로, 이전에 .TRG.TRN 파일에 저장된 트리거 메타데이터는 데이터 사전 테이블에 저장되며, 해당 파일도 더 이상 존재하지 않습니다.
  • .frm 파일 구조에 의해 부과된 64KB 테이블 정의 크기 제한이 제거되었습니다.
  • .frm 파일이 제거됨에 따라 INFORMATION_SCHEMA.TABLES VERSION 필드는 이제 MySQL 5.7에서 사용된 마지막 .frm 파일 버전인 10의 하드코딩된 값을 보고합니다.
  • .frm 파일이 제거됨에 따라 sync_frm 시스템 변수가 제거되었습니다.
  • MySQL 데이터 사전을 서비스하는 새로운 사전 객체 캐시는 이전에 액세스한 데이터 사전 객체를 메모리에 저장하여 객체 재사용을 가능하게 하고 디스크 I/O를 최소화합니다. LRU 기반의 제거 전략이 사용되어 가장 최근에 사용되지 않은 객체를 메모리에서 제거합니다. 캐시는 여러 파티션으로 구성되며, 각 파티션은 다른 객체 유형을 저장합니다. 자세한 내용은 사전 객체 캐시를 참조하십시오.
  • 새로운 내부 데이터 사전 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 테이블을 처리했기 때문에 이것이 불가능했습니다.
    이전 개선 사항은 또한 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

    자세한 내용은 INFORMATION_SCHEMA 쿼리 최적화를 참조하십시오.

    • 이제 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 테이블에 최대 64자로 저장되며, SQL 표준에 따라 더 긴 외래 키 이름은 더 이상 허용되지 않습니다.
    • 데이터 사전이 데이터베이스 객체에 대한 정보를 제공하므로, 서버는 더 이상 데이터베이스를 찾기 위해 데이터 디렉터리에서 디렉터리 이름을 확인하지 않습니다. 따라서 --ignore-db-dir 옵션과 ignore_db_dirs 시스템 변수는 불필요하며 제거되었습니다. 시스템 구성 및 애플리케이션 프로그램을 업데이트하십시오.
    • 이전에는 존재하지 않는 데이터베이스 이름으로 테이블 이름을 한정하여 존재하지 않는 데이터베이스에 임시 테이블을 생성할 수 있었습니다. 이제는 이 동작이 허용되지 않습니다.
    • 시스템 테이블 변경 사항:
      • 많은 시스템 테이블이 MyISAM(비트랜잭션) 테이블에서 InnoDB(트랜잭션) 테이블로 변환되었습니다. 예를 들어, 이 릴리스 노트의 다른 부분에서 논의된 바와 같이, 권한 부여 테이블은 이제 InnoDB 테이블입니다. 다른 예는 다음과 같습니다.
      • mysql 시스템 데이터베이스에 있는 함수 정보를 저장하는 func 테이블은 이제 InnoDB(트랜잭션) 테이블입니다. 이전에는 MyISAM(비트랜잭션) 테이블이었습니다.
        이 변경으로 인해 CREATE FUNCTIONDROP FUNCTION 명령문은 로드 가능한 함수에 대해서도 암시적 커밋을 발생시킵니다(참고: 암시적 커밋을 발생시키는 명령문). 이전에는 저장 함수의 경우 암시적 커밋을 발생시켰지만, 로드 가능한 함수의 경우에는 그렇지 않았습니다.
      • 이전에는 저장 루틴 및 이벤트에 대한 정보가 mysql 시스템 데이터베이스의 procevent 테이블에 저장되었습니다. 이제 이러한 테이블은 더 이상 사용되지 않습니다. 대신, 저장 루틴 및 이벤트에 대한 정보는 mysql 시스템 데이터베이스의 routines, events, 및 parameters 데이터 사전 테이블에 저장됩니다. 이전 테이블은 MyISAM(비트랜잭션) 저장 엔진을 사용했습니다. 새로운 테이블은 InnoDB(트랜잭션) 엔진을 사용합니다.
        이전에는 불법 문자를 포함하는 저장 루틴을 생성하면 경고가 발생했습니다. 이제는 오류가 발생합니다.
      • 시스템 테이블에 대한 액세스(예: 시간대 또는 로그 테이블)를 비시스템 테이블에 대한 액세스와 구분할 수 있도록, 서버는 System lockOpening tables 스레드 상태 대신 Locking system tablesOpening system tables 스레드 상태를 사용합니다. 자세한 내용은 일반 스레드 상태를 참조하십시오.
    • InnoDB 변경 사항:
      • 영구적인 InnoDB 테이블스페이스는 이제 Serialized Dictionary Information (SDI) 의 트랜잭션 저장소를 포함하며, 이는 직렬화된 형태의 사전 객체 데이터입니다. 앞서 언급한 .frm 및 트리거 메타데이터 파일의 소멸과 함께, .SDI 파일의 등장에 주목할 수 있습니다. SDI 트랜잭션 저장소는 아직 완전히 구현되지 않은 진행 중인 기능을 위해 예약되었습니다.
      • 새로운 명령줄 유틸리티인 ibd2sdi는 영구적인 InnoDB 테이블스페이스에서 직렬화된 사전 정보를 추출하는 데 사용됩니다. SDI 데이터는 이 릴리스의 영구적인 InnoDB 테이블스페이스에 존재하지 않습니다. ibd2sdi 유틸리티는 향후 사용을 위해 예약되어 있습니다.
      • MySQL 데이터 사전 기능과 관련된 MySQL 초기화 변경 사항을 지원하기 위해 InnoDB 시작 코드가 리팩토링되었습니다.
    • 업그레이드 및 다운그레이드 관련 사항:
      • MySQL 5.7에서 MySQL 8.0으로 업그레이드하려면 MySQL 업그레이드에 설명된 업그레이드 절차를 수행해야 합니다.
      • MySQL 8.0에서 MySQL 5.7로의 다운그레이드는 논리적 다운그레이드 방법(mysqldump 다운그레이드)을 사용하여 지원됩니다. 직접적인 다운그레이드는 지원되지 않습니다.

    (버그 #80481, 버그 #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 값과 같은 특정 데이터 유형에 대해 이전에는 수행하기 어려웠던 비트 연산을 더 쉽게 수행할 수 있습니다. 예시와 자세한 내용은 비트 함수 및 연산자를 참조하십시오.
    이 동작 변화의 한 가지 의미는 이진 문자열 인수에 대한 비트 연산이 MySQL 5.7과 8.0에서 서로 다른 결과를 생성할 수 있다는 점입니다. MySQL 5.7과 8.0 간의 잠재적 비호환성에 대비하는 방법에 대한 정보는 MySQL 5.7 레퍼런스 매뉴얼비트 함수 및 연산자를 참조하십시오. (WL #8699)

    사용 중단 및 제거 관련 사항

    중요 변경; InnoDB: 다음 InnoDB 파일 형식 구성 옵션은 MySQL 5.7.7에서 사용 중단되었으며 이제 제거되었습니다:

    • innodb_file_format
    • innodb_file_format_check
    • innodb_file_format_max
    • innodb_large_prefix

    파일 형식 구성 옵션은 MySQL 5.1의 이전 버전과 호환되는 테이블을 생성하는 데 필요했습니다. 이제 MySQL 5.1이 제품 수명 주기의 끝에 도달했기 때문에 이러한 옵션은 더 이상 필요하지 않습니다.
    FILE_FORMAT 열은 INNODB_SYS_TABLESINNODB_SYS_TABLESPACES 정보 스키마 테이블에서 제거되었습니다. (WL #7704)

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

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

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

    사용 중단된 mysql_install_db 프로그램이 MySQL 배포판에서 제거되었습니다. 데이터 디렉터리 초기화는 --initialize 또는 --initialize-insecure 옵션을 사용하여 mysqld를 호출하여 수행해야 합니다. 또한 mysql_install_db에서 사용된 mysqld의 사용 중단된 --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)

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

    Doxygen 관련 사항

    MySQL 소스 코드는 내부 문서를 위해 Doxygen을 사용하도록 업데이트되었습니다. 이 작업은 진행 중이며, 새로운 MySQL 버전이 배포될 때마다 Doxygen 문서도 업데이트됩니다. 최신 버전은 항상 https://dev.mysql.com/doc/index-other.html에서 확인할 수 있습니다.
    또한, MySQL 소스 배포판에서 Doxygen 콘텐츠를 로컬에서 생성하는 것도 가능합니다. 방법은 MySQL Doxygen 문서 콘텐츠 생성을 참조하십시오. (WL #8493)

    옵티마이저 관련 사항

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

    옵티마이저는 이제 유도 테이블이나 뷰를 외부 쿼리 블록에 병합할지 또는 내부 임시 테이블을 사용하여 물리화할지를 지정하기 위한 테이블 수준 MERGENO_MERGE 힌트를 지원합니다. 예시:

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

    자세한 내용은 옵티마이저 힌트를 참조하십시오. (버그 #79554, 버그 #22328100, WL #9307)

    MySQL은 이제 비가시성 인덱스를 지원합니다. 비가시성 인덱스는 옵티마이저에서 전혀 사용되지 않지만, 그 외에는 정상적으로 유지됩니다. 인덱스는 기본적으로 가시성 상태입니다. 비가시성 인덱스를 사용하면 인덱스가 쿼리 성능에 미치는 영향을 테스트할 수 있으며, 인덱스가 필요하다고 판명될 경우 이를 되돌려야 하는 파괴적인 변경 없이 이를 수행할 수 있습니다. 이 기능은 기본 키가 아닌 인덱스에 대해 InnoDB 테이블에 적용됩니다.
    새 인덱스에 대해 인덱스가 비가시성인지 여부를 제어하려면 CREATE TABLE, CREATE INDEX, 또는 ALTER TABLE에서 인덱스 정의의 일부로 VISIBLE 또는 INVISIBLE 키워드를 사용하십시오. 기존 인덱스의 비가시성 상태를 변경하려면 ALTER TABLE ... ALTER INDEX 작업에서 VISIBLE 또는 INVISIBLE 키워드를 사용하십시오. 자세한 내용은 비가시성 인덱스를 참조하십시오. (WL #8697)

    mysql 시스템 데이터베이스는 이제 열 값에 대한 통계를 저장하는 column_stats 테이블을 포함합니다. 자세한 내용은 옵티마이저 통계를 참조하십시오. (WL #8706)

    패키징 관련 사항

    이전 MySQL 시리즈에서 개발 마일스톤 릴리즈는 개발 마일스톤 N을 나타내기 위해 -mN 접미사를 사용했습니다. MySQL 8.0에서는 개발 릴리즈가 -dmr 접미사를 사용합니다. 예를 들어, 이 MySQL 릴리즈는 8.0.0-dmr로 번호가 매겨졌습니다. (버그 #80408, 버그 #22748154)

    이 릴리즈 노트의 다른 부분에서 설명된 C++11 기능의 사용 결과로 다음 패키징 변경 사항이 적용되었습니다:

    • Red Hat Enterprise Linux 5 및 Oracle Linux 5 RPM 지원이 중단되었습니다.
    • 일반 바이너리 타르볼 빌드는 Red Hat Enterprise Linux 6으로 이전되었습니다.

    (WL #8896)

    파서 관련 사항

    비호환 변경: SELECTUNION의 파서 규칙이 더 일관되도록 리팩터링되었으며(각 맥락에서 동일한 SELECT 구문이 일관되게 적용됨), 중복이 줄어들었습니다. 이 작업으로 인해 여러 사용자에게 보이는 영향이 발생했으며, 일부 구문을 다시 작성해야 할 수 있습니다:

    • 표준 SQL을 준수하여, NATURAL JOIN은 선택적으로 INNER 키워드를 허용합니다 (NATURAL INNER JOIN).
    • 괄호 없이 오른쪽으로 깊은 조인이 허용됩니다 (예: ... JOIN ... JOIN ... ON ... ON), 이는 표준 SQL을 준수한 것입니다.
    • STRAIGHT_JOIN은 이제 다른 내부 조인과 유사하게 USING 절을 허용합니다.
    • 파서는 쿼리 표현식 주위에 괄호를 허용합니다. 예를 들어, (SELECT ... UNION SELECT ...)가 허용됩니다.
    • 파서는 SQL_CACHESQL_NO_CACHE 쿼리 수정자의 허용되는 위치에 대해 더 잘 따릅니다.
    • 이전에 서브쿼리에서만 허용되었던 유니언의 왼쪽 중첩이 이제 최상위 수준 명령문에서도 허용됩니다. 예를 들어, 다음 명령문이 이제 유효한 것으로 인정됩니다:
    (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);

    (버그 #11746363, 버그 #25734, WL #8083, WL #8907)

    CREATE TABLE의 파서 규칙이 문맥 독립적으로 리팩터링되어 유지 관리성과 확장성이 향상되었습니다. 이 작업으로 인해 사용자에게 몇 가지 가시적인 변화가 발생했습니다:

    • 생성된 열의 경우, 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 관련 사항

    비호환성 변경: 퍼포먼스 스키마가 이제 서버 오류(및 경고)를 계측하며, 요약 테이블을 통해 이에 대한 통계 정보를 노출합니다:

    자세한 내용은 오류 요약 테이블을 참조하십시오.
    이 MySQL 릴리스를 이전 버전에서 업그레이드할 경우, mysql_upgrade를 실행하고 서버를 재시작하여 이 변경 사항을 performance_schema 데이터베이스에 적용해야 합니다.
    이러한 변경 사항의 결과로, 두 개의 서버 오류 기호가 다음과 같이 이름이 변경되었습니다: 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입니다.
    또한, 서버에서 더 이상 사용되지 않는 여러 서버 오류 코드가 제거되었습니다. 이러한 오류를 구체적으로 테스트하는 애플리케이션은 업데이트해야 합니다.

    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)

    이전에는 퍼포먼스 스키마의 events_statements_current 테이블에 있는 DIGESTDIGEST_TEXT 열이 명령문 실행이 끝난 후에만 채워졌습니다. 이제는 구문 분석 직후, 실행 시작 전에 열이 채워지므로 모니터링 애플리케이션이 명령문 실행 중에도 다이제스트 정보를 액세스할 수 있게 되었습니다. (버그 #23336542)

    이전에는 퍼포먼스 스키마 최적화가 모니터링 데이터 수집 시 발생하는 오버헤드 감소에 중점을 두었지만, 이제는 그 데이터를 검색하는 퍼포먼스 스키마 쿼리의 오버헤드도 감소되었습니다. 대부분의 퍼포먼스 스키마 테이블에 인덱스를 추가하여 옵티마이저가 전체 테이블 스캔 외에 다른 실행 계획에 액세스할 수 있게 하여 성능이 향상되었습니다. 이러한 인덱스는 이들 테이블을 사용하는 sys 스키마 뷰와 같은 관련 객체의 성능도 개선합니다. 자세한 내용은 퍼포먼스 스키마 쿼리 최적화를 참조하십시오. (WL #6616)

    퍼포먼스 스키마 테이블 setup_actorsROLE 열 크기가 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) 값을 가져오고 내보내는 공간 함수는 MySQL 비표준 구문인 'GEOMETRYCOLLECTION()'을 사용했으나, 이제 OpenGIS 표준 구문인 'GEOMETRYCOLLECTION EMPTY'를 사용합니다. 두 구문 모두 가져오기에 사용될 수 있으며, 내보내기에는 표준 구문이 사용됩니다. 자세한 내용은 WKT 값을 사용하여 기하학적 값을 생성하는 함수를 참조하십시오. (버그 #23632147, 버그 #81964)

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

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

    MySQL은 이제 공간 데이터에서 SRID 0 이외의 공간 참조 시스템(SRS)에 대한 정보를 저장합니다. 이 정보는 st_spatial_reference_systems 데이터 사전 테이블에 저장되며, EPSG 데이터셋 8.7을 기반으로 합니다. 공간 참조 시스템에 대한 자세한 내용은 공간 참조 시스템 지원을 참조하십시오.
    이전에는 ST_IsValid(), ST_MakeEnvelope(), ST_Validate() 함수가 SRID 0을 가진 기하학적 인수를 필요로 했습니다. 이제 이 함수들은 투영된 공간 참조 시스템의 SRID를 가진 기하학적 인수도 허용합니다. (WL #8579)

    MySQL 5.7에서는 여러 이름으로 제공되는 여러 공간 함수가 사용 중단되었으며, 공간 함수 네임스페이스를 더 일관되게 만드는 방향으로 나아갔습니다. 목표는 각 공간 함수 이름이 정확한 연산을 수행하는 경우 ST_로, 최소 경계 사각형에 기반한 연산을 수행하는 경우 MBR로 시작되도록 하는 것입니다. 사용 중단된 함수는 이제 제거되어, 대응되는 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와 유사합니다. (버그 #24350345)

    mysqltestrmdir 명령은 제거하려는 디렉터리에 파일이나 다른 디렉터리가 포함되어 있으면 실패합니다. 이제 mysqltest는 디렉터리 및 그 내용을 재귀적으로 제거할 수 있도록 force-rmdir 명령을 지원합니다. (버그 #24316799)

    두 개의 새로운 테스트 스위트 옵션은 테스트 케이스를 디버깅하는 데 도움이 됩니다:

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

    mysql-test-run.pl은 이제 MTR_CTEST_TIMEOUT 환경 변수를 인식합니다. 이 변수가 설정되면 해당 값은 ctest 유닛 테스트 명령에 전달할 타임아웃 시간(초)을 나타냅니다. (버그 #21821049, 버그 #21278845)

    MySQL 테스트 스위트의 테스트 케이스에서 이전에는 --error 명령에 대해 서버 오류에 대해서만 기호 오류 이름을 사용할 수 있었습니다. 이제 클라이언트 오류에도 사용할 수 있습니다. 예를 들어:

    --error CR_SERVER_GONE_ERROR

    (버그 #21048973, 버그 #76972)

    mysqltest 프로그램은 이제 패턴과 일치하는 모든 파일을 소스 디렉터리에서 대상 디렉터리로 복사하는 copy_files_wildcard 명령을 지원합니다. 자세한 내용은 MySQL Server Doxygen 문서를 참조하십시오. (버그 #82111, 버그 #23743035)

    X Plugin 관련 사항

    Protobuf 디코더 클래스는 기본값인 50으로 중첩된 객체의 수를 제한했습니다. (버그 #23707238, 버그 #82025)

    list_objects 명령문이 테이블을 잘못 컬렉션으로 보고했습니다. (버그 #23631240)

    create_collection 명령문이 _id 열에 기본 키 대신 고유 키 인덱스를 가진 컬렉션 테이블을 생성했습니다. (버그 #23284569)

    기능 추가 및 변경 사항

    비호환 변경; 파티셔닝: MySQL 서버에서 일반 파티셔닝 핸들러가 제거되었습니다. 이 변경의 일환으로, mysqld는 더 이상 --partition--skip-partition 옵션을 지원하지 않으며, -DWITH_PARTITION_STORAGE_ENGINE 옵션을 사용하여 서버를 빌드할 수 없습니다. 또한 SHOW PLUGINS의 출력이나 INFORMATION_SCHEMA.PLUGINS 테이블에도 partition이 더 이상 표시되지 않습니다.
    특정 테이블에 대해 파티셔닝을 지원하려면, 이제 해당 테이블에서 사용하는 스토리지 엔진이 자체 파티셔닝 핸들러(“네이티브” 파티셔닝 핸들러)를 제공해야 합니다. MySQL 8.0에서 지원하는 스토리지 엔진 중 네이티브 파티셔닝 핸들러를 포함하는 것은 InnoDB뿐입니다. 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로 변환하는 방법에 대한 자세한 내용은 해당 문서를 참조하십시오.

    이는 MySQL 5.7 또는 이전 버전에서 mysqldump를 사용하여 생성된 덤프 파일을 MySQL 8.0 서버로 가져올 때도 유사한 상황이 발생합니다. MySQL 8.0에서는 파티셔닝을 지원하지 않는 스토리지 엔진을 사용하는 테이블을 생성하려는 명령문이 오류로 실패하기 때문입니다. 이 때문에 덤프 파일에 있는 파티셔닝된 테이블을 생성하는 명령문이 지원되지 않는 스토리지 엔진을 지정하지 않도록 해야 합니다. 이를 위해 STORAGE ENGINE 옵션에 InnoDB가 아닌 값을 사용하는 CREATE TABLE 명령문에서 파티셔닝에 대한 참조를 제거하거나, 기본적으로 InnoDB를 사용하도록 하십시오.
    자세한 내용은 스토리지 엔진과 관련된 파티셔닝 제한 사항을 참조하십시오. (WL #8971, WL #9457)

    InnoDB: innodb_buffer_pool_debug 옵션은 innodb_buffer_pool_instances에 부과된 최소 1GB 버퍼 풀 크기 제약을 무시하고, 버퍼 풀이 1GB보다 작을 때 여러 버퍼 풀 인스턴스를 허용합니다. (버그 #24287290)

    InnoDB: 새 동적 구성 옵션인 innodb_deadlock_detect는 교착 상태 감지를 비활성화하는 데 사용될 수 있습니다. 높은 동시성을 가진 시스템에서는 다수의 스레드가 동일한 잠금을 기다릴 때 교착 상태 감지로 인해 성능 저하가 발생할 수 있습니다. 이 경우, 교착 상태 감지를 비활성화하고 교착 상태 발생 시 트랜잭션 롤백을 위한 innodb_lock_wait_timeout 설정에 의존하는 것이 더 효율적일 수 있습니다. (버그 #23477773, WL #9383)

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

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

    InnoDB: 이제 InnoDBALTER TABLE ALGORITHM=COPY 작업 중 10000행마다 발생했던 중간 커밋을 피합니다. 중간 커밋의 목적은 ALTER TABLE ALGORITHM=COPY 작업이 중단된 경우 복구 속도를 높이는 것이었습니다. 이제 ALTER TABLE ALGORITHM=COPY 작업이 중단되면, DDL 로그 복구 중에 새로운 커밋되지 않은 테이블이 롤백 전에 삭제되므로, 커밋되지 않은 테이블에 대한 시간 소모적인 데이터 롤백을 피할 수 있습니다. 이제 IGNORE 절이나 롤백 기능이 필요한 다른 것이 없는 한, ALTER TABLE ALGORITHM=COPY 작업에서는 언두 로그 기록이 억제됩니다.
    변경 중인 테이블에 전문 검색 인덱스가 있는 경우, 전문 검색 데이터는 새로운 커밋되지 않은 테이블에 행이 삽입될 때 전문 검색 보조 테이블에 삽입됩니다. 이전에는 전문 검색 데이터가 트랜잭션 커밋 시에만 처리되었습니다. (버그 #17479594)

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

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

    InnoDB: BLOB 코드를 리팩터링하여 압축된 BLOB 데이터와 압축되지 않은 BLOB 데이터에 대한 내부 C++ 인터페이스를 제공합니다. (WL #8985, WL #9141)

    InnoDB: InnoDB memcached 플러그인은 이제 여러 개의 키/값 쌍을 한 번에 가져오는 여러 get 작업과 범위 쿼리를 지원합니다. 자세한 내용은 InnoDB memcached Multiple get and Range Query Support를 참조하십시오. (WL #6650)

    InnoDB: 인덱스 트리 손상이 발생하면, InnoDB는 손상 플래그를 리두 로그에 기록하여 손상 플래그를 크래시로부터 안전하게 만듭니다. InnoDB는 또한 메모리 내 손상 플래그 데이터를 각 체크포인트 시점에 엔진 전용 시스템 테이블에 기록합니다. 복구 중에는 InnoDB가 두 위치에서 손상 플래그를 읽고 결과를 병합한 후, 메모리 내 테이블과 인덱스 객체를 손상된 것으로 표시합니다. (WL #7816)

    InnoDB: InnoDB는 이제 MySQL 데이터 디렉터리 외부에 테이블스페이스 데이터 파일을 생성할 때 .isl 파일(InnoDB 심볼릭 링크 파일)을 생성하지 않습니다.
    이 변경으로 서버가 오프라인 상태일 때 .isl 파일을 수동으로 수정하여 원격 테이블스페이스를 이동하는 것은 더 이상 지원되지 않습니다. (WL #6416)

    InnoDB: InnoDB는 더 이상 압축된 임시 테이블을 지원하지 않습니다. innodb_strict_mode가 활성화된 경우(기본값), ROW_FORMAT=COMPRESSED 또는 KEY_BLOCK_SIZE가 지정되면 CREATE TEMPORARY TABLE 명령이 오류를 반환합니다. innodb_strict_mode가 비활성화된 경우, 경고가 발생하며 비압축 행 형식을 사용하여 임시 테이블이 생성됩니다.
    이 변경으로 모든 임시 테이블은 공유 임시 테이블스페이스 ibtmp1에 생성됩니다.
    INFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO 테이블에서 PER_TABLE_TABLESPACEIS_COMPRESSED 열이 제거되었습니다. (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이 아닙니다. 유닉스 계열 시스템에서는 기본값이 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 데이터 디렉터리 외부에 파일별 테이블 테이블스페이스 데이터 파일을 생성할 때 더 이상 .isl 파일(InnoDB 심볼릭 링크 파일)을 생성하지 않습니다. 이제 InnoDB는 리두 로그를 사용하여 원격 테이블스페이스 데이터 파일을 찾습니다.
    MySQL 데이터 디렉터리 외부에 생성된 파일별 테이블 테이블스페이스 데이터 파일을 .isl 파일을 수정하여 오프라인으로 이동하는 것은 더 이상 지원되지 않습니다. (WL #6416)

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

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

    자세한 내용은 InnoDB의 AUTO_INCREMENT 처리InnoDB 자동 증가 카운터 초기화를 참조하십시오. (버그 #199, 버그 #13726455, WL #6204)

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

    • 이전에는 옵션 명세 사이에 쉼표가 없었으므로(예: MASTER_USER =MASTER_PASSWORD = 사이), 사용자가 명령문을 복사하여 붙여넣기 할 때 쉼표를 수동으로 추가해야 했습니다. 이제 명령문이 에러 로그에 기록될 때 쉼표가 삽입됩니다.
    • MASTER_PASSWORD 값의 자리표시자로 삽입되는 리터럴 “<secret>”은 이제 따옴표로 묶이지 않습니다. 사용자가 이 리터럴을 실제 암호로 교체하는 것을 잊고 복사 및 붙여넣기를 했을 때, 즉시 구문 오류가 발생하여 다른 문제가 발생하기 전에 이를 알 수 있습니다.

    (버그 #18194384)

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

    복제: 이제 새로운 성능 스키마 단계가 추가되어 행 기반 복제의 진행 상황을 표시합니다. 이를 통해 느린 작업이 있는 경우 해당 진행 상황을 확인할 수 있으며, 변경 사항이 적용되는 데이터베이스도 파악할 수 있습니다. 이는 행 기반 복제 문제를 해결하는 데 도움이 되며 성능 조정을 위한 추가 정보를 제공합니다. 자세한 내용은 행 기반 복제 모니터링을 참조하십시오. (WL #7364)

    JSON: 이번 릴리스에서는 MySQL에 저장된 JSON 문서와 함께 사용할 수 있는 언쿼팅 추출 연산자 ->>가 추가되었습니다. 새로운 연산자는 -> 연산자와 유사하지만, 값을 JSON 언쿼팅하는 기능을 추가로 수행합니다. JSON 열 mycol과 JSON 경로 표현식 mypath에 대해, 다음 세 가지 표현식은 동일하게 작동합니다:

    ->> 연산자는 JSON_UNQUOTE(JSON_EXTRACT())가 허용되는 모든 SQL 문에서 사용할 수 있습니다. 여기에는 (하지만 이에 국한되지 않음) SELECT 목록, WHEREHAVING 절, 그리고 ORDER BYGROUP BY 절이 포함됩니다.
    자세한 내용은 JSON 값 검색 함수JSON 경로 구문을 참조하십시오. (버그 #78736, 버그 #21980346, WL #9124)
    보다 정확한 추정치를 생성하기 위해, MEMORY 스토리지 엔진은 이제 인덱스 통계를 계산할 때(키당 레코드 추정치) 정수 산술 대신 부동 소수점 산술을 사용합니다. (버그 #23024059)

    새로운 CMake 옵션인 INSTALL_STATIC_LIBRARIES는 정적 라이브러리 설치 여부를 제어할 수 있게 합니다. 기본값은 ON입니다. 이 값이 OFF로 설정되면 libmysqlclient.a, libmysqld.a, libmysqlservices.a 라이브러리가 설치되지 않습니다. (버그 #22891432)

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

    (버그 #22884886)

    이전에는 성능 스키마가 내장 서버 libmysqld용으로 빌드되지 않았습니다. 이로 인해 show_compatibility_56=OFF를 사용한 경우 SHOW STATUSSHOW VARIABLES 명령을 사용할 수 없었습니다. 이제 libmysqld의 경우 필요한 성능 스키마 테이블이 빌드되며(계측 데이터는 수집되지 않음), 이를 통해 show_compatibility_56=OFF를 사용할 때도 이러한 SHOW 명령을 지원할 수 있습니다. (버그 #22809694)

    JSON_CONTAINS(), JSON_SEARCH() 및 기타 MySQL JSON 함수에서 JSON 객체를 검사할 때 키와 값 또는 둘 모두의 로컬 복사본을 과도하게 생성하는 여러 내부 함수가 사용되었습니다. 이러한 복사본 생성은 많은 경우 제거되었거나 줄어들었으며, 일부 함수에서 사용하는 임시 객체의 수명도 단축되었습니다. 이러한 변경 사항은 이와 관련된 JSON 함수들이 이전보다 더 효율적으로 작동하고, 더 적은 리소스를 사용할 수 있게 합니다. (버그 #22602142)

    시스템에 lz4openssl zlib 명령이 있는 경우, lz4_decompresszlib_decompress 유틸리티는 더 이상 필요하지 않습니다. 두 가지 변경 사항을 통해 이러한 유틸리티가 빌드되지 않도록 설정할 수 있습니다. 새 WITH_LZ4 CMake 옵션을 system으로 설정하면 lz4_decompress가 빌드 또는 설치되지 않으며, WITH_ZLIB 옵션을 system으로 설정하면 zlib_decompress가 빌드 또는 설치되지 않습니다. (버그 #22329851)

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

    mysys 라이브러리의 소스 코드가 이제 C++을 사용하여 더 엄격한 컴파일 검사를 수행하고 C++ 기능을 사용할 수 있도록 변경되었습니다. (버그 #21881278)

    성능 향상과 다른 플랫폼과의 더 나은 호환성을 위해, OS X에서 my_sync()가 이제 F_FULLSYNC 플래그가 있는 fcntl() 대신 fsync()를 사용합니다. (버그 #20742269)

    새로운 CMake 옵션인 WITH_TSAN을 통해 이를 지원하는 컴파일러에서 ThreadSanitizer를 활성화할 수 있습니다. (버그 #80409, 버그 #23171902)

    이전에는 전역 연결 목록이 단일 뮤텍스로 보호되었지만, 이제는 8개의 부분으로 분할되어 각 부분이 자체 뮤텍스 인스턴스로 보호됩니다. 이 변경 사항으로 인해 오버헤드가 줄어들고 연결 처리 성능이 향상되었습니다. 모니터링 목적으로 성능 스키마에서 이제 LOCK_thd_list 뮤텍스, LOCK_thd_remove 뮤텍스, COND_thd_list 조건 변수를 각각 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)

    서버는 더 이상 특수 문자가 포함된 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) 더 이상 MySQL 5.0 데이터베이스 이름을 현재 MySQL 버전으로 변환할 필요가 거의 없습니다. 해결 방법으로는 MySQL 5.0 설치를 MySQL 5.1로 업그레이드한 후 최신 릴리스로 업그레이드하는 것입니다. (WL #8186)

    버그 수정

    호환성 문제: 공간 값을 연결하는 것은 의미가 없기 때문에 이제 CONCAT()CONCAT_WS() 함수는 공간 인수를 사용할 때 오류를 발생시킵니다. (버그 #22893669)

    중요 변경 사항; JSON: 빈 문자열 값이 이제 JSON_EXTRACT() 같은 JSON 함수와 함께 키로 사용될 때 허용됩니다. 이 경우, 따옴표로 감싸야 합니다. (버그 #79643, 버그 #22366102)

    NDB 클러스터: 이전에는 서버가 NDB 없이 빌드되었더라도 mysql.ndb_binlog_index 테이블이 생성되었습니다. 이제 이 테이블은 서버가 NDB로 빌드된 경우에만 생성됩니다. (버그 #22874872)

    InnoDB; Microsoft Windows: 특정 블록 크기를 지정하지 않으면, 클러스터 페이지 크기가 8K 이상인 Windows NTFS에서 INFORMATION_SCHEMA.TABLESPACES 테이블이 비어 있게 되는 문제가 발생했습니다. (버그 #23598872)

    InnoDB; Microsoft Windows: Visual Studio 2015 Update 2로 InnoDB를 컴파일할 때 경고가 발생했습니다. (버그 #23056963)

    InnoDB: 외래 키 제약 조건을 추가하는 ALTER TABLE ... ALGORITHM=COPY 작업이 10000개의 행이 복사된 후 중간 커밋이 발생하여 실패했습니다. 중간 커밋이 외래 키 검사 플래그를 재설정했기 때문에 작업이 실패한 것입니다. 이제 중간 커밋이 발생하지 않습니다. (버그 #28662255, 버그 #92471)
    참고: 버그 #17479594도 참조하십시오.

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

    InnoDB: 삭제된 테이블스페이스에서 비동기 읽기 작업이 오류를 발생시켰습니다. (버그 #24388498)

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

    InnoDB: InnoDB 코드에서 dict_col 함수를 접근자로 대체했습니다. (버그 #24361098)

    InnoDB: InnoDB 코드에서 dict_index_t 함수가 접근자로 대체되었습니다. (버그 #24361023)

    InnoDB: 적응형 해시 인덱스 검색 래치의 예약 확인 및 해제를 수행하는 불필요한 코드를 제거했습니다. (버그 #24300175)

    InnoDB: 32비트 운영 체제에서 시스템 테이블스페이스 데이터 파일 크기가 4G를 초과할 경우 오버플로 조건이 발생할 수 있었습니다. (버그 #23753625)

    InnoDB: 테이블 객체 데이터를 액세스하기 위한 내부 메서드가 dict_table_t에 추가되었습니다. (버그 #23748128)

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

    InnoDB: 테이블의 인덱스를 반복하는 데 사용되는 내부 접근자 함수가 접근자 메서드로 대체되었고, 불필요한 코드는 제거되었습니다. (버그 #23336108)

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

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

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

    InnoDB: InnoDB 코드에서 boost::atomicstd::atomic으로 대체되었습니다. (버그 #23280649)

    InnoDB: MySQL 바이너리가 NUMA 기능으로 빌드되지 않았습니다. (버그 #23259754)

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

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

    InnoDB: 성능 스키마에서 InnoDB 메모리 할당 이벤트 데이터를 조회할 때 0값이 잘못 보고되었습니다. (버그 #23020280)

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

    InnoDB: SHOW ENGINE INNODB STATUS 출력에 대해 기다림당 음수 스핀 라운드 값이 표시되었습니다. 패치를 제공한 Laurynas Biveinis에게 감사드립니다. (버그 #22844987, 버그 #79703)

    InnoDB: innodb_disable_resize_buffer_pool_debug 옵션이 제거되었습니다. 이 변경 사항을 위한 패치에서는 코드 변수도 제거되었으며 buf_pool_resize() 함수가 간소화되었습니다. (버그 #22755053)

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

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

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

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

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

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

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

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

    InnoDB: 서버가 언두 테이블스페이스가 없어 시작에 실패했습니다. (버그 #22452992)

    InnoDB: 복구 프로세스에서 도입된 버퍼링된 언두 테이블스페이스 변경으로 인해 InnoDB 복구 중 언두 테이블스페이스를 닫으려고 할 때 어설션이 발생했습니다. (버그 #22361764)

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

    InnoDB: C++11로 InnoDB를 빌드할 때 “register” 사용 중단 경고가 발생했습니다. 코드에서 사용 중단된 “register” 키워드가 제거된 후에도 “register” 사용 중단 경고 처리가 남아 있었습니다. 또한 사용되지 않는 yyset_extra() 선언이 제거되었습니다. (버그 #22292704)

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

    InnoDB: ALTER TABLE...TRUNCATE PARTITION 작업에서 테이블의 KEY_BLOCK_SIZE 속성을 무시하고 기본값을 사용했으며, 이는 innodb_page_size 값의 절반이었습니다. (버그 #22186558, 버그 #79223)

    InnoDB: innochecksum에서 메모리 누수가 수정되었습니다. (버그 #22179518)

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

    InnoDB: 가상 열에 대한 퍼지 스레드 테이블 열기 콜백에서 예상치 못한 데이터 사전 테이블 래치로 인해 어설션이 발생했습니다. 임시 해결책으로, 가상 생성 열에 대해 퍼지가 일시적으로 비활성화되었습니다. 이 임시 해결책은 가상 열의 인덱스에서 삭제 표시된 레코드를 퍼지하지 않아 b-트리가 확장될 수 있습니다. (버그 #22153217)

    InnoDB: 전체 텍스트 인덱스와 외래 키 제약 조건을 가진 테이블을 foreign_key_checks 비활성화 상태에서 생성할 때 실패하는 문제가 있었습니다. (버그 #22094601, 버그 #78955)
    참고: 이 문제는 버그 #16845421의 회귀 문제입니다.

    InnoDB: ha_innobase::m_primary_key 필드가 제거되었습니다. 이 필드는 중복된 것으로, 대신 부울 조건인 TABLE_SHARE::is_missing_primary_key()가 추가되었습니다. (버그 #21928734, 버그 #78662)

    InnoDB: 초기화되지 않은 페이지를 로드하려는 버퍼 풀 로드 작업이 Valgrind 오류를 발생시켰습니다. (버그 #21747906)

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

    InnoDB: innodb_buffer_pool_size 구성 옵션에 사용된 내부 전역 변수가 제거되었습니다. (버그 #21512749)

    InnoDB: 버퍼 풀 크기 조정 작업 중에 InnoDB 페이지 클리너 스레드에서 어설션이 발생했습니다. (버그 #21473497)

    InnoDB: 로그 버퍼 충돌을 줄이기 위해 두 번째 버퍼가 추가되어 로그 버퍼 쓰기와 플러싱을 동시에 수행할 수 있게 되었습니다. 로그 버퍼 플러싱을 보호하는 새로운 뮤텍스가 추가되었습니다. Zhai Weixiang에게 패치 제공에 감사드립니다. (버그 #21352937, 버그 #77094)

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

    InnoDB: 사전 정의된 여러 사용되지 않는 함수가 내부 SQL 파서에서 제거되었습니다. 이 파서는 전체 텍스트 인덱스 구현, 데이터 사전 업데이트 및 영구 통계 업데이트에 사용됩니다. (버그 #21126390, 버그 #77111)

    InnoDB: SysTablespace::parse_units() 함수는 이제 파일 내 페이지 수를 반환하며, SysTablespace::normalize_size() 함수는 제거되었습니다. SysTablespace::parse_params()의 오류 메시지가 수정되었습니다. (버그 #21040199, 버그 #76949)

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

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

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

    InnoDB: __attribute__((nonnull))InnoDB 코드에서 제거되었습니다. 이 속성은 더 이상 InnoDB 코딩 가이드라인에서 허용되지 않습니다. (버그 #20468234)

    InnoDB: 외부 BLOB 필드 참조를 처리하고 조작하기 위한 논리적 인터페이스를 제공하는 새로운 구조체가 추가되었습니다. (버그 #18195972)

    InnoDB: TRUNCATE TABLE이 이제 DROP TABLECREATE TABLE로 매핑됩니다. 이 변경 사항은 다음과 같은 영향을 미칩니다:

    • 큰 버퍼 풀과 innodb_adaptive_hash_index가 활성화된 시스템에서는 TRUNCATE TABLE 작업이 테이블의 적응형 해시 인덱스 항목을 제거할 때 발생하는 LRU 스캔으로 인해 일시적인 성능 저하를 초래할 수 있었습니다. 이제 TRUNCATE TABLEDROP TABLECREATE TABLE로 다시 매핑되어 이러한 LRU 스캔 문제를 방지합니다.
    • TRUNCATE TABLE은 일시적으로 비원자적입니다. 서버 종료가 TRUNCATE TABLE 작업 중에 발생하면 테이블이 삭제되고 InnoDBSYS_FOREIGNSYS_FOREIGN_COLS 시스템 테이블에 고아가 된 외래 키 제약 조건이 남을 수 있습니다.
    • InnoDB memcached 플러그인의 flush_all 명령은 이제 TRUNCATE TABLE 대신 DELETE를 호출합니다. DELETE는 로그 플러싱, 삭제 표시 및 결국 삭제된 행을 퍼지하는 작업을 포함하기 때문에 FLUSH TABLES보다 오버헤드가 더 큽니다.
    • 파일당 테이블 테이블스페이스에서 내부 truncate 테이블 작업에 대한 로그 체크포인트가 로그 플러시로 대체되었습니다.

    (버그 #16834993, 버그 #68184, 버그 #16207919, WL #6795)

    InnoDB: InnoDB가 프래그먼트 페이지에 사용되는 확장 페이지의 대부분을 낭비했습니다. (버그 #16204823, 버그 #67963)

    파티셔닝: 최적화 중 모든 파티션이 이미 파싱 시점에 제거된 후, 파티션 프루닝이 다시 시도되는 문제로 인해 어설션이 발생하는 경우가 있었습니다. (버그 #23194259)

    파티셔닝: 테이블 이름과 파티션 이름을 합친 길이가 61자를 초과하는 경우, mysqldump로 생성된 백업에서 테이블을 가져올 수 없었습니다. 테이블이 서브파티션을 사용하는 경우, 테이블 이름, 파티션 이름 및 해당 서브파티션 이름을 합친 길이가 57자를 초과하면 동일한 문제가 발생했습니다.
    이 문제는 내부적으로 mysql.innodb_table_stats 테이블이 테이블 이름을 저장하는 열에 최대 64자를 허용했기 때문입니다. InnoDB는 파티션이 있거나 서브파티션이 있는 테이블에 대해 각 파티션이나 서브파티션에 대해 table_name#P#partition_name 또는 table_name#P#partition_name#SP#subpartition_name 형식의 값을 사용하여 innodb_table_stats에 행을 저장합니다. 이 문제는 innodb_table_stats의 정의를 최대 199자의 이러한 속성들을 허용하도록 변경하여 해결되었습니다. (버그 #72061, 버그 #18416479)

    복제: Slave_worker::write_info()에서 DBUG_ENTER()의 인자가 “Master_info::write_info”로 되어 있었는데, 이를 “Slave_worker::write_info”로 수정했습니다. Stewart Smith에게 감사드립니다. (Bug #21658067, Bug #78133)

    복제: 멀티스레드 슬레이브에서 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 값의 메모리 주소를 사용하여 체크섬을 계산하여 체크섬 값이 달라지는 문제가 있었습니다. 이제 해당 계산은 값 자체를 기반으로 수행됩니다. (Bug #23535703)

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

    JSON: JSON 경로 인수를 구문 분석할 때 NULL 경로와 구문적으로 잘못된 경로를 구분하지 못했습니다.
    이제 구문 분석 시 유효한 비-NULL 경로, NULL 경로, 잘못된 경로를 명확히 구분합니다. (Bug #22816576)

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

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

    테이블을 존재하지 않는 데이터베이스로 이름을 변경하려고 할 때 “알 수 없는 오류” 메시지가 표시되었습니다. 이제 올바른 오류 메시지가 출력됩니다. 이 문제는 데이터 사전 구현의 일부로 수정되었습니다. (Bug #25167507, Bug #84000)

    FreeBSD에서 세그멘테이션 폴트가 발생하면 서버가 스택 트레이스를 생성하지 않았습니다. (Bug #24566529, Bug #23575445, Bug #81827)

    macOS에서 Clang으로 컴파일된 빌드의 스택 트레이스 디망글링이 이제 GCC와 동일하게 작동합니다. (Bug #23606094, Bug #81908)

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

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

    SHOW ENGINE PERFORMANCE_SCHEMA STATUSSELECT * FROM performance_schema.memory_summary_global_by_event_name에서 보고된 Performance Schema의 메모리 사용량이 서로 달랐습니다. 이제 SHOW ENGINE STATUS 출력에 누락된 메모리(pfs_buffer_scalable_container.memory)가 표시됩니다. (Bug #23104498)

    GCC의 -fexpensive-optimizations 옵션이 ARM64 및 PowerPC 빌드에서 부동 소수점 연산을 다르게 계산하게 했습니다. 이 옵션은 -O2 이상 최적화 수준에서 활성화되었으며, 이제 영향을 받는 플랫폼에서는 비활성화되었습니다. (Bug #23046775)

    관리 작업 실패 후, 퍼포먼스 스키마에서 lock-tables 모드로 선택할 때 서버가 멈출 수 있었습니다. (Bug #23044286)

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

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

    my_strtod_int() 함수에서 최적화된 모드로 Clang을 사용한 빌드에서 Valgrind 경고가 수정되었습니다. (Bug #22839888)

    소수점 64자리의 값에서 정밀 수학 연산이 0 결과를 생성할 수 있었습니다. (Bug #22828692)

    ST_GeomFromGeoJSON() 함수가 올바른 인수를 사용해도 오류를 반환할 수 있었습니다. (Bug #22804853)

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

    옵티마이저에 소스와 목적지를 중복 확인하지 않는 memcpy() 호출이 있었습니다. (Bug #22537196)

    디버그 빌드에서 하위 쿼리가 JSON 값을 액세스할 때 오류를 체크하지 않아 어설션이 발생할 수 있었습니다. (Bug #22522073)

    CREATE TABLE ... SELECT 문을 준비한 후 테이블을 닫고 준비된 문을 실행하면 서버가 종료될 수 있었습니다. (Bug #22393309)

    파라미터를 포함한 파생 테이블이 조인의 일부일 때 준비된 문이 서버 종료를 유발할 수 있었습니다. (Bug #22392374, Bug #24380263)

    MySQL 5.7.8에서 사용자 이름 길이가 16자에서 32자로 증가했지만 일부 권한 테이블이 이를 반영하지 않았습니다. (Bug #22379607, Bug #79680)

    생성된 열 표현식의 재평가가 이전에 해제된 메모리에 접근하여 서버 종료를 유발할 수 있었습니다. (Bug #22346120)

    인덱스 검색에 실패한 HANDLER 읽기 문이 서버 종료를 유발할 수 있었습니다. (Bug #22321965)

    잘못된 숫자에서 ZEROFILL로의 변환 처리가 NULL 값에 대해 서버 종료를 유발할 수 있었습니다. (버그 #22281205)

    행 생성자를 포함한 서브쿼리를 사용하여 SET 구문에서 변수를 설정할 때 서버 종료를 유발할 수 있었습니다. (버그 #22276843)

    SQL 모드에 ALLOW_INVALID_DATES가 포함되지 않은 경우, invalid_date IN (subquery)를 포함한 쿼리가 서브쿼리 물질화로 처리될 때 서버 종료를 유발할 수 있었습니다. (버그 #22262843)

    임베디드 서버에서 잘못된 인수를 확인한 후, 누락되거나 잘못된 인수로 인해 코드가 실행되어 비정상적인 종료를 초래할 수 있었습니다. (버그 #22262706)

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

    기본 데이터베이스를 일시적으로 변경하고 오류가 발생하여 원래 기본 데이터베이스를 복구하는 과정에서 메모리 누수가 발생할 수 있었습니다. (버그 #22179795)

    CMake 구성은 GCC에서 거짓 양성을 방지하기 위해 -Wxxx 컴파일러 옵션을 확인하도록 조정되었습니다. (버그 #21881753)

    INFORMATION_SCHEMA.EVENTS.LAST_EXECUTEDmysql.event.last_executed의 값 사이에 불일치가 발생할 수 있었습니다. 이제는 mysql.events 데이터 사전 테이블에 이벤트 정보가 저장되며, 이는 보이지 않으므로 INFORMATION_SCHEMA.EVENTS가 이벤트 메타데이터의 유일한 인터페이스가 됩니다. (버그 #21374010)

    뷰가 정의된 제한을 평가하기 전에 사용자 정의 함수나 SQL 함수를 평가할 수 있었습니다. (버그 #20933307)

    -DENABLE_DTRACE=ONCMake를 사용할 때, DTrace 설치가 제대로 작동하는지 확인하지 않았습니다. 이제 DTrace가 발견되지 않으면 빌드가 중단됩니다. (버그 #20671056)

    SHOW CREATE USER 명령어가 예상치 못한 결과를 반환했습니다. (버그 #20625566)

    --log-error 옵션에 상대 경로 이름을 제공하면 mysqldstdoutstderr를 잘못된 위치로 보낼 수 있었습니다. (버그 #20609063)

    LEAST()GREATEST()의 평가에서 너무 작은 정렬 버퍼를 사용할 경우 datetime 및 문자열 리터럴로 인해 단언 오류가 발생할 수 있었습니다. (버그 #20565160)

    MySQL 8.0에서 새로 발생한 오류에 대한 오류 번호 범위가 3500부터 시작되도록 지정되었습니다. (버그 #20538173)

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

    mysql.event 시스템 테이블에서 이벤트를 로드하는 과정에서 PAD_CHAR_TO_FULL_LENGTH SQL 모드가 활성화되면 로드가 실패할 수 있었습니다. (버그 #20073523, 버그 #74947)

    중복 레코드를 처리하기 위해 REPLACE 또는 IGNORE 키워드를 사용하는 INSERTLOAD DATA 같은 명령어가 이후 작업에 영향을 미칠 수 있었습니다. (버그 #20017428)

    CREATE TABLE ... SELECT에서 소스 테이블의 비-BIT 데이터를 대상 테이블의 BIT 열에 선택할 경우 서버가 종료될 수 있었습니다. (버그 #19930894)

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

    CHANGE MASTER TO 명령어가 일반 쿼리 로그에 작성되기 전에 암호를 필터링하도록 다시 작성될 때 MASTER_AUTO_POSITION 절이 손실되었습니다. (버그 #19622609)

    VALUES() 함수를 SELECT 구문에서 사용할 경우 서버가 종료될 수 있었습니다. (버그 #19601973)

    테이블 이름 변경 코드에서 잠재적인 null 포인터 역참조와 메모리 누수가 수정되었습니다. (버그 #18194270)

    문자 열과 집계 함수를 비교하기 위해 MATCH ... AGAINST를 사용할 때 서버가 종료될 수 있었습니다. (버그 #17865492)

    연결 수에 대해 다양한 정보 소스에서 약간 다른 값이 보고될 수 있었습니다. 예를 들어 Connections 상태 변수, Performance Schema의 threadsglobal_status 테이블, SHOW PROCESSLIST 구문 등이 이에 해당됩니다. (버그 #17666696)

    외부 참조를 포함한 집합 연산을 포함하는 서브쿼리를 포함한 쿼리가 서버 종료를 일으킬 수 있었습니다. (버그 #17270896)

    잘못된 사용자에 대해 암호를 변경하려고 GRANT를 사용할 때 오류가 발생했지만, mysql.user 시스템 테이블은 업데이트되었습니다. (버그 #17180985)

    공간 WKT 데이터의 구문 분석기가 0.23과 같은 숫자를 허용했지만, 해당하는 선행 0이 없는 값 .23은 허용되지 않았습니다. 이제 두 형식 모두 허용됩니다. (버그 #17167633)


    이전에는 클라이언트가 전송하려는 연결 속성 키/값 쌍의 총 크기가 performance_schema_session_connect_attrs_size 시스템 변수의 값보다 큰 경우, 퍼포먼스 스키마가 해당 속성 데이터를 잘랐습니다. 또한, log_warnings 시스템 변수 값이 0보다 큰 경우, 퍼포먼스 스키마는 다음 메시지를 오류 로그에 기록했습니다:

    [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를 참조하십시오. (버그 #16576959)

    데이터 사전 도입으로 여러 INFORMATION_SCHEMA 문제들이 해결되었습니다:

    • INFORMATION_SCHEMA.STATISTICS에서 열 순서에 따라 쿼리 결과가 다를 수 있었습니다.
    • 일부 INFORMATION_SCHEMA 테이블은 최적화되지 않은 열 유형과 크기를 가지고 있었습니다. 이제 이러한 테이블은 mysql 시스템 데이터베이스의 데이터 사전 테이블에 대한 뷰로, 더 적합한 열 정의를 갖추고 있습니다.
    • 데이터베이스나 파일 이름을 확인하기 위해 디렉토리 스캔을 수행하던 INFORMATION_SCHEMA 테이블 쿼리는 더 이상 디렉토리 스캔을 수행하지 않고 데이터 사전에서 이름을 읽습니다.
    • 테이블 메타데이터를 얻기 위해 .frm 파일을 열던 INFORMATION_SCHEMA 테이블 쿼리는 이제 데이터 사전에서 이 정보를 읽습니다.
    • INFORMATION_SCHEMA 쿼리에서 데이터베이스나 테이블 이름 비교 시, COLLATE를 사용하여 지정한 정렬 규칙을 강제하려면 INFORMATION_SCHEMA 테이블 열에 적용해야 했지만 비교 값에는 적용되지 않았습니다.
      자세한 비교 방법에 대해서는 INFORMATION_SCHEMA 검색에서 정렬 사용을 참조하십시오.

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

    Windows에서 비정상적인 서버 종료 시, 이전에는 서버 실행 파일 이름을 사용한 module_name.dmp 형식의 미니덤프 파일을 생성했습니다. 이전 미니덤프 파일이 덮어쓰이지 않도록, 이제 프로세스 ID가 포함된 module_name..pid_dmp 형식으로 파일 이름이 지정됩니다. 예: mysqld.exe.7296.dmp. (버그 #12779463)

    INFORMATION_SCHEMA 테이블에 대한 쿼리에서, 스키마 및 테이블 이름의 비교는 파일 시스템 특성과 lower_case_table_names 시스템 변수 값에 따라 대소문자 구분이 달랐습니다. 또한, 비교 속성을 변경하기 위해 COLLATE 절을 제공해도 무시되었습니다. 이제 COLLATE가 더 이상 무시되지 않으며, 원하는 비교 속성을 얻기 위해 사용할 수 있습니다. (버그 #11748044, 버그 #34921)

    FLOOR(CEIL()) 함수가 큰 BIGINT UNSIGNED 인수를 잘못 처리하여 잘린 결과를 반환했습니다. (버그 #80873, 버그 #23013359)

    JSON_MERGE() 함수로 반환된 값을 JSON_SET()으로 조작할 때, 때때로 잘못된 결과를 생성했습니다. (버그 #80787, 버그 #22961128)

    ST_AsGeoJSON() 함수가 사용자 정의 변수를 사용한 기하 데이터에서 실패했습니다. (버그 #80697, 버그 #22912800)

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

    SRID 매개변수를 사용하는 지오메트리 가져오기 함수는 경고나 오류 없이 해당 매개변수를 부호 없는 32비트 정수로 변환하여, 음수 값이나 32비트 정수 범위를 초과하는 값이 있으면 해당 값을 범위 내의 숫자로 조용히 변환했습니다. 이제 SRID 매개변수를 사용하는 모든 지오메트리 함수는 SRID 값이 부호 없는 32비트 정수 범위 내에 있는지 확인하며, 범위를 초과할 경우 ER_DATA_OUT_OF_RANGE 오류를 발생시킵니다. 이 변경 사항은 이전에 매개변수 범위를 확인했지만 다른 오류 코드를 반환했던 GeoJSON 및 GeoHash 함수에도 적용됩니다. (버그 #80499, 버그 #22819614)

    술어 값을 저장하는 동안 반올림이 발생하면, <<= 연산자에 대해 범위 최적화가 잘못된 결과를 반환할 수 있었습니다. (버그 #80244, 버그 #22661012)

    mf_iocache 단위 테스트에서 누락된 va_end()를 추가하고, 메모리 누수를 수정하기 위해 my_end()를 호출했으며, 테스트를 위한 타겟을 추가했습니다. (버그 #80085, 버그 #22578670)

    SELECT DISTINCT SUBSTR() 함수가 큰 위치나 길이 인수를 가진 값을 중복으로 잘못 취급하여 값을 무시할 수 있었습니다. 이 문제는 LEFT()RIGHT() 함수에도 영향을 미쳤습니다. (버그 #80047, 버그 #22565155)

    SUBSTRING_INDEX(str, delim, count) 함수가 32비트보다 큰 count 값을 제대로 처리하지 못했습니다. (버그 #79978, 버그 #22545429)

    CONVERT() 함수 호출에서 리터럴 문자열 인수가 실행 중 수정되어 잘못된 결과를 생성할 수 있었습니다. (버그 #79924, 버그 #22531111)

    REPLACE('a', BINARY 'b', NULL) 함수가 NULL 대신 'a'를 반환했습니다. (버그 #79912, 버그 #22523836)

    트랜잭션 상태 추적이 8비트 안전하지 않은 함수를 피하여 비표준 문자 집합과의 호환성이 향상되었습니다. (버그 #79905, 버그 #22523383)

    GREATEST()LEAST() 함수가 모든 정수 입력을 부호 있는 값으로 처리했습니다. (버그 #79902, 버그 #22523685)

    일반 쿼리 로그의 라인에 타임스탬프와 스레드 ID 사이에 탭이 누락되었습니다. (버그 #79868, 버그 #22508563)

    부호 없는 값과 음수의 상한 사이의 비교가 잘못된 결과를 반환할 수 있었습니다. (버그 #79857, 버그 #22501606)

    REPEAT() 함수가 SUBSTR() 함수의 출력을 제대로 처리하지 못했습니다. (버그 #79695, 버그 #22391186)

    JSON_TYPE() 함수가 BIT 리터럴을 JSON으로 변환할 때 이제는 BIT가 아닌 BLOB으로 타입을 표시합니다. (버그 #79308, 버그 #22297987)

    -DWITH_UBSAN=ON CMake 옵션으로 MySQL을 구성하면 완전하지 않은 서버가 생성되었습니다. (버그 #79238, 버그 #22194071)

    sql_common.h 파일이 MySQL 배포판에 포함된 hash.h에 의존하여 컴파일 오류가 발생할 수 있었습니다. 이를 해결하기 위해 sql_common.h에서 hash.h 포함을 제거했습니다. (버그 #79237, 버그 #22187997, 버그 #70672, 버그 #17633467)

    최대 명령어 실행 시간을 확인하는 타이머가 --help 옵션으로 서버를 시작할 때도 초기화되었습니다. 이제 이 옵션이 주어지면 타이머가 초기화되지 않습니다. (버그 #79182, 버그 #22172389)

    IF(true, '2015-01-01', '2015-01-01') IS NOT NULL 형태의 표현식을 최적화하려고 시도할 때 최적화가 실패했습니다. (버그 #79114, 버그 #22148586)

    부호 없는 소수의 뺄셈이 음수 값을 반환할 수 있었으며, 이 경우 메타데이터 유형 정보는 UNSIGNED BINARY로 표시되었습니다. 이제 부호 없는 소수의 뺄셈은 부호 없는 정수의 뺄셈과 동일한 방식으로 처리됩니다. 결과가 음수일 경우 NO_UNSIGNED_SUBTRACTION SQL 모드가 활성화되지 않은 한, ER_DATA_OUT_OF_RANGE 오류가 발생합니다. (버그 #78914, 버그 #22083757)

    HEX() 함수에서 264보다 큰 숫자를 처리하는 방식이 개선되었습니다. (버그 #78828, 버그 #22297983)
    참고: 이 문제는 버그 #9854의 회귀 문제입니다.

    클라이언트 측 플러그인 종료 함수 시그니처가 int (*deinit)()에서 int (*deinit)(void)로 변경되어 -Wstrict-prototypes로 컴파일할 때 경고가 발생하지 않도록 수정되었습니다. (버그 #78177, 버그 #21680094, 버그 #81419, 버그 #23282498)

    CREATE TABLE에서 DATA DIRECTORY 또는 INDEX DIRECTORY 테이블 옵션에 대해 매우 길거나 잘못된 경로 이름이 지정된 경우 잘못된 오류가 보고되었습니다. 이제 이 경우에 ER_PATH_LENGTH 또는 ER_WRONG_VALUE 오류가 보고됩니다. (버그 #76635, 버그 #20857556)

    서버가 다음 오류 코드에 대해 보다 유용한 메시지를 제공하도록 개선되었습니다: ER_CANT_CREATE_DB, ER_CANT_CREATE_TABLE, ER_DB_DROP_RMDIR, ER_ERROR_DURING_COMMIT, ER_ERROR_DURING_ROLLBACK, ER_GET_ERRNO. (버그 #76298, 버그 #20694494)

    XA 트랜잭션 준비에 실패하는 경우 불완전한 트랜잭션 정리가 어설션을 발생시킬 수 있었습니다. (버그 #75809, 버그 #20488921)

    mysqld에서 잘못된 소켓 파일 디스크립터를 닫으려고 시도할 수 있었습니다. Zhai Weixiang에게 패치에 대해 감사드립니다. (버그 #75778, 버그 #20504513)

    다음 형태의 문장이 테이블 데이터를 latin1로 변환했지만 테이블 기본 문자 집합도 latin1로 변경되었고, utf8 절은 무시되었습니다:

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

    패치를 제공해주신 Daniel Black에게 감사드립니다. (버그 #75320, 버그 #20279241)

    mysqld.cc에서 abort_loop 변수가 volatile로 선언되어 일부 플랫폼에서는 다른 코어에서 실행 중인 스레드에 변경 사항이 즉시 반영되지 않을 수 있었습니다. Stewart Smith에게 패치에 대해 감사드립니다. (버그 #74846, 버그 #20134637)

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

    서버 측 준비된 문서의 타임스탬프가 해당 비준비된 문서의 타임스탬프보다 최대 1초 늦게 바이너리 로그에 기록될 수 있어 마스터와 슬레이브 서버 간의 시간 값 차이가 발생할 수 있었습니다. (버그 #74550, 버그 #19894382, 버그 #25187670)

    동적 스토리지 엔진 플러그인에 대해, .frm 파일에서 엔진을 잘못 결정하는 문제로 인해 DROP TABLE, TRUNCATE TABLE, RENAME TABLE이 작동하지 않았습니다. (버그 #74277, 버그 #19902868)

    실행된 준비된 문은 ? 매개변수 마커가 데이터 값으로 대체되어 로그에 기록됩니다. 기록된 문자열의 생성이 비효율적이었으나 개선되었습니다. (버그 #73056, 버그 #20955496)

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

    뷰를 사용한 그룹화가 기본 테이블에서 선택할 때는 발생하지 않았던 ER_INVALID_GROUP_FUNC_USE 오류(“그룹 함수의 잘못된 사용”)를 발생시킬 수 있었습니다. (버그 #70220, 버그 #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;

    (버그 #50510, 버그 #74251, 버그 #11758322, 버그 #19774083)

    스토리지 엔진에 구애받지 않아야 할 테스트 케이스들이 특정 엔진을 사용하는 문제를 수정했습니다. (WL #7264)

    Leave a Comment



    이 문서 공유

    8.0.0 변경 사항 (2016-09-12 Development Milestone)

    링크 복사

    CONTENTS