MySQL 8.4 Release Notes

2 Changes in MySQL 8.4.6 (2025-07-22, LTS Release)

Note

These release notes were created with the assistance of HeatWave GenAI.

Compilation Notes

  • macOS: It is now possible to compile the server on MacOS using -DWITH_KERBEROS.

  • Solaris: Clang and GCC now can be used for compiling MySQL on Solaris. (Bug #30562248)

  • Upgraded the bundled libcurl library to version 8.14.1. (Bug #38042758)

  • MySQL Server now supports CMake 4, ensuring compatibility with future CMake versions where support for versions prior to 3.10 is expected to be discontinued. (Bug #38027636)

  • The included ICU library has been upgraded to version 77-1. (Bug #37870791)

  • The included zstd library has been upgraded to version 1.5.7. (Bug #37869972)

  • Disabled clang::musttail when building with GCC 15. (Bug #37776018)

  • Worked around an issue with list handling in certain older versions of CMake. (Bug #37709169)

  • Some compiler features tests did not pass when building with -fprofile-use. (Bug #37707556)

  • The linker tried to use the empty Cmake variable ${ICU_LIBRARIES}, even though the correct library (ext::icu) was already linked elsewhere. (Bug #36524167)

  • On MacOS, silenced deprecation warnings generated by Xcode 14; this includes suggestions to use snprintf(3) instead of sprintf(3), and warnings about possible loss of precision when converting from 64-bit to 32-bit integers. (Bug #34776172)

Configuration Notes

  • Microsoft Windows: An in-place upgrade of MySQL Server using MySQL Configurator failed when a Windows service name other than the default had been used. (Bug #37917039)

  • Microsoft Windows: When upgrading a server from 8.0 to a higher series, MySQL Configurator did not persist custom server settings in the my.ini file. (Bug #37481548)

  • Microsoft Windows: When upgrading a MySQL Server using MySQL Configurator, the process hung in the "Starting the server and upgrading system tables" step if a custom error log name was used. (Bug #37463478)

InnoDB Notes

  • Fixed an issue relating to importing tables. (Bug #37621360)

Installation Notes

  • Debian packages for installing MySQL can now be run by users other than root. This helps prevent issues for Debian or Ubuntu systems that require rootless installations. (Bug #37765153)

  • RPM and Yum repository installation are now supported for Red Hat Enterprise Linux and Oracle Linux 10. (Bug #37592019)

Functionality Added or Changed

  • Important Change: Added the mysql client --commands option, which enables or disables most mysql client commands.

    This option is enabled by default. To disable it, start the client with --commands=OFF or --skip-commands.

    For a complete list of all commands affected by this option, and additional information, see mysql Client Options. (WL #16949)

    References: See also: Bug #36416568, Bug #38066040.

  • Group Replication: Added the error ER_GRP_RPL_APPLIER_THD_KILLED, to distinguish when the applier thread has been terminated using SQL KILL, rather than stopped by an error. (Bug #37764717)

  • Binary packages that include curl rather than linking to the system curl library have been upgraded to use curl 8.14.1. (Bug #37389565)

Bugs Fixed

  • Important Note; Group Replication: The Group Communication System (GCS) handles Group Replication communication between members, and keeps track of the group membership and connections between all group members. Membership tracking includes the membership's current and previous two iterations. When a member leaves, the remaining members in the group keep a record of the departing member but stop communicating with it until it returns. For example: The group contains members M1, M2, and M3. M3 leaves the group; M1 and M2 stop communicating with M3. When a new member (M4) joins, it learns the previous iterations of this group's membership and attempts to communicate with all servers, including those from previous iterations (in this case, M3).

    In the event that some previous servers were gone and did not return, the new member continuously tried to connect to the missing servers; in some conditions, these ongoing connection attempts could introduce network latency affecting group member communication.

    In order to avoid this issue, connections to servers that belong to iterations of the group membership are now stopped after 5 minutes, which should be sufficient time to re-establish valid connections without imposing a continuing impact on group communication. (Bug #37704514)

  • Performance: Redundant conditions in some queries optimized away in MySQL 8.0 were no longer removed in later versions, leading to a signifcant drop in the performance of such queries. (Bug #117907, Bug #37808260)

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

  • NDB Cluster: Following an upgrade from NDB 8.0 to NDB 8.4, all data nodes in the cluster underwent an unexpected simultaneous restart. This occurred when the transaction coordinator had no scan state, leading to protocol timeout; the resulting misalignement in protocol states caused data nodes to shut down unexpectedly. This is fixed by extending existing handling of an unexpected SCAN_NEXTREQ signal to cover the case when the scan is already stateless. (Bug #37994985)

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

  • NDB Cluster: Concurrent ALTER TABLE statements could cause delays of up to 100 * TransactionDeadlockDetectionTimeout before failing with a lock wait timeout when a client held a conflicting row lock, stalling the accompanying get_commit_count() call. The retry mechanism has been adjusted to identify locking issues sooner. (Bug #37955025)

  • InnoDB: When rebuilding a primary key, the server sometimes encountered issues when duplicates were present, potentially leading to the server stopping unexpectedly.

    Our thanks to Xizhe Zhang and the team at Alibaba for the contribution. (Bug #37822992)

  • InnoDB: Fixed an issue relating to dropping columns that were part of an index. (Bug #37726881)

  • InnoDB: MySQL Community Edition binaries included unnecessary OpenTelemetry symbols, due to unprotected static arrays. (Bug #37689163)

  • InnoDB: The double write buffer was unnecessarily large. When calculating the number of segments per file, one extra segment was always added, whereas an extra segment should be added only if the number of Double_write instances is not divisible by the number of dblwr files. (Bug #37684656)

  • InnoDB: Fixed an issue relating to DELETE operations. (Bug #37478594)

  • InnoDB: Creating a secondary index on a VARCHAR column could allocate more memory than configured, with the amount allocated being directly related to the value of innodb_ddl_buffer_size, leading to errors similar to ERROR 1136 (21S01): Column count doesn't match value count at row 1. (Bug #37233273)

  • InnoDB: Fixed an issue relating to indexing spatial datatype columns. (Bug #36682518)

  • InnoDB: The temptable handler did not terminate cleanly during server shutdown, potentially causing the server to terminate unexpectedly. This issue has been addressed by implementing a mechanism to track and properly clean up temptable objects associated with each thread. (Bug #36538081)

  • InnoDB: A long semaphore wait crash could occur when a redo log consumer lagged behind after a failed MySQL Enterprise Backup incremental backup, preventing the redo log writer thread from advancing. Error messages were returned similar to the following:

    [Warning] [MY-013934] [InnoDB] Redo log writer is waiting for MEB redo 
    log consumer which is currently reading LSN=23335640211468 preventing 
    reclamation of subsequent portion of the redo log. Consider
    increasing innodb_redo_log_capacity.    
          

    (Bug #36330455)

  • InnoDB: Fixed an issue relating to range queries on tables. (Bug #31360522)

    References: See also: Bug #38063122.

  • Partitioning: Truncating a partition was rejected with a duplicate entry error when the partition ID exceeded INT_MAX, preventing creation of new partitioned tables. To mitigate this issue, the Table_partition_values_pk class constructor now uses ulonglong instead of int for the object ID. (Bug #35912852)

  • Replication: When using replication in a chain, CREATE TABLE ... AS SELECT sometimes resulted in inconsistent entries in the binary log, potentially causing replication to break on downstream servers. Error messages related to this issue included errors resulting from missing START TRANSACTION statements in the log. (Bug #37986380)

  • Replication: During semisync replication, when the length of the binary log suffix exceeded six digits (.999999), so that the next log file became—for example—mysql-bin.1000000, the replication protocol unexpectedly changed from semisynchronous to asynchronous.

    Our thanks to Wuhao Cao for the contribution. (Bug #115861, Bug #37024069)

  • Group Replication: The Gr_empty_consensus_proposals_count system status variable was not updated as expected. (Bug #37937927)

  • Group Replication: In an unstable network environment, a Group Replication InnoDB Cluster with group_replication_paxos_single_leader=ON experienced several long-running transactions that became stuck in the waiting for handler commit state. As a consequence, group_replication_set_as_primary() was forced to wait, which in turn blocked other incoming queries and rendered the cluster unwritable.

    The issue involving long-running transactions stuck in waiting for handler commit occurred as follows: During an intermittent network partition, a secondary node incorrectly assumed the leader role due to outdated or inaccurate membership information. This resulted in conflicts in synode number allocation, causing transactions originating from the primary node to remain incomplete.

    We fix this by making sure that a secondary node always reflect the latest, accurate state before pushing the view message to Paxos. This ensures that outdated or inconsistent membership information does not lead to conflicts in leadership or synode number allocation. (Bug #37764970)

    References: See also: Bug #117424, Bug #37237959, Bug #37645674.

  • NDB Cluster APIs: Excluding a VARCHAR column from an event definition resulted in an Invalid schema object version error. (Bug #37766391)

    References: See also: Bug #31848270.

  • RPM installations on Fedora 24 could not be completed because conflicting packages were pulled from upstream. This fix adds the proper obsoletions to block the conflicting packages. (Bug #37976913)

  • Some triggers which called stored routines did not always execute correctly. (Bug #37915445)

  • A view using a CTE which contained a subquery was not always handled correctly. (Bug #37832605)

  • Installing Oracle packages for MySQL on an Ubuntu 25.04 system was not possible where MySQL was already installed using the system's APT repositories. (Bug #37804480)

  • On Fedora 24, Oracle MySQL RPMs could not be installed due to package conflicts when MariaDB was already installed on the system. With this fix, the conflicts are not properly handled to allow MySQL Server to be installed successfully. (Bug #37798784)

  • Improved a previous fix for an issue in which client connections were not always terminated correctly during shutdown. (Bug #37755594)

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

  • The Fedora 42 RPM installation packages have been adapted to accommodate the merged /usr/bin and /usr/sbin directories in Fedora 42 and later. (Bug #37737658)

  • Performance of fulltext searches using InnoDB, particularly for phrase searches, has been improved. The efficiency of doc_id matching has been enhanced. (Bug #37682648)

  • Queries against the performance_schema.keyring_keys table caused issues when the keyring_okv plugin (see Using the keyring_okv KMIP Plugin) was installed but not configured correctly. (Bug #37655299)

  • The fix for Bug #30875669 was not actually included in the code for the mysql client when the bug was closed. The changes are now implemented. (Bug #37572191)

    References: See also: Bug #30875669.

  • An init file having one or more single lines, each containing multiple SQL statements, sometimes gave rise to errors during initialization. (Bug #37559598)

  • Some sequences of CREATE TABLE and DROP TABLE statements were not handled correctly. (Bug #37534068)

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

  • UPDATE ... SET ... could not always be rolled back successfully. (Bug #37489167)

  • Multiple DEFAULT column expressions in CREATE TABLE statements were not always handled correctly. (Bug #37436220)

  • Queries having a correlated subquery which performed aggregation were sometimes (incorrectly) rejected with duplicate key errors during execution.

    This issue was introduced by a previous fix which removed the restoration of the original reference slice (set_ref_item_slice(REF_SLICE_SAVED_BASE)) during JOIN::cleanup() execution under the assumption that this was not necessary. As a result, temporary table field references from previous executions were not cleared, leading to attempts to insert duplicate keys into temporary tables triggering the error Can't write; duplicate key in table.

    We fix this by restoring the original reference slice during cleanup, ensuring that any stale references are discarded. (Bug #37415167)

    References: See also: Bug #32141711. This issue is a regression of: Bug #35856247.

  • Unquoted semicolon characters (;) within comments were not always flagged as errors, in spite of the fact that they are not allowed. (Bug #37117875)

    References: See also: Bug #38063286.

  • A query using a nested aggregate function which contained a subquery was not always properly handled. (Bug #36421727)

  • When attempting to transform a subquery to a derived table, certain cases were not always considered. (Bug #36421710)

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

  • With optimizer_switch set to subquery_to_derived=on, some queries with ROLLUP were not handled properly. (Bug #36314993)

  • Setting max_join_size led to improper processing of some nested queries. (Bug #35625769)

  • The transform of a scalar subquery into a join with a derived table where the subquery is in the SELECT list and the containing query is implicitly grouped should be allowed, but was rejected when the subquery_to_derived optimizer switch was enabled. (Bug #35150438)

  • An error in include/assert_grep.inc could lead to erroneous results from any file that included it.

    Out thanks to Ke Yu for the contribution. (Bug #116239, Bug #37105430, Bug #37675340)

  • The query rewrite plugin (see The Rewriter Query Rewrite Plugin) did not work properly when the server was run with autocommit=OFF. (Bug #115437, Bug #36784795)