MySQL 26.7 Release Notes  /  Changes in MySQL 26.7.0 (2026-07-28)

Changes in MySQL 26.7.0 (2026-07-28)

Audit Log Notes

  • The server could close unexpectedly if audit_log_encryption_password_get(keyring ID) was called. (Bug #33296125)

  • The following new Audit Log status variables are introduced in this version:

    • audit_log_file_count (Audit plugin)

    • audit_log.file_count (Audit component)

    This variable reports the number of audit log files generated by the Audit Log plugin or component when audit_log_format=JSON. The value is incremented for automatic rotations and decremented for pruning actions. (WL #17292)

Compilation Notes

  • The version of libfido2 used with MySQL was upgraded to 1.17.0. (Bug #39478664)

  • Fixed a potential memory leak in the comp_err utility. (Bug #36532183)

Component Notes

  • The command-service default DOM consumer stored SQL NULL fields as literal NULL string and recomputed field lengths with strlen() from the buffered row. This made SQL NULL indistinguishable from a real "NULL" value and truncated binary values at embedded NUL bytes. (Bug #39405458)

  • The statement result metadata service exposes field_info("type") as a stored-program argument type. That value is not always the raw MySQL field type carried in Column_metadata::type, so consumers cannot retrieve the original field type value from result metadata.

    As of this release, a component-safe mysql_field_type_t type and MYSQL_FIELD_TYPE_* values are added under services/bits to mirror raw MySQL field type values. That type is used for a new field_info("mysql_type") metadata key while preserving the existing type behavior. (Bug #39359509)

  • In previous releases, command-service consumers did not have a public mysql_command_options API to set or read extra client flags on a command-service MYSQL connection.

    The new command-services option, MYSQL_COMMAND_CLIENT_FLAGS, passes client flags to mysql_real_connect().

    Custom consumers can continue to override command capabilities with MYSQL_TEXT_CONSUMER_CLIENT_CAPABILITIES. The callback delegate remains unaware of MYSQL_COMMAND_CLIENT_FLAGS. (Bug #39349732)

  • Command-service consumers could not generically retrieve session-tracker information—such as schema, system-variable, transaction, and GTID changes—from a MYSQL_H handle.

    A new mysql_command_session_state service now provides iterator-based access to cached session-tracker entries. The cache is refreshed for each command, cleared on reset or errors, and retains the latest completion state for multi-result commands, giving consumers consistent access to current session state. (Bug #39330990)

Data Dictionary Notes

  • Data dictionary validation now checks invalid SET definitions with no elements in addition to ENUM definitions.

    Our thanks to Yongfei Ji for the contribution. (Bug #36357937)

Deprecation and Removal Notes

INFORMATION_SCHEMA Notes

  • Large AUTO_INCREMENT values (>INT64_MAX) were truncated in information_schema.tables.auto_increment. (Bug #116149, Bug #37077567)

InnoDB Notes

  • InnoDB: Fixed a potential race condition in processing of SET GLOBAL innodb_redo_log_encrypt = ON;. (Bug #39484886)

  • InnoDB: Fixed an issue relating to Clone validation. (Bug #39252970)

  • InnoDB: Fixed a debug assertion in row_upd_rec_in_place() for non-versioned ROW_FORMAT=REDUNDANT rows. (Bug #39165747)

  • InnoDB: During a buffer-pool resize, Adaptive Hash Index could be disabled in mysqld-auto.cnf even though innodb_adaptive_hash_index=ON. (Bug #39157211)

  • InnoDB: Fixed an issue relating to table maintenance and clean-up. (Bug #39091376)

  • InnoDB: Fixed an issue relating to unique indexes. (Bug #38501299)

  • InnoDB: InnoDB buffer-pool index statistics could report implausibly high INFORMATION_SCHEMA.INNODB_CACHED_INDEXES.N_CACHED_PAGES values, including values above the number of table pages or the buffer pool capacity. The metric now counts cached leaf index pages for the tracked index in the buffer pool structures and handles page reuse, split and merge operations, compressed pages, spatial indexes, and SDI correctly. (Bug #30164033)

  • InnoDB: In workloads that frequently create, truncate, or drop tables, InnoDB’s cached-index statistics map could grow very large because obsolete entries were retained. Adding a new index entry could then trigger expensive internal map maintenance while page latches were held, causing other transactions to wait for extended periods.

    InnoDB now pre-creates the statistics entry before btr_create() begins making page changes. This moves potentially costly map maintenance outside the latch-sensitive work, reducing prolonged contention during index creation and table truncation. (Bug #120441, Bug #39509101)

  • InnoDB: ReadView objects are shared through an intrusive list that is frequently accessed by both transaction threads and the purge thread. Their padding was intended to keep the list-link node on a separate CPU cache line, avoiding cache contention between these concurrent operations. However, the implementation assumed a 64-byte cache line and calculated padding based on the list node’s size, which did not reliably provide the intended isolation.

    The padding now reserves a full, platform-specific InnoDB cache line. This removes the hardcoded assumption and ensures the list-link node is separated from other ReadView fields regardless of its position within the object, reducing the risk of false sharing on different hardware platforms.

    Our thanks to Kaiwang Chen and the team at Tencent for the contribution. (Bug #116878, Bug #37569394)

  • InnoDB: Under certain circumstances, when adding an AUTO_INCREMENT column to an existing table, some records in that table could be skipped, resulting in inaccurate values in the AUTO_INCREMENT column.

    Our thanks to Huaxiong Song and the team at Alibaba for the contribution. (Bug #115136, Bug #37105825)

  • InnoDB: Source builds with WITH_INNODB_EXTRA_DEBUG enabled could fail.

    Our thanks to Sam Bird for the contribution. (Bug #114455, Bug #37706575)

  • MySQL Clone plugin supports the updated CalVer model.

    • Cloning is allowed when the version strings match.

    • Cloning is allowed across patch versions of a given version.

    • Cloning is allowed from Donor in one LTS to Recipient in next LTS.

    • Cloning is not allowed from donor in one LTS to recipient in an older LTS.

    • Cloning is not allowed from donor in one LTS to recipient in a later LTS.

    • Cloning is not allowed if either donor or recipient is not LTS and the Major and/or Minor versions mismatch.

    (WL #17317)

  • InnoDB undo tablespace creation and truncation no longer rely on a local undo truncate log files. Undo truncation progress information is now stored in the Undo Tablespace header.

    As of this release, undo truncation logs are no longer generated.

    Note

    For backward compatibility, existing truncate log files are still supported, but no new truncate logs are created.

    (WL #16989, WL #17187)

JSON Notes

  • Updating a JSON relational duality view that deleted rows from a nested child base table could violate foreign-key constraints. JSON Duality View update processing now performs deletes first, in reverse binding order, before inserts and updates are executed. (Bug #39566804)

  • Fixed an issue relating to JSON Schema validation. (Bug #39489024)

  • Fixed an issue relating to processing JSON date values. (Bug #39361343)

  • Fixed an issue relating to processing of nested arrays. (Bug #39255759)

  • Fixed an issue relating to metadata validation. (Bug #39255734)

  • JSON_VALUE() with RETURNING DATETIME and a DEFAULT value could return an invalid constant date when the expression was used in a DATE context, silently affecting predicates and joins. The datetime value is now extracted before narrowing to a date. (Bug #120788, Bug #39649893)

MySQL Programs Notes

  • When dumping the mysql.innodb_table_stats, and mysql.innodb_index_stats tables with --replace option, mysqldump added an IGNORE clause for the REPLACE command.

    Our thanks to Jinyou Ma for the contribution. (Bug #119810, Bug #38939358)

  • mysql_tzinfo_to_sql generated unnecessary warnings. For example:

    Warning: Unable to load '/usr/share/zoneinfo//iso3166.tab' as time zone. Skipping it.
    Warning: Unable to load '/usr/share/zoneinfo//leap-seconds.list' as time zone. Skipping it.
    Warning: Unable to load '/usr/share/zoneinfo//leapseconds' as time zone. Skipping it.
    Warning: Unable to load '/usr/share/zoneinfo//tzdata.zi' as time zone. Skipping it.
    Warning: Unable to load '/usr/share/zoneinfo//zone.tab' as time zone. Skipping it.
    Warning: Unable to load '/usr/share/zoneinfo//zone1970.tab' as time zone. Skipping it.

    As of this release, those warnings are suppressed.

    Our thanks to Daniël van Eeden for the contribution. (Bug #115021, Bug #36624161)

  • --extended-insert-multiline option is added for mysqldump. This option can be used with --extended-insert to write table data using a separate line for each row.

    --extended-insert-multiline is disabled by default.

    Our thanks to Michiel Beijen for the contribution. (Bug #112719, Bug #35912859)

Optimizer Notes

  • Fixed an issue relating to subquery_to_derived. (Bug #39525738)

  • Fixed an issue relating to ROLLUP queries. (Bug #39501528)

  • Fixed an issue related to error handling in aggregation of decimal data. (Bug #39474810)

  • Fixed an issue related to executing EXPLAIN on a LEFT JOIN. (Bug #39461426)

  • Fixed an issue relating to error-handling. (Bug #39272322)

  • Fixed an issue relating to user-variable handling. (Bug #39243027)

  • Fixed an issue relating to Common Table Expressions with subquery_to_derived enabled. (Bug #39179197)

  • Fixed an issue in ExtractValue(). (Bug #39138426)

  • Fixed an issue relating to dynamic scan execution.

    Our thanks to Mengchu Shi and the team from Alibaba for the contribution. (Bug #38657550)

  • Queries that referenced the same common table expression (CTE) from multiple query blocks could generate duplicate internal temporary-index names. When the CTE was materialized on disk, InnoDB could select the wrong internal index, resulting in a crash, assertion failure, “table does not exist” error, or incorrect query result.

    Internal temporary-index names are now regenerated when indexes are moved between slots, ensuring each generated index remains uniquely and consistently named.

    Our thanks to Wang Zhengmao for the contribution. (Bug #36492739)

  • Under certain circumstances, filters using IFNULL returned incorrect results. (Bug #36448705)

  • UNION ALL evaluated children in textual order. With EXISTS or LIMIT, this could cause expensive branches to be evaluated first, when a cheaper branch could produce a row immediately. (Bug #35767452)

  • Temporal results returned by GREATEST(), LEAST(), or COALESCE() could report an incorrect collation through the client protocol and the COLLATION() function. Temporal values use the binary collation, but these multi-purpose functions did not apply the required translation. Temporal results from these functions now correctly report the binary collation.

    Our thanks to Dirkjan Bussink for the contribution. (Bug #117543, Bug #37626671)

  • Some LEFT JOIN queries with OR conditions displayed dynamic range access in EXPLAIN, but still performed full scans of the inner table at execution time. This occurred because the optimizer did not recognize eligible outer-join predicates when evaluating range access.

    The optimizer now considers these predicates for dynamic range analysis, allowing eligible LEFT JOIN queries to use an index range scan re-planned for each outer row instead of repeatedly scanning the full inner table.

    Our thanks to Hope Lee for the contribution. (Bug #113288, Bug #36061036)

  • Using a view created with one or more CTE definitions could result in a syntax error.

    Our thanks to Vitali Vinahradski for the contribution. (Bug #111559, Bug #35536775)

  • A cached table could retain temporary-NULL state after a multi-table UPDATE involving a trigger, causing later valid statements to warn or fail under strict SQL mode. Errors were returned similar to the following:

    ERROR 1048 (23000): Column 'columnName' cannot be null

    Our thanks to Shun Yi and the team from Alibaba for the contribution. (Bug #110962, Bug #35373634)

  • TIMESTAMPDIFF() returned unexpected results when used with a WHERE clause. (Bug #108143, Bug #34499767)

Performance Schema Notes

  • Fixed an issue relating to OBJECT_INSTANCE_BEGIN columns. (Bug #39449066)

  • A fix in a previous version caused a performance overhead in prepared statement digests. (Bug #38809758)

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

  • Queries with the same SQL_DIGEST could produce identical summaries, even if they had distinct characteristics, such as differing ORDER BY clauses. The digest computation has been improved to better distinguish between these queries.

    Our thanks to Kaiwang Chen for the contribution. (Bug #31103386, Bug #115943, Bug #36997723)

Replication Notes

  • Important Change: MySQL 26.7 introduces the Change Stream Applier (CSA), a new implementation of the replica SQL applier for multi-threaded replication. CSA is an opt-in, per-channel alternative to the Multi-Threaded Applier (MTA). It uses a modular scheduling and execution design to improve parallel transaction application, make replication resources configurable per channel, and provide a foundation for future replication enhancements. CSA continues to use the existing replication channel commands and the relay log. Receiver-thread and storage-engine interfaces are unchanged, allowing supported channels to be migrated without changing the source-side replication protocol.

    CSA enables the following:

    • Configuring the replication applier independently for each channel.

    • Configuring one to 1,024 CSA worker threads per channel, rather than relying on one global value for all channels.

    • Separation of transaction application from commit ordering. When a worker cannot yet commit, it can apply another dependency-ready transaction instead of waiting idle.

    • Allows parallel reads of relay-log-backed transactions and release cached event memory as transactions are consumed.

    • Purges an inactive relay log file after all of its consumers have completed successfully and all preceding relay log files are also eligible for purging; a failed consumer retains its required file and prevents later files from being purged past it.

    • Improves responsiveness to STOP REPLICA and keep other channels running when one CSA channel encounters an error.

    • Exposes CSA configuration and worker state through Performance Schema.

    The following channel options are added:

    • APPLIER_VERSION = 1|2: Selects the applier implementation.

      • 1: Multi-Threaded Applier. Default for new channels.

      • 2: CSA

    • APPLIER_WORKER_COUNT: CSA-only. Sets the number of CSA workers for the channel. Range is 1-1024. If omitted for a new channel, replica_parallel_workers is used.

    • APPLIER_EVENT_MEMORY_LIMIT: CSA-only. Sets a per-channel cache limit for binlog events. Default is 0 when omitted for a new channel. The effective cache limit is at least equal to the value of replica_max_allowed_packet, a lower configured value produces a warning.

    For example:

    CHANGE REPLICATION SOURCE TO
      APPLIER_VERSION = 2,
      APPLIER_WORKER_COUNT = 8,
      APPLIER_EVENT_MEMORY_LIMIT = 1073741824
      FOR CHANNEL 'channel_name';

    To update an existing channel, you must stop the SQL thread first.

    The following features are not supported when CSA is enabled:

    • Statement-based or mixed-format binary logs.

    • File-position replication channels.

    • Replication from GTID-disabled sources or ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS.

    • GTID_MODE values other than ON.

    • GTID_ONLY=0 or REQUIRE_ROW_FORMAT=0.

    • Delayed replication (SOURCE_DELAY).

    • sql_replica_skip_counter for skipping portions of transactions.

    • START REPLICA ... UNTIL conditions other than SQL_BEFORE_GTIDS and SQL_AFTER_GTIDS.

    • replica_pending_jobs_size_max; use APPLIER_EVENT_MEMORY_LIMIT for CSA event-cache control instead.

    • IGNORE_SERVER_IDS, unnecessary for GTID replication because applied GTIDs are skipped automatically.

    • Legacy VCLE.

    • Extended applier statistics.

    (WL #10500)

  • Replication: Fixed an issue relating to client BINLOG execution with REPLICATION_APPLIER. (Bug #39474825)

  • Replication: Fixed an issue relating to heartbeat handling. (Bug #39377010)

  • Replication: On writable replicas with log_replica_updates disabled, concurrent local commits and applier work could cause a race condition. (Bug #39259437)

  • Replication: Fixed an issue relating to event rotate handling. (Bug #39253359)

  • Replication: A replication receiver configured with SOURCE_RETRY_COUNT=0 could stop after a later transient connection loss, despite SOURCE_RETRY_COUNT=0 allowing unlimited reconnect attempts. The inconsistency could also cause the receiver to exit without logging an additional reconnect error.

    Replication now consistently treats SOURCE_RETRY_COUNT=0 as unlimited across reconnect paths, allowing the receiver to continue retrying and catch up after repeated transient failures. (Bug #39086875)

  • Replication: Fixed an issue relating to error handling. (Bug #38924622)

  • Replication: ALTER USER statements with explicit empty authentication data were rewritten for the binary log without preserving the empty authentication string. This resulted in password_expired errors. (Bug #38478657)

  • Replication: If a replication channel was configured using an applier user, the privilege check for CREATE and DROP statements failed if those privileges are granted only at the database-specific level for that user. (Bug #37587555)

  • Replication: Under certain circumstances, multiple simultaneous queries on the binary_log_transaction_compression_stats table could cause the server to stop with an error. (Bug #36196212)

  • Replication: If explicit_defaults_for_timestamp was disabled, row-based replica apply or mysqlbinlog replay could stop when recomputing a stored, generated TIMESTAMP NOT NULL column from NULL input. Errors were returned similar to the following:

    Could not execute Write_rows event on table tablename; Column 'timestamp_col2' 
    cannot be null, Error_code: 1048; handler error No Error!

    The row is now applied using the field default and a warning is emitted. (Bug #120128, Bug #39182574)

  • Fixed several issues relating to validations. (Bug #39234600, Bug #38673268, Bug #38673285, Bug #38712932, Bug #39253416, Bug #39282368, Bug #39253383, Bug #39253491, Bug #39254867, Bug #39254885, Bug #39254896, Bug #39254914, Bug #39282350, Bug #39319907)

  • As of this release, the default value of group_replication_communication_stack is changed from XCOM to MYSQL. (WL #15709)

Security Notes

  • MySQL now supports post-quantum cryptography (PQC) in TLS 1.3 connections for OpenSSL 3.5.0 or later. This enables negotiation of PQC-capable TLS key-exchange groups, including hybrid classical/PQC groups, and advertising of PQC TLS handshake signature algorithms.

    The following system variables are introduced:

    • force_pqc: only accept main TLS connections negotiated with a PQC- compatible key exchange group.

    • admin_force_pqc: only accept admin TLS connections negotiated with a PQC- compatible key exchange group.

    • replication_force_pqc: require asynchronous replication TLS connections to use a PQC-compatible key exchange group.

    • group_replication_force_pqc: require Group Replication recovery TLS connections to use a PQC-compatible key exchange group.

    • mysqlx_force_pqc: only accept X Plugin TLS connections negotiated with a PQC-compatible key exchange group.

    • tls_kex: TLS key exchange groups to use for the main connection channel.

    • admin_tls_kex: TLS key exchange groups to use for the admin connection channel.

    • replication_tls_kex: TLS key exchange groups to use for asynchronous replication TLS connections.

    • group_replication_tls_kex: TLS key exchange groups to use for Group Replication recovery TLS connections.

    • mysqlx_tls_kex: TLS key exchange groups to use for X Plugin TLS connections.

    • The following boolean system variables define which algorithm is advertised. If enabled, PQC is used. If disabled, only classical TLS handshake signature algorithms are advertised.

      Note

      If enabled, but PQC is not available, the OpenSSL default is used.

      • use_pqc_sign: which algorithm is advertised on the main connection channel.

      • admin_use_pqc_sign: which algorithm is advertised on administration connections.

      • replication_use_pqc_sign: which algorithm is advertised on asynchronous replication connections.

      • group_replication_use_pqc_sign: which algorithm is advertised on Group Replication recovery connections.

      • mysqlx_use_pqc_sign: which algorithm is advertised on X Plugin connections.

    The following status variables are introduced:

    • Tls_key_exchange_algorithm: indicates the TLS key exchange group negotiated for the current TLS connection.

    • Tls_sign_algorithm: indicates the TLS handshake signature algorithm negotiated for the current TLS connection.

    • Mysqlx_force_pqc: value of the effective configuration applied to the current X plugin TLS channel.

    • Mysqlx_tls_kex: value of the effective configuration applied to the current X plugin TLS channel.

    • Mysqlx_use_pqc_sign: value of the effective configuration applied to the current X plugin TLS channel.

    (Bug #39536947, WL #17245)

Thread Pool Notes

  • The default value of thread_pool_max_unused_threads is changed from 2 to 32. (Bug #39405207)

  • MySQL Thread Pool plugin, formerly only available in MySQL Enterprise Edition, is now available in MySQL Community Edition 26.7.0. (WL #17296)

X Plugin Notes

  • Fixed several issues in the X Plugin. (Bug #39268692, Bug #39268863)

Functionality Added or Changed

  • Important Change: MySQL Server now uses calendar-based versioning for releases after the 9.7 LTS series. Version values use Year.Month.Patch (YY.M.P) format. MySQL 26.7.0 is the first such calendar-version release.

    The following are added to the mysql_version.h to identify the previous LTS version:

    • MYSQL_PREVIOUS_LTS_VERSION: The previous LTS version number. For example, "9.7.0" is the previous LTS version for MySQL 26.7.0.

    • MYSQL_PREVIOUS_LTS_VERSION_ID: The identifier of the previous LTS version. For example, "9.7.0" is represented as 90700.

    The versioning lineage defined in mysql_version.h enables clear upgrade and downgrade paths. (WL #17310)

  • MySQL upgrade performance is improved by streamlining the ALTER TABLE statements which run on mysql.general_log and mysql.slow_log.

    Our thanks to Karry Zhang and the team at Alibaba for the contribution. (Bug #118132, Bug #37944523)

Bugs Fixed

  • Fixed an issue in Spatial Data handling. (Bug #39489004)

  • Fixed several issues in the Clone plugin. (Bug #39252316, Bug #39245805, Bug #39245844, Bug #39253040, Bug #39253103)

  • It was not possible to start the server on Oracle Linux or Red Hat Linux 9 if innodb_redo_log_encrypt=ON was defined in the configuration file. (Bug #39181231)

  • Fixed an issue relating to connection-attribute parsing. (Bug #39116965)

  • An assertion failure could be returned for an UPDATE statement assigning the result of an IN subquery, if the subquery used a derived table with UNION. (Bug #38911659)

  • Some Polish characters were replaced by question marks (?) in client messages. (Bug #38036138)

  • Fixed an issue relating to table maintenance statement error handling after table and metadata-lock cleanup.

    Our thanks to Yin Peng and the team from Tencent for the contribution. (Bug #37797437)

  • Deleting a row from a table with a self-referencing foreign key caused replication to fail. (Bug #119996, Bug #39091367)

  • An INSERT ... SELECT through a view with ON DUPLICATE KEY UPDATE could cause an assertion failure. (Bug #119805, Bug #38901085)

  • Server upgrade checks could fail when validating events created under a different sql_mode than the one used in the target version, causing the upgrade to abort although the event was valid in its original context. (Bug #119672, Bug #39077967)

  • During LOAD DATA, fields can be marked temporarily nullable while input rows are parsed. If a row supplies NULL for a NOT NULL column, LOAD DATA could leave temporary NULL state on the table fields before returning to the same thread. A later INSERT in that same session can then treat valid non-NULL values as NULL and return ER_BAD_NULL_ERROR.

    Our thanks to Feng Chuanheng for the contribution. (Bug #118060, Bug #38939847)

  • The variable has_unique_key was assigned unnecessarily.

    Our thanks to Alex Xing for the contribution. (Bug #118057, Bug #37876712)

  • Upgrading from older 8.x releases with thousands of tables, views, routines, and events caused the memory consumed by server to grow continuously, leading to significant memory spikes.

    Memory management is improved for these scenarios. (Bug #117983, Bug #37832455, Bug #38031020)

  • NOW() accepted values outside the defined range (0-6) and did not return an error. (Bug #116307, Bug #37141651)

  • Rewriter patterns containing trailing semicolons did not load and match consistently with query digests produced by normal statement execution.

    Our thanks to Kaiwang Chen and the team at Tencent for the contribution. (Bug #116222, Bug #37100271)

  • key_object_cache_mutex and key_object_loading_cond were not registered.

    Our thanks to Huaxiong Song for the contribution. (Bug #115524, Bug #36809659)

  • The following were not properly defined as reserved keywords:

    • CUBE

    • EXTERNAL

    • QUALIFY

    • TABLESAMPLE

    The following were not properly defined as non-reserved keywords:

    • MANUAL

    • PARALLEL

    (Bug #114874, Bug #36584265)

  • The behavior of INSERT() was incorrect for multibyte characters. It inserted characters even if the given position was beyond the input string.

    Our thanks to Dirkjan Bussink for the contribution. (Bug #113962, Bug #36289412)

  • Under certain circumstances, LEAST() and GREATEST() could return unexpected results.

    Our thanks to Jinsheng Ba for the contribution. (Bug #113304, Bug #36065440)

  • The explain_filename() implementation was simplified by removing redundant code.

    Our thanks to Hiroyuki Sasagawa for the contribution. (Bug #104169, Bug #33064492)

  • Fixed a memory leak in statement_digest() and statement_digest_text(). (Bug #104115, Bug #33073320)


PREV   HOME   UP