MySQL 9.7 Release Notes  /  Changes in MySQL 9.7.0 (2026-04-21)

Changes in MySQL 9.7.0 (2026-04-21)

Note

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

Atomic DDL Notes

  • Dropping a database is now possible even if its corresponding directory is missing from the file system, maintaining a consistent state for the database. (Bug #38711166)

  • Generated Invisible Primary Keys (GIPK) were added to tables even when UNIQUE NOT NULL keys existed, when sql_generate_invisible_primary_key=ON. If the unique key was autoincremented, GIPK creation failed.

    As of this release, UNIQUE NOT NULL keys are treated as Primary Key-equivalent for CREATE and ALTER statements. (Bug #38195294)

  • Applying mysqlbinlog output failed while executing CREATE TABLE ... START TRANSACTION which were immediately followed by comments, preceded by #. Errors were returned similar to the following:

            ERROR 3977 (HY000) at line 117: Only BINLOG INSERT, COMMIT and
            ROLLBACK statements are allowed after CREATE TABLE with START
            TRANSACTION statement.

    (Bug #36313112)

  • It was not possible to create tables with a Primary Key Equivalent if SQL_REQUIRE_PRIMARY_KEY was enabled. Errors were returned similar to the following:

    ERROR 3750 (HY000): Unable to create or change a table without a primary key, 
    when the system variable 'sql_require_primary_key' is set. Add a primary key 
    to the table or unset this variable to avoid this message. Note that tables 
    without a primary key can cause performance problems in row-based 
    replication, so please consult your DBA before changing this setting.

    (Bug #31402520)

  • It was not possible to drop columns, on a table with virtual columns, using LOCK=NONE. (Bug #83557, Bug #24962142)

Audit Log Notes

  • Fixed an issue related to processing certain gzip files. The MySQL Server has been updated to relax the .gz header checks, allowing ordinary gzip files to be processed. Errors were returned similar to the following:

    Invalid audit log file content

    (Bug #38980223)

  • Fixed an issue related to the audit_log_prune_seconds system variable. You can now set audit_log_prune_seconds. Checks have been added to ensure audit_log_prune_seconds does not exceed a certain threshold based on other system variable values, including log_offload.log_analytics_schedule and audit_log_rotate_on_time. (Bug #38941456)

  • A new feature has been introduced that rotates the audit log file based on elapsed time, controlled by the new variable audit_log.rotate_on_time. (WL #17213)

  • Audit Log now supports automatic recovery from invalid filter configurations, ensuring that the server can start even if an invalid filter is found in the table. With this update, if an invalid filter configuration is detected, it will be replaced in- memory at startup with a default filter that logs all events, preventing any loss of audit activity. This feature is controlled by the global variable audit_log.filter_recovery_mode (or audit_log_filter_recovery_mode for the Audit Log plugin), which allows users to choose from three recovery modes: LOG_ALL_IF_INVALID_FILTER_DETECTED, LOG_NOTHING_IF_INVALID_FILTER_DETECTED, and ABORT_IF_INVALID_FILTER_DETECTED. This enhancement provides greater flexibility and reliability in managing audit log configurations, reducing the risk of operational issues and ensuring that critical audit data is not missed.

    See audit_log.filter_recovery_mode and audit_log_filter_recovery_mode for more information. (WL #17179)

Authentication Notes

  • Authentication now supports PBKDF2 storage format with Caching_sha2_password, providing enhanced security and flexibility. This update allows for the use of PBKDF2 with SHA512, enabling a smoother migration path from existing formats and ensuring even stronger security guarantees. With this change, users can switch to the new storage format without requiring client-side modifications, and administrators can enforce the preferred storage format for added security. Overall, this enhancement strengthens password protection and offers a more robust authentication experience.

    See Caching SHA-2 Pluggable Authentication for more information. (WL #17160)

Compilation Notes

  • The included zlib library has been upgraded to version 1.3.2. (Bug #38987448)

Component Notes

Configuration Notes

  • Microsoft Windows: On Windows, MySQL Configurator did not validate group names defined with --named-pipe-full-access-group.

    As of this release, an error is returned if the group does not exist. (Bug #38068986)

Data Dictionary Notes

  • When altering a table's character set, the date and time data type columns are converted in both the data dictionary and SDI. However, the new collation_id in SDI did not match that of the Field object.

    As of this release, ALTER TABLE CONVERT TO CHARACTER SET does not alter the character set for temporal types stored in data dictionary or SDI. The server always uses my_charset_latin1 for temporal types in data dictionary and SDI.

    Our thanks to Venkatesh Prasad Venugopal and the team at Percona for the contribution. (Bug #114830, Bug #36574259)

SQL Function and Operator Notes

  • Fixed an issue relating to the DEFAULT() function. (Bug #39057054)

Replication with GTIDs

  • A new variable, replica_allow_higher_version_source, has been introduced that lets you enable or disable replication from a higher version source into a lower version replica. (WL #17202)

InnoDB Notes

  • Memory usage during FTS index construction for large tables has been optimized. (Bug #39040226)

  • Fixed an issue relating to multi-value indexes. (Bug #39040128)

  • Fixed an issue in the parallel reader. (Bug #39033858)

  • dict_sdi_create_idx_in_mem function added columns in a different order than expected, with the compressed_len and uncompressed_len fields swapped. (Bug #38810801)

  • Under certain circumstances, running CREATE INDEX with a high value for --innodb_parallel_read_threads could cause the disk space to fill up, leading to disk space exhaustion. (Bug #38370155)

  • Fixed an issue related to TRUNCATE TABLE. (Bug #38169053)

  • Under certain circumstances, if the cgroups memory limit was set to a very high value, and --innodb-dedicated-server=ON, MySQL could fail to start. (Bug #37944614)

  • Under certain circumstances, when calculating the maximum possible index record size, an assertion failure could occur. (Bug #85060, Bug #25579578)

  • MySQL Server now supports handling resource limitations set using the cpuset cgroup, providing a mechanism for assigning a set of CPUs to the application running in the cgroup. This update enables the server to adhere to the restrictions set by the cpuset-cpus cgroup controller, ensuring accurate calculation of logical CPUs available to the MySQL Server. With this enhancement, users can expect improved performance and efficient resource utilization, as the server can now correctly determine the number of logical CPUs according to cgroup restrictions. (WL #16851)

  • MySQL Clone plugin now supports cloning between consecutive LTS versions higher than 9.7.0.

    See Clone Plugin Limitations and Remote Cloning Prerequisites. (WL #16520)

JSON Notes

  • Using the monthname function within a JSON scope resulted in an assertion error. Errors were returned similar to the following:

    Assertion `mtime.time_type == MYSQL_TIMESTAMP_DATE in JSON

    (Bug #38980997)

  • MySQL Community Server now supports DML operations on JSON Duality Views, enabling users to perform insert, update, and delete operations on these views. This enhancement expands the functionality of JSON Duality Views, which were previously limited to DDL operations in the Community Server edition. With this update, users can now fully leverage the capabilities of JSON Duality Views in MySQL Community Server, making it easier to manage and manipulate data in a flexible and efficient manner.

    See DML Operations on JSON Duality Views for more information. (WL #17246)

  • MySQL now supports the use of auto-increment columns in DML operations with JSON duality views, allowing for more flexible and efficient data management. With this update, you can leverage auto-generated values for primary keys, enabling easier insertion of data into JSON duality views. The system automatically handles the generation of these values, streamlining the data insertion process and reducing the need for manual intervention. This enhancement provides a more seamless and intuitive experience for users working with JSON duality views, making it easier to manage and manipulate data in a variety of scenarios. (WL #17056)

Optimizer Notes

  • Fixed an issue relating to optimized prepared DELETE and UPDATE statements. (Bug #39071552)

  • Fixed an issue relating to Batched Key Access path and partitioning. (Bug #38947039)

  • Fixed an issue relating to query management. (Bug #38928287)

  • Fixed an issue relating to memory management. (Bug #38573278)

  • TIMEDIFF() returned the wrong result if the first argument was DATETIME and the second argument was DATE. (Bug #38181443, WL #16895)

  • TIMEDIFF() did not return NULL if unsupported values were used. (Bug #38179658, WL #16895)

  • FROM_DAYS() did not handle out of range values, or values less than 366, consistently. (Bug #38177844, Bug #38177993, WL #16895)

  • DAYNAME() did not return the day name if used in an arithmetic expression but returned the day number instead. (Bug #38177821, WL #16895)

  • ADDDATE() returned an incorrect result if the first argument was year zero (0000). (Bug #38177766, WL #16895)

  • When copying a DATE value to an INTEGER column, the DATE value was extended to DATETIME and 00:00:00 was added to it. (Bug #38043311)

  • Fixed an issue relating to the Optimizer's SQL planner. (Bug #35634700)

  • Overflow handling of date arithmetic has been improved. (Bug #32019977)

  • CAST() of a year column returned the wrong result. (Bug #29616536, Bug #35093107, WL #16895)

  • Under certain circumstances, with ALLOW_INVALID_DATES sql_mode enabled, invalid dates were not properly handled and no warning was issued if they were set to NULL. (Bug #20583945, WL #16895)

  • ADDTIME, SUBTIME, ADDDATE, and SUBDATE did not return NULL for invalid values. (Bug #12805124)

  • When errors and warnings occured during background histogram updates, the conditions in the diagnostic area were not cleared, leading to future background histogram updates emitted the same stale conditions to the error log.

    Our thanks to Tony Chen and the team at Amazon for the contribution. (Bug #119922, Bug #38983545)

  • IN operator returned an unexpected result if one of values in the list is NULL. (Bug #119650, Bug #38831745)

  • Datetime comparisons were inconsistent depending on the type used to store the values, INT or BIGINT. (Bug #119136, Bug #38819341, WL #16895)

  • Fixed an issue with NULL detection for temporal data types in derived tables after a derived merge.

    Our thanks to Xingyu Yang and the team at Tencent for the contribution. (Bug #118658, Bug #38191248)

  • Under certain circumstances, INTERSECT could return an incorrect result. (Bug #117911, Bug #37804715)

  • A histogram generated by ANALYZE TABLE UPDATE HISTOGRAM ON col_name was not be accepted by ANALYZE TABLE UPDATE HISTOGRAM ON col_name USING DATA ... if the histogram was built on a bigint column with values outside the uint32 range.

    Our thanks to Tianfeng Li for the contribution. (Bug #116611, Bug #37269033)

  • Conditions on const tables and on previously joined tables were not consistently taken into account when building ranges in get_quick_record_count(). This could lead to suboptimal or incorrect range estimates, especially when range predicates depended on values from const or earlier-joined tables.

    Our thanks to Xingyu Yang for the contribution. (Bug #112737, Bug #35912840)

  • Using DISTINCT with date functions returned inconsistent results. (Bug #109351, Bug #34889757)

  • Assigning a date value to a bigint column in MySQL resulted in zeroes being appended to the end of the value, unless an explicit cast was used. Support for automatic casting in assignment operations has been added when the right-hand side is a single value or column. (Bug #79563, Bug #22353325, WL #16895)

  • The Hypergraph Optimizer is now available in MySQL Community Edition.

    It can be enabled in one of the following ways:

    • Session scope: SET optimizer_switch='hypergraph_optimizer=on|off'

    • Global scope: SET GLOBAL optimizer_switch='hypergraph_optimizer=on|off'

    • Persisted scope: SET PERSIST optimizer_switch='hypergraph_optimizer=on|off'

    • Server startup: mysqld --optimizer-switch='hypergraph_optimizer=on|off'

    • Per-statement hint: /*+ SET_VAR(optimizer_switch='hypergraph_optimizer=on|off') */

    (WL #17265)

Packaging Notes

  • Building with PGO (Profile Guided Optimization) is now also supported for RPM builds on SLE/openSUSE and Fedora, by adding --define=with_pgo 1 to the rpmbuild command line. (Bug #38915967)

  • For platforms on which OpenSSL libraries are bundled, the linked OpenSSL library for MySQL Server has been updated to version 3.5.5. For more information, see OpenSSL 3.5 Series Release Notes. (Bug #38867109, WL #17209)

Performance Schema Notes

  • Prepared statements with mismatched parameter types could enter infinite loops and consume 100% CPU after re-preparation.

    Our thanks to Alex Xing for the contribution. (Bug #38600714)

Thread Pool Notes

  • Under high load, when using Thread Pool, connections could hang. (Bug #38693319)

Functionality Added or Changed

  • X Protocol now supports PBKDF2 storage format with Caching_sha2_password. (Bug #38879953)

Bugs Fixed

  • It was not possible to use double quotes in revoke_schema_privileges_from_all_accounts_except if ANSI_QUOTES was present in sql_mode. (Bug #39105598)

  • Fixed an issue relating to Information Schema privileges. (Bug #35243416, Bug #37387633)

  • The SETS keyword was not included in the parser's identifier keyword lists, preventing its use as an unquoted identifier. (Bug #119904, Bug #38974036)

  • The SQL parser consumed a large amount of memory when parsing very large queries with many large IN clauses.

    As of this release, the SQL parser's memory management has been improved. (Bug #105004, Bug #33390851)