MySQL 8.0 Release Note

8.0.14 변경 사항 (2019-01-21 GA)

Estimated reading: 8 minutes 82 views

공식 문서: Changes in MySQL 8.0.14 (2019-01-21, General Availability)

계정 관리 관련 사항

이전에는 각 MySQL 사용자 계정이 하나의 비밀번호만 가질 수 있었습니다. 이제 MySQL에서는 계정이 기본 비밀번호와 보조 비밀번호로 지정된 두 개의 비밀번호를 가질 수 있습니다. 이 기능은 복잡한 다중 서버 시스템에서 다운타임 없이 단계적인 비밀번호 변경을 원활하게 수행할 수 있게 해줍니다. 이중 비밀번호 기능을 지원하기 위해, ALTER USERSET PASSWORD 문에는 새로운 기본 비밀번호를 계정에 할당할 때 현재 비밀번호를 보조 비밀번호로 저장하는 RETAIN CURRENT PASSWORD 절이 추가되었습니다. 또한 ALTER USER 문에는 더 이상 필요하지 않은 보조 비밀번호를 삭제하는 DISCARD OLD PASSWORD 절이 추가되었습니다. 비밀번호 관리를 참조하십시오.

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

(WL #11540)

감사 로그 관련 사항

감사 API는 이제 애플리케이션이 새로운 audit_api_message_emit 컴포넌트를 사용하여 감사 로그에 자체 메시지 이벤트를 추가할 수 있도록 합니다. 여기에는 로드 가능한 함수인 audit_api_message_emit_udf()도 포함됩니다. 감사 메시지 컴포넌트를 참조하십시오. (WL #11542)

컴파일 관련 사항

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

컴포넌트 관련 사항

새로운 host_application_signal 컴포넌트 서비스가 추가되어 컴포넌트가 호스트 애플리케이션에 신호를 전달할 수 있도록 합니다. 예를 들어, 이 서비스는 복제 컴포넌트가 서버에 종료 신호를 보낼 수 있게 합니다. (WL #12003)

구성 관련 사항

이전에는 COMPILATION_COMMENT CMake 옵션이 서버(예: version_comment 시스템 변수 설정을 위해) 및 다른 프로그램에 의해 사용되었습니다. 그러나 값에 “server”라는 단어가 포함된 경우, 다른 프로그램에서 사용하기에 적합하지 않았습니다. 이제 서버는 새로운 COMPILATION_COMMENT_SERVER 옵션을 사용합니다. 다른 프로그램은 계속해서 COMPILATION_COMMENT를 사용합니다. (버그 #28888510)

.gitignore 파일의 내용이 정리되었습니다. 이 파일의 대부분은 .bzrignore에서 상속된 것으로, 관련이 없었습니다. 이 정리의 한 결과로 인소스 빌드는 허용되지 않습니다. (버그 #28341794, 버그 #91626)

이제 MySQL 서버는 TCP/IP 포트를 관리 연결에 대해 별도로 구성할 수 있습니다. 이를 통해, 일반 연결에 사용되는 네트워크 인터페이스에서 max_connections 연결이 이미 설정된 경우에도 허용되는 단일 관리 연결에 대한 대안을 제공합니다. 관리 네트워크 인터페이스의 특징은 다음과 같습니다:

  • 인터페이스는 admin_address 시스템 변수를 시작 시 설정하여 IP 주소를 지정한 경우에만 활성화됩니다. admin_address가 설정되지 않으면 서버는 관리 인터페이스를 유지하지 않습니다.
  • admin_port 시스템 변수는 인터페이스의 TCP/IP 포트 번호를 지정하며, 기본값은 33062입니다.
  • 관리 연결 수에는 제한이 없지만, SERVICE_CONNECTION_ADMIN 권한이 있는 사용자만 연결이 허용됩니다.
  • create_admin_listener_thread 시스템 변수를 통해 관리 인터페이스에 별도의 스레드를 할당할지 여부를 시작 시 선택할 수 있습니다. 기본값은 OFF이며, 이는 주 인터페이스의 일반 연결을 관리하는 관리자 스레드가 관리 인터페이스에 대한 연결도 처리함을 의미합니다.

Facebook에 이 아이디어를 제안해 주신 것에 감사드립니다(그리고 코드도 제공해 주셨습니다만, 사용되지는 않았습니다). (버그 #27847672, 버그 #90395, WL #12138)

사용 중단 및 제거 관련 사항

사용이 중단된 resolveipresolve_stack_dump 유틸리티가 제거되었으며 더 이상 MySQL 배포에 포함되지 않습니다. resolveip 대신 nslookup, host, 또는 dig를 사용할 수 있습니다. 공식 MySQL 빌드의 스택 트레이스는 항상 심볼화되므로 resolve_stack_dump를 사용할 필요가 없습니다. (WL #12619, WL #12620)

SQL 함수 및 연산자 관련 사항

JSON_ARRAYAGG()JSON_OBJECTAGG() 집계 함수는 이제 OVER 절이 있을 경우 윈도우 함수로 사용할 수 있습니다. 집계 함수 설명을 참조하십시오. (WL #11574)

로깅 관련 사항

새로운 시스템 변수인 log_slow_extra를 활성화하면 서버가 느린 쿼리 로그 라인에 추가 필드를 작성하여 느린 명령문에 대한 정보를 제공합니다. 또한, 로그에 작성된 SET 라인은 명령문 실행 종료 시점이 아닌 실행 시작 시점의 시간을 사용합니다. 느린 쿼리 로그를 참조하십시오. 이 기능은 Facebook의 기여에 기반하여 개발되었습니다. (버그 #27535580, 버그 #89637, WL #12393)

바이너리 로그 파일과 릴레이 로그 파일을 이제 암호화할 수 있으며, 이를 통해 외부 공격자가 파일을 악용하거나 해당 파일을 저장하는 운영 체제 사용자가 무단으로 보는 것을 방지할 수 있습니다.
MySQL 서버에서 암호화를 활성화하려면 새로운 binlog_encryption 시스템 변수를 ON으로 설정합니다. 기본값은 OFF입니다. 이 시스템 변수는 바이너리 로그 파일과 릴레이 로그 파일에 대해 암호화를 설정합니다. 암호화를 활성화한 상태로 서버를 처음 시작하면 바이너리 로그와 릴레이 로그가 초기화되기 전에 새로운 바이너리 로그 암호화 키가 생성됩니다. 이 키는 각 바이너리 로그 파일(서버에 바이너리 로깅이 활성화된 경우)과 릴레이 로그 파일(서버에 복제 채널이 있는 경우)에 대한 파일 비밀번호를 암호화하는 데 사용되며, 파일 비밀번호에서 생성된 추가 키는 파일 내 데이터를 암호화하는 데 사용됩니다.
서버 실행 중에 암호화를 활성화하면 그 시점에서 새로운 바이너리 로그 암호화 키가 생성되며, 바이너리 로그 파일과 릴레이 로그 파일이 회전하여 새 파일과 이후의 파일이 암호화됩니다. binlog_encryption 시스템 변수를 OFF로 변경하여 암호화를 비활성화하면 바이너리 로그 파일과 릴레이 로그 파일이 즉시 회전되며, 이후의 모든 로그는 암호화되지 않습니다. 이전에 암호화된 파일은 자동으로 복호화되지 않지만, 서버는 여전히 해당 파일을 읽을 수 있습니다. (이제 SHOW BINARY LOGS 명령은 각 바이너리 로그 파일이 암호화되었는지 여부를 보여줍니다.) 서버 실행 중에 암호화를 활성화하거나 비활성화하려면 SUPER 권한 또는 새로운 BINLOG_ENCRYPTION_ADMIN 권한이 필요합니다.
파일에 사용되는 암호화 알고리즘은 AES(고급 암호화 표준) 암호 알고리즘이며, MySQL 서버에 내장되어 있어 구성할 수 없습니다. 로그 파일의 파일 비밀번호를 암호화하는 데 사용되는 바이너리 로그 암호화 키는 MySQL 서버의 내장된 키링 서비스를 사용하여 각 MySQL 서버 인스턴스마다 고유하게 생성된 256비트 키입니다. 서버에서 현재 사용 중인 바이너리 로그 암호화 키를 바이너리 로그 마스터 키라고 합니다.
새로운 binlog_rotate_encryption_master_key_at_startup 시스템 변수는 서버가 다시 시작될 때 바이너리 로그 마스터 키를 자동으로 회전할지 여부를 제어합니다. 이 시스템 변수가 ON으로 설정되면 서버가 다시 시작될 때마다 새로운 바이너리 로그 암호화 키가 생성되고, 새로운 바이너리 로그 마스터 키로 사용됩니다. 기본값인 OFF로 설정된 경우, 기존 바이너리 로그 마스터 키가 다시 시작 후에도 계속 사용됩니다.
MySQL 서버 인스턴스에서 암호화가 활성화되면, 바이너리 로그 파일과 릴레이 로그 파일에 기록된 데이터(휴지 상태 데이터)만 암호화된다는 점에 유의하십시오. MySQL 클라이언트(예: mysqlbinlog)로 전송되는 복제 이벤트 스트림의 데이터(전송 중인 데이터)는 항상 암호화되지 않은 형식이므로, 연결 암호화를 사용하여 전송 중에 보호해야 합니다. 트랜잭션 중 바이너리 로그 트랜잭션 및 명령문 캐시에 저장된 데이터(사용 중인 데이터)와 이러한 캐시에 사용 가능한 공간을 초과하여 디스크의 임시 파일에 저장되는 데이터도 암호화되지 않은 형식입니다. 임시 파일과 캐시는 트랜잭션을 처리하는 스레드가 종료되면 삭제됩니다. (WL #10957)

서버의 로깅 동작이 시작 옵션을 처리하기 전 생성된 오류 로그 메시지에 대해 변경되었습니다. 이전에는 서버가 기본 타임스탬프, 형식 및 상세 수준으로 메시지를 생성한 후 버퍼링하고, 오류 로그 구성이 알려지면 플러시했습니다. 이 초기 메시지들은 기본 로깅 구성을 사용했기 때문에 시작 옵션에 지정된 것과 다를 수 있었습니다.
이제 서버는 형식화된 로그 메시지 대신 로그 이벤트를 버퍼링합니다. 이를 통해 설정이 알려진 후에 해당 이벤트에 대해 구성을 소급 적용할 수 있으며, 결과적으로 플러시된 메시지는 기본값이 아닌 구성된 설정을 사용합니다. 자세한 내용은 오류 로그 출력 형식을 참조하십시오. (WL #11875)

옵티마이저 관련 사항

이전에는 유도 테이블 및 공통 테이블 표현식에 외부 참조를 포함할 수 없었습니다. 이제 외부 참조가 허용됩니다. (WL #461)

패키징 관련 사항

Ubuntu 18.10 및 Fedora 29는 기본적으로 OpenSSL 1.1.1을 설치하지만, OpenSSL 1.1.1은 MySQL에서 완전히 지원되지 않습니다. MySQL을 설치하려면 OpenSSL 1.0.2 호환 패키지를 설치해야 합니다. (버그 #28981868)

Performance Schema 관련 사항

성능 스키마 명령문 이벤트 테이블(events_statements_current, events_statements_history, 및 events_statements_history_long)에 이제 SQL 레벨에서 서버가 유지하는 쿼리 ID를 나타내는 STATEMENT_ID 열이 추가되었습니다. 열 값은 전역 카운터를 원자적으로 증가시켜 생성되므로 서버 인스턴스에 대해 고유합니다. (WL #12165)

플러거블 인증

LDAP 포트 번호가 636 또는 3269로 설정된 경우, 이제 플러그인은 LDAP 대신 LDAPS(LDAP over SSL)를 사용합니다. 포트 번호는 authentication_ldap_sasl_server_port 또는 authentication_ldap_simple_server_port 시스템 변수를 사용하여 설정할 수 있습니다. (LDAPS는 startTLS와 다릅니다.) (버그 #28743563)

이전에는 프록시 기능을 사용한 LDAP 인증 시, LDAP 인증 플러그인은 LDAP 서버에서 반환된 첫 번째 그룹 이름을 MySQL 프록시 사용자 계정 이름으로 사용했습니다. 이제 MySQL 계정의 인증 문자열은 우선 순위대로 일치시킬 그룹 목록을 지정할 수 있으며, 선택적으로 일치하는 그룹 이름을 지정된 MySQL 프록시 사용자 이름에 매핑할 수 있습니다. LDAP 플러거블 인증을 참조하십시오. (WL #12005)

보안 관련 사항

일부 플랫폼(Windows, macOS, 및 Generic Linux)에서 MySQL과 함께 제공되는 OpenSSL 라이브러리가 버전 1.0.2q로 업그레이드되었습니다. 다른 모든 플랫폼에서는 MySQL이 시스템에 설치된 OpenSSL을 사용합니다. 새로운 OpenSSL 버전에서 수정된 문제는 http://www.openssl.org/news/vulnerabilities.html에서 확인할 수 있습니다. (버그 #28988091)

SET PERSISTSET PERSIST_ONLY 명령문은 시스템 변수를 데이터 디렉터리의 mysqld-auto.cnf 옵션 파일에 지속적으로 저장하여 이후 서버 재시작에 영향을 미칠 수 있게 합니다. 그러나 일부 시스템 변수는 예를 들어 민감한 데이터를 포함하는 등의 이유로 지속적으로 저장될 수 없습니다. 결과적으로, 이러한 변수는 원격 관리자가 세션 내에서 실행 중에 설정할 수 없으며, 관리자에게 서버 호스트에 직접 로그인하여 my.cnf 옵션 파일을 수정하도록 요구합니다.
이제 MySQL은 제한된 조건에서 많은 이전에는 지속 불가능한 시스템 변수를 런타임에 관리할 수 있게 허용합니다. 이 기능을 활성화하려면 제한된 시스템 변수를 지속할 수 있는 능력을 나타내는 SSL 인증서 X.509 주체 값을 지정하고, 새 persist_only_admin_x509_subject 시스템 변수를 해당 주체 값으로 설정합니다. 암호화된 연결을 사용하여 서버에 연결하고 지정된 주체 값이 포함된 SSL 인증서를 제공하는 사용자는 이제 SET PERSIST_ONLY를 사용하여 제한된 시스템 변수를 지속적으로 저장할 수 있습니다. 자세한 내용은 지속 불가능 및 제한된 지속 시스템 변수를 참조하십시오. (WL #12086)

대부분의 시스템 변수는 현재 세션에 영향을 미치기 위해 특별한 권한 없이도 모든 사용자가 설정할 수 있습니다. 그러나 일부 시스템 변수는 현재 세션 외부에 영향을 미칠 수 있으므로 제한된 작업으로 간주되며, 특별한 권한이 있는 사용자만 설정할 수 있습니다. 이전에는 SYSTEM_VARIABLES_ADMIN 또는 SUPER 권한이 필요했지만, 두 권한 모두 세션 변수 설정 외의 작업도 허용했습니다. 이제 새로운 SESSION_VARIABLES_ADMIN 권한을 통해 사용자가 제한된 세션 변수를 설정할 수 있도록 허용하면서도 다른 작업은 허용하지 않도록 할 수 있습니다.
SESSION_VARIABLES_ADMIN 권한으로 허용된 작업은 SYSTEM_VARIABLES_ADMIN 또는 SUPER 권한으로도 허용되므로, 이미 후자의 권한 중 하나를 가지고 있는 사용자는 암묵적으로 SESSION_VARIABLES_ADMIN 권한을 가지고 있으며, 별도로 부여할 필요는 없습니다. 그러나 제한된 세션 시스템 변수를 수정하기 위해 SYSTEM_VARIABLES_ADMIN 또는 SUPER 권한만을 부여받은 사용자의 경우, 관리자는 사용자의 권한 범위를 줄이기 위해 SYSTEM_VARIABLES_ADMINSUPER 권한을 철회하고 대신 SESSION_VARIABLES_ADMIN을 부여할 수 있습니다. 자세한 내용은 시스템 변수 권한을 참조하십시오.
다음은 이전에는 SYSTEM_VARIABLES_ADMIN 또는 SUPER 권한이 필요했던 제한된 세션 변수들로, 이제는 SESSION_VARIABLES_ADMIN 권한으로도 설정할 수 있습니다:

binlog_format
binlog_row_image
binlog_row_value_options
binlog_rows_query_log_events
debug
debug_sync
default_collation_for_utf8mb4
explicit_defaults_for_timestamp
gtid_next
histogram_generation_max_mem_size
original_commit_timestamp
sql_log_bin
sql_log_off
sql_require_primary_key

다음은 이전에는 제한되지 않았으나 이제는 제한된 세션 변수들로, 설정하려면 최소한 SESSION_VARIABLES_ADMIN 권한이 필요합니다(이 변수들은 또한 SYSTEM_VARIABLES_ADMIN 또는 SUPER 권한을 가진 사용자도 설정할 수 있습니다):

auto_increment_increment
auto_increment_offset
binlog_direct_non_transactional_updates
bulk_insert_buffer_size
character_set_filesystem
character_set_database
collation_database
pseudo_slave_mode
pseudo_thread_id
rbr_exec_mode
transaction_write_set_extraction

(WL #12217)

공간 데이터 지원

이제 ST_Distance() 함수는 반환 값의 단위를 지정할 수 있는 선택적 세 번째 인수를 받습니다. 허용되는 단위는 새로운 INFORMATION_SCHEMA ST_UNITS_OF_MEASURE 테이블에 나열된 단위입니다. 자세한 내용은 객체 모양을 사용하는 공간 관계 함수INFORMATION_SCHEMA ST_UNITS_OF_MEASURE 테이블을 참조하십시오. (WL #11000)

SQL 구문 관련 사항

이제 유도 테이블 앞에 LATERAL 키워드를 붙여 동일한 FROM 절에서 앞에 있는 테이블의 열을 참조(의존)할 수 있도록 할 수 있습니다. LATERAL로 지정된 유도 테이블은 쉼표로 구분된 테이블 목록이나 조인 명세(JOIN, INNER JOIN, CROSS JOIN, LEFT [OUTER] JOIN, RIGHT [OUTER] JOIN)에서만 FROM 절에 나올 수 있습니다. LATERAL 유도 테이블을 사용하면 비LATERAL 유도 테이블로는 불가능한 특정 SQL 작업을 수행할 수 있으며, 비효율적인 우회 방법을 사용할 필요가 없어집니다. 자세한 내용은 Lateral 유도 테이블을 참조하십시오.

참고
이제 LATERAL은 예약어가 되어 식별자로 사용할 수 없으며, 식별자로 사용하려면 따옴표로 묶어야 합니다.

(WL #8652)

스레드 풀 관련 사항

스레드 풀 플러그인과 함께 제공되던 INFORMATION_SCHEMA 테이블이 성능 스키마 테이블로 마이그레이션되었습니다. INFORMATION_SCHEMA 테이블은 이제 사용 중단되었으며 향후 MySQL 버전에서 제거될 예정입니다. 애플리케이션은 구 테이블에서 새로운 테이블로 전환해야 합니다. 예를 들어, 애플리케이션이 다음 쿼리를 사용하고 있다면:

SELECT * FROM INFORMATION_SCHEMA.TP_THREAD_STATE;

애플리케이션은 대신 다음 쿼리를 사용해야 합니다:

SELECT * FROM performance_schema.tp_thread_state;

자세한 내용은 성능 스키마 스레드 풀 테이블을 참조하십시오. (WL #11547)

X Plugin 관련 사항

X Plugin은 이제 5자리 SQLSTATE 오류 코드를 오류 처리 클래스에 포함합니다. 이전에는 SQLSTATE 오류 코드가 SQL 오류에 대해 클라이언트에 반환되었지만, MySQL 고유의 오류 번호만 노출되었습니다. (버그 #28735058)

문서 컬렉션을 쿼리할 때, SQL 쿼리의 자리 표시자에 불리언 값이 인수로 사용되면 예기치 않은 결과가 반환되었습니다. 이제 불리언 값을 위한 새로운 번역 특수화가 추가되어 이 상황에서 올바르게 처리됩니다. (버그 #28227037)

X Protocol은 이제 반환된 데이터를 utf8mb4 문자셋(utf8mb4_general_ci 정렬 방식 사용)으로 항상 변환한 후 반환합니다. (버그 #28180155)

X Protocol은 이제 SQL 준비 기능을 지원합니다. (WL #9270)

기능 추가 및 변경 사항

InnoDB: innodb_buffer_pool_in_core_file 변수를 비활성화하면 InnoDB 버퍼 풀 페이지를 제외하여 코어 파일 크기를 줄일 수 있습니다. 이 변수를 사용하려면 core_file 변수가 활성화되어야 하며, 운영 체제는 Linux 3.4 이상에서 지원되는 비POSIX madvise() 확장 기능인 MADV_DONTDUMP을 지원해야 합니다. 자세한 내용은 코어 파일에서 버퍼 풀 페이지 제외를 참조하십시오.
기여해주신 Facebook에 감사드립니다. (버그 #27724476, 버그 #90144)

InnoDB: 기본적으로 undo 로그는 MySQL 인스턴스가 초기화될 때 생성되는 두 개의 undo 테이블스페이스에 위치합니다.
추가적인 undo 테이블스페이스는 CREATE UNDO TABLESPACE 문법을 사용하여 런타임 중 선택한 위치에 생성할 수 있습니다.

CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';

문법을 사용하여 생성된 undo 테이블스페이스는 DROP UNDO TABLESPACE 문법을 사용하여 런타임 중에 삭제할 수 있습니다.

DROP UNDO TABLESPACE tablespace_name;

문법을 사용하여 undo 테이블스페이스를 활성 또는 비활성으로 설정할 수 있습니다.

ALTER UNDO TABLESPACE tablespace_name SET {ACTIVE|INACTIVE};

테이블스페이스의 상태를 표시하는 STATE 열이 INFORMATION_SCHEMA.INNODB_TABLESPACES 테이블에 추가되었습니다. undo 테이블스페이스는 삭제되기 전에 empty 상태여야 합니다.
이전에 사용이 중단된 innodb_undo_tablespaces 변수는 더 이상 구성할 수 없으며, 향후 MySQL 버전에서 제거될 예정입니다.
자세한 내용은 Undo 테이블스페이스를 참조하십시오. (WL #9508)

InnoDB: 이제 InnoDB는 병렬 클러스터형 인덱스 읽기를 지원하여 CHECK TABLE 성능을 향상시킬 수 있습니다. 이 기능은 보조 인덱스 스캔에는 적용되지 않습니다. 병렬 클러스터형 인덱스 읽기가 발생하려면 innodb_parallel_read_threads 세션 변수를 1보다 큰 값으로 설정해야 합니다. 기본값은 4입니다. 병렬 클러스터형 인덱스 읽기에 사용되는 실제 스레드 수는 innodb_parallel_read_threads 설정값 또는 스캔할 인덱스 서브트리 수 중 작은 값에 따라 결정됩니다. (WL #11720)

InnoDB: 이제 CREATE TABLESPACE 명령문의 ADD DATAFILE 절은 선택 사항으로, FILE 권한이 없는 사용자도 테이블스페이스를 생성할 수 있습니다. ADD DATAFILE 절이 없는 CREATE TABLESPACE 문은 고유한 파일 이름을 가진 테이블스페이스 데이터 파일을 암시적으로 생성합니다. (WL #12236)

InnoDB: 서버가 --innodb-dedicated-server 옵션으로 시작되면 이제 로그 파일의 크기와 개수가 이 옵션에 의해 설정된 버퍼 풀에 따라 결정됩니다. 이전에는 로그 파일 크기가 서버에서 감지된 메모리 양에 따라 설정되었고, 로그 파일 수는 자동으로 설정되지 않았습니다. 자세한 내용은 전용 MySQL 서버에 대한 자동 InnoDB 구성 활성화를 참조하십시오. (WL #12300)

복제: 복제에 내부적으로 사용되는 두 개의 새로운 세션 변수가 추가되었습니다. original_server_versionimmediate_server_version은 트랜잭션과 관련된 MySQL 서버 릴리스 번호를 복제 토폴로지를 통해 전송하여 교차 버전 복제를 지원합니다. original_server_version은 트랜잭션이 원래 커밋된 서버의 MySQL 서버 릴리스 번호를 보유합니다(예: MySQL 8.0.14 서버 인스턴스는 80014). immediate_server_version은 복제 토폴로지에서 바로 직전 마스터 서버의 MySQL 서버 릴리스 번호를 보유합니다. 이 서버 또는 복제 토폴로지 내의 다른 중간 서버가 이 세션 시스템 변수를 지원하지 않는 이전 릴리스에 있는 경우 해당 값은 0으로 설정됩니다.
이 정보를 통해 슬레이브는 구문 또는 의미가 변경된 릴리스 간의 차이를 인식하고 이를 적절히 처리함으로써 더 오래된 릴리스의 마스터에서 유래한 데이터를 올바르게 처리할 수 있습니다. 이 정보는 그룹 복제 환경에서도 유용하며, 복제 그룹의 하나 이상의 멤버가 다른 멤버보다 최신 릴리스에 있을 때 적절히 처리할 수 있습니다. 이 변수의 값은 각 트랜잭션에 대한 바이너리 로그에서 볼 수 있으며(Gtid_log_event 또는 서버에서 GTID가 사용되지 않는 경우 Anonymous_gtid_log_event의 일부로), 교차 버전 복제 문제를 디버깅하는 데 유용할 수 있습니다. (WL #11879)

복제: 단일 기본 모드에서 그룹이 실행될 때, 새로운 기본 노드가 선출되는 동안 적용 대기 중인 트랜잭션이 있을 경우 새로운 기본 노드에 대한 읽기 작업이 오래된 값을 반환할 가능성이 있었습니다. 이제 group_replication_consistency 변수를 사용하여 이러한 상황에서 그룹의 동작을 제어할 수 있습니다. group_replication_consistencyEVENTUAL로 설정되면, 적용 대기 중인 백로그가 있어도 새로운 기본 노드는 읽기 요청에 응답합니다. 이는 이전 동작과 일치하며, 백로그가 적용되는 동안 클라이언트가 오래된 값을 읽을 수 있는 위험이 있습니다. 새로운 기본 노드에 대한 쓰기 작업은 이 기간 동안 super_read_only 모드가 활성화되어 실패합니다. group_replication_consistencyBEFORE_ON_PRIMARY_FAILOVER로 설정된 경우, 새로운 기본 노드에서 백로그를 적용하는 동안 발생하는 모든 새로운 읽기 또는 쓰기 쿼리는 백로그가 적용될 때까지 대기됩니다. 이를 통해 클라이언트는 항상 자신이 기록한 최신 값을 읽을 수 있지만, 백로그가 적용될 때까지 대기해야 할 수 있습니다. (WL #11123)
참고: 관련 항목: 버그 #26004894.

그룹 복제: 그룹 복제를 위한 그룹 통신 시스템(GCS) 및 그룹 통신 엔진(XCom, Paxos 변형)이 이제 IPv6에 대한 전체 지원을 제공하므로, 복제 그룹의 멤버는 내부 그룹 통신에 대해 IPv4 주소 대신 IPv6 주소를 사용할 수 있습니다. IPv6의 로컬호스트 주소와 IPv6의 프라이빗 서브넷 주소(고유-로컬 주소 및 링크-로컬 유니캐스트 주소)가 수동 화이트리스트가 지정되지 않은 경우 그룹 복제를 위한 자동 화이트리스트에 추가되었습니다.
모든 복제 그룹 멤버가 그룹 복제를 위한 IPv6 주소 사용을 지원하는 MySQL 서버 버전인 경우, 그룹은 IPv6 주소를 사용하는 멤버와 IPv4 주소를 사용하는 멤버가 혼합될 수 있습니다. 가입하는 멤버는 연결을 위해 시드 멤버에서 제공하는 프로토콜과 일치하는 화이트리스트 IP 주소 또는 호스트 이름을 제공해야 하지만, 가입 멤버의 주요 식별 주소 또는 호스트 이름(group_replication_local_address)은 어느 프로토콜이든 사용할 수 있습니다. 멤버가 IPv4와 IPv6 주소 모두로 확인되는 호스트 이름을 사용하는 경우, 그룹 복제 연결에는 항상 IPv4 주소가 사용됩니다.
기존 복제 그룹의 멤버 중 하나 또는 모두가 그룹 복제를 위한 IPv6 주소 사용을 지원하지 않는 이전 MySQL 서버 버전을 사용하는 경우, 가입하는 멤버는 그룹 통신을 위해 group_replication_local_address 옵션에 IPv4 주소를 제시해야 합니다. 모든 그룹 멤버가 업그레이드되면 그룹은 IPv6 주소로 마이그레이션할 수 있습니다. (버그 #26088469, 버그 #27757729, 버그 #90217, WL #11926)

그룹 복제: 이제 MySQL 그룹 복제는 TCP 소켓을 사용하는 대신 전용 입력 채널을 사용하여 통신할 수 있습니다. 새 입력 채널은 그룹 복제 로직과 기본 그룹 통신 엔진(XCom, Paxos 변형)의 로컬 인스턴스 간의 통신을 위해 공유 메모리를 사용합니다.
이전에는 로컬 XCom 인스턴스와의 통신이 항상 TCP 소켓을 통해 이루어졌으며, 이는 각 그룹 멤버에 대해 group_replication_local_address 시스템 변수가 지정한 네트워크 주소를 사용했습니다. 이는 로컬 통신에 불필요한 네트워크 프로토콜 스택을 통한 메모리 복사 및 데이터 직렬화와 같은 오버헤드를 초래했습니다. 그룹의 각 멤버가 원격 XCom 인스턴스와 통신하려면 여전히 TCP 소켓(group_replication_local_address)이 필요합니다. 그룹 통신 시스템(GCS) 구성 요소는 이제 각 그룹 복제 작업에 대해 가장 적합한 통신 방법을 선택하며, 입력 채널 또는 TCP를 사용할 수 있습니다. 예를 들어, 그룹에 가입하는 과정은 원격 XCom 인스턴스와의 통신을 필요로 하므로 TCP가 사용됩니다. 그러나 멤버를 그룹에서 제거하는 과정은 로컬 XCom 인스턴스와의 통신만 필요하므로 입력 채널이 사용됩니다. 가능한 경우 입력 채널을 선택하여 네트워크 메커니즘을 사용하는 통신과 관련된 오버헤드를 최소화합니다. (WL #9850)

Microsoft Windows: MySQL 서버에서 생성된 명명된 파이프에 대해 클라이언트에게 부여된 액세스 제어는 이제 Windows에서 성공적인 통신에 필요한 최소한의 수준으로 설정됩니다. 최신 MySQL 클라이언트 소프트웨어는 추가 구성이 필요 없이 명명된 파이프 연결을 열 수 있습니다. 오래된 클라이언트 소프트웨어를 즉시 업그레이드할 수 없는 경우, 새로운 named_pipe_full_access_group 서버 시스템 변수를 사용하여 Windows 그룹에 명명된 파이프 연결을 열 수 있는 필요한 권한을 부여할 수 있습니다. 전체 액세스 그룹의 멤버 자격은 제한적이고 임시적이어야 합니다. (WL #12445)

최소 서버 RPM은 주로 Docker 이미지를 위해 사용됩니다. Docker 호환성을 향상시키기 위해 rpm-docker 구성 파일에서 log-error 라인이 제거되었습니다. 이렇게 하면 로깅이 stdout/stderr로 이루어져 Docker의 자체 인터페이스를 사용할 수 있게 됩니다. (버그 #28692675)

외래 키를 생성하고 삭제하는 것과 관련된 오류 메시지가 더 구체적이고 정보성 있게 개선되었습니다. (버그 #28526309, 버그 #92087)

문자 집합 변환을 시도했으나 실패한 ALTER TABLE 문에 대한 오류 메시지가 개선되어 어떤 열에서 오류가 발생했는지 표시됩니다. (버그 #27546306, 버그 #88738)

명령 옵션에 숫자 값을 지정할 때, 값에 K, M, G 접미사를 사용하여 1024, 10242 또는 10243의 배수를 나타낼 수 있었습니다. 이제 T, P, E 접미사도 10244, 10245 또는 10246의 배수를 나타내기 위해 사용할 수 있습니다. Daniel Black에게 패치에 대해 감사드립니다. (버그 #27306931, 버그 #89017)

리소스 그룹 잠금이 확장성과 성능을 개선하기 위해 수정되었습니다. (버그 #27148580)

시작 옵션 --binlog-row-event-max-size에 해당하는 시스템 변수 binlog_row_event_max_size가 추가되었습니다. 시작 옵션 및 시스템 변수는 기본 설정값이 8192바이트인 행 기반 바이너리 로그 이벤트의 최대 크기에 대한 소프트 제한을 설정합니다. 가능한 경우, 바이너리 로그에 저장된 행은 이 설정 값보다 크지 않은 이벤트로 그룹화됩니다. 이벤트를 분할할 수 없는 경우 최대 크기를 초과할 수 있습니다.
binlog_row_event_max_size 전역 시스템 변수는 읽기 전용이며 서버 시작 시에만 설정할 수 있습니다. 따라서 이 값은 PERSIST_ONLY 키워드를 사용하거나 SET 명령과 함께 @@persist_only 수식어를 사용하여만 수정할 수 있습니다. 시스템 변수가 추가됨에 따라 이 설정을 성능 스키마 테이블을 사용하거나 SHOW VARIABLES 또는 SELECT 명령문을 통해 확인할 수 있습니다. (버그 #19985377, 버그 #74728, WL #12385)

이제 ALTER TABLE은 다음 조건이 적용될 때 테이블 재구축 없이 열 문자 집합을 변경하는 데 사용할 수 있습니다:

  • 열 데이터 유형이 CHAR, VARCHAR, TEXT 유형 또는 ENUM일 때.
  • 문자 집합 변경이 utf8mb3에서 utf8mb4로, 또는 모든 문자 집합에서 binary로 변경되는 경우.
  • 열에 인덱스가 없는 경우.

(WL #11605)

새로운 -DFORCE_INSOURCE_BUILD CMake 옵션은 인소스 빌드를 강제로 수행할지 여부를 정의합니다. 소스 외부 빌드가 권장되며, 이는 동일한 소스에서 여러 빌드를 수행할 수 있게 하고 빌드 디렉터리 제거로 신속하게 정리할 수 있습니다. 인소스 빌드를 강제로 수행하려면 CMake-DFORCE_INSOURCE_BUILD=ON으로 호출하십시오.

버그 수정

중요 변경 사항: MySQL 5.7 서버에서 MySQL 8.0 서버로 덤프를 가져올 때, 8.0 서버에서 지원되지 않는 SQL 모드가 사용되면 종종 ER_WRONG_VALUE_FOR_VAR 오류가 발생했습니다. 이는 MySQL 5.7에서 기본적으로 NO_AUTO_CREATE_USER가 활성화되어 있지만, MySQL 8.0에서는 지원되지 않기 때문에 자주 발생할 수 있었습니다.
이제 서버의 이러한 상황에서의 동작은 pseudo_slave_mode 시스템 변수 설정에 따라 달라집니다. 이 변수가 false로 설정된 경우 서버는 ER_UNSUPPORTED_SQL_MODE 오류와 함께 모드 설정을 거부합니다. pseudo_slave_modetrue로 설정된 경우 서버는 지원되지 않는 모드를 무시하고 경고를 반환합니다. mysqlbinlog은 SQL을 실행하기 전에 pseudo_slave_modetrue로 설정합니다. (버그 #90337, 버그 #27828236)

InnoDB: 백그라운드 정리 스레드가 undo 로그를 잘라낸 후 글로벌 및 백업 메타데이터 잠금이 해제되지 않았습니다. (버그 #29215254, 버그 #93901)

InnoDB: MySQL이 Solaris X86에서 시작되지 않았습니다. TempTable 스토리지 엔진의 정적 스레드 로컬 ‘tables’ 변수가 제대로 초기화되지 않았습니다. (버그 #28987365)

InnoDB: 교착 상태 감지 중에 사용된 래칭 로직이 간소화되었습니다. (버그 #28904966)

InnoDB: 클러스터형 인덱스 레코드의 이전 버전에 대해 잘못된 레코드 오프셋이 디버그 어설션을 발생시켰습니다. (버그 #28825617)
참고: 이 문제는 버그 #25540277의 회귀 문제입니다.

InnoDB: 히스토리 목록 길이가 innodb_max_purge_lag을 초과할 때 적용되는 최소 DML 지연 시간이 5000마이크로초에서 5마이크로초로 감소되었습니다. (버그 #28813453)

InnoDB: 하나의 스레드가 테이블을 삭제하려고 시도하는 동안 다른 스레드가 암호화된 테이블스페이스를 생성하려고 할 때 잘못된 잠금 순서로 인해 교착 상태가 발생했습니다. (버그 #28774259)

InnoDB: ALTER TABLESPACE 명령이 지원되지 않는 테이블스페이스 속성을 무시하지 못했습니다. (버그 #28656611)

InnoDB: 묵시적 잠금을 명시적 잠금으로 변환하는 로직이 간소화되고 최적화되었습니다. (버그 #28637472)

InnoDB: 프래그먼트 페이지 할당 실패가 어설션을 발생시켰습니다. (버그 #28615893)

InnoDB: 잘못된 위치에 있는 디버그 포인트로 인해 플러시된 LOB 페이지가 손상된 것으로 간주되었습니다. (버그 #28607368)

InnoDB: TempTable 스토리지 엔진이 tmpdir 변수에 의해 정의된 디렉터리 대신 시스템 임시 디렉터리에 잘못된 임시 파일을 생성했습니다. (버그 #28598943)

InnoDB: 전체 텍스트 검색 보조 테이블과 유사한 이름의 테이블을 삭제하려고 시도할 때 어설션 오류가 발생했습니다. (버그 #28577083)

InnoDB: UPDATE 쿼리에 의해 호출된 함수가 가상 열을 고려하지 않았습니다. (버그 #28560650)

InnoDB: 버퍼 풀 압축 해시 뮤텍스에 대해 잘못된 키가 정의되었습니다. (버그 #28556539)

InnoDB: mysql.innodb_table_statsmysql.innodb_index_stats 테이블과 관련된 백그라운드 트랜잭션에 대한 교착 상태 처리 방식이 수정되었습니다. 내부 테이블이 교착 상태 사이클에 포함되었을 때 트리거되는 어설션에 테이블이 잘못 포함되었습니다. (버그 #28523042, 버그 #92069)

InnoDB: innodb_spin_wait_delay를 높은 값으로 설정하면 서버를 종료하려고 할 때 어설션 오류가 발생했습니다. 이 오류를 방지하기 위해 innodb_spin_wait_delay 최대 값이 1000으로 줄어들었습니다. (버그 #28489407, 버그 #91973)

InnoDB: 외래 키 제약 조건이 있는 테이블에서 ON DELETE CASCADE 작업을 수행할 때 서버가 종료되었습니다. (버그 #28470805)

InnoDB: 가상 열 값을 포함하는 잘못된 DML 로그가 어설션을 발생시켰습니다. (버그 #28448853)

InnoDB: DATA DIRECTORY 절을 사용하여 MySQL 데이터 디렉터리 외부에서 생성된 테이블에 대해 RENAME TABLE 작업을 실행할 때 실패했습니다. (버그 #28341514)

InnoDB: 서로 다른 가상 열 정의를 가진 파티션이 교환될 수 있도록 ALTER TABLE ... EXCHANGE PARTITION이 허용되어, 나중에 InnoDB가 존재하지 않는 가상 열을 읽으려고 할 때 어설션이 발생했습니다. (버그 #28235668)

InnoDB: 트랜잭션 커밋 중 발생하는 redo 로그 쓰기 및 플러시 요청에 대한 카운터가 추가되었습니다. 이 카운터는 로그 작성 스레드가 연속 요청 사이의 평균 시간을 계산하는 데 사용됩니다. 평균 시간이 100마이크로초를 초과하면 로그 작성 스레드는 스핀 지연을 사용하지 않고 10마이크로초 제한 시간으로 요청 이벤트를 대기합니다.
로그 작성 스레드 구현 문제로 인해 발생할 수 있는 중단 문제도 수정되었습니다. (버그 #28062382, 버그 #28444247, 버그 #28616442, 버그 #90890)

InnoDB: 완전히 초기화되지 않은 새로 추가된 undo 테이블스페이스에 롤백 세그먼트를 추가하려고 할 때 어설션이 발생했습니다. (버그 #27914054)

InnoDB: RENAME TABLE 작업 후 외래 키 제약 조건이 무시되었습니다. (버그 #27453180, 버그 #89441)

InnoDB: innodb_flush_method 설정에서 O_DIRECT_NO_FSYNC를 사용할 경우 파일 시스템 메타데이터가 비동기화되어 시스템이 중단될 수 있었습니다. O_DIRECT_NO_FSYNC 모드에서 이 문제를 방지하기 위해 InnoDB는 파일을 새로 생성하거나 파일 크기를 늘리거나 파일을 닫은 후에 fsync()를 호출합니다. fsync() 시스템 호출은 여전히 각 쓰기 작업 후에 건너뜁니다. (버그 #27309336)

InnoDB: 빈 문자열을 사용하여 CREATE TABLE 또는 ALTER TABLE ENCRYPTION 옵션을 지정하면 오류를 발생시키지 않고 기본 설정인 ENCRYPTION='N'으로 해석되었습니다. 이제 빈 문자열은 유효하지 않은 것으로 처리되며 오류를 발생시킵니다. (버그 #27177845)

InnoDB: Windows에서 MySQL 인스턴스의 테이블스페이스 데이터 파일을 Linux 인스턴스로 이동할 때, 파티션 테이블 이름 구분자(#P# 또는 #SP# 부분)가 소문자로 변환되지 않았습니다. lower_case_table_names 변수가 활성화된 Linux 인스턴스에서 이름이 완전히 소문자로 변환되지 않아 테이블을 변경, 이름 변경 또는 최적화하려고 할 때 “’InnoDB error’ from storage engine” 오류가 발생했습니다. (버그 #26925260)

InnoDB: 64비트 Windows 시스템에서 4GB를 초과하는 테이블스페이스 파일에 쓰기를 시도할 때 어설션이 발생했습니다. 이 오류는 좁은 형 변환으로 인해 발생했습니다. (버그 #26636815, 버그 #87423)

InnoDB: 파티션 테이블을 참조하는 외래 키 제약을 포함하는 테이블을 생성하려고 시도한 후, 이는 지원되지 않는 작업인데도 불구하고 SHOW ENGINE INNODB STATUS 출력에서 참조된 테이블 이름을 확인할 수 없다는 잘못된 외래 키 오류를 보고했습니다. 이제 이 오류는 더 이상 나타나지 않으며, 클라이언트에 반환되는 오류 메시지는 외래 키가 파티셔닝과 함께 아직 지원되지 않는다는 메시지를 표시합니다. (버그 #25319071, 버그 #84331)

InnoDB: 파티션 테이블을 참조하는 외래 키를 생성하거나 외래 키를 지원하지 않는 스토리지 엔진을 사용하는 테이블을 참조할 때 발생하는 잘못된 오류 메시지가 보고되었습니다. 이제 오류 메시지가 더 구체적이고 유익하게 수정되었습니다. (버그 #11747571, 버그 #33027)

파티셔닝: 폐기된 테이블스페이스에서 즉시 열 추가를 시도하면 어설션이 발생했습니다. 이제 이러한 경우 오류가 반환됩니다. (버그 #28517843)

파티셔닝: BLOB 또는 TEXT 열이 포함된 파티션 테이블에 대해 반복된 ALTER TABLE 명령이 항상 올바르게 처리되지 않았습니다. (버그 #28491099)

파티셔닝: 파티션 정의에 DATA DIRECTORY 옵션을 사용하는 파티션 테이블에서 ALTER TABLE ... EXCHANGE PARTITION이 작동하지 않았습니다. 이 수정은 InnoDB 스토리지 엔진을 사용하는 파티션 테이블만 지원합니다. (버그 #19730200)

복제: group_replication_exit_state_action 값에 따라 그룹을 떠나는 멤버의 동작이 일관되지 않았습니다. 이제 group_replication_exit_state_action=READ_ONLY로 설정된 멤버가 그룹을 의도치 않게 떠날 때, 해당 멤버가 시작할 때 가졌던 super_read_only 모드가 복원됩니다. 이로 인해 group_replication_exit_state_action=ABORT_SERVER 설정된 멤버의 동작과 일관성을 유지하게 됩니다. (버그 #28971639, 버그 #28526591)

복제: CREATE TABLE 명령문에 대해 바이너리 로그에 기록된 메타데이터에는 테이블의 문자 열에 대한 문자 집합 정보가 포함됩니다. 이전에는 mysqlbinlog 옵션 --print-table-metadata를 지정했을 때 테이블에 대해 기본 문자 집합이 출력되었습니다. 이 기본 문자 집합은 테이블 열에서 가장 많이 나타나는 문자 집합이었으며, 테이블에 지정된 기본 문자 집합과 일치하지 않을 수 있었습니다. 이제 mysqlbinlog는 각 열에 대해 개별적으로 문자 집합을 출력하며, 열은 별도의 줄에 출력됩니다. (버그 #28774144)

복제: ENUMSET 열에 대한 문자 집합 정보가 테이블 메타데이터의 일부로 바이너리 로그에 기록되지 않았습니다. 이제 binlog_row_metadata=FULL가 설정된 경우 이 정보가 추가됩니다. (문자 열의 경우, binlog_row_metadata=MINIMAL로도 문자 집합 정보가 추가됩니다.) (버그 #28706307)

복제: 바이너리 로그에서 ROLLBACK TO SAVEPOINT 명령문의 식별자에 대한 따옴표 처리를 수정하는 패치가 이후 MySQL 버전에 올바르게 적용되지 않았습니다. (버그 #28569645)

복제: MySQL 5.7.23에서 적용된 패치 이후, MySQL 5.7.22 마스터에서 최신 릴리스의 복제 슬레이브로 LOAD DATA 명령문을 사용한 명령문 기반 복제가 중지되었습니다. 이제 이 문제가 수정되었습니다. (버그 #28541204, 버그 #92132)

복제: 마스터 정보 로그를 테이블(master_info_repository=TABLE)에서 파일(master_info_repository=FILE)로 변경한 경우, 복제 슬레이브에서 CHANGE MASTER TO 명령을 사용할 수 없었습니다. (버그 #28529558)

복제: mysqlbinlog이 DML SQL 명령과 관련된 이벤트에 대해 sql_require_primary_key 시스템 변수를 ON으로 설정하는 명령문을 잘못 추가했습니다. 이 시스템 변수가 ON으로 설정되었을 때 수행되는 검사는 새 테이블을 생성하거나 기존 테이블의 구조를 변경하는 DDL SQL 명령문에만 관련이 있습니다. (버그 #28524803)

복제: 시스템 변수 binlog_transaction_dependency_trackingbinlog_transaction_dependency_history_size를 설정하거나 읽을 때, 트랜잭션 종속성 추적 시스템 변수에 대한 접근을 위해 사용된 잠금 유형이 활성 바이너리 로그 작업에도 필요한 동일한 잠금을 사용했기 때문에 교착 상태가 발생할 수 있었습니다. 이제 이 교착 상태를 방지하기 위해 트랜잭션 종속성 추적 시스템 변수 접근에 새로운 잠금 유형이 사용됩니다. (버그 #28511326, 버그 #91941, 버그 #28537209, 버그 #92108)

복제: 다음 트랜잭션에 대한 GTID 값이 아직 결정되지 않았을 때(gtid_next=NOT_YET_DETERMINED) 암시적 커밋이 시도되면 디버그 빌드에서 어설션이 발생했습니다. gtid_next 시스템 변수는 mysqlbinlog가 형식 설명 이벤트를 실행하기 위해 내부용 명령문 BINLOG를 발행한 직후에 이 값을 갖습니다. 그 후 암시적 커밋이 있는 명령문(예: CREATE TABLE 명령문)이 시도되면 gtid_next 설정이 AUTOMATIC 상태로 전환되지 않고 허용되지 않는 상태로 남았습니다. 자동 커밋이 활성화된 경우, 명령문이 시도될 때 ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON 오류도 기록되었습니다.
이 문제를 해결하기 위해 이제 트랜잭션 중에 BINLOG 명령문이 gtid_next 상태를 변경할 경우 사용이 금지됩니다. 이를 시도하면 ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION 오류가 반환됩니다. 또한 GTID가 사용 중이고 gtid_next 값이 NOT_YET_DETERMINED인 경우, 다음 명령문은 명시적으로 gtid_next를 유효한 값으로 설정하거나 GTID 상태에 영향을 주지 않아야 합니다. 그렇지 않으면 ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON 오류가 반환됩니다. (버그 #28490793, 버그 #91980)

복제: mysqlbinlogmove를 사용하여 다른 위치로 이동된 바이너리 로그 파일에 대해 PURGE BINARY LOGS TO 'log_name' 명령문이 실패했습니다. 이러한 파일은 여전히 바이너리 로그 인덱스 파일에 나열되지만, 보통 바이너리 로그 파일이 저장되는 디렉터리에 상대 경로가 아닌 절대 경로로 나열되었습니다. 이제 MySQL 서버는 이동된 바이너리 로그 파일을 성공적으로 찾아서 삭제할 수 있습니다. (버그 #28284624)

복제: binlog_formatMIXED로 설정된 경우, 함수에 임시 테이블에 적용된 DML 명령문과 함께 DROP TEMPORARY TABLE 명령문이 포함되어 있으면 함수 호출이 바이너리 로그에 기록되지 않아 복제 오류가 발생했습니다. 이제 함수가 임시 테이블에서 작동하는 DML 명령문을 포함할 경우 함수 호출이 혼합 복제 모드에서 바이너리 로그에 기록됩니다. (버그 #28258992)

복제: GTID가 사용 중인 복제 슬레이브 또는 그룹 복제 멤버에서 autocommit이 0으로 설정되고, super_read_only=ON이 설정된 경우, 트랜잭션이 완료되지 않아 서버 종료가 방지되었습니다. 이 트랜잭션은 mysql.gtid_executed 테이블에 GTID를 저장하려고 시도했으나, super_read_only=ON으로 인해 업데이트가 실패했습니다. (이 상황에서 autocommit이 1로 설정된 경우 트랜잭션이 완료되고 mysql.gtid_executed 테이블이 서버 시작 시 업데이트됩니다.) 이제 이 작업에서는 super_read_only 설정을 건너뛰므로, 트랜잭션이 GTID를 mysql.gtid_executed 테이블에 저장하고, super_read_onlyautocommit 설정과 관계없이 완료될 수 있습니다. (버그 #28183718)

복제: 알려지지 않은 트랜잭션 식별자에 대해 XA ROLLBACK 명령문이 발행되고 gtid_next 값이 수동으로 설정된 경우, 디버그 빌드에서 어설션이 발생했습니다. 이제 XA ROLLBACK 명령문이 오류로 인해 실패하면 서버가 GTID 상태를 업데이트하지 않습니다. (버그 #27928837, 버그 #90640)

복제: 트랜잭션이 커밋되거나 롤백된 직후, GTID가 수동으로 할당된 상태에서 SELECT... FOR UPDATE 명령문이 발행되면 디버그 빌드에서 어설션이 발생했습니다. gtid_next를 사용해 트랜잭션에 GTID가 설정되고 해당 트랜잭션이 커밋 또는 롤백된 후, 또 다른 명시적인 SET GTID_NEXT 명령문이 발행되기 전까지는 다른 명령문이 실행되기 전에 gtid_next 값이 정의되지 않은 상태로 남아 있었습니다. 이 경우 SELECT... FOR UPDATE 명령문은 변경 사항이 없었지만 쓰기 잠금을 획득했기 때문에 GTID 일관성 위반이 발생했습니다. 이제 쓰기 잠금을 획득하는 SELECT... FOR UPDATE 명령문은 이러한 상황에서 오류를 반환합니다. (버그 #27903848, 버그 #90547)

복제: 바이너리 로그 그룹 커밋에서 과부하가 걸릴 때 경쟁 조건이 발생하면 서버가 예기치 않게 중지될 수 있었습니다. 트랜잭션 커밋 추적 방식이 변경되어 이 상황을 방지했습니다. (버그 #27556117)

복제: SHOW SLAVE STATUS 명령문에서 반환되는 모든 기존 릴레이 로그 파일의 총 결합 크기(Relay_Log_Space)가 실제 릴레이 로그 파일에 사용된 디스크 공간보다 훨씬 커질 수 있었습니다. I/O 스레드가 값을 업데이트하는 동안 해당 변수를 잠그지 않았기 때문에 SQL 스레드가 릴레이 로그 파일을 자동으로 삭제하고 I/O 스레드가 값을 업데이트하기 전에 축소된 값을 기록할 수 있었습니다. 그런 다음 I/O 스레드는 SQL 스레드의 업데이트를 무시하고 삭제된 파일의 공간을 다시 추가하여 원래 크기 계산을 기록했습니다. 이제 Relay_Log_Space 값은 업데이트 중에 잠겨져 동시 업데이트를 방지하고 정확한 계산을 보장합니다. (버그 #26997096, 버그 #87832)

복제: 백업 프로세스가 복제 슬레이브의 릴레이 로그 인덱스 파일을 일시적으로 잠가서 볼 수 있었고, MySQL 서버가 해당 파일에 접근하려고 할 때(이름 변경 또는 삭제 작업 시) 경고와 함께 백업이 완료되었으나 MySQL 서버가 예기치 않게 중단되었습니다. 이제 MySQL 서버는 이러한 상황이 발생할 경우 파일이 다시 사용 가능해질 때까지 여러 번 파일 액세스 작업을 재시도합니다. (버그 #25839610)

복제: sync_binlog=1로 설정된 경우, 바이너리 로그가 커밋 중에 회전되었지만 바이너리 로그 끝 위치가 업데이트되기 전에 슬레이브에서 복제가 중지되었습니다. 서버는 바이너리 로그 끝 위치를 업데이트할 때 활성 바이너리 로그 파일과 바이너리 로그 파일 이름을 비교하여 이 문제가 발생하지 않도록 합니다. (버그 #22252394, 버그 #25524203, 버그 #84752)

복제: 그룹에 새로운 멤버를 추가할 때, 인증 정보가 너무 커서 전송할 수 없으면 모든 그룹 멤버에서 오류가 발생할 수 있었습니다. 이제 인증 정보가 너무 큰 경우, 새로 합류한 멤버가 그룹에서 나가도록 하는 오류가 발생합니다. (버그 #93130, 버그 #91870, 버그 #28900691, 버그 #28443958)

복제: group_replication_switch_to_single_primary_mode()를 사용한 경우, 비동기 채널을 가진 멤버에서 오류가 발생하면 비동기 복제 채널이 제대로 중지되지 않아 서버가 예기치 않게 중단될 수 있었습니다. (버그 #91747, 버그 #28382590)

복제: 그룹 코디네이터 기반 함수(예: group_replication_switch_to_single_primary_mode를 사용하여 그룹을 구성할 수 있는 함수)를 사용할 때, 멤버가 UNREACHABLE 또는 RECOVERING 상태에 있는 경우 해당 작업은 모든 멤버가 ONLINE 상태가 될 때까지 대기합니다. 이로 인해 그룹 코디네이터 작업이 완료되지 않을 수 있었습니다. 이제 그룹이 이러한 상태일 때 이러한 함수 중 하나를 호출하면 오류가 반환됩니다. 그룹을 구성하기 전에 모든 멤버가 ONLINE 상태에 있는지 확인하십시오. (버그 #91537, 버그 #28284355)

복제: 그룹에 지속적으로 피크 부하가 걸릴 때 새 멤버가 RECOVERING 상태에서 ONLINE 상태로 전환되지 못할 수 있었습니다. 그 원인은 다음과 같습니다:

  • 멤버가 복구 중에 도착한 트랜잭션 대기열을 모두 적용할 때까지 루프에서 기다리고 있었고, 이 동안 새 트랜잭션이 계속 도착했습니다.
  • 전체 대기열이 적용된 후에도 멤버는 어플라이어가 일시 중지되었는지 확인하고 있었는데, 이는 지속적인 피크 워크로드에서는 거의 발생하지 않습니다.

이제 복구 완료 정책이 트랜잭션 적용을 기다릴 때 멤버는 먼저 다음 조건 중 하나가 충족될 때까지 기다립니다:

  • 적용할 트랜잭션이 흐름 제어 구성 내에 맞습니다. 즉, 적용할 트랜잭션이 다음 흐름 제어 반복 중에 적용될 수 있습니다.
  • 빈 복구 대기열의 경우 대기열에 트랜잭션이 대기 중이거나 적용 중이지 않습니다.

그런 다음 멤버는 group_replication_applier 채널에 현재 대기 중인 트랜잭션이 적용될 때까지 기다린 후 멤버 상태를 ONLINE으로 변경합니다. (버그 #89582, 버그 #27511404)

그룹 복제: 의심스러운 그룹 복제 멤버를 추방하기 전에 대기하는 최대 시간 설정이 3600초(1시간)로 줄어들었습니다. 이전에는 group_replication_member_expel_timeout 시스템 변수를 최대 31,536,000초로 설정할 수 있었습니다. 새로운 상한선은 그룹에서 비활성 멤버를 제거하기 위한 보다 합리적인 최대값을 제공합니다. 타임아웃 기본 설정은 0으로, 이는 5초 감지 기간이 끝난 직후 비활성 멤버가 추방될 수 있음을 의미합니다. 느린 네트워크에서 또는 일시적인 네트워크 장애나 시스템 지연이 예상되는 경우 불필요한 추방을 피하기 위해 타임아웃 값을 지정하는 것이 유용합니다. (버그 #28656750)

그룹 복제: 그룹 통신 시스템(GCS)이 네트워크 이름 해석을 위해 systemd-resolved 서비스를 사용한 시스템에서 호스트 이름을 해석할 수 없는 경우, GCS는 무한정 시도했습니다. 이제 이름 해석 서비스에서 재시도 메시지가 반환되면, GCS는 제한된 횟수만큼 재시도한 후 호스트 이름이 해석 불가능하다고 결론 내립니다. (버그 #28177861)

그룹 복제: 그룹이 온라인에서 재구성될 때(예: group_replication_switch_to_multi_primary_mode 또는 group_replication_set_as_primary를 사용하는 경우), 멤버를 중지할 때 예기치 않은 종료가 발생할 수 있었습니다. 이제 STOP GROUP_REPLICATION 명령을 내리면, 멤버가 재구성 중인 온라인 그룹의 일부일 경우 그룹 코디네이터에 그룹 복제가 중지되고 있음을 알립니다. 멤버는 온라인 구성 프로세스가 진행 중인 작업을 완료할 때까지 대기하지만, 이후 작업은 취소됩니다. (버그 #92829, 버그 #28807260)

그룹 복제: 그룹 복제를 중지할 때 대기 중인 트랜잭션이 있는 채널이 교착 상태를 유발할 수 있었습니다. (버그 #92376, 버그 #28636768, 버그 #28365855)

그룹 복제: group_replication_exit_state_actionABORT_SERVER로 설정된 경우, 그룹 복제 플러그인은 이제 MySQL을 종료하기 위해 WL#12003에 의해 추가된 새로운 컴포넌트 서비스를 사용합니다. (버그 #91793, 버그 #28401703)

Microsoft Windows: 기존 MySQL 서비스를 제거하지 못한 후 MySQL Installer가 실패할 수 있었습니다. 이제 이 문제는 치명적인 것으로 간주되지 않으며 설치 작업이 계속 진행될 수 있지만, 서비스 정리를 위해 시스템 재시작이 필요할 수 있습니다. (버그 #29016677, 버그 #93048)

Microsoft Windows: 동일한 호스트에서 동일한 사용자로 --no-monitor 옵션을 사용하여 여러 mysqld 인스턴스가 시작된 경우, SHUTDOWN 명령이 잘못된 서버 프로세스를 종료했습니다. 이 수정은 프로세스 ID를 추가하여 --no-monitor를 사용하는 고유한 종료 이벤트 이름을 생성합니다. (버그 #28723675)

X DevAPI: X Protocol을 사용할 때, 사용자 변수를 OUT 매개변수로 사용하는 저장 프로시저가 변수의 값을 설정하지 않았습니다. (버그 #91907, 버그 #28458752)

JSON: JSON 객체에 대한 반복(iteration)에서 불필요한 문자열 할당이 발생했습니다. (버그 #28975640)

JSON: JSON 값을 텍스트로 변환할 때 대상 문자열의 선형적 증가로 인해 재할당 횟수가 불필요하게 많아졌습니다. 이제 이 프로세스는 재할당 횟수를 줄이기 위해 지수적 증가를 사용합니다. (버그 #28949700)
참고: 관련 항목: 버그 #103790, 버그 #32919524.

JSON: YEAR 값이 JSON에서 불투명 데이터로 저장되었습니다. YEAR 값을 포함한 JSON 문서를 텍스트로 변환하면 YEAR 값이 base64로 인코딩된 문자열로 표시되었습니다. 이 문제를 해결하기 위해 이제 YEAR 값이 부호 없는 정수로 저장되며, 텍스트로 변환될 때 숫자로 표시됩니다. 이 수정의 추가 이점은 JSON 문서 내의 YEAR 값에 대해 더 적은 저장 공간이 필요하다는 점입니다. (버그 #28947107)

JSON: ARCHIVE 테이블에서 JSON 열이 포함된 테이블에 대해 UPDATE 또는 DELETE 명령을 실행하려고 할 때 어설션이 발생했습니다. (버그 #28923281)

JSON: FEDERATED 테이블의 JSON 열에서 데이터를 선택하려고 하면, 서버는 ER_INVALID_JSON_PATH_CHARSET 오류를 반환하며, CHARACTER SET ‘binary’로 문자열에서 JSON 값을 생성할 수 없다고 표시했습니다.
또한, JSON 열이 포함된 FEDERATED 테이블에 대해 DELETEUPDATE 명령이 적용되지 않았습니다. (버그 #28877215)

JSON: SELECT jt.* FROM t1, JSON_TABLE(t1.c, '$[*]' COLUMNS (num INT PATH '$[0]')) AS jt 형식의 쿼리가 사용자가 열 c에 대한 SELECT 권한을 가지고 있음에도 불구하고 권한 오류로 실패했습니다. (버그 #23254268)

Facebook이 제공한 버그 #27855592에서 구현된 기능에 대한 코드가 업데이트되었습니다. (버그 #28950397)
참고: 관련 항목: 버그 #27855592.

SuSE Linux에서 pthread_mutex_destroy()에서 발생하는 EBUSY 반환값이 처리되지 않았습니다. (버그 #28948462)

mysqld_safemysqld_multi가 클라이언트 전용 패키지에 잘못 포함되었습니다. (버그 #28942508)

호스트 캐시 잠금 처리가 잘못되어 서버 종료가 발생할 수 있었습니다. (버그 #28936159)

MySQL Enterprise Firewall이 audit_log 플러그인이 설치된 경우 제대로 작동하지 않았습니다. (버그 #28930885, 버그 #93184)

Windows에서 Visual Studio를 사용하여 빌드를 성공적으로 수행하기 위한 수정이 이루어졌습니다. (버그 #28892711, 버그 #93077)

서버는 redo 로그 파일과 동일한 이름으로 데이터베이스를 생성하도록 허용하여, 예기치 않은 서버 동작이 발생할 수 있었습니다. 이제 이러한 이름은 데이터베이스 이름으로 허용되지 않습니다. (버그 #28867993)

mysqld_multimysqld에 올바른 datadir 값을 전달하지 못할 수 있었습니다. (버그 #28866662, 버그 #90801)

다중 바이트 문자를 포함하는 스키마 이름을 처리할 때 루틴, 이벤트 및 트리거의 MDL 키 생성을 검사하는 디버그 어설션이 실패했습니다. (버그 #28864244)

일부 오류 메시지에 대한 형식 지정자가 개선되어 잘못된 숫자 값이 표시되지 않도록 했습니다. (버그 #28860795)

Windows에서 디버그 빌드의 경우, 사용되지 않는 메모리 누수 검사로 인해 종료 프로세스가 느려질 수 있었습니다. 이제 이러한 검사는 전문화된 빌드에만 적용됩니다. (버그 #28857626)

sql_require_primary_key 시스템 변수가 활성화된 경우, mysql_upgrade가 특정 시스템 테이블을 업그레이드하지 못할 수 있었습니다. (버그 #28855207, 버그 #92988)

-DWITH_LIBWRAP=ON으로 구성된 빌드가 컴파일되지 않았습니다. (버그 #28853650, 버그 #92983)

InnoDB 테이블의 경우, DEFAULT() 함수에 의존하는 저장되거나 인덱싱된 가상 생성 열의 값이, 이 함수에서 참조된 열의 기본값이 열의 null 가능성에 따라 변경된 경우 ALTER TABLE에 의해 올바르게 업데이트되지 않았습니다. (버그 #28848265)

Windows에서 /permissive 플래그가 켜진 상태에서 Visual Studio로 성공적인 빌드를 수행하기 위한 수정이 이루어졌습니다. (버그 #28842878, 버그 #92943)

-DCMAKE_BUILD_TYPE=Release로 구성된 빌드가 컴파일되지 않았습니다. (버그 #28841366, 버그 #92945)

이제 ALTER TABLE은 다음 조건이 적용될 때 INPLACE 알고리즘을 사용할 수 있습니다:

  • InnoDB 테이블의 경우, 생성된 저장된 열을 수정하지만 유형, 표현식 또는 null 가능성을 변경하지 않는 명령문.
  • InnoDB 테이블의 경우, 생성된 저장 또는 가상 열을 수정하지만 유형, 표현식 또는 null 가능성을 변경하지 않는 명령문.

예를 들어 열 주석을 변경하는 것이 이러한 변경의 예입니다. (버그 #28836543)

플러그인 시스템 변수 중 일부는 플러그인이 재설치될 때 적용되지 않았습니다. (버그 #28823972)

EXPLAIN ... FOR CONNECTION이 다른 연결의 SQL 모드를 수정할 수 있었습니다. (버그 #28786981)

Sun RPC 및 XDR이 glibc에서 libtirpc 라이브러리로 분리됨에 따라 일부 플랫폼에서 libasan과 관련된 문제가 발생했습니다. (버그 #28785835, 버그 #92762, 버그 #28897799, 버그 #93116)

b 열에 인덱스가 있는 경우, ENUM 값을 비교하는 동안 SELECT a FROM table WHERE b = value 형식의 쿼리를 처리할 때 어설션이 발생할 수 있었습니다. (버그 #28769996)

offline_mode 시스템 변수에 대한 동시 읽기 및 쓰기 액세스가 교착 상태를 일으킬 수 있었습니다. (버그 #28761869)

MySQL 5.7에서 MySQL 8.0으로 업그레이드할 때 트리거가 잘못된 순서로 메모리에 로드되어 어설션 오류가 발생했습니다. (버그 #28760011, 버그 #92609)

퍼포먼스 스키마 data_locks 테이블을 포함하는 조인에서 잘못된 결과가 생성될 수 있었습니다. (버그 #28733170)

스칼라 서브쿼리를 사용하는 중첩된 서브쿼리가 제대로 처리되지 않았습니다. (버그 #28723670)

Ubuntu에서 설치된 /etc/mysql/mysql.conf.d/default-auth-override.cnf 파일이 잘못 실행 모드로 생성되었습니다. Evgeniy Patlan이 제공한 수정 사항에 감사드립니다. (버그 #28714840, 버그 #92587)

GET_LOCK() 호출이 동일한 사용자 수준 잠금을 보유한 동시 연결로 인해 실패할 때 메모리 누수가 발생했습니다. (버그 #28714367)

많은 수의 테이블을 호스팅하는 서버가 반복적으로 시작되고 중지될 때 힙 손상 및 서버 종료가 발생할 수 있었습니다. (버그 #28705511, 버그 #92572)

MySQL Router가 MySQL Server MSI 패키지에서 누락되었습니다. (버그 #28685556)

예시 저장 함수 GTID_SUBTRACT_UUID가 코드에서 문서화된 버전과 일치하도록 수정되었습니다. (버그 #28670170)

Linux용 MySQL 패키지 설치 프로그램에서 더 이상 mysqld에 대해 CAP_SYS_NICE 기능이 활성화되지 않습니다. (이는 리소스 그룹 스레드 우선 순위 사용을 촉진하기 위한 조치였습니다.) 스레드 우선 순위에 액세스해야 하는 Linux 배포의 경우, 리소스 그룹 제한 사항에 대한 MySQL 참조 매뉴얼 지침을 참조하여 CAP_SYS_NICE 기능을 활성화하는 방법을 확인하십시오. (버그 #28670160)

<=> 연산자의 내부 구현이 간소화되었습니다. (버그 #28660232)

STOP GROUP_REPLICATION 명령을 통해 서버 인스턴스를 그룹에서 제거한 후, 서버 인스턴스에 “[GCS] 그룹 통신 엔진에 메시지 전송 중 오류”라는 오류 메시지가 여러 번 기록되었습니다. 이제 서버가 그룹에서 나가는 중이거나 더 이상 그룹의 멤버가 아닐 때 이 오류가 무시됩니다. (버그 #28658228, 버그 #92454)

일부 열의 CHARACTER SET 속성이 JSON_TABLE(... COLUMNS ...)에서 암시적일 경우, 생성된 열은 기본 문자 집합으로 전역 character_set_results를 사용했습니다. 이제 해당 열은 세션 character_set_connectioncollation_connection 값을 사용합니다. (버그 #28643862)

행 값을 생성하는 표현식에 대한 기능적 인덱스를 추가하면 어설션이 발생했으나, 이제는 오류가 발생합니다. (버그 #28643252)

디버그 빌드에서 sql-modeTIME_TRUNCATE_FRACTIONAL로 설정한 후 트리거를 생성하면 어설션 오류가 발생했습니다. 이 SQL 모드는 mysql.triggers 데이터 사전 테이블의 sql_mode 열에 없었습니다. (버그 #28642918)

--log-timestamps=SYSTEM를 사용할 때, 로그 메시지의 ISO 8601 타임스탬프가 일광 절약 시간을 고려하지 않았습니다. (버그 #28632725, 버그 #32893161)

오류 ER_IB_MSG_720의 인수가 잘못 계산되었습니다. (버그 #28629175)

소켓 파일을 지정하는 옵션이 올바르게 지정되지 않은 경우 서버가 시작 시 종료될 수 있었습니다. (버그 #28609181)

자식 테이블과 다른 스토리지 엔진을 가진 상위 테이블을 추가한 다음 상위 테이블을 자식 테이블과 동일한 스토리지 엔진으로 변경하여 일관되지 않은 외래 키를 생성할 수 있었습니다. (버그 #28608460, 버그 #92317)

서버가 복제 그룹에 가입할 때, group_replication_group_seeds 시스템 변수를 통해 나열된 첫 번째 시드 멤버에 연결을 시도합니다. 연결이 거부되면, 가입하는 멤버는 목록에 있는 다른 시드 멤버들에게 순차적으로 연결을 시도합니다. 이전에는 가입하는 멤버가 시드 멤버에 연결되었지만 복제 그룹에 추가되지 못한 경우, 가입하는 멤버는 추가 연결 시도를 하지 않았습니다. 이러한 상황은 시드 멤버와의 연결이 이루어진 후에 시드 멤버가 실패하거나, 시드 멤버가 가입 멤버의 주소를 허용 목록에 포함하지 않아 연결을 닫았거나, 시드 멤버가 가입 멤버의 그룹 가입 요청을 거부한 경우에 발생할 수 있었습니다. 이제 가입하는 멤버가 시드 멤버에 연결되었지만 그룹에 가입하지 못한 경우, 가입하는 멤버는 목록에 있는 나머지 시드 멤버들에게 순차적으로 연결을 계속 시도합니다. (버그 #28602835)

특정 할당 패턴, 할당자의 재바인드가 있는 복사 및 할당 해제 시, temptable::Allocator가 해제된 메모리 블록을 재사용할 수 있었습니다. 이로 인해 Windows 플랫폼에서 테스트 스위트 실패가 발생했습니다. (버그 #28595557)

time_zone을 음수 오프셋으로 설정하고 timestamp를 낮은 값으로 설정하면 루틴과 뷰를 변경할 때 어설션이 발생했습니다. (버그 #28590623, 버그 #92273)

pid_file 시스템 변수를 DEFAULT로 영구적으로 설정하면, 이후 서버 시작 시 값이 NULL이 될 수 있었습니다. (버그 #28589736)

잘못된 권한 검사가 MySQL 5.7에서는 성공적으로 실행된 SELECT ... FOR UPDATE 명령문에서 오류를 발생시킬 수 있었습니다. (버그 #28581664, 버그 #92254)

ALTER TABLE로 외래 키의 상위 열 이름을 변경하려고 시도하면 실패할 수 있었습니다. (버그 #28581468)

RESET PERSIST에 대한 권한이 올바르게 확인되지 않았습니다. (버그 #28564239)

AVG(YEAR(_datetime_column_)을 계산할 때 오버플로가 발생했습니다. (버그 #28562930)

서버 재시작 후, 퍼포먼스 스키마 variables_info 테이블에서 영구 시스템 변수의 경로 이름이 잘못 계산될 수 있었습니다. (버그 #28561584)

파티션된 테이블 이름 검사에서 잘못된 어설션이 발생했습니다. (버그 #28556942)

handler::create() 함수가 조건 목록에서 오류와 함께 호출될 수 있었으며, 이로 인해 handler::create() 함수에서 오류가 제대로 보고되지 않을 수 있었습니다. (버그 #28556264)

MySQL 8.0.12 이전 버전에서 생성된 테이블에 대해 ALTER TABLEALGORITHM=INSTANT가 잘못 거부되었습니다. (버그 #28554157, 버그 #92194)

mysqlpump가 오류를 만나면 할당된 모든 리소스를 해제하지 않아 메모리 누수가 발생했습니다. (버그 #28538971, 버그 #92131)

JSON_TABLE() 함수의 COLUMNS 절에 COLLATE 속성이 있는 데이터 타입이 거부되었습니다. (버그 #28538315)

디버그 빌드의 경우, CREATE USER 명령문을 롤백하려고 할 때 서버가 종료될 수 있었습니다. (버그 #28536312)

서명된 값을 가진 플러그인 변수가 잘못 표시되었습니다. (버그 #28534414, 버그 #92107)

사용 중단된 시스템 변수를 잘못 처리하면 퍼포먼스 스키마 variables_by_thread 테이블에 대한 쿼리 출력이 잘못될 수 있었습니다. (버그 #28515475, 버그 #92049)

Thread Sanitizer가 Event_queue::lock_dataSAFE_MUTEX 구현에서 발견한 데이터 경합이 수정되었습니다. (버그 #28510721, 버그 #92041, 버그 #28510691, 버그 #92040)

준비된 명령문에 대한 재준비가 실패했을 때, 진단 영역에 ER_NEED_REPREPARE 진단이 푸시되지 않았습니다. (버그 #28509306, 버그 #92029)

하위 쿼리에 UNION이 포함된 경우, 하위 쿼리 열의 개수가 잘못 계산되었습니다. (버그 #28499924)

WITH ROLLUP을 사용하여 표현식을 평가할 때 임시 테이블 열이 있을 경우에만 임시 테이블에 표현식의 결과를 기록합니다. (버그 #28493849, 버그 #28523014)

디버그 빌드의 경우, TEMPORARY 테이블에 대한 ALTER TABLE의 잘못된 외래 키 오류 검사가 서버 종료를 초래할 수 있었습니다. (버그 #28493257, 버그 #91990)

일부 시스템 변수의 경우, SET PERSIST가 지정된 값이 아닌 기본값을 영구적으로 저장했습니다. (버그 #28466045)

SET RESOURCE GROUP을 준비된 명령문으로 실행할 수 없었습니다. (버그 #28448258, 버그 #91876)

Item_field::fix_fields() 호출이 창 함수 구현 작업 중에 실수로 제거되었으나, 복원되었습니다. (버그 #28431783)

X Plugin 시작 및 종료 중 Thread Sanitizer가 보고한 데이터 경합 문제가 수정되었습니다. (버그 #28407294)

불법적인 utf8 문자가 포함된 파티션 설명으로 테이블을 생성하면 어설션이 발생했습니다. (버그 #28387488, 버그 #91763)

mysqldump 출력에 제거된 SQL 모드 값이 포함될 수 있었습니다. (버그 #28373001, 버그 #91714)

잠재적인 잠금 순서 순환 문제가 수정되었습니다. (버그 #28366531)

GTID가 활성화된 서버에서 INFORMATION_SCHEMA.COLUMNS 테이블에 대한 동시 명령문이 교착 상태에 빠질 수 있었습니다. (버그 #28293047, 버그 #91548)

utf32 테이블 문자 집합과 테이블 정의에 리터럴 문자열이 있는 테이블에 대한 CREATE TABLE 명령문이 어설션을 발생시켰습니다. (버그 #28275881)

서버 업그레이드가 성공적으로 완료된 후 서버 버전 번호를 업데이트하는 내부 함수가 추가되었습니다. (버그 #28211486, 버그 #91323)

memcmp() 함수를 사용하여 로그 파일 이름을 문자열로 비교할 때 초기화되지 않은 메모리 읽기 오류가 발생했습니다. 이제 비교는 strncmp() 함수로 수행됩니다. Zsolt Parragi 및 Laurynas Biveinis에게 감사드립니다. (버그 #28178776, 버그 #90238)

서버가 악센트만 다른 저장 프로그램 및 리소스 그룹 이름을 잘못 처리했습니다. (버그 #28122841)

옵티마이저가 LIKE 절을 사용하여 두 번째 열에 대해 내부 조인을 실행할 때 복합 인덱스의 두 번째 열을 건너뛰었습니다. (버그 #28086754)

CREATE TABLE ... SELECT가 날짜 열을 “0” 날짜 기본값으로 생성하여 기본값 없이 생성해야 할 경우에도 잘못된 기본값을 생성할 수 있었습니다. (버그 #28022129)

매우 많은 수의 테이블이 있는 경우 IN 하위 쿼리 술어를 세미조인으로 변환하는 과정에서 문제가 발생했습니다. (버그 #28004674)

창 함수용으로 생성된 임시 테이블에 대해 추가된 파일 정렬을 수행할 때 저장 엔진에서 필드를 읽기 위한 비트맵이 올바르게 활성화되지 않았습니다. 임시 테이블이 필요하지 않은 경우 서버는 선택 테이블의 출력에 파일 정렬을 추가했으나, 제거된 참조(즉, WHERE 조건)가 추가되지 않았습니다. 이제 이러한 경우 첫 번째 창 함수가 정렬을 필요로 하고 이전에 임시 테이블이 생성되지 않은 경우 참조가 선택 테이블에 추가됩니다. (버그 #27975193)

범위 프레임에서 한 행을 본 후 나중에 다른 행이 해당 범위 프레임 앞에 나타났을 때, 서버는 계속해서 새 행을 확인하여 다음 프레임 계산이 잘못 수행되었습니다. (버그 #27973860)

서버가 SIGHUP 신호를 잘못 처리하여 서버 종료가 발생할 수 있었습니다. (버그 #27966483, 버그 #90742)

디버그 빌드에서 DELETE WHERE a=_constant_ 명령을 생성된 열 b 값으로 파티셔닝된 테이블에서 실행하면 어설션이 발생했습니다. (버그 #27954073)

INFORMATION_SCHEMA 쿼리가 동적 테이블 통계를 업데이트할 때 서버 종료가 발생할 수 있었습니다. (버그 #27898108)

외래 키 상위 테이블을 열 때 메타데이터 잠금 교착 상태가 발생할 수 있었습니다. (버그 #27859086)

계정 관리 명령문이 잘못된 메모리 처리로 인해 서버 오작동을 일으킬 수 있었습니다. (버그 #27820277)

일부 경우, 창 함수가 ORDER BYPARTITION BY를 올바르게 처리하지 못했습니다. (버그 #27816506)

MySQL 쿼리 옵티마이저는 각 술어를 테이블 조건으로 푸시하려고 식별합니다. 이 과정의 일부로 선택된 접근 경로에 의해 해당 술어가 이미 참이라는 것이 확인되면 술어를 안전하게 제거할 수 있습니다.
예를 들어, pk가 테이블 t1의 기본 키일 때, SELECT * FROM t1 WHERE pk=1을 실행하는 경우, ref 접근 방법이 선택됩니다. 이 방법은 pk=1인 행만 반환하므로 필터(Using where)로 이 조건을 추가로 평가할 필요가 없어야 합니다.
쿼리에 GROUP BY 또는 ORDER BY가 포함된 경우, 옵티마이저는 정렬된 인덱스를 사용하여 정렬을 생략할 수 있는지 여부를 늦게 확인합니다. 이는 다른 인덱스가 선택된 후에 수행되므로, 이전 접근 경로에 따라 불필요하다고 판단된 술어가 너무 일찍 제거될 수 있습니다. 이를 보완하기 위해 다음 작업이 수행되었습니다:

  • 접근 방법이 선택된 후 제거된 술어를 다시 추가하여 테이블 조건을 재구성합니다.
  • 정렬을 피할 수 있는 정렬된 인덱스가 존재하는지 확인하고, 이를 사용해 접근 계획을 수정할 수 있습니다.

다음 작업들이 잘못 수행되어, 초기 조건 절 제거를 해결하려는 시도에서 문제가 발생했습니다:

  • 액세스 계획이 수정되었든 그렇지 않았든, 이전에 언급된 재구성된 테이블 조건에 추가된 모든 추가 조건절이 테이블 조건의 영구적인 일부가 되었습니다.
  • 액세스 계획이 다른 정렬된 인덱스를 사용하도록 변경되었을 때, 새로운 인덱스로 인해 불필요해진 조건절을 제거하기 위한 분석이 수행되지 않았습니다.

추가적으로, NDBCLUSTER와 같이 조건 푸시다운을 구현하는 스토리지 엔진에서도 문제가 발생했습니다. 푸시된 조건들은 테이블 조건에서 분석이 이루어지기 전에 생성되었기 때문에, 나중에 액세스 경로가 변경되면 푸시된 조건은 이미 제거된 조건을 포함하지 않게 되어 조건 푸시다운의 효율성이 떨어졌습니다.
이 문제의 근본 원인은 part_of_refkey() 분석이 테이블의 액세스 방법이 완전히 결정되기 전에 테이블 조건에 대해 수행되었기 때문입니다. 이 문제는 조기 분석을 제거하여 해결되었습니다. (버그 #27808758, 버그 #27814026)

ORDER BY column 절이 포함된 창 함수가 테이블에서 열을 찾을 수 있음에도 불구하고 “Unknown field in window order by” 오류를 발생시켰습니다. (버그 #27808099)

많은 자리 표시자를 사용하는 여러 행 삽입 준비된 명령문을 실행할 때 과도한 메모리 사용과 실행 속도 저하가 발생할 수 있었습니다. (버그 #27703912)

Windows에서 Visual C++ Redistributable for Visual Studio가 제거된 경우, MSI 설치 관리자를 사용한 MySQL 제거가 실패했습니다. (버그 #27621546)

파서는 트리거 정의에서 잘못된 SET 명령문 구문을 수락하여 서버 종료를 일으킬 수 있었습니다. (버그 #27595603)

keyring_encrypted_file 플러그인 키링 파일이 유효하지 않으면 서버가 시작되지 않았습니다. (버그 #27588064)

keyring_okvkeyring_encrypted_file 키링 플러그인을 사용한 키링 마이그레이션이 실패했습니다. (버그 #27493970)

서명된 정수를 사용하는 창 함수가 FOLLOWING이 포함된 프레임을 잘못 처리할 수 있었습니다. (버그 #27452365)

CURSOR_TYPE_READ_ONLY 플래그가 설정된 절차 호출을 포함하는 준비된 명령문을 실행할 때, 절차가 빈 결과 집합을 반환하는 SELECT를 실행하면 클라이언트 라이브러리가 멈췄습니다. (버그 #27443252, 버그 #89214)

외래 키 참조 열의 이름이 항상 SHOW CREATE TABLE 출력과 INFORMATION_SCHEMA.KEY_COLUMN_USAGE 테이블에서 소문자로 표시되었습니다. (버그 #27353767, 버그 #88718)

audit_log 플러그인을 로드 및 언로드하면서 동시에 다른 작업을 수행하면 서버가 응답하지 않을 수 있었습니다. (버그 #27325622)

데이터 사전 속성 인터페이스(dd::Properties) 및 구현이 속성 객체에 유효한 키를 정의하는 새로운 메서드를 제공하도록 수정되었습니다. (버그 #27309072, 버그 #89031, 버그 #27309082, 버그 #89032)

SET PASSWORD를 사용하여 validate_password 컴포넌트를 설치하고 제거할 때 컴포넌트 오류가 발생할 수 있었습니다. (버그 #27020979)

서버 소스 코드의 일부 오타가 수정되었습니다. 기여해주신 Hyunwoo Park님께 감사드립니다. (버그 #26189673, 버그 #86565)

테이블에 열 권한이 부여된 후, HANDLER READ 호출이 권한 검사 중에 어설션을 발생시켰습니다. (버그 #25987758)

외래 키 정의에서 참조 열과 참조된 열의 유형 호환성을 보장하는 검사가 스토리지 엔진 계층에서 SQL 계층으로 이동되었습니다. 또한, 열이 호환되지 않거나 외래 키 제약 조건이 존재하지 않는 테이블을 참조할 때 더 나은 오류 메시지가 생성됩니다. (버그 #25722927, 버그 #28371394, 버그 #91712, 버그 #21308781, 버그 #77467, 버그 #11746132, 버그 #23693)

파서가 일부 메모리 부족 검사를 잘못 수행했습니다. (버그 #25633994)

사용자 관리 명령문과 권한 테이블에 직접 액세스하려는 명령문 간의 경쟁 조건이 교착 상태 및 트랜잭션 롤백을 초래할 수 있었습니다. (버그 #24481240)

skip_name_resolve 시스템 변수를 활성화하여 서버를 시작했을 때, localhost 호스트 이름 부분을 가진 계정을 무시한다는 잘못된 경고가 오류 로그에 기록되었습니다. (실제로는 계정이 무시되지 않고 사용되었습니다.) (버그 #23329861, 버그 #81441)

생성된 열이 있는 테이블에서 IGNORE를 사용하는 DML 명령문이 항상 올바르게 처리되지 않았습니다. (버그 #22990029)

MySQL은 상수 리터럴 표현식에서 발생하는 사소한 WHERE 조건을 최적화의 나중 단계가 아닌 준비 단계에서 제거하도록 변경되었습니다. 이로 인해 다음과 같은 사소한 조건이 포함된 외부 조인 쿼리에 대한 계획이 개선될 수 있습니다:

SELECT * FROM t1 LEFT JOIN t2 ON condition_1 WHERE condition_2 OR 0 = 1

최적화 프로그램이 불필요한 OR 0 = 1 조건을 제거한 후, 쿼리는 다음과 같이 내부 조인으로 재작성될 수 있습니다:

SELECT * FROM t1 LEFT JOIN t2 WHERE condition_1 AND condition_2

자세한 내용은 MySQL 8.0의 새로운 기능외부 조인 최적화를 참조하십시오. (버그 #16893426, 버그 #28237111, 버그 #28239008, 버그 #28341790, WL #9571)
참고: 관련 버그로는 버그 #28197977, 버그 #28240054가 있습니다.

FEDERATED 테이블의 BLOB 열에 대한 업데이트가 작동하지 않았습니다. (버그 #11748067, 버그 #34997)

REGEXP_REPLACE(), REGEXP_SUBSTR(), REGEXP_LIKE(), REGEXP_INSTR() 함수 각각이 지정된 반환 유형 대신 DOUBLE 값을 반환했습니다. (버그 #90039, 버그 #27682225)

동적 범위와 인덱스 병합을 사용하는 쿼리가 예상보다 더 많은 메모리를 사용할 수 있었습니다. (버그 #89953, 버그 #27659490)

NO_PAD 대조가 있는 CHAR 열이 있는 테이블에서 선택할 때 일관되지 않은 결과가 발생했습니다. (버그 #89753, 버그 #27578340)

Leave a Comment



이 문서 공유

8.0.14 변경 사항 (2019-01-21 GA)

링크 복사

CONTENTS