MySQL 9.7 Release Notes
These release notes were created with the assistance of MySQL HeatWave GenAI.
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)
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 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)
The following components, previously availabile only in MySQL Enterprise Edition, are now available in MySQL Community Edition:
(WL #17234, WL #17235, WL #17236, WL #17237)
The Telemetry component, previously available only in MySQL Enterprise Edition, is now available in MySQL Community Edition.
See Telemetry. (WL #17224)
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)
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)
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)
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)
Fixed an issue relating to processing of JSON files. (Bug #39000847)
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)
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)
Under certain circumstances,
find_in_set() could return
incorrect results. The optimization which caused this has been
removed.
Our thanks to Jingqi Tian for the contribution. (Bug #119995, Bug #39056621)
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, incorrect results were returned when comparing DECIMAL columns to constants containing more decimals than the column. (Bug #118033, Bug #37864937)
References: This issue is a regression of: Bug #34361287.
A previous fix changed range analysis for non-binary string collations, when a string constant in a range predicate was longer than the indexed column, no index range was formed, unless the collation was known to be safe. This resulted in queries, which should have used efficient range plans, using index or table scans.
Our thanks to Yakir Gibraltar for the contribution. (Bug #118009, Bug #37849917)
References: This issue is a regression of: Bug #35169384.
Under certain circumstances, INTERSECT could
return an incorrect result.
(Bug #117911, Bug #37804715)
A histogram generated by ANALYZE TABLE UPDATE HISTOGRAM
ON was not be
accepted by col_nameANALYZE TABLE UPDATE HISTOGRAM ON
if
the histogram was built on a col_name USING DATA ...bigint column
with values outside the uint32 range.
Our thanks to Tianfeng Li for the contribution. (Bug #116611, Bug #37269033)
In an explain expanded query, join order hints were not printed with a valid syntax.
Our thanks to Kaiwang Chen for the contribution. (Bug #116084, Bug #37053765)
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)
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)
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)
X Protocol now supports PBKDF2 storage format with Caching_sha2_password. (Bug #38879953)
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)