MySQL 8.4 Release 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)
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 of
COM_PROCESS_KILL
(removed), this function
has been reimplemented such that it uses
mysql_real_query()
to
execute KILL
.
mysql_list_fields()
:
Restored as previously implemented, along with
COM_FIELD_LIST
.
mysql_list_processes()
:
Reimplemented using
mysql_real_query()
to
execute SHOW PROCESSLIST
, in
place of COM_PROCESS_INFO
(removed).
mysql_refresh()
:
Reimplemented using
mysql_real_query()
to
execute FLUSH
statements in
place of COM_REFRESH
, which was removed
in MySQL 8.3.
mysql_shutdown()
:
Reimplemented using mysql_real_query() to execute a shutdown
command rather than COM_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, 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)
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)
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
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)
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.
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
); and
SHOW 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
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:
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
), and
MASTER_LOG_POS
(SOURCE_LOG_POS
).
START REPLICA
options removed:
MASTER_LOG_FILE
(SOURCE_LOG_FILE
) and
MASTER_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
); 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
, --skip-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:
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 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 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
: 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.
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)
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 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)
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 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)
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
limit
thread_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 by
thread_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 the
thread_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 the
admin
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 now
BEFORE_ON_PRIMARY_FAILOVER
; previously,
this was EVENTUAL
.
The default value of the
group_replication_exit_state_action
system variable is now OFFLINE_MODE
;
previously, this was READ_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 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 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 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 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, 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)
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 release
log.writer_mutex
; when
innodb_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 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:
Results for SHOW
ENGINE INNODB STATUS
showed an invalid value
(NULL
) as the name of the first thread in the
File IO
section.
(Bug #113819, Bug #36118112)
References: This issue is a regression of: Bug #34992157.
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. (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 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, Bug #36047891)
References: See also: Bug #37587252.
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 stored programs were not always handled correctly. (Bug #36402968, Bug #35395333)
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 item_func.cc
.
(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/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
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/sql_select.cc
.
(Bug #35991384)
The server sometimes terminated unexpectedly in response to a specific query. (Bug #35957627)
A rollup query with a window function such as
COUNT()
in the select list, which
was also part of 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, Bug #36521376)
Found and fixed an assertion failure at
handler::ha_index_end()
in
handler.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
, where
t1.pk = 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/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 in sql/sql_executor.cc
.
(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)
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()
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/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
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/sql_select.cc
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/sql_derived.cc
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)