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 executeFLUSH
statements 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.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, sincelibsasl.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)
-
When the
character_set_server
system variable was set usingSET PERSIST
orSET 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
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)Warnings for unused variables are turned into compilation errors when compiling with
-DMYSQL_MAINTAINER_MODE=1
. To avoid this use-DMYSQL_MAINTAINER_MODE=0
to 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_plugin
variable to the generatedmy.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 variableauthentication_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)
-
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 addingmysql_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
orALTER 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.
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 TO
andSTART 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:-
CHANGE REPLICATION SOURCE TO
options 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 REPLICA
options 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_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
toWRITESET
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
toTRANSACTIONS_APPLIED
in previous versions of MySQL. avoid_temporal_upgrade
andshow_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
,--skip-ssl
, and--admin-ssl
server options, as well as thehave_ssl
andhave_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. Useauthentication_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 SchemaINNODB_TABLESPACES
andINNODB_DATAFILES
tables provide tablespace metadata. (WL #14065) LOW_PRIORITY
used withLOCK TABLES ... WRITE
had had no effect since MySQL 5.5, and was deprecated in MySQL 5.6. It is removed in this release; includingLOW_PRIORITY
inLOCK TABLES
now causes a syntax error. (WL #16057)-
Support for use of the
AUTO_INCREMENT
modifier withFLOAT
andDOUBLE
columns was deprecated in MySQL 8.0, and is now removed. Attempting to use these together inCREATE TABLE
andALTER TABLE
statements 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_INCREMENT
orDOUBLE ... 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: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
ENGINE
clause withALTER TABLESPACE
orDROP TABLESPACE
causes the statement to be rejected with an error.ENGINE
clauses for theALTER TABLESPACE
andDROP 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 inGRANT
statements now causes a syntax error. Use theSET_ANY_DEFINER
andALLOW_NONEXISTENT_DEFINER
privileges 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_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
: Usecomponent_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
: Usecomponent_keyring_encrypted_file
instead; see Using the component_keyring_encrypted_file Encrypted File-Based Keyring Component.The
keyring_encrypted_file_data
andkeyring_encrypted_file_password
server system variables have also been removed. -
keyring_oci
: Usecomponent_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
, 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
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) toOFF
.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 isON
by default. This means that any attempt to use a nonstandard key as a foreign key in aCREATE TABLE
orALTER TABLE
statement is rejected with the errorER_FK_NO_INDEX_PARENT
; setting it toON
allows such statements to run, but they raiseER_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.
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
plusINSERT
statements, as well as those ofINSERT IGNORE
plusUPDATE
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()
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
PROCESSLIST
table. (Bug #35509371)
-
As part of the installation process, a file in JSON format named
mysql_upgrade_history
is 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_info
file 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-component
server option introduced in this release, setting--keyring-migration-source
to the name of the source component, and--keyring-migration-destination
the 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 TABLE
is run on the parent table. Automatic recalculation of persistent statistics byInnoDB
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 theANALYZE TABLE
statement. To disable it, includeMANUAL 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 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)
User variables assigned decimal values were rounded up in the
user_variables_by_thread
table. (Bug #35781732)
-
Important Change: This release adds a privilege which is specific to the use of the
FLUSH PRIVILEGES
statements. Unlike the existingRELOAD
privilege, the newFLUSH_PRIVILEGES
privilege applies only toFLUSH 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 executeFLUSH 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 theFLUSH_PRIVILEGES
privilege; if there are none, users having theRELOAD
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 executeOPTIMIZE LOCAL TABLE
andOPTIMIZE NO_WRITE_TO_BINLOG TABLE
statements.When upgrading from a previous releases, users already having the
SYSTEM_USER
privilege are automatically granted theOPTIMIZE_LOCAL_TABLE
privilege. (WL #15819)
-
Important Change: Previously, when the limit defined by
thread_pool_max_transactions_limit
was 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_limit
can be (and is) enforced again. See the description of thethread_pool_longrun_trx_limit
server system variable for more information about how this is determined. (WL #16132) The Performance Schema
tp_connections
thread pool plugin table contained no entries for connections that were in theadmin
group. (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_consistency
system variable is nowBEFORE_ON_PRIMARY_FAILOVER
; previously, this wasEVENTUAL
.The default value of the
group_replication_exit_state_action
system 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_consistency
set toBEFORE_ON_PRIMARY_FAILOVER
, the MySQLKILL
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 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
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
, andtemptable_use_mmap
.The settings affected by the
--innodb-dedicated-server
startup 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_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: 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_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. 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 (
.exe
and.dll
files) 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_version
is2
), the output now contains aquery_type
field identifying the type of statement (select, insert, delete, and so on). (Bug #36134568)
Important Change; Replication: The
TRANSACTION_GTID_TAG
privilege is now required to set thegtid_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 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,
valgrind
occasionally 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_shard
mutex caused a deadlock with another thread that had acquired thefil_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 increasinginnodb_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
anddata_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. (Bug #100597, Bug #112767, Bug #31791868, Bug #35952353)
Replication:
diagnostics.sql
prevented 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_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
andgtid_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
andM2
were in a group, withM1
usingu1
as its recovery user andM2
usingu2
as its own recovery user, and both usersu1
andu2
existing onM1
andM2
with all necessary privileges, and when a new memberM3
joined the group usingu2
as its recovery user.M3
knew only of useru2
, but did not know of useru1
, leadingSTART GROUP REPLICATION
onM2
to be rejected sinceM1
was unable to connect toM2
. This also generated a newview_id
listing the group members asM1
andM2
, butM1
nevertheless continued trying to connect toM3
, withM1
logging 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
ERROR
state, but did not honor the action specified bygroup_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
wasOFFLINE_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 secondariesi2
andi3
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
) reportedi1
asONLINE
andPRIMARY
,i2
asONLINE
andSECONDARY
, andi3
asONLINE
andSECONDARY
for 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)
JSON:
JOIN
andGROUP BY
handled someJSON
column 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)-
Events created within stored programs were not always handled correctly. (Bug #36402968, Bug #35395333)
References: This issue is a regression of: Bug #17809, Bug #11745618.
The
strings
andstrings_shared
library 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 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 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.yy
by 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()
andEXCEPT
raised 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
UNION
as 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
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
andgcc-ranlib
when building on Oracle Linux with link-time optimization. (Bug #36089900)Use
sa_sigaction
rather thansh_handler
for catching fatal signals, which allows the signal handler to output more information when handlingSIGSEGV
orSIGFPE
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
to0
when compiling debug builds on Windows using Clang. (Bug #36032501)-
When performing a rollup on an
ENUM
orSET
column, an assertion was raised insql/item_sum.cc
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
orEXCEPT
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/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 partof 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)
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.x
andpk
is 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
SELECT
query 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 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 insql/sql_executor.cc
. (Bug #35228083)When successive
ALTER TABLE ... ALGORITHM=COPY
statements were issued within 10 seconds of one another, then_rows
value became 0. (Bug #35127747)Removed a memory leak observed while running
authentication_kerberos
under 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 typeSET
orENUM
hit an assertion during resolution. The same assertion was hit in some queries using theLEAST()
orGREATEST()
function on aSET
orENUM
column. (Bug #33045412)When adding a
HAVING
condition to a temporary table, it is expected that all the fields in theHAVING
condition are already replaced with the temporary table fields, but for a query which had an expression involving the internalItem_row
type in theHAVING
clause, constant expressions were not getting cached, so that theHAVING
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 inMATERIALIZE
access paths twice: first when it saw theMATERIALIZE
access path itself, and then again when it visited thetable_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 thetable_path
belowMATERIALIZE
. (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 produceNULL
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 insql/sql_select.cc
when trying to execute the same prepared statement. (Bug #112919, Bug #35970620)The server now uses
ER_NO_REFERENCED_ROW_2
orER_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/sql_derived.cc
that checked whether a referenced item in anItem_ref
object 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_ref
object and the original expression that this reference points to, but an intermediate reference object between theItem_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)
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
musl
version oflibc
.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 byREVERSE(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)