For general information about upgrades, downgrades, platform support, etc., please visit https://dev.mysql.com/doc/relnotes/mysql/8.0/en/.
This is a milestone release, for use at your own risk. Upgrades between milestone releases (or from a milestone release to a GA release) are not supported. Significant development changes take place in milestone releases and you may encounter compatibility issues, such as data format changes that require attention in addition to the usual procedure of running mysql_upgrade. For example, you may find it necessary to dump your data with mysqldump before the upgrade and reload it afterward. (Making a backup before the upgrade is a prudent precaution in any case.)
Beginning with MySQL 8.0.4, macOS 10.13 is a supported platform.
Linux: Binary packages on Linux platforms now are built using GCC 6. The optimization level has changed from
-O3
to-O2
. (WL #10343)macOS; Microsoft Windows: For compiling MySQL from source, the
-DWITH_SSL=system
CMake option now works on Windows and macOS. (Bug #26907731, Bug #87938)On platforms for which the GNU gold linker is used, removal of unused functions is now enabled, reducing the size of binaries. (Bug #26612067, Bug #87372)
#include
directives in source files were rewritten and reorganized to be unambiguous. (Bug #26597243, Bug #87358, Bug #26897738)The
BUILD
directory containing compilation scripts is no longer maintained and has been removed from MySQL source trees. (Bug #26576219, Bug #87323)The minimum version of the Boost library for server builds is now 1.65.0. (Bug #26574924, Bug #87317)
MySQL can now be linked against OpenSSL 1.1 on Unix and Unix-like systems. (Bug #25094892, Bug #83814)
Work was done to clean up the source code base, including: Removing unneeded CMake checks; removing unused macros from source files; reorganizing header files to reduce the number of dependencies and make them more modular, removing function declarations without definitions, replacing locally written functions with equivalent functions from industry-standard libraries.
-
The
validate_password
plugin has been reimplemented to use the component infrastructure. To install and uninstall thevalidate_password
component, use these statements:INSTALL COMPONENT 'file://component_validate_password'; UNINSTALL COMPONENT 'file://component_validate_password';
INSTALL PLUGIN
andUNINSTALL PLUGIN
still work to install and uninstall thevalidate_password
plugin as before, but generate warnings. The plugin form ofvalidate_password
is deprecated and will be removed in a future MySQL version. MySQL installations that use the plugin should transition to the component instead. See Transitioning to the Password Validation Component.A usage difference between the component and plugin implementations of
validate_password
is that, whereas the plugin exposes system and status variables with names that begin withvalidate_password_
, the component uses the convention of exposing variables with names that begin with the component name and a period. For example, the plugin exposes thevalidate_password_policy
system variable andvalidate_password_dictionary_file_words_count
status variable, whereas the corresponding variables exposed by the component arevalidate_password.policy
andvalidate_password.dictionary_file_words_count
. The plugin variables, like the plugin itself, are deprecated and will be removed in a future MySQL version. (WL #6667)
-
Replication: When calculating the binary log expiration period, any value that you specify for the deprecated
expire_logs_days
system variable is now ignored ifbinlog_expire_logs_seconds
is set, and only the value ofbinlog_expire_logs_seconds
is used. Previously, the effects ofbinlog_expire_logs_seconds
andexpire_logs_days
were cumulative.If you set a value for both system variables at startup, a warning message is issued stating that the value of
expire_logs_days
is ignored. You cannot set or change the value of one option dynamically while the other is set, and an error message is issued in this situation.The default binary log expiration period of 30 days (as changed in MySQL 8.0.2) applies if neither
binlog_expire_logs_seconds
norexpire_logs_days
has a value set at startup. If a value for eitherbinlog_expire_logs_seconds
orexpire_logs_days
is set at startup, this value overrides the default binary log expiration period. To disable automatic purging of the binary log, you must set bothbinlog_expire_logs_seconds
andexpire_logs_days
explicitly to 0 at startup. (Bug #26274274, Bug #86698) For RHEL, SLES, and Fedora RPMs, the default plugin directory for debug builds has been changed from
/usr/lib64/mysql/plugin
to/usr/lib64/mysql/plugin/debug
. (Bug #27072155, Bug #88363)The new
WITH_LZMA
andWITH_RE2
CMake options control whether to compile with the bundled or system LZMA and RE2 libraries.The
table_open_cache
system variable default variable has been increased from 2000 to 4000. This additionally changes the default for the autosizedtable_definition_cache
system variable from 1400 to 2000. (WL #9703)The
optimizer_trace_max_mem_size
system variable default value was changed from 16KB to 1MB to lessen the likelihood of optimizer trace truncation. (WL #11345)The
log_error_verbosity
system variable default value was changed from 3 (error, warning, and information messages) to 2 (error and warning messages) to make mysqld error logging less verbose by default. (WL #11143)
InnoDB: The
innodb_undo_tablespaces
configuration option is deprecated and will be removed in a future MySQL version. (WL #10473)Replication: The
group_replication_primary_member
status variable has been deprecated and will be removed in a future MySQL version. (WL #10958)Replication: The
group_replication_allow_local_disjoint_gtids_join
system variable has been removed. (WL #11139)-
When the
libmysqld
embedded server library was removed in MySQL 8.0.1, the following mysql_options() options used only forlibmysqld
were not removed. They have now been removed.MYSQL_OPT_GUESS_CONNECTION MYSQL_OPT_USE_EMBEDDED_CONNECTION MYSQL_OPT_USE_REMOTE_CONNECTION MYSQL_SET_CLIENT_IP
(Bug #26712418)
mysqlpump no longer includes the
SQL_NO_CACHE
modifier in statements because that modifier is now deprecated and results in deprecation warnings. (Bug #26694675)Generated columns no longer permit deprecated functions in the generation expression, to avoid problems when MySQL is upgraded to a version in which the deprecated functions have been removed. (Bug #26279884, Bug #86712)
The Performance Schema
setup_timers
table has been removed, as has theTICK
row in theperformance_timers
table. (Bug #18296337, WL #10985, WL #10986)
-
Incompatible Change: Previously, MySQL used the Henry Spencer regular expression library to support regular expression operators (
REGEXP
,RLIKE
). Regular expression support has been reimplemented using International Components for Unicode (ICU), which provides full Unicode support and is multibyte safe. TheREGEXP_LIKE()
function performs regular expression matching in the manner of theREGEXP
andRLIKE
operators, which now are synonyms for that function. In addition, theREGEXP_INSTR()
,REGEXP_REPLACE()
, andREGEXP_SUBSTR()
functions are available to find match positions and perform substring substitution and extraction, respectively. Theregexp_stack_limit
andregexp_time_limit
system variables provide control over resource consumption by the match engine.MySQL source distributions bundle the ICU library, and the
WITH_ICU
CMake
option controls whether to compile with the bundled or system ICU library. TheICU_VERSION()
function returns the ICU library version.For more information, see Regular Expressions. For information about ways in which applications that use regular expressions may be affected by the implementation change, see Regular Expression Compatibility Considerations. (WL #8987)
Two new SQL functions are available to provide digest information about SQL statements. Given an SQL statement as a string,
STATEMENT_DIGEST()
returns the statement digest hash value, andSTATEMENT_DIGEST_TEXT()
returns the normalized statement digest. See Encryption and Compression Functions. (WL #9637)
-
The restriction enacted in MySQL 8.0.3 against renaming of columns in a parent foreign key has been lifted. (Bug #26659110, Bug #87490, Bug #25722221)
References: See also: Bug #26334071.
-
For platforms that use systemd (see Managing MySQL Server with systemd), the data directory is initialized if empty at server startup. This might be a problem if the data directory is a remote mount that has temporarily disappeared: The mount point would appear to be an empty data directory, which then would be initialized as a new data directory. It is now possible to suppress this automatic initialization behavior. Specify the following line in the
/etc/sysconfig/mysql
file (create the file if it does not exist):NO_INIT=true
(Bug #26595288, Bug #87287)
MySQL now supports key migration between underlying keyring keystores, permitting DBAs to switch a MySQL installation from one keyring plugin to another. See Migrating Keys Between Keyring Keystores. (WL #9769)
A new error log filter component,
log_filter_dragnet
, enables control over events written to the error log, based on user-defined rules specified as the value of thedragnet.log_error_filter_rules
system variable. This new filtering capability is more flexible than is achievable using the built-inlog_filter_internal
filter component andlog_error_verbosity
system variable. For more information, see Types of Error Log Filtering. (WL #9651)Messages written to the error log by the
log_sink_internal
log sink component now contain an error-ID indicator. This ID has a format of[
. It follows the severity indicator and precedes the message text. For more information, see Error Log Output Format. (WL #11009)error_id
]-
When the
log_error_verbosity
system variable for error logging is set to filter out warning and information messages, selected important messages about non-error situations are now printed to error logs as system messages. These messages were previously handled and labeled as errors so that they were logged whenlog_error_verbosity=1
was set. The labeling function has now been decoupled from the handling function for these messages, so that the messages can be given an appropriate label.System messages now have the label “System” in the MySQL error log. Other log sinks that support custom labels might also use this convention. In logs that do not support custom labels, system messages are printed with the label used for the information level of severity. However, they are included even if the
log_error_verbosity
setting normally excludes messages at this level.If your system has additional configuration to discard messages labeled as information level, or to redirect them to a different destination from messages labeled as errors, system messages do not override this behavior. If the log sink involved does not use the “System” label, system messages are now discarded or redirected along with other messages labeled as information level.
The messages that are now printed with the “System” label where supported include startup and shutdown messages, and some significant changes to settings, as follows:
ER_NORMAL_SHUTDOWN
ER_RPL_SLAVE_CONNECTED_TO_MASTER_REPLICATION_STARTED
ER_RPL_SLAVE_CONNECTED_TO_MASTER_REPLICATION_RESUMED
ER_SLAVE_CHANGE_MASTER_TO_EXECUTED
ER_RPL_SLAVE_DUMP_THREAD_KILLED_BY_MASTER
(WL #10942)
-
All MySQL binary distributions now are linked against OpenSSL, including Community distributions, which previously were linked against yaSSL. In addition, OpenSSL is linked dynamically rather than statically, which enables substitution of alternative SSL libraries for use with MySQL if desired. For some platforms, binary distributions bundle OpenSSL libraries to ensure library availability:
Windows: Distributions bundle
libeay32.dll
andssleay32.dll
, which are installed in the same directory as MySQL binaries. Other libraries can be used by replacing those library files with alternatives, or by using some other library-selection method supported on Windows. (See https://msdn.microsoft.com/en-us/library/7d83bc18.aspx.)macOS: Distributions bundle
libssl.dylib
andlibcrypto.dylib
. MySQL binaries are linked to expect the libraries in the same directory, and symbolic links there point to the actual library locations.Linux (for generic compressed tar file distributions only): Distributions bundle
libssl.so
andlibcrypt.so
,which are installed in the same directory as thelibmysqlclient.so
client library.
(Bug #26272084, Bug #26134893, Bug #26927607, Bug #87996, WL #10524)
The Performance Schema now uses SHA-256 hashes for statement digests rather than MD5 hashes. To accommodate the increased storage required for SHA-256 values,
DIGEST
columns in Performance Schema tables are widened fromVARCHAR(32)
toVARCHAR(64)
. (Bug #26727443)
Incompatible Change: Passwords are now restricted to a maximum of 256 characters for the
caching_sha2_password
andsha256_password
authentication plugins, and for thePASSWORD()
function whenold_passwords=2
. Also, the number of password hashing rounds is capped to limit CPU time used. (Bug #27099029, Bug #27194270)-
Incompatible Change: The
caching_sha2_password
andsha256_password
authentication plugins provide more secure password encryption than themysql_native_password
plugin, andcaching_sha2_password
provides better performance thansha256_password
. Due to these superior security and performance characteristics ofcaching_sha2_password
, it is now the preferred authentication plugin, and is also the default authentication plugin rather thanmysql_native_password
. This change affects both the server and thelibmysqlclient
client library:For the server, the default value of the
default_authentication_plugin
system variable changes frommysql_native_password
tocaching_sha2_password
.The
libmysqlclient
library treatscaching_sha2_password
as the default authentication plugin rather thanmysql_native_password
.
This change has the following implications:
The change affects only the authentication plugin used for creating new MySQL accounts. For accounts already existing in an upgraded installation, their authentication plugin remains unchanged.
Clients that use an account that authenticates with
caching_sha2_password
must use either a secure connection (made using TCP using TLS/SSL credentials, a Unix socket file, or shared memory), or an unencrypted connection that supports password exchange using an RSA key pair. This security requirement does not apply tomysql_native_passsword
, so the switch tocaching_sha2_password
may require additional configuration (see Caching SHA-2 Pluggable Authentication). However, client connections in MySQL 8.0 prefer use of TLS/SSL by default, so clients that already conform to that preference may need no additional configuration.Because
caching_sha2_password
is also now the default authentication plugin in thelibmysqlclient
client library, authentication requires an extra round trip in the client/server protocol for connections from MySQL 8.0 clients to accounts that usemysql_native_password
(the previous default authentication plugin), unless the client program is invoked with a--default-auth=mysql_native_password
option.Incompatibility: Clients and connectors that have not been updated to know about
caching_sha2_password
cannot connect to accounts that authenticate withcaching_sha2_password
because they do not recognize this plugin as valid. To work around this issue, relink clients againstlibmysqlclient
from MySQL 8.0.4 or higher, or obtain an updated connector that recognizescaching_sha2_password
.Incompatibility: Clients and connectors that have not been updated to know about
caching_sha2_password
may have trouble connecting to a MySQL 8.0 server configured withcaching_sha2_password
as the default authentication plugin, even to use accounts that do not authenticate withcaching_sha2_password
. This issue occurs because the server specifies the name of its default authentication plugin to clients. If a client or connector is based on a client/server protocol implementation that does not gracefully handle an unrecognized default authentication plugin, it may fail with an error.
For more information about the more prominent role of
caching_sha2_password
, including discussion of potential compatibility issues and solutions, see caching_sha2_password as the Preferred Authentication Plugin.Additionally, replication slaves are now able to connect to masters using RSA key pair-based password exchange. This RSA capability applies for accounts that authenticate with the
caching_sha2_password
orsha256_password
authentication plugin. (Previously, slaves could authenticate with those plugins, but required a secure connection and could not use RSA password exchange.) The following changes enable use of this new slave RSA capability:The
CHANGE MASTER TO
statement has clauses for specifying RSA public key information.For Group Replication, the
group_replication_recovery_public_key_path
andgroup_replication_recovery_get_public_key
system variables serve the same purpose.The
SHOW SLAVE STATUS
statement and the Performance Schemareplication_connection_configuration
table display replication slave RSA public key information.
More programs now support a
--server-public-key-path
option to enable specifying a client-side file containing the public key for RSA key pair-based password exchange, for accounts that authenticate with thecaching_sha2_password
orsha256_password
authentication plugin: mysqladmin, mysqlbinlog, mysqlcheck, mysqldump, mysqlimport, mysqlpump, mysqlshow, mysqlslap, mysql_upgrade. Previously, only mysql and mysqltest supported--server-public-key-path
. The--server-public-key-path
option is an alternative to--get-server-public-key
, and may be used when a client-side file is available that contains a copy of the RSA public key required by the server, rather than sending a request for the public key to the server.The new
mysql_reset_server_public_key()
C API function clears any cached copy of the server RSA public key from the client library. See mysql_reset_server_public_key().The new
caching_sha2_password_auto_generate_rsa_keys
system variable enables automatic RSA private/public key-pair file generation, similar to thesha256_password_auto_generate_rsa_keys
system variable. See Automatic SSL and RSA File Generation.The new
Caching_sha2_password_rsa_public_key
status variable exposes the public key used by thecaching_sha2_password
authentication plugin for RSA key pair-based password exchange. (Bug #26751594, WL #11057) The linked OpenSSL library for MySQL Server has been updated to version 1.0.2n. Issues fixed in the new OpenSSL version are described at http://www.openssl.org/news/vulnerabilities.html. (Bug #27212666, Bug #27236394)
Certificates automatically generated by mysqld and mysql_ssl_rsa_setup now use X509 v3 rather than v1. (Bug #26521654)
A new
RESTART
SQL statement is available that enables restarting a MySQL server instance from within a client session. This feature is available for platforms on which a monitoring process is able to detect a server shutdown performed for restart purposes: Windows (mysqld started as a Windows service or standalone), and Unix and Unix-like systems that use systemd or mysqld_safe to manage mysqld. See RESTART Statement. (WL #9809)
-
Incompatible Change: These spatial import functions now return an error for data in a geographic spatial reference system for which the coordinates are outside the legal range of values:
ST_GeomCollFromText()
,ST_GeomCollFromTxt()
,ST_GeomCollFromWKB()
,ST_GeometryCollectionFromText()
,ST_GeometryCollectionFromWKB()
,ST_GeometryFromText()
,ST_GeometryFromWKB()
,ST_GeomFromGeoJSON()
,ST_GeomFromText()
,ST_GeomFromWKB()
,ST_LineFromText()
,ST_LineFromWKB()
,ST_LineStringFromText()
,ST_LineStringFromWKB()
,ST_MLineFromText()
,ST_MLineFromWKB()
,ST_MPointFromText()
,ST_MPointFromWKB()
,ST_MPolyFromText()
,ST_MPolyFromWKB()
,ST_MultiLineStringFromText()
,ST_MultiLineStringFromWKB()
,ST_MultiPointFromText()
,ST_MultiPointFromWKB()
,ST_MultiPolygonFromText()
,ST_MultiPolygonFromWKB()
,ST_PointFromText()
,ST_PointFromWKB()
,ST_PolyFromText()
,ST_PolyFromWKB()
,ST_PolygonFromText()
,ST_PolygonFromWKB()
. (ST_LatFromGeoHash()
,ST_LongFromGeoHash()
, andST_PointFromGeoHash()
do not have this behavior because they cannot represent out-of-range values.)ST_GeomFromGeoJSON()
also now returns an error if acrs
member that specifies an SRID different from the top-level object SRID is found at a lower level of the GeoJSON document.NoteIf spatial data contains SRID values that refer to a geographic spatial reference system and the data coordinates are out of range, existing queries using these functions will return different results, compared to previous MySQL versions.
(Bug #26941370, Bug #88031, WL #9449)
-
Incompatible Change: Previously, these spatial functions ignored the spatial reference system (SRS) for geometry arguments and computed results on a Cartesian plane. They now support computations for geometry arguments that specify a geographic SRS:
ST_Distance_Sphere()
,ST_IsSimple()
,ST_IsValid()
,ST_Length()
.Previously, these spatial functions ignored the SRS for any geometry arguments and computed results on a Cartesian plane. They now produce an error when invoked with geometry arguments that specify a geographic SRS:
ST_Area()
,ST_Buffer()
,ST_Centroid()
,ST_ConvexHull()
,ST_Difference()
,ST_Envelope()
,ST_Intersection()
,ST_IsClosed()
,ST_MakeEnvelope()
,ST_Simplify()
,ST_SymDifference()
,ST_Union()
,ST_Validate()
.Previously, these spatial functions permitted geometry arguments with an undefined SRS. They now produce an error when invoked with geometry arguments that have an undefined SRS:
ST_Dimension()
,ST_Distance_Sphere()
,ST_EndPoint()
,ST_ExteriorRing()
,ST_GeometryN()
,ST_GeometryType()
,ST_InteriorRingN()
,ST_IsEmpty()
,ST_IsSimple()
,ST_IsValid()
,ST_Length()
,ST_NumGeometries()
,ST_NumInteriorRing()
,ST_NumInteriorRings()
,ST_NumPoints()
,ST_PointN()
,ST_StartPoint()
,ST_SwapXY()
,ST_X()
,ST_Y()
.Previously, the
ST_GeoHash()
spatial function accepted points with any SRID.ST_GeoHash()
now accepts only points with SRID 0 or 4326.NoteIf spatial data contains geometry values that now are interpreted differently by the functions just listed, existing queries using these functions will return different results, compared to previous MySQL versions.
(WL #10416, WL #10926, WL #10927, WL #10999, WL #11096)
-
Incompatible Change: For the following spatial functions that take an SRID argument, they now return an error if the SRID does not exist:
ST_GeomCollFromText()
,ST_GeomCollFromTxt()
,ST_GeomCollFromWKB()
,ST_GeometryCollectionFromText()
,ST_GeometryCollectionFromWKB()
,ST_GeometryFromText()
,ST_GeometryFromWKB()
,ST_GeomFromGeoJSON()
,ST_GeomFromText()
,ST_GeomFromWKB()
,ST_LineFromText()
,ST_LineFromWKB()
,ST_LineStringFromText()
,ST_LineStringFromWKB()
,ST_MLineFromText()
,ST_MLineFromWKB()
,ST_MPointFromText()
,ST_MPointFromWKB()
,ST_MPolyFromText()
,ST_MPolyFromWKB()
,ST_MultiLineStringFromText()
,ST_MultiLineStringFromWKB()
,ST_MultiPointFromText()
,ST_MultiPointFromWKB()
,ST_MultiPolygonFromText()
,ST_MultiPolygonFromWKB()
,ST_PointFromGeoHash()
,ST_PointFromText()
,ST_PointFromWKB()
,ST_PolyFromText()
,ST_PolyFromWKB()
,ST_PolygonFromText()
,ST_PolygonFromWKB()
. (ST_SRID()
already had this behavior.)NoteIf spatial data contains SRID values that refer to a nonexistent spatial reference system, existing queries using these functions will return different results, compared to previous MySQL versions.
(WL #9450)
The server now prints a warning if a
SPATIAL
index is created that the optimizer will never use. (Bug #27015964)The EPSG Dataset containing spatial reference system data for spatial calculations has been upgraded from version 9.0 to 9.2. (Bug #26711258, Bug #87564, Bug #26990896)
MySQL now supports
CREATE SPATIAL REFERENCE SYSTEM
andDROP SPATIAL REFERENCE SYSTEM
statements for creating and removing spatial reference system (SRS) definitions in the data dictionary. See CREATE SPATIAL REFERENCE SYSTEM Statement, and DROP SPATIAL REFERENCE SYSTEM Statement. With the implementation of these statements, direct access to themysql.st_spatial_reference_systems
data dictionary table using statements such asSELECT
,INSERT
, andUPDATE
is not needed, and is no longer permitted. Read access to SRS definitions remains available through theINFORMATION_SCHEMA
ST_SPATIAL_REFERENCE_SYSTEMS
table, as before. (WL #9059)
Documentation for the MySQL Test Suite is now maintained in the MySQL source tree using Doxygen (see the MySQL Server Doxygen documentation, available at https://dev.mysql.com/doc/index-other.html.) The related Unix man pages that previously were produced from the old test suite manual are no longer updated and have gone out of date. Consequently, they are no longer included in MySQL distributions. (Bug #27021754)
The MySQL test suite now includes
CRC32()
tests. Thanks to Daniel Black for the patch. (Bug #26495791, Bug #87136)-
mysqltest now accepts an optional
retry
argument for these commands:copy_file
copy_files_wildcard
,file_exists
,move_file
,remove_file
, andremove_files_wildcard
. Usage is as follows:--file_operation file_name ... [retry]
When the
retry
argument is specified, the command retries a failed operation the given number of times at one-second intervals. (Bug #24671890)
X Plugin could incorrectly remove quotes from parameters that were passed to functions expecting JSON strings, causing an error. (Bug #26906519)
After an index was created on a collection, X Plugin would list the collection as a relational table, and no longer list it as a collection. (Bug #26906487)
X Protocol displayed the
DATE
type in the same way as theDATETIME
type. The two data types are now treated differently. (Bug #26647488)mysqlxtest did not display fractional seconds in
DATETIME
values correctly. (Bug #26638422)X Plugin returned a column metadata field showing fractional digits for a JSON column, for which that information was irrelevant. The field is no longer returned. (Bug #26258481)
X Plugin handled user account lookup incorrectly if the IP address resolved to an empty host name. (Bug #26042786)
-
X Plugin can now be configured to abort any authenticated connections which are considered idle. The following system variables have been added:
(WL #9267)
-
X Plugin now supports Caching SHA-2 Pluggable Authentication. To enable the support, issue:
INSTALL PLUGIN mysqlx_cache_cleaner SONAME 'mysqlx.so';
This plugin maintains the cache and removes all entries for accounts that were modified. (WL #10992)
References: See also: Bug #27213213, Bug #27042109.
InnoDB: Obsoleted
InnoDB
system tables that are no longer required after upgrading to MySQL 8.0.3 or later are now dropped after a successful upgrade. (Bug #26757171)-
InnoDB: Support was added to automatically upgrade data dictionary table definitions when starting the MySQL server after upgrading MySQL binaries to a new version. At startup, the data dictionary version of the server is compared to the version information stored in the data dictionary to determine if data dictionary tables should be upgraded. If an upgrade is necessary and supported, the server creates data dictionary tables with updated definitions, copies persisted metadata to the new tables, atomically replaces the old tables with the new ones, and reinitializes the data dictionary. If an upgrade is not necessary, startup continues without updating the data dictionary tables.
The mysqld
--no-dd-upgrade
option can be used to prevent automatic upgrade of data dictionary tables at startup. (WL #9553) -
InnoDB: Moving or restoring tablespace files to a new location while the server is offline is supported by the new
--innodb-directories
option, which defines directories to scan at startup for tablespace files. For more information, see Moving Tablespace Files While the Server is Offline.With the introduction of the
--innodb-directories
feature, the location of file-per-table and general tablespace files created with an absolute path or in a location outside of the data directory should be added to theinnodb_directories
argument value. Otherwise,InnoDB
is not able to locate these files during recovery. To view tablespace file locations, query theINFORMATION_SCHEMA.FILES
table:mysql> SELECT TABLESPACE_NAME, FILE_NAME FROM INFORMATION_SCHEMA.FILES \G
The
CREATE TABLESPACE ... ADD DATAFILE
statement now requires that a specified directory is known toInnoDB
. Known directories include those implicitly and explicitly defined by theinnodb_directories
option.innodb_directories
replacesinnodb_scan_directories
, which has been removed. (WL #8619) -
InnoDB:
InnoDB
now supports partial update of large object (LOB) data stored in external fields outside of clustered index pages, includingJSON
documents updated usingJSON_SET()
andJSON_REPLACE()
. Previously, LOB values could only be read or modified in full, and updates ofJSON
column values were done by completely removing the previous document and writing the new one in its place.Partial update uses an internal LOB index, or ZLOB index in the case of compressed LOB data, which is created and stored in one or more LOB pages when a row containing LOB data is inserted or updated. Thus, partial fetch and update of LOB data is supported for newly inserted rows, but existing rows containing LOB data must be updated to add partial fetch and update support. The addition of LOB index data increases the storage space required by LOB values by a small percentage.
This feature adds the following
InnoDB
page types for storing uncompressed and compressed LOB data:FIL_PAGE_TYPE_LOB_INDEX
FIL_PAGE_TYPE_LOB_DATA
FIL_PAGE_TYPE_LOB_FIRST
FIL_PAGE_TYPE_ZLOB_FIRST
FIL_PAGE_TYPE_ZLOB_DATA
FIL_PAGE_TYPE_ZLOB_INDEX
FIL_PAGE_TYPE_ZLOB_FRAG
FIL_PAGE_TYPE_ZLOB_FRAG_ENTRY
(WL #8960)
InnoDB: The storage engine private field of the
mysql.tablespaces
data dictionary table and page 0 ofInnoDB
tablespace files now store MySQL server version and tablespace version information. The MySQL server version is the version that created the tablespace, the version into which the tablespace was imported, or the version of the last major MySQL upgrade. The tablespace version tracks tablespace format changes.SERVER_VERSION
andSPACE_VERSION
fields were added to theINFORMATION_SCHEMA.INNODB_TABLESPACES
table to provide access to this data. (WL #5989, WL #11063)-
Group Replication: Host names can now be specified as part of a whitelist for group replication connections, using the
group_replication_ip_whitelist
system variable. Host names support CIDR notation. Host names that resolve to IPv6 addresses are not supported.For host names, name resolution takes place only when a connection request is made by another server. A host name that cannot be resolved is not considered for whitelist validation, and a warning message is written to the error log. Forward-confirmed reverse DNS (FCrDNS) verification is carried out for resolved host names.
WarningHost names are inherently less secure than IP addresses in a whitelist. FCrDNS verification provides a good level of protection, but can be compromised by certain types of attack. Specify host names in your whitelist only when strictly necessary, and ensure that all components used for name resolution, such as DNS servers, are maintained under your control. You can also implement name resolution locally using the hosts file, to avoid the use of external components.
(WL #10803, WL #11298)
-
JSON: Added the
JSON_TABLE()
function, which acceptsJSON
data and returns it as a relational table whose columns are as specified. This virtual table can be accessed using standard SQL mechanismsThis function has the syntax
JSON_TABLE(
, whereexpr
,path
COLUMNScolumn_list
) [AS]alias
)expr
is an expression that returns JSON data,path
is a JSON path applied to the source, andcolumn_list
is a list of column definitions. Columns can be of the typesFOR ORDINAL
,PATH
,EXISTS PATH
, andNESTED PATH
orNESTED
, as described in the following list:FOR ORDINAL
: The column is a counter, similar to anAUTO_INCREMENT
column.PATH
: The column holds a scalar value using the specified JSON path.ON ERROR
andON EMPTY
options are supported for handling illegal values (such as nonscalars) and empty values, respectively.EXISTS PATH
: The column value is 1 if a match exists for the specified JSON path, and 0 otherwise.NESTED PATH
: Nested objects or arrays in JSON data found in the given JSON path are flattened into a single row along with the JSON values from the parent object or array. ThePATH
keyword is optional.
Two simple examples are shown here:
mysql> SELECT * -> FROM -> JSON_TABLE( -> '[1, 3, 5, 7, 9]', -> "$[*]" COLUMNS(rowid FOR ORDINALITY, col VARCHAR(50) PATH "$") -> ) AS t1; +-------+------+ | rowid | col | +-------+------+ | 1 | 1 | | 2 | 3 | | 3 | 5 | | 4 | 7 | | 5 | 9 | +-------+------+ mysql> SET @j = '[{"a": [{"x":"3"},{"y":"2"}]}, '> {"b": [{"x":"1"},{"y":"1"}]}, '> {"a": [{"x":"2"},{"y":"3"}]}]'; mysql> SELECT * -> FROM JSON_TABLE( -> @j, -> "$[*]" COLUMNS( -> rowid FOR ORDINALITY, -> -> xa INT EXISTS PATH "$.a", -> xb INT EXISTS PATH "$.b", -> -> ja JSON PATH "$.a", -> jb JSON PATH "$.b" -> ) -> ) AS jts; +-------+------+------+--------------------------+--------------------------+ | rowid | xa | xb | ja | jb | +-------+------+------+--------------------------+--------------------------+ | 1 | 1 | 0 | [{"x": "3"}, {"y": "2"}] | NULL | | 2 | 0 | 1 | NULL | [{"x": "1"}, {"y": "1"}] | | 3 | 1 | 0 | [{"x": "2"}, {"y": "3"}] | NULL | +-------+------+------+--------------------------+--------------------------+
The JSON source expression can be any expression that yields a valid JSON document, including a JSON literal, a table column, or a function call that returns JSON such as
JSON_EXTRACT(t1, data, '$.post.comments')
. For complete syntax and other information about this function, see JSON Table Functions. (WL #8867) The
-DWITH_ASAN_SCOPE
CMake option enables the AddressSanitizer-fsanitize-address-use-after-scope
Clang flag for use-after-scope detection. The default is off. To use this option,-DWITH_ASAN
must also be enabled. (Bug #27095089)Handling of empty
JSON
documents has been made more robust. (Bug #26787468, Bug #87734)MySQL 8.0.3 imposed a restriction against
ALTER TABLE RENAME
on tables in a foreign key relationship if aLOCK TABLES
was active. This restriction has been lifted. (Bug #26647340, Bug #87467)If the server PID file is configured to be created in a world-writable location, the server now issues a warning suggesting use of a more secure location. (Bug #26585560)
For constructs using
_
character set introducers (for example,charset
_utf8mb4 'abc'
), lookup performance was improved for mapping the introducer onto the proper character set. (Bug #25680866, Bug #85331)
-
Important Change: The following changes are made to the
PERIOD_ADD()
andPERIOD_DIFF()
functions:A period value used with one of these functions may not be negative.
The month part of a period value may not be equal to 0.
A period value used with one of these functions for which at least one of these conditions is true now causes the function to fail with an error. (Bug #27004699, Bug #27004729)
-
Important Change: The
LEAST()
andGREATEST()
functions no longer attempt to infer a context for their arguments from expressions in which they are used. For example,LEAST('11', '45', '2')
returns'11'
, butLEAST('11', '45', '2') + 0
treated the function arguments as integers rather than as strings, and returned2
. Now these functions always evaluate their arguments strictly according to type, and any data type coercion due to their inclusion in an expression is performed only on the result returned by the function. This means that the expressionLEAST('11', '45', '2') + 0
now evaluates to'11' + 0
, and thus to the integer value11
.This change has been made due to the following considerations:
Rules for deriving the context were not always clear or consistent.
The results of these functions when used in expressions were not consistent with the results of
COALESCE()
, or of aUNION
query.
Applications that use these functions within expressions should be checked to make sure that they do not depend on the previous behavior, and updated if they do so. (Bug #83895, Bug #25123839)
InnoDB: Concurrent XA transactions that ran successfully to the XA prepare stage on the master conflicted when replayed on the slave, resulting in a lock wait timeout in the applier thread. The conflict was due to the GAP lock range which differed when the transactions were replayed serially on the slave. To prevent this type of conflict, GAP locks taken by XA transactions in
READ COMMITTED
isolation level are now released (and no longer inherited) when XA transactions reach the prepare stage. (Bug #27189701, Bug #25866046)InnoDB: An
ALTER TABLE
operation that added a foreign key constraint referencing a table with generated virtual columns raised an assertion. (Bug #27189701)InnoDB: A
DROP DATABASE
operation raised an assertion due to a missing general tablespace data file. (Bug #27151163)InnoDB: On Windows, an operation that altered a table partition raised an assertion. The table name was not parsed correctly. (Bug #27075816)
InnoDB: A
TRUNCATE TABLE
operation on a temporary table raised an assertion. (Bug #27073280)InnoDB: A call to a recovery-related function during the post-DDL phase of a DDL operation raised an assertion. (Bug #27041487, Bug #88263)
InnoDB: Adding a spatial index that referenced a column with an SRID attribute returned an error. (Bug #27021029)
InnoDB: A table with a 64-character foreign key name caused an upgrade failure. Foreign key names up to 64 characters in length should be permitted. (Bug #27014308, Bug #88196)
-
InnoDB: The
InnoDB
recovery process failed with a tablespace size error for a compressed table that was upgraded from MySQL 5.7 to MySQL 8.0.The tablespace file for a compressed table is now created using the physical page size instead of the
InnoDB
page size, which makes the initial size of a tablespace file for an empty compressed table smaller than in previous MySQL releases. (Bug #27014083, Bug #88195) -
InnoDB: Unnecessary tablespace fetch and cache update operations caused a server startup delay. (Bug #26995951)
References: This issue is a regression of: Bug #26832347.
InnoDB: An orphan
.frm
file caused an upgrade failure, and subsequent upgrade attempts were unsuccessful due to a full-text search auxiliary table that was renamed during the first upgrade attempt. (Bug #26995951)-
InnoDB: Workarounds introduced to address conflicting serialized dictionary information (SDI) inserts during concurrent
CREATE TABLE
operations were removed. (Bug #26995534)References: See also: Bug #26539665.
InnoDB: A “no space left on device” error reported an invalid error message. (Bug #26960345)
InnoDB: During a fast shutdown,
InnoDB
attempted to write dynamic metadata to the data dictionary after files were closed, resulting in an initialization failure due pending I/O on the data dictionary tablespace. (Bug #26950659)InnoDB: A stack overflow error was encountered on startup after upgrading to MySQL 8.0.4 due to repeated attempts to load an evicted
InnoDB
system table. (Bug #26945437, Bug #88042)InnoDB: Importing a compressed table raised an assertion. The operation used the clustered index of the table instead of the serialized dictionary information (SDI) index to transform SDI pages. (Bug #26938297)
InnoDB: In debug builds, failed temporary table creation during a
REPLACE
operation raised an invalid assertion. (Bug #26919378, Bug #26958868)InnoDB:
DROP DATABASE
failed if database tables were created in a general tablespace. General tablespace flags were registered incorrectly causing the serialized dictionary information (SDI) operation to fail. (Bug #26834496)InnoDB: With binary logging enabled, an
ALTER TABLESPACE ... RENAME
operation failed with a “cannot find space” error. (Bug #26832347)InnoDB: An operation that failed to add an index raised an invalid adaptive hash index assertion. (Bug #26788968)
InnoDB: A valid table row type value read from the data dictionary raised an invalid assertion. (Bug #26773152)
InnoDB: Starting an upgrade with
innodb_force_recovery=5
initializedInnoDB
background threads but did not exit the threads gracefully when an error was encountered. Upgrading with a nonzeroinnodb_force_recovery
setting is no longer permitted. (Bug #26766632)InnoDB: A failed
CREATE TEMPORARY TABLE
statement left an entry inINFORMATION_SCHEMA.INNODB_TEMP_TABLE_INFO
. The in-memory table object was not freed. (Bug #26765438)InnoDB:
InnoDB
looked up the name of a virtual column in the wrongdict_table_t
array when attempting to locate a qualifying index for a foreign key. (Bug #26764604)InnoDB: Attachable read-write transactions that update the
table_stats
andindex_stats
data dictionary tables attempted to update the same row, causing a deadlock. (Bug #26762517)InnoDB: During recovery, the tablespace name in an in-memory tablepace object was defined using the file name character set instead of table name character set, resulting in a “missing tablespace” error. (Bug #26761960)
InnoDB: Bootstrap code did not reserve the first 1024 table IDs for data dictionary tables. (Bug #26757227)
InnoDB: Multiple updates from different clients on a partitioned table caused an unexpected lock wait timeout due to an incorrectly set lock type. (Bug #26731025, Bug #87619)
-
InnoDB: An asynchronous rollback thread that attempted to acquire a metadata lock was interrupted, but the resulting error was not returned to the server. This issue was addressed by removing the metadata lock acquisition, which was not necessary for asynchronous rollback.
Only in-memory tables were checked when opening tables for undo processing. The data dictionary is now checked as well, in case tables are not present in memory. (Bug #26678883)
InnoDB: An assertion was raised when attempting to open a full-text auxiliary table with a name that was longer than expected. (Bug #26649020)
InnoDB: Data dictionary table open functions did not properly handle table and schema name character set conversion, resulting in an error during recovery. (Bug #26640776)
InnoDB: A transaction
end_stmt()
function was not called in someALTER TABLE ... PARTITION
scenarios, resulting in a timeout. (Bug #26629790, Bug #25886814)InnoDB: Acquiring a metadata lock on the serialized diction information (SDI) table during the commit phase of a DDL operation would fail due to a lock wait timeout or halting of the query. (Bug #26628126)
InnoDB: Redo logs for dynamic metadata updates were not considered when checking redo log margin. Also, in read-only mode, the
innodb_dynamic_metadata
data dictionary table was opened unnecessarily for writing of metadata from the redo log. (Bug #26589535)InnoDB: An unexpected error occurred after a failed attempt to install the
memcached
plugin. (Bug #26588738)InnoDB: The state of a buffer pool page was altered by another thread while a buffer pool resize operation was in progress. (Bug #26588537)
InnoDB: Debug functions that assert for conflicting locks did not account for transaction locks that are to be committed or rolled back. (Bug #26562371)
InnoDB: Variance-Aware Transaction Scheduling (VATS) functionality that updates the age of waiting record locks failed to ignore table locks, causing an assertion failure. (Bug #26538702)
InnoDB: A DDL operation that created or modified a table partition unintentionally altered the row format of other partitions, resulting in a row format mismatch. (Bug #26535746)
InnoDB: An
ALTER TABLE
operation caused the server to halt. (Bug #26492721)InnoDB: The
innodb_table_stats
data dictionary table was not updated with new partition names when renaming a partitioned table. (Bug #26390658, Bug #86927)InnoDB: Due to a regression introduced in MySQL 8.0.0, the
innodb_change_buffering
configuration option could not be set dynamically. (Bug #26389442)InnoDB: The online log for a freed index was accessed while rolling back a concurrent
UPDATE
statement during an online DDL operation. (Bug #26334475)InnoDB: A
REPLACE
operation on a table with a secondary index on the prefix of a virtual column raised an assertion. (Bug #26330279)InnoDB: Setting
tmpdir
to the root of a drive caused “Invalid (old?) table or database name” error messages to be printed to the error log. (Bug #26299984, Bug #86737)InnoDB: A race condition occurred during an
INFORMATION_SCHEMA
query when attempting to check the transaction state without acquiring a transaction mutex. (Bug #26299705)InnoDB: A
FLUSH TABLES
operation failed to drop an aborted index. While removing the table from the cache, the clustered index was dropped prior to checking for the aborted index. (Bug #26256456, Bug #86607)InnoDB: For
InnoDB
tables,CREATE TABLE ... LIKE
did not respect theinnodb_file_per_table
system variable setting, andSHOW CREATE TABLE
displayed aTABLESPACE
clause even though the user specified no explicit tablespace during table creation. (Bug #26199233, Bug #86589)-
InnoDB: An iterative approach to processing foreign cascade operations resulted in excessive memory use. (Bug #26191879, Bug #86573)
References: This issue is a regression of: Bug #16244691.
InnoDB: The lock acquisition sequence for a buffer pool eviction operation that evicts compressed pages was incorrect. (Bug #25972975)
InnoDB: Metadata locks were released while data dictionary objects were still in use. (Bug #25928984)
InnoDB: innochecksum returned a Valgrind error when run on
InnoDB
files with a 1K compressed page size. (Bug #25922124, Bug #85993)InnoDB: A kill thread failed to close the socket of another thread that was executing a
TRUNCATE TABLE
operation, causing an assertion. (Bug #25887335, Bug #85925)InnoDB: An
INSERT
operation on a table with a spatial index raised an assertion due to a failure that occurred during a lock conflict check. (Bug #25729649)InnoDB: A debug sync point intended for user tables was activated for data dictionary tables. (Bug #25508568)
InnoDB: A server-side check was added to prevent a foreign key constraint from being placed on the base column of a generated stored column. (Bug #25339192)
InnoDB: Warnings that should only appear in debug builds of MySQL were printed to the error log when the length of the history list exceeded 2000000. (Bug #24296076, Bug #82213)
InnoDB: Attempting to reduce the buffer pool size to less than the buffer pool chunk size did not report a warning. (Bug #23590280)
InnoDB: A “wrong key column” error was added to address an unsupported index creation scenario. (Bug #22486025)
InnoDB: Full-text search on indexed columns that use a binary collation did not return case-sensitive matches. (Bug #21625016, Bug #78048)
Packaging: When trying to install MySQL Server on Fedora 27 using the MySQL Yum repository, installation failed due to a conflict with the native
mariadb-connector-c-devel
package. With this fix, the appropriate “obsoletes” have been added for that and other native packages. (Bug #26963839)-
Partitioning: When creating a partitioned table using an implicit tablespace, the effect is to place each partition in its own tablespace, with no designated tablespace for the table as a whole. Since serialized dictionary information (SDI) was stored in all tablespaces used by a given table, the cost of storing it in a table with many tablespaces became prohibitive. This problem is solved by including only the tablespace for the first partition in the set of tablespaces used to store the SDI. (Bug #26762973)
References: See also: Bug #26765252.
Partitioning: An assertion could be raised on
CREATE VIEW
on partitioned tables when the server tried to prune partitions of the underlying tables. (Bug #26659699)Partitioning: When renaming a partitioned table, the table statistics were not updated with the new partition names. (Bug #86074, Bug #25953183)
Replication; JSON: For row-based replication, partial updates to JSON documents were not applied if the server variable
binlog_row_value_options=PARTIAL_JSON
(introduced in MySQL 8.0.3) was not specified on the replication slave, as well as on the master. Now, a replication slave applies partial updates to JSON documents whenever these are received from the master, whether or not the slave hasbinlog_row_value_options=PARTIAL_JSON
in its own settings. (Bug #26762675)-
Replication: The function
set_unknow_error()
in theBinlog_sender
class has been renamed toset_unknown_error()
. Thanks to Simon Mudd for the fix (and also for the typo fix in Bug 88149). (Bug #27149075, Bug #88559)References: See also: Bug #26996065, Bug #88149.
Replication: When you invoke mysqld with the
--initialize
or--initialize-insecure
option to initialize the data directory, a warning message is no longer issued regarding the availability of themysql.gtid_executed
table, which should not be available at that stage. Also, the message formerly issued as a warning regarding the generation of a new UUID is now issued as a note, because the generation of a new UUID is normal in that situation. (Bug #27115183)-
Replication: In MySQL 8.0.3, the default base name for the binary log files and index file was
, using the name of the host machine. This default name was used if thehost_name
-bin--log-bin
option was not supplied, and also if the--log-bin
option was supplied with no string or with an empty string. From MySQL 8.0.4, if you do not supply the--log-bin
option, MySQL now usesbinlog
as the default base name for the binary log files and index file. In releases before MySQL 8.0.3, there was no binary log with that configuration, so there is no incompatibility with existing binary logs at upgrade. However, for compatibility with existing binary logs from releases before MySQL 8.0.3, if you supply the--log-bin
option with no string or with an empty string, the base name defaults to
, using the name of the host machine.host_name
-binThe warning messages that were previously issued at startup if you did not specify a binary log file name using the
--log-bin
option (ER_LOG_BIN_BETTER_WITH_NAME
) and if you did not specify a server ID by setting theserver_id
system variable (ER_WARN_NO_SERVERID_SPECIFIED
) are now issued as informational messages. A warning message is still issued if replication is attempted with a nonunique server ID. (Bug #27082922) Replication: In the
Gtid_log_event
that precedes every GTID transaction in the binary log file, thetransaction_length
field used 8 bytes for transactions with 16777216 bytes or more, when it should have used the maximum permitted 9 bytes. (Bug #26993433)Replication: The fix for Bug #22671846 was missing from MySQL version 8.0.3. (Bug #26985976)
Replication: The fix for Bug #26117735 (MySQL Bug #86288) could cause a debug assertion when running mysqlbinlog with the
--read-from-remote-server
option and the--rewrite-db
option, depending on the database names specified in the rewrite rule. The issue has now been corrected. (Bug #26878022)Replication: With MySQL compiled using yaSSL, and semisynchronous replication in use, a deadlock could be caused by incorrect handling of acknowledgement packets. Multiple acknowledgement packets can be read together by yaSSL, but the receiver thread for semisynchronous replication only handled the first acknowledgement packet seen after polling. Now, the receiver thread handles all acknowledgement packets that are present in the buffer. (Bug #26865538)
Replication: With semisynchronous replication in use, if
RESET MASTER
was issued while an active transaction was waiting for an acknowledgement from the slave, the count of waiting sessions in theRpl_semi_sync_master_wait_sessions
server status variable was incorrect after the wait was completed. (Bug #26748533)Replication: The
--log-slave-updates
and--slave-preserve-commit-order
options require binary logging. If you specify these options and also disable binary logging using the--skip-log-bin
or--disable-log-bin
option, a warning or error message is issued. The--skip-log-bin
and--disable-log-bin
options now disable the--log-slave-updates
and--slave-preserve-commit-order
options by default, so when those options are not specified, the warning or error message is not issued. (Bug #26666259)Replication:
XA ROLLBACK
statements that failed because an incorrect transaction ID was given, could be recorded in the binary log with the correct transaction ID, and could therefore be actioned by replication slaves. A check is now made for the error situation before binary logging takes place, and failedXA ROLLBACK
statements are not logged. (Bug #26618925, Bug #87393)Replication: For the NDB storage engine, when the slave used hashing for searches of rows (which is included by default in the setting for the
slave_rows_search_algorithms
system variable from MySQL 8.0.2), the table used to store the row hashes was not cleaned up correctly after records were removed on the slave. The issue was caused by a variant error value returned by the NDB storage engine, which has now been corrected to the expected value. (Bug #26434966)Replication: MySQL internal administration commands that update replication-specific repository tables, for example during a replication synchronization check using the mysqlrplsync utility, can now bypass read locks. This enables such commands to execute regardless of the settings for the
read_only
andsuper_read_only
system variables and theautocommit
mode. (Bug #26414532, Bug #86224)Replication: The binary log function
MYSQL_BIN_LOG::new_file_impl
returned the error “Can't open file” (ER_CANT_OPEN_FILE
) when it should have returned “Error writing file” (ER_ERROR_ON_WRITE
). (Bug #26370868, Bug #86870)Replication: When write sets are used for parallelization by a replication slave (as specified by the
binlog_transaction_dependency_tracking
system variable), the case and accent sensitivity of the database are now taken into account when generating the write set information. Write set information is generated when thetransaction_write_set_extraction
system variable is enabled. Previously, duplicate keys could be incorrectly identified as different, causing transactions to have incorrect dependencies and so potentially be executed in the wrong order. (Bug #26277771, Bug #86078)Replication: The receiver thread for semisynchronous replication was not able to receive acknowledgements from slaves that used compression of the master/slave protocol (
slave_compressed_protocol=ON
). The receiver thread now handles compressed acknowledgements correctly. (Bug #26027024, Bug #86230)Replication: The
mysql_reset_connection()
function now clears the write set session history. (Bug #25950554, Bug #86063)Replication: On replication slaves, in the
XA_STATE
field in the Performance Schema tableevents_transactions_current
, the state of XA transactions was incorrectly reported asCOMMITTED
instead ofPREPARED
after theXA PREPARE
statement was applied on the slave. (Bug #25940184)Replication: In a multi-source replication topology, a memory leak could occur on the slave when
binlog_rows_query_log_events
was enabled on the master, and a statement already applied from another channel was skipped on the slave. In this situation, the instance of theRows_query
log event stored on the slave was not being deleted. The log event instance is now cleaned up and the memory is freed. Thanks to Vlad Lesin for his contribution to the patch. (Bug #25695434, Bug #85371, Bug #85034)Replication: Queries to the Performance Schema
replication_applier_global_filters
andreplication_applier_filters
tables, which show the global and channel-specific replication filters configured on a replication slave, have been optimized so that a view is generated only when the filters are changed. Previously, a view was generated for every row that was created. (Bug #25694140)Replication: A memory leak was fixed in GTID-based replication. Memory was not being freed after the repository tables were updated for skipped or ignored events. (Bug #25656123, Bug #85251)
Replication: When a worker thread on a multithreaded slave failed to apply a transaction on which a later transaction depended, the coordinator thread could begin scheduling the dependent transaction before being notified of the issue. If a
STOP SLAVE
request was made during this situation, it caused an assertion to be raised in debug builds. (Bug #25585436)Replication: With statement-based replication in use, if an
UPDATE
orDELETE
statement was used inside an XA transaction ending withXA COMMIT ONE PHASE
, and the statement did not affect any rows, a replication error occurred. AnXA END
statement was not written to the binary log, so slave servers identified the XA transaction as still being active at the time of the commit request. The requiredXA END
statement is now written even if the transaction affected no rows. (Bug #24812958, Bug #83295)Replication: Replication clients no longer enable
LOCAL
capability forLOAD DATA
statements, because they do not useLOAD DATA LOCAL
statements. (Bug #24763131)-
Replication: The behavior of mixed-format replication (
binlog_format=MIXED
) has changed with regards to temporary tables. Previously, when mixed-format binary logging was in use, if a statement was logged by row and the session that executed the statement had any temporary tables, all subsequent statements were treated as unsafe and logged in row-based format until all temporary tables in use by that session were dropped. Also, on a replication slave withlog_slave_updates
enabled, row-based logging was incorrectly continued across all subsequent sessions for the duration of the connection, as reported in the bug.Now, when mixed binary logging format is in use, statements that exclusively use temporary tables are not logged. Statements that involve a mix of temporary and nontemporary tables are logged on the master only for the operations on nontemporary tables, and the operations on temporary tables are not logged. The exception is if the creation of a temporary table was recorded in the binary log using statement-based format. In this case, a
DROP TEMPORARY TABLE IF EXISTS
statement is logged on the master when the temporary table is dropped.With this change in behavior, the remaining statements in the session that do not involve temporary tables no longer need to be treated as unsafe. The safe statements are now logged in statement-based format, and the unsafe statements are logged in row-based format, according to the normal behavior for mixed format replication, regardless of the presence of temporary tables in the session. Also, the issue reported in the bug has been fixed so that subsequent sessions using the connection now use the appropriate logging format for the session, regardless of the format used by earlier sessions.
When
binlog_format
isROW
orSTATEMENT
, the behavior remains as before. For row-based binary logging format, operations on temporary tables are not logged, with the exception of theDROP TEMPORARY TABLE IF EXISTS
statement as for mixed format. For statement-based binary logging format, operations on temporary tables are logged on the master and replicated on the slave, provided that the statements involving temporary tables can be logged safely using statement-based format.binlog_format=STATEMENT
is now the only logging mode in which temporary tables are replicated on the slave.You cannot now change the
binlog_format
setting fromROW
orMIXED
toSTATEMENT
at runtime, because anyCREATE TEMPORARY TABLE
statements will have been omitted from the binary log in the previous mode. You can still switch fromSTATEMENT
toROW
orMIXED
format, even when temporary tables have been created.Thanks to George Lorch and Laurynas Biveinis from Percona for the patch. (Bug #18843730, Bug #72475)
Replication: During distributed recovery as part of joining the group, when the applier was signaling that it had applied all transactions, it was also blindly searching for partial transactions. This was to avoid future applier errors, which would happen if the applier stopped at this point. However, this search and remove only made sense for applier stop cases. Upon execution completeness it should not be done, otherwise it can corrupt or purge the applier relay log, which can led to data loss. To solve this issue, when the applier is waiting for execution completeness, it no longer searches for and removes partial transactions. (Bug #88304, Bug #27049034)
Replication: In a group with heavy load, joining members could need to retrieve a large amount of data to gain synchrony with the group. If the amount of data retrieved exceeded the
View_change
packet size of 4Mb the members would fail to join the group and enterError
state. Now, the packet size is taken fromslave_max_allowed_packet
, which defaults to 1GB. Depending on the load your group processes, you might want to increase the packet size further by configuringslave_max_allowed_packet
. (Bug #87701, Bug #26770576)Replication: In a group where a joining member consistently received transactions, the joining member could sometimes not enter the online state. This was due to the way the incoming queue of messages was tested. (Bug #87631, Bug #26731317)
Group Replication; Microsoft Windows: On Windows, errors generated by Group Replication now contain a detailed error message rather than just the error number. (Bug #24918678)
Group Replication: The thread where the Group Replication plugin was started was not being correctly killed, making it impossible to stop or start the plugin after killing this thread. (Bug #26435775)
Group Replication: When
transaction_write_set_extraction
was enabled, there was a risk of unnecessary serialization while foreign keys were gathered if concurrent DDL took place. Group Replication now takes advantage of the new Data Dictionary to interact with table definitions and foreign keys, which has solved this potential serialization. (Bug #26187850)-
Group Replication: When
group_replication_enforce_update_everywhere_checks
isON
, the Group Replication plugin checks whether there are any foreign key cascades and disallows updates to tables affected by them.SET NULL
operations were not checked as part of this process, which could lead to data inconsistency. Now, when this value isON
, operations on child tables are blocked if the table has aSET NULL
option configured. (Bug #25404162) Group Replication: All servers that belong to a group must have unique UUIDs set by
server_uuid
, but this was not enforced by Group Replication, so that it was possible to add members with duplicate UUIDs. (Bug #88452, Bug #27105803)Group Replication: When starting or stopping, the Group Replication plugin executes internal operations on the server such as enabling or disabling read only mode using an internal session. When this internal session was opened, if the total number of sessions exceeded the number of permitted open sessions set by
max_connections
, the operation failed as expected but a thread was left behind, which later caused issues. (Bug #88182, Bug #27008102, Bug #27016552)Group Replication: If Group Replication was configured to start on server boot when the server was being initialized using
--initialize
or--initialize-insecure
, because the replication applier infrastructure was not initialized, this resulted in an assertion. Now, Group Replication is not started when the server is being initialized. (Bug #87759, Bug #26802395)Group Replication: Changes to Group Replication variables while starting or stopping the plugin were not being correctly validated. Now, the variables can only be changed if the plugin is not changing state. (Bug #86874, Bug #26372117)
Group Replication: Regardless of the number of virtual IPs configured on a machine, Group Replication could access only the first 12 addresses. (Bug #86772, Bug #26324852)
-
Group Replication: The delayed initialization mechanism used for server starts has been improved. Now, it blocks connections only until the server is in read mode. (Bug #86271, Bug #26037344)
References: See also: Bug #84731, Bug #25475132.
Group Replication: When a primary member, such as the primary in a single-primary group or in a multi-primary group which also had asynchronous replication channels feeding data into it, was stopped, the asynchronous channels would continue applying changes. Although
super_read_only
was set whenSTOP GROUP_REPLICATION
was issued, this did not stop any running asynchronous replication channels already running. This meant that changes could be made locally on the member, and that the asynchronous replication channels had to be stopped manually. Now when Group Replication stops, either due to an error or whenSTOP GROUP_REPLICATION
is issued, all asynchronous replication channels are stopped. (Bug #86222, Bug #26024253)-
Group Replication: Group Replication logging has been improved, and now includes includes about when a member joins or leaves, when the view changes, and so on. (Bug #84798, Bug #25495393)
References: See also: Bug #26422857.
-
Linux: On Alpine Linux, mysql would lose its connection to the server if its standard output was not writable. Also, for mysql and mysqldump, order of result flushing for
stdout
andstderr
is now deterministic. (Bug #27169809)References: See also: Bug #17583.
Microsoft Windows: On Windows, with the
myisam_use_mmap
andflush
system variables enabled,MyISAM
did not always flush table files properly. (Bug #26880757)JSON: JSON expressions used as arguments with the
LAG()
function were not always evaluated correctly. (Bug #26740557)-
JSON: Repeated execution of a prepared statement that employed
JSON_ARRAY()
was not handled correctly. (Bug #26704312)References: This issue is a regression of: Bug #25867454.
-
JSON: When executing the
JSON_INSERT()
function, the check that is performed to determine whether or not a given insert is being made into the root element tested whether the length of the path was 1—that is, whether the path consisted of a single leg determining which position the inserted element has inside the root element. A problem occurred when there were auto-wrapping path legs at the beginning of the path, in which case a path whose length is greater than 1 might also refer to an element in the root, so that checking the path length did not reliably inform us whether the target element of the insert was the root or some other element.To fix this, the check of the path length for detection of the root element has been replaced with a check as to whether the matched element has a parent; if it has none, it must be the root element. (Bug #26649978)
References: This issue is a regression of: Bug #86213, Bug #26022576.
JSON: When serializing a JSON value to its binary representation, it is necessary to make sure that the destination buffer has sufficient space to hold an integer or double value of the required size. Allocation of this buffer previously reserved only the minimum amount of memory needed, which made it very likely that a reallocation would be needed shortly thereafter. This could adversely affect performance, especially when serializing arrays with many numeric values. The serialization is now performed in a manner such that the allocation increases the size of the destination buffer size exponentially, which reduces the amount of the time spent performing this task when processing large arrays. (Bug #88656, Bug #27171283)
-
JSON: When a JSON document was converted to string representation, floating-point values that had no fractional part could be represented such that they became indistinguishable from integers. When the string representation of such a JSON document was passed through the JSON parser again, the information that the numeric value was originally specified as a floating-point value was lost.
To rectify this problem, a fractional part is now added to the string representation of a floating-point value in a JSON document if the value has no fractional part and is not represented using scientific format. This makes the string representation of a floating-point value distinguishable from that of an integer, so that it continues to be treated as a floating-point number even if the string is parsed again.
This fix also makes
ST_GeomFromGeoJSON()
use the same JSON parser as the other JSON functions rather than its own custom parser as had been the case since MySQL 5.7.8; this special handling was due to the fact thatST_AsGeoJSON()
dropped the fractional part of negative zero (-0 instead of -0.0), causing the JSON parser to interpret -0 as integer 0, thus losing the distinction between positive and negative zero. SinceST_AsGeoJSON()
now uses the standard JSON parser, it represents negative zero as correctly as -0.0, obviating any need forST_GeomFromGeoJSON()
to preserve negative zero explicitly on its own when parsing the output fromST_AsGeoJSON()
. (Bug #88230, Bug #27028889)References: See also: Bug #19504183.
JSON: When inserting
JSON
values created from the result of aGROUP BY
query, the inserted values could sometimes include the concatenation of all the values previously inserted into that column. (Bug #87854, Bug #26867509)JSON: When called using strings extracted from JSON documents as arguments, the
LEAD()
andLAG()
functions returned the same value for every row. (Bug #87839, Bug #26848089)JSON: The microseconds part of the last-updated field in each histogram in the
INFORMATION_SCHEMA.COLUMN_STATISTICS
table (showing when the histogram was last updated) was dropped when serializing the histogram into JSON and so was not stored. (Bug #87833, Bug #26846289)JSON: When a
JSON_SET()
statement updated aJSON
value to the same value using a partial update (in other words, when the partial update was essentially aNOOP
), it was possible that logical diffs for this operation were produced, even though no binary diffs were produced. Now in such cases, neither logical update nor binary diffs are generated. (Bug #87113, Bug #26483625)-
JSON: Following the implementation of JSON partial updates, the same JSON document could have different binary representations on the master and the slave. This could lead row-based replication—which uses binary equality to find the matching row on the slave—to fail if this occurred. Now the string representation of the JSON document is used for the comparison instead.
Also as a result of this fix, updates can be skipped in more cases than previously; this is true where the binary representation has changed, but not the contents of the document. (Bug #86532, Bug #26177130)
Ubuntu 14.04 and Debian 8 are no longer supported. (Bug #27422291)
For builds on 32-bit platforms with Undefined Behavior Sanitizer enabled, a stack-overrun check could cause a server exit. (Bug #27224961)
The server could hang during spatial reference system (SRS) creation while another session was using that SRS. (Bug #27220467)
A lock for the privilege cache was acquired unnecessarily during privilege-checking operations not involving table permissions. (Bug #27197483)
Persisting the read-only
gtid_owned
orgtid_executed
system variable caused an assertion failure at server startup. These variables can no longer be persisted. (Bug #27193853)Improper handling of plugin loading and unloading could cause a server exit. (Bug #27151550, Bug #88589, Bug #27116827, Bug #88483)
Error propagation from some windowing functions was not always performed correctly. (Bug #27135084, Bug #27136492)
Negation of some very large values was not handled correctly by an internal function. (Bug #27134168)
Instituted stricter checks when performing addition involving date intervals. (Bug #27134148)
Recently introduced SRID and COLUMN_STATISTICS metadata locks were not instrumented by the Performance Schema. (Bug #27124506)
The name of a derived table was not saved before the table was materialized and assigned the name of the temporary table. Later, when trying to reset the table name, this caused the server to fail due to the missing reference to the original value of the name. (Bug #27121663)
Performance Schema queries that used indexes on
OBJECT_TYPE
columns could return incorrect results. (Bug #27121500)Compiling with
-DWITH_ASAN=1
and-DWITH_ASAN_SCOPE=1
detected a stack-use-after-scope memory error. (Bug #27108794, Bug #88460)FILE
privilege checking for preparedSELECT ... INTO OUTFILE
statements was incorrect. (Bug #27094955)Some messages with information priority were written to the error log when
log_error_verbosity
was less than 3. (Bug #27082862)The
ha_create_table_from_engine
function failed to pass a table object to theha_create
routine. (Bug #27066335)Partition by and order by elements of unused window definitions were not included when estimating memory requirements. This is resolved by assigning a parsing context (
CTX_WINDOW
), but only when the current context isCTX_NONE
. As part of this fix, unused window definitions are now removed after being checked for syntax and semantic errors. (Bug #27062031)GROUP BY
with aROLLUP
that generatedNULL
was not handled correctly. (Bug #27060420)An Event Scheduler event for which global autocommit was disabled at event expiration time caused an assertion to be raised. (Bug #27041552, Bug #88255)
Length calculations for string-valued user-defined variables could be incorrect if the collation was changed. (Bug #27041543, Bug #88256)
CREATE TABLE ... SELECT
statements that attempted to create a non-InnoDB
table raised an assertion if a pre-existing view referenced the table to be created. (Bug #27041536, Bug #88258)When used as an argument to the
IF()
function, the value of aTIMESTAMP
column could be handled differently for different collations. (Bug #27041526, Bug #88259)With statement-based binary logging, using
CREATE TABLE ... SELECT
to create aBLACKHOLE
table caused an assertion to be raised. (Bug #27041516, Bug #88260)For debug builds, a
TIMESTAMP
-related assertion could be raised withexplicit_defaults_for_timestamp
enabled. (Bug #27041502, Bug #88261)Under
LOCK TABLES
, an attempt to execute a DML statement on a table with foreign keys led to assertion failure if the statement was incompatible with the mode under which the tables in the foreign key relationship were locked. (Bug #27041477, Bug #88264)With a
LOCK TABLES
statement active, queries that select from theINFORMATION_SCHEMA.FILES
table could raise an assertion trying to obtain a metadata lock. (Bug #27041452, Bug #88266)Component installation did not properly perform auto-increment handling, which could result in a server exit. (Bug #27041374, Bug #88276)
With
big_tables=1
andcharacter_set_connection=ucs2
,SHOW TABLE STATUS
could raise an assertion. (Bug #27041323, Bug #88279)With a backup lock active, removal of binary log files and relay log files incorrectly was permitted. (Bug #27030339, Bug #88238)
When evaluating an end-range condition in a scan of a non-covering secondary index, and the end-range condition referenced an indexed virtual column,
InnoDB
sometimes read the wrong column from the index, which could lead to assertion failures or wrong results. (Bug #27010089)In
event
items in filter rules, theaudit_log
plugin did not properly process values specified as aJSON
array. (Bug #27010045)An integer overflow was sometimes possible when adding date values, with the potential to return invalid results. (Bug #27004806)
TRUNCATE TABLE
on anInnoDB
table with an activeLOCK TABLES
raised an assertion if more than one table instance was locked. (Bug #26999526)Some windowing functions including
NTH_VALUE()
did not returnNULL
in all cases in which they should have. (Bug #26975882)-
If one of the temporal arguments to
LEAST()
orGREATEST()
was of typeDATETIME
, but the aggregated data type was something other thanVARCHAR
or a temporal type, theLEAST()
orGREATEST()
item had temporal properties set for it in spite of the fact that it was not of a temporal data type. The temporal properties for theLEAST()
orGREATEST()
item, including its fractional precision, were therefore not calculated correctly, leading to failure at a later point in statement execution.To fix this issue, the data type of
LEAST()
orGREATEST()
is now temporarily set to a temporal type if one or more, but not all, of its arguments are of temporal types regardless of their aggregated data type. (Bug #26975864) IFNULL()
did not always check for errors correctly when processing multiple arguments. (Bug #26975848, Bug #27062796, Bug #27062694)With compression enabled for the client/server protocol, logical packets that are multiples of size
0xFFFFFF
could cause the connection to be dropped. Thanks to Facebook Inc. for the patch. (Bug #26974113, Bug #88092)Installing and uninstalling a plugin many times from multiple sessions could cause the server to become unresponsive. (Bug #26946491)
A virtual column definition that included a function removed in MySQL 8.0 caused startup to fail with a “No database selected” error when starting the MySQL 8.0 server on a MySQL 5.7 data directory. (Bug #26945125, Bug #88040)
-
These errors occurred after an in-place upgrade from MySQL 5.7 to 8.0:
Starting the server with an
--explicit-defaults-for-timestamp=0
setting returned an Invalid default value for 'cached_time' error.Starting the server with
--initialize
and--explicit-defaults-for-timestamp=0
configuration settings returned an Invalid default value for 'SET_TIME' error.Duplicate
SET
data type values caused a Duplicated value in SET error, regardless of thesql_mode
configuration setting.
(Bug #26944731, Bug #88039, Bug #26948678, Bug #88032)
Queries with a common table expression and a derived table or view that contained a window function produced incorrect results. (Bug #26907753, Bug #87939)
The deprecation warnings were clarified regarding use of the
--symbolic-links
and--skip-symbolic-links
server options (and their equivalents). The server no longer warns about a missing data directory when invoked with the--help
option. (Bug #26898576, Bug #87913)-
VALUES()
was not handled correctly in some cases. (Bug #26881946)References: See also: Bug #19601973, Bug #17458914.
The tablespace discovery mechanism in MySQL Cluster was disabled, which prevented serialized dictionary information from being imported into the data dictionary in cases where the table exists in the storage engine dictionary but not in the MySQL data dictionary. (Bug #26867488)
For debug builds, validation checks on relevant generated columns could be missed for
UPDATE
statements, leading to a server exit. (Bug #26838771)For window functions, an error could be produced that a window was not defined, when it was defined. (Bug #26813454, Bug #87780)
When a materialized derived table was determined to be superfluous, the routine that deleted the corresponding object left it in an inconsistent state. Now in such cases, the derived table's
TABLE_LIST
object left in a consistent state after its materialized object is deleted, by setting its table pointer toNULL
. (Bug #26798989)Incorrect results were obtained for a query with
MAX()
and aHAVING
clause used inside a view. (Bug #26781725)Metadata locking for definition changes to tables underlying a view could be inconsistent with metadata locking for other statements on the tables. (Bug #26770836)
In MySQL 8.0, view column names are restricted to 64 characters. A MySQL 5.7 view with longer column names was marked as invalid during an upgrade to 8.0 was marked invalid. Now such views produce an error during the upgrade and must be altered to have legal column names before the upgrade will succeed. (Bug #26743291, Bug #87650)
Concurrent calls to
GET_LOCK()
could cause deadlock, even with a wait time of 0. (Bug #26739438, Bug #87620)FROM_UNIXTIME()
did not always work correctly withLAG()
. (Bug #26739028)Following an
INSERT
statement withBLOB
values in theON DUPLICATE KEY UPDATE
clause that failed with a constraint violation, a similar statement with no reason to return an error could cause a server exit. (Bug #26734162)The Performance Schema now stores rewritten rather than raw SQL statement text when available. (Bug #26732229)
Re-executing a prepared statement that used window functions could cause a server exit. (Bug #26730020)
An in-place upgrade to MySQL 8.0 caused a server exit if tables contained columns with a pre-5.0
DECIMAL
data type. This data type is not supported, so upgrades now detect such columns and warn that in-place upgrade cannot be done. Affected tables must be upgraded by dumping and restoring them. (Bug #26727481)A comparison operator used to order keys in a data dictionary cache hash map incorrectly determined that two storage-engine private IDs used by different storage engines were equal. (Bug #26723442)
Values in the
XID_GTRID
column of the Performance Schemaevents_transactions_current
table were displayed incorrectly for XA transactions. (Bug #26710081, Bug #87559)Incorrect results or a server exit could result when
SHA2()
was passed a user-defined variable in some character sets. (Bug #26704451)Incorrect
NULL
handling byLAG()
andLEAD()
could cause a server exit. (Bug #26703246, Bug #26703156)-
If an error occurred while setting up the temporary table for duplicate weedout in a semijoin (for example, because the disk was full), the server did not terminate gracefully with an appropriate error message.
Now in the event that the temporary table is not successfully created, the query is aborted. (Bug #26679983)
The server did not always clean up correctly after executing an
IN
subquery that used a hash semijoin. (Bug #26679495)Building with the
-DWITHOUT_SERVER=ON
CMake option failed due to attempting to link theauthentication_ldap_sasl_client
client-side plugin against the embedded server library. (Bug #26665217)-
During data directory creation or upgrade from MySQL 5.7 to 8.0, server startup would fail due to a Performance Schema initialization failure if the server was started in
read_only
mode. Additionally, Information Schema metadata was not updated at startup, and Performance Schema and Information Schema version information was stored without verifying that schema tables were created.The versioning scheme used for the data dictionary and Information Schema system views is now consistent with the Performance Schema versioning scheme. (Bug #26636238, Bug #87436)
The
CREATE_OPTIONS
column in theINFORMATION_SCHEMA.TABLES
table did not show correct information. (Bug #26634507)Incorrect results could be returned for queries that used an outer join and a derived table referenced a
const
value from an inner table of the outer join. (Bug #26627181)AFTER UPDATE
triggers were not invoked forINSERT ... ON DUPLICATE KEY UPDATE
when the value to be updated and the new value were the same. (Bug #26626277, Bug #87371)Assignment of anonymous roles to the
mandatory_roles
system variable was incorrectly permitted. Additionally, assigning a value tomandatory_roles
now requires theROLE_ADMIN
privilege, in addition to theSYSTEM_VARIABLES_ADMIN
orSUPER
privilege normally required to set a global system variable. (Bug #26576989)The server fell back to using the built-in error messages if the
lc_messages_dir
value was invalid at server startup, but not iflc_messages
orlc_time_names
were invalid. Now the server uses the built-in messages if any of those variables are invalid at startup. (Bug #26576922)SET DEFAULT ROLE ALL
did not include roles named in themandatory_roles
system variable. (Bug #26571995)On Windows, CMake did not automatically add x64 toolchain support for some Visual Studio versions. (Bug #26566360)
Problems could occur when a derived table with an
ORDER BY
clause was merged into an outer query, and when the columns from theORDER BY
were not also referenced in the outer query. (Bug #26542829)Parallel inserts of schema SDI into the SDI B-tree could raise an assertion when creating tables in the same schema in parallel. (Bug #26539665, Bug #87225)
Changing the
UMASK
andUMASK_DIR
environment variables from their default values had no effect on database directory and table file access. (Bug #26529942)For debug builds, incorrect nullability assessment of derived table column references could cause
CONCAT()
to raise an assertion. (Bug #26524721)A server exit could result from simultaneous attempts by multiple threads to register and deregister metadata Performance Schema objects, or to acquire and release metadata locks. (Bug #26502135)
MSI packages for Windows failed to detect when Microsoft Visual C++ 2010 Redistributable Package was installed. (Bug #26501092, Bug #87139)
Queries that used window functions for tables that contained a
BLOB
column could cause a server exit. (Bug #26496880)Persisted variables belonging to plugins were not always handled properly at server startup. (Bug #26495619)
A server exit could occur for queries that used
DISINCT
andORDER BY ... LIMIT
and were executed using range access and a temporary table for theORDER BY
. (Bug #26483909)LDAP authentication plugins could fail if their associated system variables were set to invalid values. (Bug #26474964)
The Linux RPM spec file for RHEL6 and higher is updated with comments that recommend installing the
redhat-rpm-config
package to add convenience macros that make rebuilding the RPM package easier. Thanks to Simon Mudd for the patch. (Bug #26474153, Bug #87098)If the error log was misconfigured and the server could not start, no output describing the problem was produced. (Bug #26447825, Bug #87087)
When a materialized semijoin operation was evaluated more than once, and one of the tables in the materialization was a
const
table (that is, with join typeJT_CONST
), invalid data was accessed during the second materialization when referencing theconst
table. (Bug #26436185)Password-expiration options did not work correctly for authentication plugins that use external authentication methods. (Bug #26435766)
Adding an
ORDER BY
to a query that included an outer join and a subquery caused a constant value defined for a column in the subquery to be incorrectly promoted to a constant value in the case when the subquery returns 0 rows. (Bug #26432173)For the
autocommit
system variable, the Performance Schemavariables_info
table always reported theVARIABLE_SOURCE
column asCOMPILED
. (Bug #26428017)For debug builds,
INSERT IGNORE
statements that tried to insertNULL
into aGEOMETRY NOT NULL
column raised an assertion because there is no valid value to convert theNULL
to. This is now handled as a nonignorableER_BAD_NULL_ERROR_NOT_IGNORED
error. (Bug #26412713)SET PERSIST_ONLY
changed theVARIABLE_SOURCE
column of the Performance Schemavariables_info
table when it should not have. (Bug #26395134)The server failed to check the maximum path length for partition names. (Bug #26390632)
-
Problems occurred when a window with buffering followed an equi-join on a unique index, due to the fact that the window modified the input record with the assumption that, the next time control passes back to the join, a new record was read to the input record. This problem is addressed by reinstating the input record in such cases.
NoteThis fix was reverted in MySQL 8.0.27.
(Bug #26389508)
References: See also: Bug #32820802.
Identifiers containing a mixt of backslashes and backticks could be parsed incorrectly. (Bug #26372491)
audit_log
pluginTHD
objects could be created with incorrect thread ID information, leading to assertion failure. (Bug #26362452)The
HISTOGRAM
column in thecolumn_statistics
data dictionary table used a key namedcharset-id
to indicate collation numbers. This key has been renamed tocollation-id
. (Bug #26330090, Bug #86794)Starting the server with the
skip_name_resolve
system variable enabled could causelocalhost
in account entries to match non-localhost
hosts. (Bug #26328274, Bug #26202411, Bug #86546)if a configured error log service existed but could not be initialized, log information was lost. Now if a log service is configured at startup but cannot be initialized, diagnostics about the problem are sent to the default log service (or if that fails, directly to the error stream), and the server exits. If a log service is configured at runtime but cannot be initialized, diagnostics are sent to the client. (Bug #26286871, Bug #86728)
Installing and uninstalling Performance Schema example plugins concurrently with deletes from tables associated with those plugins could cause a server exit. (Bug #26281359)
When
HASH_SCAN
was specified as one of the values for theslave_rows_search_algorithms
system variable, which is the default from MySQL 8.0.2, and row-based replication was in effect, updates to a table containing virtual generated fields could raise an assertion. The issue was caused by an error when generating string representations of the virtual generated fields in order to create hashes for use in searches. To remove the issue, MySQL no longer creates hashes for virtual generated fields. (Bug #26280724)The server permitted
SHOW CREATE TABLE
on nontable files created for full-text searching. (Bug #26271244)For debug builds,
CREATE OR REPLACE VIEW
for an existing view raised an assertion for column names greater than 64 characters. Now an appropriate error is reported. (Bug #26266789)SET PERSIST
could be ineffective due to sorting variables written tomysqld-auto.cnf
. Variables are now written in the order persisted. (Bug #26259671)Attempting a partial backup with mysqlpump on a GTID-enabled server failed and produced an error message suggesting incorrectly that this was not possible. (It is possible using the
--set-gtid-purged
option.) (Bug #26199978)GRANT GRANT OPTION ON *.* TO
granteduser
GRANT OPTION
for static but not dynamic privileges.REVOKE ALL ... FROM CURRENT_USER()
revoked static but not dynamic privileges. (Bug #26191109, Bug #25658967)Error logging could attempt to log freed messages, resulting in a server exit. (Bug #26188656, Bug #86562)
A
HAVING
condition was optimized away for an alias on an aggregate column where there was noGROUP BY
clause. (Bug #26188578)ST_Crosses()
could return an incorrect result when at least one parameter is a geometry collection and multiple elements of the geometry collection must be taken into account in order to determine whether the geometries cross. (Bug #26188208, Bug #86559)MBROverlaps()
incorrectly returned false for two crossing perpendicular lines. (Bug #26188118, Bug #86558)ALTER USER
produced an error. (Bug #26174169)user
DEFAULT ROLE ALLmysqldump exited abnormally for large
--where
option values. (Bug #26171967, Bug #86496, Bug #27510150)A query using a window function with a window which partitioned or ordered on the result of an aggregate function where this evaluated as
NULL
returned incorrect results. (Bug #26164633)The Performance Schema could leak memory due to nondeletion of file instances created for
ALTER TABLE
operations that used the table-copy algorithm. (Bug #26152751, Bug #86482)Failed creation of a temporary table using
REPLACE
could under some circumstances result in an assertion in a later statement. (Bug #26126789, Bug #86422)mysqlpump did not properly parse
TABLESPACE
clauses in the result fromSHOW CREATE TABLE
statements it executed to determine table structure. (Bug #26116415)The binary file for the
udf_example
loadable function was omitted from binary distributions. (Bug #26115002, Bug #29178542)Long
SET PERSIST
statements could cause a server exit. (Bug #26100122)An incorrect formula was used to calculate maximum length of result strings for a few string functions:
QUOTE()
,AES_DECRYPT()
, andWEIGHT_STRING()
. This could affect, for example, the length of character columns created forCREATE TABLE ... AS SELECT ... QUOTE()
. (Bug #26049942, Bug #86305)Schema creation and removal operations could fail due to checking for schema directories under the data directory rather than checking the data dictionary. (Bug #26043994, Bug #86282)
SHOW PLUGINS
did not handle plugins that were terminating, resulting in a server exit. The statement now displays the status for such plugins asDELETING
. (Bug #26029765, Bug #86243)Some statements could cause a buffer overflow in the digest code. Thanks to Laurynas Biveinis and Roel van de Paar for the patch. (Bug #26021187)
Previously, when the Performance Schema failed to initialize, it wrote a nonspecific init failed warning to the error log. Now it prints more specific messages about which memory allocation failed. (Bug #25996291)
-
Incorrect results could occur on a table with a unique index when the optimizer chose a Loose Index Scan even though the unique index had no index extensions. (Bug #25989915, Bug #86165, Bug #26532061, Bug #87207)
References: This issue is a regression of: Bug #21749123, Bug #78244.
For
XA COMMIT
, precommit handling could set an error in the diagnostics area that was not reported correctly on the calling side, causing an assertion to be raised. (Bug #25978684, Bug #86142)The
MIN_VALUE
column of the Performance Schemavariables_info
table displayed incorrect values on 32-bit big-endian platforms. (Bug #25967079)A memory leak occurred when the optimizer excluded a subquery associated with a temporary table. (Bug #25951134)
An assertion could be raised for updates when a view or derived table considered read only had nested references not seen as read only. (Bug #25832861, Bug #85796)
Certificate and key files automatically generated by the server could have an incorrect access mode. (Bug #25832856)
Queries on the
INFORMATION_SCHEMA
TABLES
andSTATISTICS
tables, if evaluated using Index Condition Pushdown, could push down internal data dictionary functions, resulting in an assertion being raised. (Bug #25820175, Bug #85765)ST_AsText()
could read freed memory. (Bug #25818451)CREATE USER IF NOT EXISTS
was not written to the binary log if the user existed. This could result in inconsistent replication behavior if the user did not exist on slave servers. A similar issue occurred forALTER USER IF EXISTS
. To avoid inconsistencies, these statements now are written to the binary log. (Bug #25813089, Bug #85733)An invalid
utf8
input string caused a heap buffer overflow error. (Bug #25811623, Bug #25946444)A race condition made it possible to cause a server exit by persisting variables from multiple sessions simultaneously. (Bug #25768813)
Plugins can create or drop
INFORMATION_SCHEMA
tables, but views that referenceINFORMATION_SCHEMA
tables were not validated when plugins were unloaded or unloaded. (Bug #25761992, Bug #85579)mysql wrote some password-related statements to the
.mysql_history
file. (Bug #25750609)Incorrect handling of internal memory buffers could cause a server exit. (Bug #25737271)
On a read-only server with GTIDs enabled, a
DROP TEMPORARY TABLE IF EXISTS
statement relating to a nonexistent or filtered table could write an unnecessary transaction to the binary log and create an unnecessary GTID. In this situation, the missing temporary table was previously assumed to be transactional, leading to the statement being split. Now, MySQL checks that the temporary table exists and that itsDROP TEMPORARY TABLE
statement is recorded in the binary log. If this is not the case, no GTID is created. Thanks to Laurynas Biveinis for the patch. (Bug #25656992, Bug #85258)The MeCab full-text parser plugin failed to load on Windows. (Bug #25633175)
The
SET_TIME
column of the Performance Schemavariables_info
table was initialized incorrectly. (Bug #25608115)Executing a stored procedure containing a statement that created a table from the contents of certain
SELECT
statements could result in a memory leak. (Bug #25586773)The Performance Schema failed to check the maximum host length for client connections. (Bug #25510805)
For spatial functions, some set operations produced a result with SRID 0 when given arguments in a different SRID. (Bug #25510403)
Large
--ssl-cipher
values could cause client programs to exit. (Bug #25483593)A missing argument-count check during preparation of a stored procedure call could result in a server exit. (Bug #25398451, Bug #84512)
Temporary tables used in processing a recursive common table expression with
UNION DISTINCT
and a great many columns now use theMEMORY
engine instead ofInnoDB
. (Bug #25190109)If the MySQL
root
user account was renamed, a query that accessed anINFORMATION_SCHEMA
view returned an error stating that the user specified as the definer does not exist. To avoid this error, a new reserved account,'mysql.infoschema'@'localhost'
, is now theDEFINER
forINFORMATION_SCHEMA
views. (Bug #25185947, Bug #84027)When an
UPDATE
required a temporary table having a primary key larger than 1024 bytes and that table was created usingInnoDB
, the server could exit. (Bug #25153670)SET DEFAULT ROLE
was not transactional like other account-management statements. (Bug #25122897)mysqlpump
included thegtid_executed
table in dumps of themysql
system database, causing thegtid_executed
position to be lost upon server restart after the dump was reloaded.mysqlpump
no longer dumps thegtid_executed
table. (Bug #25109007)For geometry calculations, invalid input parameters could lead to an incorrect result buffer and cause an assertion to be raised or a server exit. (Bug #25062396)
IFNULL(decimal, int)
could lose a digit after the decimal point when used in a query that includedGROUP BY
and was executed using a temporary table. (Bug #25051195, Bug #83699)For some queries, such as those involving
UNION
, column width forGROUP_CONCAT()
could be calculated incorrectly, leading to incorrect application ofgroup_concat_max_len
. (Bug #25050090, Bug #83667)Audit logging of events for the Performance Schema
global_variables
table was improved so as to not report events for rows materialized but not reported to the SQL layer. (Bug #24970428)ST_Buffer()
could return an invalid result or raise an error for some inputs that should have produced a valid output geometry. (Bug #24947868, Bug #26735293, Bug #25662426)For builds with AddressSanitizer or Undefined Behavior Sanitizer enabled, division by zero could occur during Performance Schema timer initialization. (Bug #24785784)
Operations that rely heavily on the metadata locking (MDL) subsystem caused a performance degradation. Traversal of MDL ticket lists was time consuming in cases where there were large number of MDL tickets. (Bug #24734971, Bug #83143)
-
When
binlog_format
isROW
orMIXED
, operations on temporary tables are not logged. Previously, the exception to this rule was that when the connection was terminated at the end of the session, the statementDROP TEMPORARY TABLE IF EXISTS
was logged for any temporary tables that had been opened in the session. For row-based replication, this behavior caused an unnecessary write to the binary log, and added a transaction sequence number for the GTID where these were enabled.Now, when a temporary table is created in a session, the binary logging format is tracked. The
DROP TEMPORARY TABLE IF EXISTS
statement is only logged at the end of the session if statement-based format was in effect when the temporary table was created, so theCREATE TEMPORARY TABLE
statement was logged. If row-based or mixed-format binary logging was in use when the table was created, theDROP TEMPORARY TABLE IF EXISTS
statement is not logged.Thanks to Laurynas Biveinis for the patch. (Bug #24670909, Bug #83003, Bug #28606948)
Concurrent
INSERT
,ALTER TABLE
, andDROP DATABASE
operations could result in deadlock. (Bug #24510948, Bug #82704)Under some conditions, the
audit_log
plugin could recursively lock a mutex, resulting in an unresponsive server. (Bug #24437533)In some cases, the optimizer chose a Loose Index Scan (
QUICK_GROUP_MIN_MAX_SELECT
) for aGROUP BY
query even when there was a predicate with a disjunction. This is fixed by not performing a range scan when the condition in theWHERE
clause results in more than one disjoint range tree. (Bug #24423143)Incorrect results could occur when the optimizer chose an index on a generated column to fetch values. (Bug #24345509, Bug #29451999)
Debug symbol packages are now included for all
apt
platforms (previously, they were only available on Debian 9). (Bug #24008883, Bug #27990381)With
SQL_MODE=''
,UNIX_TIMESTAMP(COUNT(1))
returnedNULL
instead of 0 as expected. (Bug #23529242)-
When deleting rows from a table that had an indexed virtual
BLOB
column with aNOT NULL
constraint, and the generated column expression evaluated toNULL
in one of the rows that were being deleted, conversion of theNULL
to itsNOT NULL
equivalent was not performed correctly. (Bug #23321196)References: See also: Bug #23037025, Bug #21345972.
Setting the
MYSQL_GROUP_SUFFIX
environment variable had no effect. (Bug #23072792)A missing check for error handling during generated column evaluation could result in a server exit. (Bug #23021693)
To check whether a table was empty,
ALTER TABLE
performed a table scan, which is inefficient. (Bug #22688065)Failure to acquire tablespace metadata locks for
ALTER TABLE
when aLOCK TABLES
was active could cause an assertion to be raised. (Bug #22486020, Bug #79820)Constant propagation is no longer performed when a constant expression contains a reference to the column it is meant to replace. (Bug #20964700)
Queries with many left joins were slow if join buffering was used (for example, using the block nested loop algorithm). (Bug #18898433, Bug #72854)
REGEXP
failed to find matches occurring after a\0
character in the string expression. (Bug #17541193, Bug #70470)Selecting from a view that involved aggregation and
WITH ROLLUP
could result in a spurious Columncol_name
cannot be null error. (Bug #11755860, Bug #47693)COALESCE()
could change the value ofFLOAT
fields. (Bug #11751705, Bug #42666)In some cases, the row estimate used by the server to determine whether to use sampling could be inaccurate. This was because the histogram process assumed that the estimate for the number of rows in the table was current, although it was not updated by (for example)
INSERT
orDELETE
statements. Now the histogram process requests an updated count of rows. (Bug #88710, Bug #27197709)Long-running regular expression matches could not be killed. (Bug #88676, Bug #27183583)
An optimizer
SET_VAR
hint (see Variable-Setting Hint Syntax) settingcte_max_recursion_depth
was ignored. (Bug #88594, Bug #27153338)When handling range frames, if the first row for a range frame was found, its position was not stored. This could later cause retrieval of the row from the frame buffer to fail. (Bug #88568, Bug #27149369)
-
The server did not handle triggers activated by
LOAD DATA
correctly when--skip-log-bin
was enabled. (Bug #88516, Bug #27128534)References: This issue is a regression of: Bug #27041382.
Stored procedures performing XA transactions and acting on views were not executed correctly. (Bug #88326, Bug #27058931)
When a table contained a column whose length was zero, the optimizer could in some cases allocate a record buffer that was too small to hold the columns read by the query. (Bug #88283, Bug #27041288)
A trigger containing invalid syntax, followed by an
INSERT
that did not specify a column list, attempted to insert a new row regardless. (Bug #88274, Bug #27041382)Window functions did not always produce correct results with
LAST_VALUE()
and frames having multipleORDER BY
expressions. (Bug #88186, Bug #27010574)-
A fix for a previous issue caused the aggregated data type to be set to
VARCHAR
whenever the result type was string and the column size was larger than 255 characters (maximum length forCHAR
). This caused problems for data types such asJSON
whose result type is a string, but which support field values longer than 255 characters. Now in such cases the data type is set explicitly toVARCHAR
when an aggregated column is of typeCHAR
orBINARY
(both represented internally as strings) but its size exceeds the maximum forCHAR
. (Bug #88073, Bug #26960106)References: This issue is a regression of: Bug #83895, Bug #25123839.
A prepared statement containing an
ORDER BY
list that referred to a parameter was not always handled correctly. (Bug #87863, Bug #26867652)DENSE_RANK()
did not work correctly for the first row in a partition when buffering was in use, due to premature initialization of the cache comparator forORDER BY
. (Bug #87760, Bug #26802696)-
The optimizer chose a composite index for
ref
access where only the first part of the key could be used. The composite key was suitable but was seen as a higher cost. This was because, when choosing betweenref
access andrange
access on the same index, we preferrange
if certain criteria are fulfilled, one of these being to choose to avoidref
-access if it has an overly-optimistic or unrealistically low cost as can happen whenrecords_per_key
is very low. This was done even if the estimate of the number of rows forrange
access was more reliable than the estimate forref
access. (Bug #87613, Bug #26727773)References: See also: Bug #23259872.
When a stored function was used with a table column value as an argument in a
WHERE
predicate, its internalnot_null_tables
property was falsely set to a nonempty value. If this predicate was applied to an outer join operation and one of the arguments was from an inner table of the outer join, the predicate was sometimes used (incorrectly) to convert the outer join to an inner join. According to the SQL standard, only functions that have theRETURNS NULL ON NULL INPUT
property should behave in that manner. Since MySQL does not currently implement this property, stored functions are changed such that they no longer implement theRETURNS NULL ON NULL INPUT
behavior. (Bug #86922, Bug #26389402)A view or derived table contained incorrect data when defined using a
SELECT
that performed aggregation of a column, and whose result was filtered withHAVING
. (Bug #86840, Bug #26360114)The server handled triggers and generated columns incorrectly. (Bug #86637, Bug #26251621)
A query that grouped results on a subquery which returned a
BLOB
(or a type based onBLOB
such asJSON
) sometimes failed to find the group boundaries, and so returned incorrect results. (Bug #78787, Bug #21974696)