Databases 10 min read

What’s New in MySQL 9.1.0? A Deep Dive into Latest Features and Fixes

MySQL Innovation Edition 9.1.0, released on October 15 2024, introduces atomic DDL operations, enhanced audit and firewall handling, numerous compiler and SQL function fixes, JavaScript stored‑procedure improvements, new vector support, updated keyring security, pluggable authentication fixes, expanded GROUP REPLICATION logging, and several EXPLAIN and performance‑schema enhancements.

dbaplus Community
dbaplus Community
dbaplus Community
What’s New in MySQL 9.1.0? A Deep Dive into Latest Features and Fixes

MySQL Innovation Edition 9.1.0 was officially released on 2024‑10‑15, alongside patch releases 8.0.40 and 8.4.3 (the current LTS version). New features and enhancements are delivered only in the Innovation edition.

DDL Atomicity

The engine now guarantees crash‑safe DDL for CREATE DATABASE and DROP DATABASE. Previously, if a CREATE DATABASE statement failed after the directory was created, the directory remained and had to be removed manually; a failed DROP DATABASE could leave the directory deleted but the transaction uncommitted, causing errors. This issue is resolved.

Audit and Firewall

Earlier versions treated usernames that did not start with a letter (e.g., $foo) as invalid. The new release accepts such identifiers.

Compilation Improvements

Many compatibility problems were fixed. The internal list implementation now uses a custom move constructor and assignment operator, and save_and_clear() now employs std::move() instead of copy assignment. These changes address issues with the SQL_I_list structure.

SQL Functions & Operations

The DATABASE() function no longer truncates its output when used inside a UNION query.

When DISTINCT is combined with SUM(), the previous inconsistent results caused by a temporary table that ignored the original column type and length have been fixed. Example:

mysql> SELECT SUM(b'1100'), SUM(DISTINCT b'1100');
+--------------+-----------------------+
| sum(b'1100') | sum(DISTINCT b'1100') |
+--------------+-----------------------+
| 12           | 9                     |
+--------------+-----------------------+

The temporary table now preserves the determined data type and length, yielding correct results.

JavaScript Stored Procedures

Default character set is now utf8mb4; INFORMATION_SCHEMA.ROUTINES.COLLATION_CONNECTION shows Utf8mb4_0900_ai_ci instead of latin1.

When a prepared statement returns a BLOB, the BLOB remains valid after the statement is freed.

Using user variables in DML inside a stored procedure no longer crashes the server after the procedure finishes; the server now resets the memory used for those variables. SqlResult now supports iteration. Example:

let result = session.runSql("SELECT * FROM t");
for (let row of result) {
  console.log(row.c1 + row.c3);
}

JavaScript stored procedures fully support the VECTOR data type as input, output, bind parameters, and return values.

Keyring

All components that relied on the insecure AES‑ECB mode have been stripped.

Pluggable Authentication

The SET PERSIST command now correctly persists the password for Authentication_ldap_simple_bind_root_pwd.

SQL Syntax Changes

References like db_name.tbl_name for columns in derived tables are no longer allowed.

The IF NOT EXISTS clause is now supported with CREATE VIEW. If the view already exists, the statement succeeds with a warning instead of an error. IF NOT EXISTS and OR REPLACE cannot be used together in a CREATE VIEW statement.

The STRING_TO_VECTOR() function now trims trailing spaces in the string representation of a VECTOR. Valid examples include "[1 ,2]", "[1,2 ]", " [1,2]", and "[1,2] ".

InnoDB Configuration

The default value of innodb_log_writer_threads is now OFF on systems with fewer than 32 logical CPUs.

Group Replication

New INFO‑level log messages are emitted when:

An action starts on all nodes.

A message is blocked waiting for the action to complete.

Internal messages are received and the counter is decremented.

EXPLAIN Output Enhancements

When explain_json_format_version=2 or EXPLAIN FORMAT=JSON is used, spaces are added around the ‘=’ sign in lookup_condition. EXPLAIN FORMAT=TREE now includes the semi‑join strategy used.

If MRR is employed, EXPLAIN FORMAT=JSON adds "multi_range_read":true when explain_json_format_version=2.

The mysql client gains a --system-command option (default OFF) to enable or disable execution of system commands.

Two new status variables track temporary table conversions: TempTable_count_hit_max_ram – counts tables that hit the temptable_max_ram limit. Count_hit_tmp_table_size – counts tables that hit tmp_table_size or max_heap_table_size.

The maximum value of TOTAL_ROW_VERSIONS is increased from 64 to 255, adjustable via ADD COLUMN and DROP COLUMN with INSTANT algorithm.

The OpenTelemetry component now can export telemetry logs to OpenTelemetry collectors.

The release also contains numerous bug fixes not listed here; see the official MySQL documentation for the full changelog.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

performancesqlmysqlGroup ReplicationRelease NotesDatabase FeaturesJavaScript Stored Procedures
dbaplus Community
Written by

dbaplus Community

Enterprise-level professional community for Database, BigData, and AIOps. Daily original articles, weekly online tech talks, monthly offline salons, and quarterly XCOPS&DAMS conferences—delivered by industry experts.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.