MySQL 8.4 Release Notes  /  Changes in MySQL 8.4.0 (2024-04-30, LTS Release)

Changes in MySQL 8.4.0 (2024-04-30, LTS Release)

Audit Log Notes

  • 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)

C API Notes

  • Important Change: The following MySQL C API functions, removed in MySQL 8.3, have been reimplemented and restored in MySQL 8.4.0:

    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.dll outside 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, since libsasl.dll expects to load all its required dependencies from a directory of its won, SASL plugins are now located in a dedicated subdirectory. (Bug #36006295)

Character Set Support

  • When the character_set_server system variable was set using SET PERSIST or SET 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)

Compilation Notes

  • The libevent library has been removed. (Bug #36357190)

  • Added the libcno library. (Bug #36357181)

  • Some of the files in extra/libbacktrace contained incorrect licensing information, copyright information, or both. (Bug #36118772)

Configuration Notes

  • 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_plugin variable to the generated my.ini file, a variable removed in MySQL Server 8.4. It also removes it when upgrading an installation to MySQL 8.4. Note that the replacement variable authentication_policy is 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)

Deprecation and Removal Notes

  • Important Change: The deprecated mysql_native_password authentication plugin is now disabled by default. It can be enabled by starting MySQL with the new --mysql-native-password=ON server option, or by adding mysql_native_password=ON to 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 TABLE or ALTER TABLE statement 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.


    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 TO and START REPLICA have been removed and are no longer accepted by the server. They are listed here for each of these statements, with their replacements in brackets:

    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); and Com_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_join system 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_tracking to WRITESET in 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_at to TRANSACTIONS_APPLIED in previous versions of MySQL.

    • avoid_temporal_upgrade and show_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=NONE instead.

    • --old and --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 and --admin-ssl server options, as well as the have_ssl and have_openssl server system variables, were all deprecated in MySQL 8.0.26, and are all removed in this release. Use --tls-version and --admin-tls-version instead.

    • default_authentication_plugin: Deprecated in MySQL 8.0.27, and now removed. Use authentication_policy instead.

      You should also be aware that the syntax for setting the authentication_policy variable 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 EXPLAIN output, 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.TABLESPACES table, deprecated in MySQL 8.0.22, has now been removed.

    For InnoDB tables, the Information Schema INNODB_TABLESPACES and INNODB_DATAFILES tables provide tablespace metadata. (WL #14065)

  • LOW_PRIORITY used with LOCK TABLES ... WRITE had had no effect since MySQL 5.5, and was deprecated in MySQL 5.6. It is removed in this release; including LOW_PRIORITY in LOCK TABLES now causes a syntax error. (WL #16057)

  • Support for use of the AUTO_INCREMENT modifier with FLOAT and DOUBLE columns was deprecated in MySQL 8.0, and is now removed. Attempting to use these together in CREATE TABLE and ALTER TABLE statements now causes an Incorrect column specifier for column error (ER_WRONG_FIELD_SPEC).


    Prior to upgrading to this release, you must alter any table having a FLOAT ... AUTO_INCREMENT or DOUBLE ... AUTO_INCREMENT column 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 ENGINE clause from the following SQL statements:

    • DROP TABLESPACE (all variants)


    • All other variants of ALTER TABLESPACE, with the two exceptions listed here:



    Other than in the exceptional cases listed previously, use of the ENGINE clause with ALTER TABLESPACE or DROP TABLESPACE causes the statement to be rejected with an error.

    ENGINE clauses for the ALTER TABLESPACE and DROP TABLESPACE statements were deprecated in MySQL 8.0. (WL #16055)

  • The SET_USER_ID privilege, deprecated in MySQL 8.2.0, has been removed in this release, and its use in GRANT statements now causes a syntax error. Use the SET_ANY_DEFINER and ALLOW_NONEXISTENT_DEFINER privileges instead. (WL #15875)

  • Removed the deprecated mysql_upgrade utility, which provided no functionality since 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 MySQL Shell's 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: Use authentication_webauthn instead; see WebAuthn Pluggable Authentication.

      The authentication_fido_rp_id server system variable, mysql client --fido-register-factor option, and the -DWITH_FIDO CMake option have also been removed.

    • keyring_file: Use component_keyring_file instead; see Using the component_keyring_file File-Based Keyring Component.

      The keyring_file_data system variable has also been removed. In addition, the CMake options -DINSTALL_MYSQLKEYRINGDIR and -DWITH_KEYRING_TEST have been removed.

    • keyring_encrypted_file: Use component_keyring_encrypted_file instead; see Using the component_keyring_encrypted_file Encrypted File-Based Keyring Component.

      The keyring_encrypted_file_data and keyring_encrypted_file_password server system variables have also been removed.

    • keyring_oci: Use component_keyring_oci instead; 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, and keyring_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, and admin_tls_ciphersuites. See the descriptions of these variables for their permitted values.

    You should be aware that libmysqlclient is 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) to OFF.

    • Start the server with the --skip-restrict-fk-on-non-standard-key option (also new in this release).

    The restrict_fk_on_non_standard_key server system variable is ON by default. This means that any attempt to use a nonstandard key as a foreign key in a CREATE TABLE or ALTER TABLE statement is rejected with the error ER_FK_NO_INDEX_PARENT; setting it to ON allows such statements to run, but they raise ER_WARN_DEPRECATED_NON_STANDARD_KEY as 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_key for more information. (WL #15699)

    References: See also: Bug #30615520, Bug #97836.

Firewall Notes

  • 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 DELETE plus INSERT statements, as well as those of INSERT IGNORE plus UPDATE operations, 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() or sp_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 PROCESSLIST table. (Bug #35509371)

Keyring Notes

Optimizer Notes

  • This release adds support for automatic updates of histograms. When this feature is enabled for a given histogram, the histogram is updated whenever ANALYZE TABLE is run on the parent table. Automatic recalculation of persistent statistics by InnoDB also 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 UPDATE option (added in this release) for the ANALYZE TABLE statement. To disable it, include MANUAL UPDATE instead. 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 using MANUAL 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)

Performance Schema Notes

Server Administration

  • Important Change: This release adds a privilege which is specific to the use of the FLUSH PRIVILEGES statements. Unlike the existing RELOAD privilege, the new FLUSH_PRIVILEGES privilege applies only to FLUSH PRIVILEGES statements. This privilege is global in scope, and is applicable to users and roles.

    The RELOAD privilege continues to be supported in this capacity to provide backwards compatibility; users having this privilege can still execute FLUSH PRIVILEGES statements 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 the FLUSH_PRIVILEGES privilege; if there are none, users having the RELOAD privilege are automatically assigned the new privilege as well. (WL #16044)

  • Important Change: This release adds a new OPTIMIZE_LOCAL_TABLE privilege. Users must have this privilege to execute OPTIMIZE LOCAL TABLE and OPTIMIZE NO_WRITE_TO_BINLOG TABLE statements.

    When upgrading from a previous releases, users already having the SYSTEM_USER privilege are automatically granted the OPTIMIZE_LOCAL_TABLE privilege. (WL #15819)

Thread Pool Notes

  • The Performance Schema tp_connections thread pool plugin table contained no entries for connections that were in the admin group. (Bug #36296830)

Functionality Added or Changed

  • 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: The default values of two server system variables relating to Group Replication have changed:

    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_consistency set to BEFORE_ON_PRIMARY_FAILOVER, the MySQL KILL statement 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 (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 successive ER_IB_LONG_ROLLBACK. (WL #15822)

  • InnoDB: Changed the default values for the following InnoDB configuration 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, and temptable_use_mmap. The settings affected by innodb_dedicated_server also changed.

    For a list of new default values in comparison to MySQL 8.0, see What Is New in MySQL 8.4. (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_recovery server system variable.

  • Group Replication: When a member rejoining a group has transactions to apply on the group_replication_applier channel 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_worker table, 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: 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_collection system 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_collection can be changed only when Group Replication is not running, and has no effect on a group running in multi-primary mode. To change from multi-primary mode and single-primary mode, use the group_replication_switch_to_single_primary_mode() function; see Changing the Group Mode, for more information about this. 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)

  • The clone plugin version requirements were 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 point release number also had to match.

    For example, clone functionality now permits cloning 8.4.0 to 8.4.14 and 8.0.51 to 8.0.37. For 8.0, previous restrictions still apply to versions older than 8.0.37, so cloning the likes of 8.0.36 to 8.0.42 or vice-versa is not permitted. (Bug #36293529, WL #15989)

  • When using the iterator-based format for EXPLAIN FORMAT=JSON (that is, when explain_json_format_version is 2), the output now contains a query_type field identifying the type of statement (select, insert, delete, and so on). (Bug #36134568)

Bugs Fixed

  • Important Change; Replication: The TRANSACTION_GTID_TAG privilege is now required to set the gtid_executed server 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 releases log.writer_mutex, which in case of innodb_log_writer_threads=OFF potentially led to other threads writing to redo log in-between. (Bug #36425219)

  • InnoDB: Some FTS operations on tables with FTS indexes could have caused 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 #36343647)

  • InnoDB: When creating an index on a table containing data, valgrind occasionally reported reads of uninitialized memory from ddl::Builder::bulk_add_row. (Bug #36342792)

  • InnoDB: On Windows, keeping a file open without a shared write lock and attempting to acquire the fil_shard mutex caused a deadlock with another thread that had acquired the fil_shard mutex 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: With innodb_parallel_read_threads set to a value greater than 1, InnoDB unnecessarily 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 increasing innodb_redo_log_capacity size. (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.log file when attempting to truncate the undo tablespace. (Bug #112262, Bug #35784192)

  • InnoDB: With innodb_parallel_read_threads set 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_lock and data_lock_waits tables 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. In addition, added the ability to provide an index hint that forces use of a clustered index. (Bug #100597, Bug #112767, Bug #31791868, Bug #35952353)

    References: This issue is a regression of: Bug #12978.

  • Replication: diagnostics.sql prevented upgrades to MySQL 8.4.0 from earlier versions of MySQL when restoring from data containing old replication terminology such as SHOW SLAVE STATUS. (Bug #36323066)

  • Replication: Gtid_tagged_log_event encoded 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_next server 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=ROW and gtid_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 COMMIT of 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_FAILURE error 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 M1 and M2 were in a group, with M1 using u1 as its recovery user and M2 using u2 as its own recovery user, and both users u1 and u2 existing on M1 and M2 with all necessary privileges, and when a new member M3 joined the group using u2 as its recovery user. M3 knew only of user u2, but did not know of user u1, leading START GROUP REPLICATION on M2 to be rejected since M1 was unable to connect to M2. This also generated a new view_id listing the group members as M1 and M2, but M1 nevertheless continued trying to connect to M3, with M1 logging Error in establishing mysql connection and M3 logging Access denied errors for the connection attempts from M1.

    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 ERROR state, but did not honor the action specified by group_replication_exit_state_action; these are listed here:

    • When an error occurred while enabling super_read_only

    • When 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_action was OFFLINE_MODE and 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 i1 and two secondaries i2 and i3 started 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_members table on the former primary (i1) reported i1 as ONLINE and PRIMARY, i2 as ONLINE and SECONDARY, and i3 as ONLINE and SECONDARY for an extended period of time (12 hours or more) until the mysqld process was restarted on i1.

    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 of SSL_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 the SSL_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)

  • JSON: JOIN and GROUP BY handled some JSON column values differently. (Bug #101048, Bug #31969607)

  • MySQL NDB ClusterJ: The setLimits() method can now be chained to deletePersistentAll() to limit the number of items to delete. See the description of deletePersistentAll() for details. (Bug #36049906)

  • Events created within other stored programs were not always handled correctly. (Bug #36402968)

    References: This issue is a regression of: Bug #17809, Bug #11745618.

  • The strings and strings_shared library files declared but did not supply the function mysql::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 GLOBAL offline_mode=ON did not always perform correctly when issued under high loads. (Bug #36275182)

    References: See also: Bug #36405894.

  • Upgraded curl to 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 by wait_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.yy by removing four shift-reduce conflicts which were not needed. (Bug #36221823)

  • Use of the deprecated exec_program() command has been replaced by execute_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() and EXCEPT raised an assertion in set_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 in (Bug #36128964)

  • When selecting two empty strings that were combined with UNION as in SELECT '' AS a UNION SELECT '' AS b, the type of the resulting data was CHAR(0) instead of VARCHAR(0).

    We fix this by removing an exception that was made for strings of length 0. (Bug #36112585)

  • Upgraded the protobuf library 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-ar and gcc-ranlib when building on Oracle Linux with link-time optimization. (Bug #36089900)

  • Use sa_sigaction rather than sh_handler for catching fatal signals, which allows the signal handler to output more information when handling SIGSEGV or SIGFPE signals. (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_LEVEL to 0 when compiling debug builds on Windows using Clang. (Bug #36032501)

  • When performing a rollup on an ENUM or SET column, an assertion was raised in sql/ during 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 INTERSECT or EXCEPT set 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/ (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 partof an ORDER 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)

  • Found and fixed an assertion failure at handler::ha_index_end() in (Bug #35877600)

  • For a query such as SELECT DISTINCT t1.x, t2.x FROM t AS t1, t AS t2 WHERE = t2.x, where = t2.x and pk is the primary key, there is a functional dependency t2.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 SELECT query which used this index. (Bug #35789759)

  • Improved code in sql/ (Bug #35733778, Bug #35738531, Bug #35779012)

  • Some aggregations of window functions were not handled correctly. (Bug #35560806)

  • CREATE USER IF EXISTS was 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)

  • Upgraded the minimum Boost version used to 1.84.0. (Bug #35259498)

  • Some RANK() ... OVER() queries raised an assertion in sql/ (Bug #35228083)

  • When successive ALTER TABLE ... ALGORITHM=COPY statements were issued within 10 seconds of one another, the n_rows value became 0. (Bug #35127747)

  • Running two concurrent OPTIMIZE TABLE statements on the same table with fulltext indexes and innodb_optimize_fulltext_only enabled sometimes caused the server to exit. (Bug #34929814)

  • Removed a memory leak observed while running authentication_kerberos under Valgrind. (Bug #34482788)

  • A query using MAX(column) gave different results before and after an index was added to the column. (Bug #34057432)

  • Some queries that used the LEAD() or LAG() window functions on a column of type SET or ENUM hit an assertion during resolution. The same assertion was hit in some queries using the LEAST() or GREATEST() function on a SET or ENUM column. (Bug #33045412)

  • When adding a HAVING condition to a temporary table, it is expected that all the fields in the HAVING condition are already replaced with the temporary table fields, but for a query which had an expression involving the internal Item_row type in the HAVING clause, constant expressions were not getting cached, so that the HAVING clause 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 in MATERIALIZE access paths twice: first when it saw the MATERIALIZE access path itself, and then again when it visited the table_path member of the MATERIALIZE access path.

    We fix this by not visiting the table when seeing the MATERIALIZE path, and doing so only when seeing the table_path below MATERIALIZE. (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/ (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 produce NULL while 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 -O2 to 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 in sql/ when trying to execute the same prepared statement. (Bug #112919, Bug #35970620)

  • The server now uses ER_NO_REFERENCED_ROW_2 or ER_ROW_IS_REFERENCED_2 for 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/ that checked whether a referenced item in an Item_ref object had consistent outer reference information failed when the reference was of type OUTER_REF. For objects of type Item_outer_ref, dependency information was set for the Item_outer_ref object and the original expression that this reference points to, but an intermediate reference object between the Item_outer_ref and 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) or BINARY(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 musl version of libc.

    Our thanks to Sam James for the contribution. (Bug #110808, Bug #35330950)

  • Using a default string histogram on a TEXT column raised an assertion due to a collation mismatch when comparing histograms bucket values with the string returned by REVERSE(1). (Bug #110527, Bug #35227319)

  • A VALUES statement in a correlated lateral or (other) dependent subquery yielded an incorrect result. (Bug #109252, Bug #110076, Bug #34852090, Bug #35087820)