Invoking
audit_api_message_emit_udf()with arguments of mixed types could lead to an unplanned shutdown of the server. (Bug #36301441)Audit log filtering by type, using error as the type, did not work correctly. (Bug #36142157)
Following an unplanned shutdown and restart, the file that was in use by the server for writing at the time may be broken or otherwise unreadable. The Audit Log plugin log message indicating unreadability of the file was shown as an error; now instead this message is treated as a warning. (Bug #36118809)
-
Important Change: The following MySQL C API functions, removed in MySQL 8.3, have been reimplemented and restored in MySQL 8.4.0:
mysql_kill(): In place ofCOM_PROCESS_KILL(removed), this function has been reimplemented such that it usesmysql_real_query()to executeKILL.mysql_list_fields(): Restored as previously implemented, along withCOM_FIELD_LIST.mysql_list_processes(): Reimplemented usingmysql_real_query()to executeSHOW PROCESSLIST, in place ofCOM_PROCESS_INFO(removed).mysql_refresh(): Reimplemented usingmysql_real_query()to executeFLUSHstatements in place ofCOM_REFRESH, which was removed in MySQL 8.3.mysql_shutdown(): Reimplemented using mysql_real_query() to execute a shutdown command rather thanCOM_SHUTDOWN, removed in MySQL 8.3.
The functions just listed are supported for the lifetime of the MySQL 8.4 series. (WL #16221)
-
Microsoft Windows: Third party DLL files on which MySQL plugins depend are located, when installed, in the same directory as the MySQL executables. The default Windows behavior is to look for dependences in the same directory as the current executable, which is not appropriate for clients using
libmysql.dlloutside of the installation directory.We fix this by that changing the default behavior of MySQL clients so that the loader looks for dependencies in the directory of current module (the executable or
libmysql.dll). In addition, sincelibsasl.dllexpects to load all its required dependencies from a directory of its won, SASL plugins are now located in a dedicated subdirectory. (Bug #36006295)
-
When the
character_set_serversystem variable was set usingSET PERSISTorSET GLOBAL, it did not take effect for new client sessions or for a client establishing a connection to the server after the server was restarted. The only workaround was to set the corresponding command-line option when starting the server.To fix this, we now make sure that, at the time of server restart, the configuration data is read in the correct order so that the variable setting takes effect as expected. (Bug #35529604)
The
libeventlibrary has been removed. (Bug #36357190)Added the
libcnolibrary. (Bug #36357181)Some of the files in
extra/libbacktracecontained incorrect licensing information, copyright information, or both. (Bug #36118772)Warnings for unused variables are turned into compilation errors when compiling with
-DMYSQL_MAINTAINER_MODE=1. To avoid this use-DMYSQL_MAINTAINER_MODE=0to disable such errors. (Bug #113662, Bug #36198423)
Microsoft Windows: On Windows, MySQL Configurator incorrectly altered the configuration settings after the Back and Next buttons were used. (Bug #36156577)
Microsoft Windows: On Windows, MySQL Configurator no longer opens when removing a MySQL Server that was not configured. (Bug #35709927)
Microsoft Windows: On Windows, MySQL Configurator stopped adding the
default_authentication_pluginvariable to the generatedmy.inifile, a variable removed in MySQL Server 8.4. It also removes it when upgrading an installation to MySQL 8.4. Note that the replacement variableauthentication_policyis not set by MySQL Configurator. (WL #16137)Microsoft Windows: On Windows, MySQL Configurator no longer allows upgrading from MySQL 5.7 or earlier, when before it allowed the upgrade to execute after stating that it was not officially supported. (WL #16138)
-
Important Change: The deprecated
mysql_native_passwordauthentication plugin is now disabled by default. It can be enabled by starting MySQL with the new--mysql-native-password=ONserver option, or by addingmysql_native_password=ONto the[mysqld]section of your MySQL configuration file.For more information, see Native Pluggable Authentication. (Bug #36337893)
-
Partitioning: Silent omission of columns with index prefixes as part of a table's partitioning key was deprecated in MySQL 8.0.21, and generated a warning. In this release, the use of any such columns in the proposed partitioning key is now expressly disallowed, and causes the
CREATE TABLEorALTER TABLEstatement in which it occurs to be rejected with an error.For more information, see Column index prefixes not supported for key partitioning, and KEY Partitioning. (WL #16054)
References: See also: Bug #31100205.
-
Replication: Syntax for a number of features relating to MySQL Replication that was deprecated in previous versions of MySQL has now been removed. These features include aspects of SQL statement syntax as well as several system status variables in the MySQL server. These changes are detailed following.
SQL statements removed. The following SQL statements have been removed (replacements in brackets):
START SLAVE(START REPLICA);STOP SLAVE(STOP REPLICA);SHOW SLAVE STATUS(SHOW REPLICA STATUS);SHOW SLAVE HOSTS(SHOW REPLICAS);RESET SLAVE(RESET REPLICA);CHANGE MASTER TO(CHANGE REPLICATION SOURCE TO);RESET MASTER(RESET BINARY LOGS AND GTIDS);SHOW MASTER STATUS(SHOW BINARY LOG STATUS);PURGE MASTER LOGS(PURGE BINARY LOGS); andSHOW MASTER LOGS(SHOW BINARY LOGS).The statements just listed have also been removed from all MySQL test programs and files, and elsewhere, where used internally.
Statement options removed. The following options formerly supported by
CHANGE REPLICATION SOURCE TOandSTART REPLICAhave been removed and are no longer accepted by the server. They are listed here for each of these statements, with their replacements in brackets:-
CHANGE REPLICATION SOURCE TOoptions removed:MASTER_AUTO_POSITION(SOURCE_AUTO_POSITION),MASTER_HOST(SOURCE_HOST),MASTER_BIND(SOURCE_BIND),MASTER_USER(SOURCE_USER),MASTER_PASSWORD(SOURCE_PASSWORD),MASTER_PORT(SOURCE_PORT),MASTER_CONNECT_RETRY(SOURCE_CONNECT_RETRY),MASTER_RETRY_COUNT(SOURCE_RETRY_COUNT),MASTER_DELAY(SOURCE_DELAY),MASTER_SSL(SOURCE_SSL),MASTER_SSL_CA(SOURCE_SSL_CA),MASTER_SSL_CAPATH(SOURCE_SSL_CAPATH),MASTER_SSL_CIPHER(SOURCE_SSL_CIPHER),MASTER_SSL_CRL(SOURCE_SSL_CRL),MASTER_SSL_CRLPATH(SOURCE_SSL_CRLPATH),MASTER_SSL_KEY(SOURCE_SSL_KEY),MASTER_SSL_VERIFY_SERVER_CERT(SOURCE_SSL_VERIFY_SERVER_CERT),MASTER_TLS_VERSION(SOURCE_TLS_VERSION),MASTER_TLS_CIPHERSUITES(SOURCE_TLS_CIPHERSUITES),MASTER_SSL_CERT(SOURCE_SSL_CERT),MASTER_PUBLIC_KEY_PATH(SOURCE_PUBLIC_KEY_PATH),GET_MASTER_PUBLIC_KEY(GET_SOURCE_PUBLIC_KEY),MASTER_HEARTBEAT_PERIOD(SOURCE_HEARTBEAT_PERIOD),MASTER_COMPRESSION_ALGORITHMS(SOURCE_COMPRESSION_ALGORITHMS),MASTER_ZSTD_COMPRESSION_LEVEL(SOURCE_ZSTD_COMPRESSION_LEVEL),MASTER_LOG_FILE(SOURCE_LOG_FILE), andMASTER_LOG_POS(SOURCE_LOG_POS). START REPLICAoptions removed:MASTER_LOG_FILE(SOURCE_LOG_FILE) andMASTER_LOG_POS(SOURCE_LOG_POS).
Status variables removed. Also as part of this work, the following system status variables have been removed from the server, and no longer appear in the output of statements such as
SHOW STATUS. These variables are listed here, with their replacements in brackets:Com_slave_start(Com_replica_start);Com_slave_stop(Com_replica_stop);Com_show_slave_status(Com_show_replica_status);Com_show_slave_hosts(Com_show_replicas);Com_show_master_status(Com_show_binary_log_status); andCom_change_master(Com_change_replication_source).See also Com_xxx Variables. (WL #15831, WL #16063, WL #16069, WL #16086, WL #16087, WL #16088, WL #16089, WL #16090)
-
-
Group Replication: The
group_replication_allow_local_lower_version_joinsystem variable is now deprecated, and setting it raises a warning (ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT).You should expect this variable to be removed in a future version of MySQL. Since there is no longer any reason to allow incompatible members to join a group, no replacement for this functionality is planned. (WL #16018)
-
A number of server options and variables supported in previous versions of MySQL have been removed in this release. Attempting to set any of them in MySQL 8.4 raises an error. These options and variables are listed here:
-
binlog_transaction_dependency_tracking: Deprecated in MySQL 8.0.35 and MySQL 8.2.0.There are no plans to replace this variable or its functionality, which has been made internal to the server: Now, when multithreaded replicas are in use, the source mysqld uses always writesets to generate dependency information for the binary log; this has the same effect as setting
binlog_transaction_dependency_trackingtoWRITESETin previous versions of MySQL. -
group_replication_recovery_complete_at: Deprecated in MySQL 8.0.34.Beginning with this release, the policy applied during the distributed recovery process is always to mark a new member online only after it has received, certified, and applied all transactions that took place before it joined the group; this is equivalent to setting
group_replication_recovery_complete_attoTRANSACTIONS_APPLIEDin previous versions of MySQL. avoid_temporal_upgradeandshow_old_temporals: Both deprecated in MySQL 5.6. Each of these variables no longer had any effect, and has been removed. There are no plans to replace either variable.--no-dd-upgrade: Deprecated in MySQL 8.0.16, now removed. Use--upgrade=NONEinstead.--oldand--new: Both deprecated in MySQL 8.0.35 and MySQL 8.2.0, and now removed.--language: This option was deprecated in MySQL 5.5, and has now been removed.The
--ssl,--skip-ssl, and--admin-sslserver options, as well as thehave_sslandhave_opensslserver system variables, were all deprecated in MySQL 8.0.26, and are all removed in this release. Use--tls-versionand--admin-tls-versioninstead.-
default_authentication_plugin: Deprecated in MySQL 8.0.27, and now removed. Useauthentication_policyinstead.You should also be aware that the syntax for setting the
authentication_policyvariable has changed; see its description in the Manual for more information.
(Bug #36337893, WL #9677, WL #13965, WL #15461, WL #15839, WL #16056, WL #16058, WL #16059, WL #16095)
-
In cases where an aliased table was referenced in
EXPLAINoutput, the table name was qualified with a schema name, which was not necessary and could result in confusion. These schema qualifications have been removed from the output. (Bug #36053664)-
The unused
INFORMATION_SCHEMA.TABLESPACEStable, deprecated in MySQL 8.0.22, has now been removed.For
InnoDBtables, the Information SchemaINNODB_TABLESPACESandINNODB_DATAFILEStables provide tablespace metadata. (WL #14065) LOW_PRIORITYused withLOCK TABLES ... WRITEhad had no effect since MySQL 5.5, and was deprecated in MySQL 5.6. It is removed in this release; includingLOW_PRIORITYinLOCK TABLESnow causes a syntax error. (WL #16057)-
Support for use of the
AUTO_INCREMENTmodifier withFLOATandDOUBLEcolumns was deprecated in MySQL 8.0, and is now removed. Attempting to use these together inCREATE TABLEandALTER TABLEstatements now causes an Incorrect column specifier for column error (ER_WRONG_FIELD_SPEC).ImportantPrior to upgrading to this release, you must alter any table having a
FLOAT ... AUTO_INCREMENTorDOUBLE ... AUTO_INCREMENTcolumn that it no longer uses either of these. Otherwise, the table cannot be upgraded.(WL #13103)
The mysql_ssl_rsa_setup utility, which was deprecated in MySQL 8.0.34, is removed in this release. For MySQL distributions compiled using OpenSSL, the MySQL server can perform automatic generation of missing SSL and RSA files at startup. For more inforamtion, Creating SSL and RSA Certificates and Keys using MySQL. (WL #16205)
-
This release removes support for the
ENGINEclause from the following SQL statements:DROP TABLESPACE(all variants)-
All other variants of
ALTER TABLESPACE, with the two exceptions listed here:ALTER TABLESPACE ... ADD DATAFILE ENGINE={NDB|NDBCLUSTER}ALTER UNDO TABLESPACE ... SET {ACTIVE|INACTIVE} ENGINE=INNODB
Other than in the exceptional cases listed previously, use of the
ENGINEclause withALTER TABLESPACEorDROP TABLESPACEcauses the statement to be rejected with an error.ENGINEclauses for theALTER TABLESPACEandDROP TABLESPACEstatements were deprecated in MySQL 8.0. (WL #16055) The
SET_USER_IDprivilege, deprecated in MySQL 8.2.0, has been removed in this release, and its use inGRANTstatements now causes a syntax error. Use theSET_ANY_DEFINERandALLOW_NONEXISTENT_DEFINERprivileges instead. (WL #15875)Removed the mysql_upgrade utility, which was deprecated in MySQL 8.0.16. (WL #16096)
Removed the deprecated mysqlpump utility along with its associated lz4_decompress and zlib_decompress helper utilities. Instead, use mysqldump or the MySQL Shell dump utilities. (WL #16096)
-
The following plugins have been removed. They are noted in the list provided here, along with any server system variables, CMake options, and other features associated with them which have also been removed:
-
authentication_fido,authentication_fido_client: Useauthentication_webauthninstead; see WebAuthn Pluggable Authentication.The
authentication_fido_rp_idserver system variable, mysql client--fido-register-factoroption, and the-DWITH_FIDOCMake option have also been removed. -
keyring_file: Usecomponent_keyring_fileinstead; see Using the component_keyring_file File-Based Keyring Component.The
keyring_file_datasystem variable has also been removed. In addition, the CMake options-DINSTALL_MYSQLKEYRINGDIRand-DWITH_KEYRING_TESThave been removed. -
keyring_encrypted_file: Usecomponent_keyring_encrypted_fileinstead; see Using the component_keyring_encrypted_file Encrypted File-Based Keyring Component.The
keyring_encrypted_file_dataandkeyring_encrypted_file_passwordserver system variables have also been removed. -
keyring_oci: Usecomponent_keyring_ociinstead; see Using the Oracle Cloud Infrastructure Vault Keyring Component.The following server system variables have also been removed:
keyring_oci_ca_certificate,keyring_oci_compartment,keyring_oci_encryption_endpoint,keyring_oci_key_file,keyring_oci_key_fingerprint,keyring_oci_management_endpoint,keyring_oci_master_key,keyring_oci_secrets_endpoint,keyring_oci_tenancy,keyring_oci_user,keyring_oci_vaults_endpoint, andkeyring_oci_virtual_vault. openssl_udf: Use the MySQL Enterprise Encryption component instead; see MySQL Enterprise Encryption.
(WL #15937, WL #15938, WL #15939, WL #15941, WL #16140)
-
-
Support for weak encryption ciphers has been removed. This means that, when configuring encrypted connections, MySQL no longer allows specifying any cipher that does not meet the following conditions:
Proper TLS version (TLS v1.2 or TLSv1.3, as appropriate)
Forward secrecy
SHA2 in cipher, certificate, or both
AES in GCM or any other AEAD algorithms or modes
This has implications for setting the system variables
ssl_cipher,admin_ssl_cipher,tls_ciphersuites, andadmin_tls_ciphersuites. See the descriptions of these variables for their permitted values.You should be aware that
libmysqlclientis not affected in this change, and continues to support ciphers that do not satisfy its conditions so that it can continue to connect to previous versions of MySQL. (WL #15801) -
The use of non-unique or partial keys as foreign keys is deprecated in MySQL. Beginning with this release, you must explicitly enable such nonstandard keys in one of the ways listed here:
Set
restrict_fk_on_non_standard_key(added in this release) toOFF.Start the server with the
--skip-restrict-fk-on-non-standard-keyoption (also new in this release).
The
restrict_fk_on_non_standard_keyserver system variable isONby default. This means that any attempt to use a nonstandard key as a foreign key in aCREATE TABLEorALTER TABLEstatement is rejected with the errorER_FK_NO_INDEX_PARENT; setting it toONallows such statements to run, but they raiseER_WARN_DEPRECATED_NON_STANDARD_KEYas a warning.Upgrades to MySQL 8.4 releases from MySQL 8.0 are supported even if the old database contains one or more foreign keys referring to non-unique or partial keys. As part of the upgrade process, the server prints a list of warning messages with the names of those foreign keys referring to nonstandard keys.
See the description of
restrict_fk_on_non_standard_keyfor more information. (WL #15699)References: See also: Bug #30615520, Bug #97836.
Following an upgrade, some MySQL Firewall stored procedures were not updated as expected. (Bug #36084930)
-
Several enhancements have been made in the stored procedures provided by MySQL Enterprise Firewall. These improvements are listed here:
Stored procedures provided by MySQL Enterprise Firewall are now transactional. When an error occurs during execution of a firewall stored procedure, an error is reported, and all changes made by the stored procedure up to that point in time are rolled back.
Firewall stored procedures now avoid performing unnecessary combinations of
DELETEplusINSERTstatements, as well as those ofINSERT IGNOREplusUPDATEoperations, making them faster and more efficient.User-based stored procedures and UDFs, previously deprecated, now raise a deprecation warning, such that calling either of
sp_set_firewall_mode()orsp_reload_firewall_rules()now generates such a warning. See Firewall Account Profile Stored Procedures, as well as Migrating Account Profiles to Group Profiles, for more information.
(WL #15790)
Fixed a potential race condition in the
PROCESSLISTtable. (Bug #35509371)
-
As part of the installation process, a file in JSON format named
mysql_upgrade_historyis now created in the server's data directory, or updated if it already exists. Information contained in this file includes the following items, among others:The day and time of the installation
The MySQL server version installed
The maturity level of the release (LTS or Innovation)
The
mysql_upgrade_infofile was deprecated in MySQL 8.0.17, and is no longer used; its presence is now checked for, and if this file is found, it is removed as part of the installation process. (WL #16039)References: See also: Bug #95165, Bug #29702060.
-
Migration from a keyring component to a keyring plugin is now supported. To perform such a migration, use the
--keyring-migration-from-componentserver option introduced in this release, setting--keyring-migration-sourceto the name of the source component, and--keyring-migration-destinationthe name of the target plugin.See Key Migration Using a Migration Server, for more information. (WL #16017)
-
This release adds support for automatic updates of histograms. When this feature is enabled for a given histogram, the histogram is updated whenever
ANALYZE TABLEis run on the parent table. Automatic recalculation of persistent statistics byInnoDBalso updates the histogram when automatic updates are enabled.Automatic histogram updates use the same number of buckets as the histogram was originally specified with, if any.
To enable automatic histogram updates, include the
AUTO UPDATEoption (added in this release) for theANALYZE TABLEstatement. To disable it, includeMANUAL UPDATEinstead.MANUAL UPDATE(no automatic updates) is the default if neither option is specified. When upgrading to this release, existing histograms are treated as though they had been created usingMANUAL UPDATE.For more information, see Histogram Statistics Analysis. See also Configuring Persistent Optimizer Statistics Parameters. (Bug #36053241, WL #15786)
The multi-range read (MRR) optimization did not perform as well as in previous releases. (Bug #113711, Bug #36220640)
-
In this release, we lift the requirement for transforming a correlated scalar subquery to a derived table that an operand of the equality expression which does not contain an outer reference must be a simple column reference.
This means that inner columns can be contained in deterministic expressions, as shown here:
func1(.., funcN(.., inner-column-a, ..), inner-column-b) = outside-expression inner-column-a + inner-column-b = outside-expressionFor example, the following query is now supported for optimization:
SELECT * FROM t1 WHERE ( SELECT func(t2.a) FROM t2 WHERE func(t2.a) = t1.a ) > 0;The inner operand cannot contain outer column references; likewise, the outer operand cannot contain inner column references. In addition, the inner operand cannot contain a subquery.
If the transformed subquery has explicit grouping, functional dependency analysis may be excessively pessimistic, resulting in an error such as ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column .... For
InnoDB, the transform is disabled by default, in which case such queries pass without error (but are not transformed).For more information, see Correlated Subqueries. (WL #15540)
User variables assigned decimal values were rounded up in the
user_variables_by_threadtable. (Bug #35781732)
-
Important Change: This release adds a privilege which is specific to the use of the
FLUSH PRIVILEGESstatements. Unlike the existingRELOADprivilege, the newFLUSH_PRIVILEGESprivilege applies only toFLUSH PRIVILEGESstatements. This privilege is global in scope, and is applicable to users and roles.The
RELOADprivilege continues to be supported in this capacity to provide backwards compatibility; users having this privilege can still executeFLUSH PRIVILEGESstatements following an upgrade. As part of upgrading to a MySQL 8.4 release, a check is performed to see whether there are any users having theFLUSH_PRIVILEGESprivilege; if there are none, users having theRELOADprivilege are automatically assigned the new privilege as well. (WL #16044) -
Important Change: This release adds a new
OPTIMIZE_LOCAL_TABLEprivilege. Users must have this privilege to executeOPTIMIZE LOCAL TABLEandOPTIMIZE NO_WRITE_TO_BINLOG TABLEstatements.When upgrading from a previous releases, users already having the
SYSTEM_USERprivilege are automatically granted theOPTIMIZE_LOCAL_TABLEprivilege. (WL #15819)
-
Important Change: Previously, when the limit defined by
thread_pool_max_transactions_limitwas reached, new connections or transactions on existing connections sometimes appeared to hang until one or more of the existing transactions were completed. This release introduces a way to mitigate this issue in many cases by setting an upper limitthread_pool_longrun_trx_limit(added in this release) on the length of time during which the number of ongoing transactions is allowed to match the maximum number of thread pool transactions specified bythread_pool_max_transactions_limit; once this limit is reached, the upper limit on the number of transactions is suspended for the thread group.When the number of long-running transactions decreases appreciably,
thread_pool_max_transactions_limitcan be (and is) enforced again. See the description of thethread_pool_longrun_trx_limitserver system variable for more information about how this is determined. (WL #16132) The Performance Schema
tp_connectionsthread pool plugin table contained no entries for connections that were in theadmingroup. (Bug #36296830)
-
Important Change; Group Replication: MySQL 8.0 performs special handling for group members whose version is 8.0.17 or earlier. This special handling is removed in the current release.
Users of MySQL 8.0 are encouraged to upgrade all instances to the latest 8.0 release prior to upgrading to MySQL 8.4. (Bug #36314222)
-
Important Change; Group Replication: In-place downgrades of servers within groups are supported within the MySQL 8.4 LTS series. For example, a member of a group running MySQL 8.4.2 can be downgraded to MySQL 8.4.0.
Similarly, cross-version group membership is also supported within the 8.4 release series. For example, a server running MySQL 8.4.0 can join a group all of whose members currently run MySQL 8.4.2, as can a server running MySQL 8.4.3.
For more information, see Upgrading Group Replication. (Bug #35918034)
References: See also: Bug #35397276.
-
Important Change; Group Replication: The default values of two server system variables relating to Group Replication have changed:
The default value of the
group_replication_consistencysystem variable is nowBEFORE_ON_PRIMARY_FAILOVER; previously, this wasEVENTUAL.The default value of the
group_replication_exit_state_actionsystem variable is nowOFFLINE_MODE; previously, this wasREAD_ONLY.
For more information, see the descriptions of the variables listed, as well as Configuring Transaction Consistency Guarantees, and Responses to Failure Detection and Network Partitioning. (WL #15712, WL #15713)
Important Change; Group Replication: When issued with
group_replication_consistencyset toBEFORE_ON_PRIMARY_FAILOVER, the MySQLKILLstatement now ignores any consistency guarantees, with any interrupted transactions now being rolled back.Important Change: For platforms on which OpenSSL libraries are bundled, the linked OpenSSL library for MySQL Server has been updated to version 3.0.13. Issues fixed in OpenSSL version 3.0.13 are described at https://openssl-library.org/news/openssl-3.0-notes/. (Bug #36261675)
Important Change: Upgrading from MySQL 5.7 to MySQL 8.4 is not supported; the code and behavior was updated to reflect this. Upgrade MySQL 5.7 to 8.0 before proceeding to 8.4. (WL #15924)
InnoDB: Progress messages are now logged periodically during long-running rollbacks as informational note level error messages, initially as
ER_IB_LONG_ROLLBACK_FULL(which appends transaction information) followed by successiveER_IB_LONG_ROLLBACK. (WL #15822)-
InnoDB: Changed the default values for the following
InnoDBconfiguration options:innodb_adaptive_hash_index,innodb_buffer_pool_in_core_file,innodb_buffer_pool_instances,innodb_change_buffering,innodb_doublewrite_files,innodb_doublewrite_pages,innodb_flush_method,innodb_io_capacity,innodb_io_capacity_max,innodb_log_buffer_size,innodb_numa_interleave,innodb_page_cleaners,innodb_parallel_read_threads,innodb_purge_threads,innodb_read_io_threads,innodb_use_fdatasync,temptable_max_ram,temptable_max_mmap, andtemptable_use_mmap.The settings affected by the
--innodb-dedicated-serverstartup option have also changed.For a list of the new default values, see What Is New in MySQL 8.4 since MySQL 8.0. See also Enabling Automatic InnoDB Configuration for a Dedicated MySQL Server. (WL #16179)
Packaging: Added support for Fedora 40 and Ubuntu 24.04.
-
Replication: It is now possible to recover the relay log with any incomplete transactions removed. The relay log is now sanitized when the server is started with
--relay-log-recovery=OFF(the default). This means that, on startup, the server removes all of the following items:Incomplete transactions
Relay log files containing incomplete transactions or parts of incomplete transactions only
References in the relay log index file to any relay log files removed
For more information, see the description of the
relay_log_recoveryserver system variable. -
Group Replication: When a member rejoining a group has transactions to apply on the
group_replication_applierchannel from previous participation in the group, those transactions are applied when the member rejoins before connections to a donor during distributed recovery.This backlog of transactions to apply can be monitored using the
performance_schema.replication_applier_status_by_workertable, but there was no information about it in the error log, which could lead to the mistaken impression that the server was stalled.Now in such cases, one of the messages Distributed recovery will wait until the transactions ... contained on the group_replication_applier channel are applied or Distributed recovery finished applying the transactions ... contained on the group_replication_applier channel is also written to the error log, as appropriate. (Bug #36229998)
Group Replication: As of this release, distributed recovery using the clone plugin is permitted between different releases in the same LTS series. (Bug #35992145)
-
Group Replication: MySQL Group Replication now supports preemptive certification information garbage collection when running in single-primary mode. This feature can be enabled using the
group_replication_preemptive_garbage_collectionsystem variable added in this release; when enabled, only the write sets for those transactions that have not yet been committed are kept, which can save time and memory consumption.group_replication_preemptive_garbage_collection_rows_threshold(also introduced in in this release) sets a lower bound on the number of certification rows needed to trigger preemptive garbage collection when the feature is enabled; the default value is 100000.The value of
group_replication_preemptive_garbage_collectioncan be changed only when Group Replication is not running, and has no effect on a group running in multi-primary mode. When this system variable is enabled, it is not possible to change between multi-primary mode and single-primary mode (see Changing the Group Mode). For help with obtaining information about memory consumed by the garbage collection process, see Monitoring Group Replication Memory Usage with Performance Schema Memory Instrumentation. (WL #15923) Microsoft Windows: MySQL Windows binary files (
.exeand.dllfiles) now display additional information when their properties are viewed. (Bug #36379291)-
Clone plugin version requirements have been relaxed to allow cloning between different point releases in the same series. In other words, only the major and minor version numbers must match when previously the release number also had to match.
For example, cloning of MySQL 8.4.0 to (a future) MySQL 8.4.14, or from MySQL 8.4.14 to 8.4.0, is now supported.
For more information, see The Clone Plugin. (Bug #36293529, WL #15989)
When using the iterator-based format for
EXPLAIN FORMAT=JSON(that is, whenexplain_json_format_versionis2), the output now contains aquery_typefield identifying the type of statement (select, insert, delete, and so on). (Bug #36134568)
Important Change; Replication: The
TRANSACTION_GTID_TAGprivilege is now required to set thegtid_executedserver system variable. (Bug #36201133)Important Change: The Robin Hood hashing library has been replaced with
unordered_dense. (Bug #36158022)-
InnoDB; Microsoft Windows: Improved redo log performance on Windows by opening redo log files in overlapped mode. (Bug #36154818)
References: This issue is a regression of: Bug #12527.
InnoDB: The log writer calls functions that temporarily release
log.writer_mutex; wheninnodb_log_writer_threads=OFF, this potentially led to other threads writing to the redo log in between these times. (Bug #36425219)-
InnoDB: Some FTS operations on tables with FTS indexes led to inconsistent results. For example, if the server terminated while synchronizing the FTS cache or when synchronization occurred concurrently with another FTS operation.
Our thanks to Yin Peng and the Tencent team for the contribution. (Bug #36347647)
InnoDB: When creating an index on a table containing data,
valgrindoccasionally reported reads of uninitialized memory fromddl::Builder::bulk_add_row(). (Bug #36342792)-
InnoDB: On Windows, keeping a file open without a shared write lock and attempting to acquire the
fil_shardmutex caused a deadlock with another thread that had acquired thefil_shardmutex and was attempting to access the same file. (Bug #36159317)References: See also: Bug #32808809.
InnoDB: Fixed a potential redo log rotation issue that could emit a "Found existing redo log files, but at least one is missing" error during recovery. (Bug #36124625)
InnoDB: Found and fixed an assertion failure related to full-text indexes. (Bug #35836581)
InnoDB: Added a log buffer check to the fil_tablespace_redo_* functions for them to better handle corrupt redo logs. (Bug #35676721)
InnoDB: Improved buffer handling during the tablespace deletion process, a situation that could have potentially caused an assertion failure. (Bug #35676106, Bug #36343647)
InnoDB: The redo log would potentially not log a column order change with instant DDL, which could cause an incorrect log replay during recovery. (Bug #35183686)
-
InnoDB: Results for
SHOW ENGINE INNODB STATUSshowed an invalid value (NULL) as the name of the first thread in theFile IOsection. (Bug #113819, Bug #36118112)References: This issue is a regression of: Bug #34992157.
InnoDB: With
innodb_parallel_read_threadsset to a value greater than 1,InnoDBunnecessarily disabled read-ahead heuristics which resulted in stalls when pages were not already in the buffer pool. (Bug #113482, Bug #36142806)-
InnoDB: Importing a tablespace had a hard limit of 128 characters for the imported column names, which did not properly account for variable-length encodings. It's now set to 64 * the maximum length of a multi-byte characters.
Our thanks to Lee Adria for the contribution. (Bug #113208, Bug #36047803)
-
InnoDB: Running a query that used a unique hash index with the TempTable storage engine could take significantly more time compared to running the query with the MEMORY engine.
Our thanks to xiaoyang chen for the contribution. (Bug #113178, Bug #36037224, Bug #36224958)
InnoDB: The redo log consumer could not advance if capacity was full and another thread was executing USER-related operations such as
CREATE USER. This also blocked new connections, which potentially prevented the workaround solution of increasinginnodb_redo_log_capacitysize. (Bug #112608, Bug #36004840)-
InnoDB: In debug builds, there was an assertion failure in InnoDB's background when a transaction it wanted to acquire an MDL lock on was no longer active.
This fix is based on a patch from Genze Wu with Alibaba, thank you for the contribution. (Bug #112424, Bug #35835864)
References: This issue is a regression of: Bug #33700835.
InnoDB: The MySQL truncate undo operation (purge thread) did not remove the
undo_{space_number}_trunc.logfile when attempting to truncate the undo tablespace. (Bug #112262, Bug #35784192)InnoDB: With
innodb_parallel_read_threadsset to a value greater than 1, InnoDB would unnecessarily request asynchronous reads which required more synchronization during I/O completion and created a bottleneck due to the limited number of available threads (innodb_read_io_threads) for handling I/O operations. Now this performs synchronous instead of asynchronous reads. (Bug #112137, Bug #35740866)-
InnoDB: A trx would unexpectedly halt after encountering an incorrect trx->in_innodb value.
Our thanks to Shaohua Wang for the contribution. (Bug #110652, Bug #35277407)
InnoDB: Fixed performance issues related to querying the
data_lockanddata_lock_waitstables when thousands of read-only transactions were present. (Bug #109539, Bug #34951273)InnoDB: MySQL no longer ignores the optimizer hint to use a secondary index scan, which instead forced a clustered (parallel) index scan. (Bug #100597, Bug #112767, Bug #31791868, Bug #35952353)
Replication:
diagnostics.sqlprevented upgrades to MySQL 8.4.0 from earlier versions of MySQL when restoring from data containing old replication terminology such asSHOW SLAVE STATUS. (Bug #36323066)Replication:
Gtid_tagged_log_eventencoded the correct value only when the original commit timestamp was equal to the immediate commit timestamp, instead of only when they were different. (Bug #36312880)Replication: In certain cases, the
gtid_nextserver system variable accepted an invalid value, displayed an invalid value after setting it (even to a legal value), or both. (Bug #36308318)Replication: The replication receiver thread did not report errors when a replication channel was configured with an unknown network namespace. The receiver thread stopped when such an error occurred but no reason for the halt was shown or logged. (Bug #36054355)
Replication: With
binlog_format=ROWandgtid_mode=OFF, deadlocks were sometimes reported among workers contending for the auto-increment lock when applier concurrency was high on the replica. (Bug #35851009)Replication: In certain cases, the SQL thread terminated with error MY-001755 (
ER_MTA_CANT_PARALLEL) when executed with the parallel applier. (Bug #35431274)Replication: Failure of
XA COMMITof a prepared transaction could result in transaction rollback. (Bug #33650776)Replication: The replication receiver thread stopped with an error if the replication source server sent a heartbeat event containing a binary log file position that was above the 4GB offset, due to the large size of the binary log file. A new heartbeat event (Heartbeat_log_event_v2, log event type 41) that handles the larger value correctly has been added for use in this situation. (Bug #29913991)
Replication: When the server printed an
ER_REPLICA_HEARTBEAT_FAILUREerror message, it did not respect the length of the master log file name, leading to it print unrelated data. (Bug #29913928)-
Group Replication: Problems arose when members
M1andM2were in a group, withM1usingu1as its recovery user andM2usingu2as its own recovery user, and both usersu1andu2existing onM1andM2with all necessary privileges, and when a new memberM3joined the group usingu2as its recovery user.M3knew only of useru2, but did not know of useru1, leadingSTART GROUP REPLICATIONonM2to be rejected sinceM1was unable to connect toM2. This also generated a newview_idlisting the group members asM1andM2, butM1nevertheless continued trying to connect toM3, withM1logging Error in establishing mysql connection and M3 logging Access denied errors for the connection attempts fromM1.By design, XCom stores the last three known configurations, including references to physical connections shared among all past and present configurations. This is done to facilitate quick reconnections by nodes rejoining the group, explicitly or implicitly, and that were already present in any of those configurations.
A side effect of this was that we might keep attempting to connect to a node that was currently not in the group. To solve this problem, we inhibit error logging if the node is not in the current configuration, in order to avoid false negatives which might lead a DBA or an operator to think mistakenly that there is a problem in the system. (Bug #36210988)
References: See also: Bug #32592027.
Group Replication: Improved handling of GTID sets. (Bug #36093405)
-
Group Replication: Two cases were found in which a member exited the group and moved to the
ERRORstate, but did not honor the action specified bygroup_replication_exit_state_action; these are listed here:When an error occurred while enabling
super_read_onlyWhen member join recovery was not possible, due to missing binary logs and clone groups on group members
Example: When the value of
group_replication_exit_state_actionwasOFFLINE_MODEand one of these events took place, offline mode was not enabled as expected. (Bug #36076308) Group Replication: After successfully setting a new primary,
group_replication_set_as_primary()in some cases waited indefinitely for the operation to complete. (Bug #36059098)Group Replication: For errors affecting transactions with
AFTER(ER_GRP_RPL_TRX_WAIT_FOR_GROUP_PREPARE_FAILED), the message that was written to the error log referenced a session ID instead of the UUID. (Bug #35953196)-
Group Replication: A group running group replication with a primary
i1and two secondariesi2andi3started to have intermittent issues because of high memory usage on the primary. The secondaries began reporting the primary as unreachable then reachable again, and the primary began reporting the secondaries as intermittently reachable then reachable as well. Following a period of such instability, the secondaries expelled the original primary (i1) and elected a new one (i2).Under these conditions, queries against the
performance_schema.replication_group_memberstable on the former primary (i1) reportedi1asONLINEandPRIMARY,i2asONLINEandSECONDARY, andi3asONLINEandSECONDARYfor an extended period of time (12 hours or more) until the mysqld process was restarted oni1.The problems observed were found to have begun on the original primary (
i1) when one of the secondaries was overloaded and began intermittently leaving and joining the group, its connections being dropped and recreated repeatedly on the primary server. During the reconnection process, the primary hung when trying to create the connection, thus blocking the single XCom thread. This was traced to the invocation ofSSL_connect()on the XCom communication stack, which changed in MySQL 8.0.27 from asynchronous to synchronous form. When a node was overloaded, it might not respond to theSSL_connect()call, leaving the connecting end blocked indefinitely.To fix this, we now connect in a way that is non-blocking, and that returns in case of a timeout, leaving the retry attempts to the caller—in this specific case, the XCom thread when trying to reconnect to another node. (Bug #34348094, Bug #36047891)
References: See also: Bug #37587252.
JSON:
JOINandGROUP BYhandled someJSONcolumn values differently. (Bug #101048, Bug #31969607)MySQL NDB ClusterJ: The
setLimits()method can now be chained todeletePersistentAll()to limit the number of items to delete. See the description ofdeletePersistentAll()for details. (Bug #36049906)The
stringsandstrings_sharedlibrary files declared but did not supply the functionmysql::collation::find_by_id(). (Bug #36353447)-
Raised the minimum required version of CMake to build MySQL from 3.5.1 to 3.14.6. (Bug #36338366)
References: See also: Bug #35553331.
Configuration of the backtrace library was performed too early in the build process, and the library itself was built with an incomplete set of compiler flags, differing in both these respects from the rest of the server. (Bug #36292247)
-
SET GLOBALoffline_mode=ONdid not always perform correctly when issued under high loads. (Bug #36275182)References: See also: Bug #36405894.
Upgraded
curlto version 8.6.0. (Bug #36267545)-
Added a new error message for the case when a timeout is detected in
net_read_raw_loop()rather than in the thread pool code. This includes information about the conditions triggering the timeout. This is an error-level message if the timeout occurs earlier than indicated bywait_timeout. (Bug #36250895)References: See also: Bug #34857147.
-
mysqldump did not always interpret the server version correctly. (Bug #36248967)
References: See also: Bug #36405879.
Condition pushdown to a view was rejected with a collation mismatch if the view was created with a different character set than the character set used when querying the view. (Bug #36246859)
Improved the SQL grammar in
sql/sql_yacc.yyby removing four shift-reduce conflicts which were not needed. (Bug #36221823)Use of the deprecated
exec_program()command has been replaced byexecute_process()to provide compatibility with CMake 3.28.1 and later. (Bug #36220656)The MLE component was added to the minimal RPM build. (Bug #36210740)
-
Some queries using
NULLIF()andEXCEPTraised an assertion inset_typelib(). (Bug #36151537)References: See also: Bug #33045412.
-
Certain queries raised an assertion in
EstimateDeleteRowsCost(). (Bug #36130806)References: This issue is a regression of: Bug #35590128.
A query of the form
SELECT 1 FROM t WHERE CAST(a AS UNSIGNED INTEGER) = 1 AND a = (SELECT 1 FROM t)led to an assertion initem_func.cc. (Bug #36128964)-
When selecting two empty strings that were combined with
UNIONas inSELECT '' AS a UNION SELECT '' AS b, the type of the resulting data wasCHAR(0)instead ofVARCHAR(0).We fix this by removing an exception that was made for strings of length 0. (Bug #36112585)
Upgraded the
protobuflibrary to version 25.1. (Bug #36108397)For building Enterprise Linux RPMs, the build scripts now point to a newer strip command (under
/opt/rh/gcc-toolset-12), and they now check that the corresponding dwz tool is available. Previously this was only implemented for EL8. (Bug #36090069)We now look for
gcc-arandgcc-ranlibwhen building on Oracle Linux with link-time optimization. (Bug #36089900)Use
sa_sigactionrather thansh_handlerfor catching fatal signals, which allows the signal handler to output more information when handlingSIGSEGVorSIGFPEsignals. (Bug #36082110)The MySQL client was unable to authenticate with mysql_native_password to old MySQL Server versions that don't support pluggable authentication, such as MySQL 5.0.15. (Bug #36066161)
Improved the messages written to the log during a server downgrade. (Bug #36053108)
Keyring component error logging now supplies more information than previously when the component is unable to initialize. (Bug #36037172)
Set
_ITERATOR_DEBUG_LEVELto0when compiling debug builds on Windows using Clang. (Bug #36032501)-
When performing a rollup on an
ENUMorSETcolumn, an assertion was raised insql/item_sum.ccduring resolution when type information for neither of these types could be found. (Bug #36028294)References: See also: Bug #33045412.
When a Common Table Expression (CTE) contained an
INTERSECTorEXCEPTset operation, the second use of the same CTE in a subsequent join returned a wrong result. (Bug #36002215)Killing a query, while it was evaluating an uncorrelated subquery containing a hash join during optimization, led to an assert in
sql/sql_select.cc. (Bug #35991384)The server sometimes terminated unexpectedly in response to a specific query. (Bug #35957627)
-
A rollup query with a window function such as
COUNT()in the select list, which was also part of anORDER BY, led to an unexpected shutdown of the server. (Bug #35947358)References: This issue is a regression of: Bug #33069747.
Improved view and trigger definer handling by view and table DDL. (Bug #35942937)
The server did not always return metadata to the client correctly for certain queries. (Bug #35904044, Bug #36521376)
Found and fixed an assertion failure at
handler::ha_index_end()inhandler.cc. (Bug #35877600)-
For a query such as
SELECT DISTINCT t1.x, t2.x FROM t AS t1, t AS t2 WHERE t1.pk = t2.x, wheret1.pk = t2.xandpkis the primary key, there is a functional dependencyt2.x->t1.x. This means that some candidate plans grouped on{t2.x, t1.x}and others on{t1.x}, which were both valid but yielded different row estimates for two sets of fields, since this did not take functional dependencies into account.Now we ensure that we perform a single calculation of the number of distinct rows, and use that number for all plan candidates. (Bug #35855573)
When running queries against a table with a multi-value index, the server sometimes exited unexpectedly, often while executing a complex
SELECTquery which used this index. (Bug #35789759)Improved code in
sql/item_subselect.cc. (Bug #35733778, Bug #35738531, Bug #35779012)Some aggregations of window functions were not handled correctly. (Bug #35560806)
CREATE USER IF EXISTSwas not always logged correctly. (Bug #35530823)The server did not disallow subqueries in partition expressions properly. These are invalid, and should cause a syntax error. (Bug #35476172)
-
Events created within stored programs were not always handled correctly. (Bug #35395333, Bug #36402968, Bug #37918920)
References: This issue is a regression of: Bug #17809, Bug #11745618.
Upgraded the minimum Boost version used to 1.84.0. (Bug #35259498)
Some
RANK() ... OVER()queries raised an assertion insql/sql_executor.cc. (Bug #35228083)When successive
ALTER TABLE ... ALGORITHM=COPYstatements were issued within 10 seconds of one another, then_rowsvalue became 0. (Bug #35127747)Removed a memory leak observed while running
authentication_kerberosunder Valgrind. (Bug #34482788, Bug #36570929)A query using
MAX(gave different results before and after an index was added to the column. (Bug #34057432)column)Some queries that used the
LEAD()orLAG()window functions on a column of typeSETorENUMhit an assertion during resolution. The same assertion was hit in some queries using theLEAST()orGREATEST()function on aSETorENUMcolumn. (Bug #33045412)When adding a
HAVINGcondition to a temporary table, it is expected that all the fields in theHAVINGcondition are already replaced with the temporary table fields, but for a query which had an expression involving the internalItem_rowtype in theHAVINGclause, constant expressions were not getting cached, so that theHAVINGclause still held references to the fields from the underlying tables. (Bug #30112096)-
In queries that materialized rows in a temporary table before performing hash join or streaming aggregation, data was sometimes copied twice from the temporary table to the join buffer or aggregation buffer. While this did not cause any wrong results, it led to inefficient use of buffer space with a possible negative impact on performance.
This was due to the internal
WalkTablesUnderAccessPath()function visiting tables inMATERIALIZEaccess paths twice: first when it saw theMATERIALIZEaccess path itself, and then again when it visited thetable_pathmember of the MATERIALIZE access path.We fix this by not visiting the table when seeing the
MATERIALIZEpath, and doing so only when seeing thetable_pathbelowMATERIALIZE. (Bug #113647, Bug #36190386) Updated the URL used for downloading the Boost C++ libraries. (Bug #113576, Bug #36164514)
In the debug server, an intersection comparing columns of different types sometimes triggered an assert in
sql/item.cc. (Bug #113385, Bug #36094867)A transform could be semantically invalid when the selected item in the subquery tested for
NULL; the left outer join with a grouped derived table might in such cases produceNULLwhile the original subquery might not. To prevent this from happening, we now bar such subqueries from being transformed. (Bug #113318, Bug #36070542)-
The fix for a previous issue, first addressed in MySQL 8.0.30, was incomplete.
Our thanks to Hao Lu for the contribution. (Bug #113174, Bug #36035044)
References: This issue is a regression of: Bug #110801, Bug #35328028.
-
On s390x, we now compile the FMA test with
-O2to avoid overoptimization.Our thanks to Jonathan Albrecht for the contribution. (Bug #113096, Bug #36016140)
-
Although s390x is a big-endian platform, the little-endian ICU data directory was used for compiling.
Our thanks to Jonathan Albrecht for the contribution. (Bug #113095, Bug #36016141)
SET SESSION optimizer_switch = 'hash_set_operations=off'after preparing a statement led to an assertion insql/sql_select.ccwhen trying to execute the same prepared statement. (Bug #112919, Bug #35970620)The server now uses
ER_NO_REFERENCED_ROW_2orER_ROW_IS_REFERENCED_2for foreign key errors whether error details are displayed, or not. In addition, we now display parent and child table details in error messages when the user has the proper grants. (Bug #112589, Bug #35868410)Incorrect results were sometimes obtained from a query that used a group by loose index scan. (Bug #112541, Bug #35854362)
An assertion in
sql/sql_derived.ccthat checked whether a referenced item in anItem_refobject had consistent outer reference information failed when the reference was of typeOUTER_REF. For objects of typeItem_outer_ref, dependency information was set for theItem_outer_refobject and the original expression that this reference points to, but an intermediate reference object between theItem_outer_refand the original expression did not contain this information. (Bug #112478, Bug #35846847)An assertion failed in debug builds when inserting data with a zero-length column, such as
CHAR(0)orBINARY(0), into a table. Now, a less strict assertion more accurately fails only if it detects that a non-zero number of bytes copied from a source is identical to the target. (Bug #111450, Bug #35507763)-
MySQL did not build correctly using the
muslversion oflibc.Our thanks to Sam James for the contribution. (Bug #110808, Bug #35330950)
Using a default string histogram on a
TEXTcolumn raised an assertion due to a collation mismatch when comparing histograms bucket values with the string returned byREVERSE(1). (Bug #110527, Bug #35227319)A
VALUESstatement in a correlated lateral or (other) dependent subquery yielded an incorrect result. (Bug #109252, Bug #110076, Bug #34852090, Bug #35087820)