Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Release notes for MariaDB Enterprise Server 11.4 series releases
MariaDB Enterprise Server 11.4.9-6 is a Stable (GA) maintenance release of MariaDB Enterprise Server 11.4, released on 2025-12-11
Release date: 11 Dec 2025
MariaDB Enterprise Server 11.4.8-5 is a Stable (GA) maintenance release of MariaDB Enterprise Server 11.4. This release includes a variety of fixes.
This release incorporates MariaDB ColumnStore engine version 25.10.2
updated to 26.4.24
NOTE: Includes increasing the GCS protocol version, which prevents downgrades of individual nodes in the cluster as soon as all nodes have been updated
Due to the impending EOL of Windows 10 22H2, and Windows 11 23H2, this will be the last release supporting these releases
The PrivateDevices=false
Failure to detect corruption during backups of Aria table ()
DDL in procedure propagates no locking to tables locked by DML ()
Assertion `table_share->tmp_table != NO_TMP_TABLE || m_lock_type == 1' failed upon REBUILD PARTITION ()
SIGSEGV in replace_user_table when changing mysql db tables ()
SIGSEGV in replace_db_table on GRANT ()
LIMIT ROWS EXAMINED prematurely triggers during optimization ()
Corrected the creation of views on JSON_TABLEs to require no special privileges. ()
wsrep_store_key_val_for_row() may invoke memcpy() on nullptr ()
UPDATE/DELETE of single table queries would now show r_table_time_ms, and r_other_time_ms during ANALYZE FORMAT=JSON ()
Multiple versions of MariaDB Enterprise Server are now available in the package repositories ()
For Debian and Ubuntu, see the section of the page for details on how to install old versions from the deb repositories
For RHEL/Alma/Rocky, see the section of the page for details on how to install old versions from the rpm repositories
Workloads that are bound by innodb_log_file_size would write out unnecessarily many data pages in an attempt to advance the log checkpoint. ()
Query does not recognize advantage of using primary key index ()
The locking in the audit plugin was simplified in order to remove some scalability bottlenecks. ()
REPLACE on a precise-versioned table returns duplicate key error (ER_DUP_ENTRY) ()
Wrong result when split optimization is used for grouping with order by and limit ()
Assertion `!is_set() || (m_status == DA_OK_BULK && is_bulk_op())' failed after ALTER TABLE of versioned table ()
Exchange partition with virtual columns fails ()
For the complete list of changes in this release, see the .
In alignment to the enterprise lifecycle, MariaDB Enterprise Server 11.4.9-6 is provided for:
AlmaLinux 8 (x86_64, ARM64)
AlmaLinux 9 (x86_64, ARM64)
AlmaLinux 10 (x86_64, ARM64)
Debian 12 (x86_64, ARM64)
Some components of MariaDB Enterprise Server are supported on a subset of platforms. See for details.
systemdThe HashiCorp Key Management Plugin has been updated to provide robust stability against Vault communication failures:
The plugin is now configured to use cached keys for all communication errors (not just timeouts), ensuring continuous operation when the Vault server is temporarily unreachable.
The default setting for using the cache on errors is now ON.
The default key cache timeout () has been increased to its maximum practical value (e.g., one year in milliseconds), maximizing key availability in the cache during extended service interruptions. ()
Prevent MariaDB server crash when a query includes a derived table containing unnamed column. (MDEV-24588)
SIGSEGV in replace_table_table on GRANT (MDEV-24814)
Crash when calling stored function in FOR loop argument (MDEV-26115)
Spider: Assertion `inited==RND' failed in handler::ha_rnd_end on DELETE (MDEV-26540)
Several bugs in SPATIAL INDEX page splitting logic could crash InnoDB if the PRIMARY KEY or the SPATIAL data is variable-length. (MDEV-27675)
SIGSEGV in replace_routine_table on GRANT (MDEV-27842)
Setting wsrep_slave_threads causes thread hang (MDEV-30418)
InnoDB could crash if the definition of the InnoDB persistent statistics tables were incorrect. (MDEV-31740)
Correlated derived table query merges can cause crashes, especially with prepared statements. (MDEV-32294)
Server crash on cleanup of non-fully-constructed-due-to-an-error CTE (MDEV-32308)
Crash if subquery is a UNION of SELECT rand() and uncorrelated SELECT (MDEV-32403)
JSON_ARRAY_INTERSECT function crashes the server when called with empty json arrays, UBSAN runtime error: member access within null pointer of type 'struct String' in Item_func_json_array_intersect::prepare_json_and_create_hash (MDEV-33149)
Assertion `0' failed in void wsrep::transaction::state(wsrep::unique_lockwsrep::mutex&, wsrep::transaction::state) (MDEV-33250)
Assertion `! thd->in_sub_stmt' failed in bool trans_rollback_stmt(THD*) (MDEV-34117)
Assertion `ist_seqno >= cc_seqno' failed in galera_vote_rejoin_dml (MDEV-35964)
Mariadb server crashed during insert (MDEV-36134)
InnoDB could potentially crash if there is any lock conflict on an internal FTS_%_CONFIG table of a FULLTEXT INDEX while one of the INFORMATION_SCHEMA views INNODB_TRX, INNODB_LOCKS, or INNODB_LOCK_WAITS are being accessed. (MDEV-36545)
Assertion `bulk_insert == TRX_NO_BULK' failed in trx_t::assert_freed from innodb_shutdown (MDEV-36771)
json_array_intersect previously crashed when there was an unused table reference in the SQL query. (MDEV-36809)
Assertion `client_state.transaction().active()' failed in int wsrep_thd_append_key(THD*, const wsrep_key*, int, Wsrep_service_key_type) (MDEV-36909)
SIGSEGV in wsrep_check_sequence | mysql_alter_table (MDEV-37056)
sql/wsrep_allowlist_service.cc:40:27: runtime error: member call on null pointer of type 'Wsrep_schema' (MDEV-37136)
Fixed crashing bug when inserting into a tables with several nextval(sequence) default values. (MDEV-37172)
When the server was started in read-only mode with encryption enabled, the fix ensures that InnoDB avoids creating any encryption thread. Testing: encryption.innodb-read-only(MTR Test) contains scenario that can be used to test this change. (MDEV-37299)
Item_func_nextval::val_int() crash on INSERT...SELECT with subqueries (MDEV-37345)
Inconsistency detected - create sequence (MDEV-37366)
InnoDB: Failing assertion: node->pcur->rel_pos == BTR_PCUR_ON (MDEV-37404)
Parallel replica worker crashes during backup at retrying (MDEV-37453)
ASAN errors in find_type2 upon executing a procedure from sys schema (MDEV-37710)
In rare cases, shutdown might hang (MDEV-37728)
Galera replication does not preserve the character set and collation associated with views, etc. (MDEV-37857)
Assertion `0' failed in int wsrep::transaction::before_rollback() (MDEV-37935)
Item_func_hex doesn't check for max_allowed_packet (MDEV-37947)
MDL conflict between CREATE TRIGGER and INSERT (MDEV-37965)
Galera cluster crashes when granting permission to non existing user after setting max_error_count and wsrep_ignore_apply_errors to zero (MDEV-37991)
Galera nodes should operate when transaction-read-only=ON (MDEV-38073)
Assertion `level != Sql_condition::WARN_LEVEL_ERROR' failed in void push_warning(THD*, Sql_state_errno_level::enum_warning_level, uint, const char*) (MDEV-38201)
MDL conflict between XA and DDL in MariaDB Enterprise Cluster (MENT-2405)
Race of rolling back and committing transaction to binlog (MENT-2448)
For large transactions (i.e. those whose data exceeds the binlog_cache_size limit and spills into tmp files), provides a general performance improvement and fixes a bug that would lead to binlog corruption where the large transaction would have its GTID written into the binary log, without any additional transaction data, if the server's --tmp-dir was full. (MENT-2451)
With --encrypt-binlog=ON if a node fails to apply a writeset it will crash the whole cluster due to a bug in Galera library encryption handling. Fixed in Galera library. (MENT-2474)
ALTER TABLE could fail to update InnoDB persistent statistics. (MDEV-35163)
ALTER TABLE tbl_a ADD PARTITION (PARTITION pt2) MSAN uninitalized read (MDEV-36723)
Killed query with side effects without error (MDEV-37198)
InnoDB partition table disallow local GTIDs in galera (MDEV-37373)
mariadb-dump -T did not encode table names like the server did for frm files, so some tables can be created in the server, but not dumped with mariadb-dump -T, for example, a table con on Windows. (MDEV-37483)
wsrep_allowlist allows all connections during SST (MDEV-37548)
CHECK TABLE…EXTENDED could flag bogus corruption on a column prefix index. (MDEV-37659)
Table Charset Mismatch (Primary/Replica) via Event (MDEV-37744)
Under selinux, the galera SST port checking resulted in excessive AVC notices. This has been simplified under selinux. (MDEV-37899)
ALTER TABLE ... ENGINE=MRG_MyISAM is now properly logged as an DDL. This ensures that the changed MERGE table cannot be used by a slave thread until after the ALTER command has been executed. (MDEV-37903)
disable_index_merge_plans causes SELECT data loss when more than 100 ORs (MDEV-37913)
very long query cannot be killed quickly (MDEV-37938)
If the server was killed during an operation that creates a .ibd file, such as TRUNCATE TABLE, it could fail to recover. (MDEV-37994)
If the user specifies some tls-related parameters in spider table creation with odbc/mariadb backend, these parameters could be ill-formatted in the odbc connection string, causing them to be ignored by the driver. (MENT-2407)
Parameterized PS converts error to warning, causes replication problems (MDEV-34046)
View containing JSON_TABLE does not return JSON (MDEV-34081)
Wrong result json_table (MDEV-36319)
Fix COALESCE and IFNULL functions to use - (i) argument nullness, (ii) type conversion safety of fallback values to decide nullability of result. (MDEV-36851)
Correct return value of JSON_VALUE which in the previous release, incorrectly converted a valid empty string return value to a NULL. This has been reverted to correct behaviour. (MDEV-37428)
Wrong query_ids in server_audit plugin not reflecting reality (MDEV-37434)
Fix server_audit rwlock Performance Schema instrumentation (MDEV-37555)
IS TRUE incorrectly converts outer join to inner (MDEV-37653)
Spider: XA COMMIT ONE PHASE fails with "This xid does not exist" (MDEV-37829)
mysqli silently trims each json_arrayagg result to modulo 64KB (MDEV-37835)
Wrong result with Loose Scan on QUICK_GROUP_MIN_MAX_SELECT WITH TIES (MDEV-37901)
Assertion failure in online_alter_log_row or server hang upon replicating REPAIR on mysql.gtid_slave_pos (MENT-2462)
Oracle Linux 8 (x86_64, ARM64)
Oracle Linux 9 (x86_64, ARM64)
Oracle Linux 10 (x86_64, ARM64)
Red Hat Enterprise Linux 8 (x86_64, ARM64)
Red Hat Enterprise Linux 9 (x86_64, ARM64, PPC64LE)
Red Hat Enterprise Linux 10 (x86_64, ARM64)
Rocky Linux 8 (x86_64, ARM64)
Rocky Linux 9 (x86_64, ARM64)
Rocky Linux 10 (x86_64, ARM64)
SUSE Linux Enterprise Server 15 (x86_64, ARM64)
Ubuntu 22.04 (x86_64, ARM64)
Ubuntu 24.04 (x86_64, ARM64)
Microsoft Windows (x86_64) (Without MariaDB Enterprise Cluster (Galera) support)
Red Hat UBI 8 (x86_64, ARM64)
Red Hat UBI 8 is part of the Enterprise Server Docker Image. It does not support MariaDB Enterprise Cluster (Galera) or MariaDB ColumnStore.
Log write buffering added to the and plugins (MENT-2438)
The buffering is controlled by the added variables:
server_audit_file_buffer_size - defines the size of the buffer. The default value is 0 meaning there's no buffering at all. Setting non-zero value enables the buffering with the buffer of the specified size aligned by 8192. The maximum value is 65536.
server_audit_sync_log_file - flushes the buffer to the log file. While the log record is in the buffer, it cannot be seen in the log file. And if there are not many events to log, the time before records can be observed can be significant. So user can do SET GLOBAL server_audit_log_file=1 to this variable to force write the buffer to the file, to make sure he doesn't miss the recent records.
Two new fields are available via SHOW REPLICA STATUS ()
Connects_Tried, which provides the number of attempts the replica has made to connect to the primary, and
Master_Retry_Count, which provides the number of times the replica will attempt to connect to a primary before giving up.
The authentication plugin caching_sha2_password has been added, not loaded by default ()
An overview of changes, improvements, and what's new in MariaDB Enterprise Server 11.4
MariaDB Enterprise Server 11.4 introduces new features to MariaDB Enterprise. Enhancements include JSON functions for validation and comparison, SQL functions for natural sorting and custom formatting, and a new UUID data type. Operational improvements include an improved cost-based optimizer, a new feature for non-blocking online schema changes, and faster InnoDB imports. Security is strengthened with default SSL encryption, password reuse prevention, and Galera Cluster security improvements. Replication is enhanced with default GTID, binary log size limits, and optimistic ALTER TABLE. Monitoring benefits from JSON histograms, new thread states, and detailed error reporting. These updates aim to improve developer experience, database administration, and overall performance.
This document includes all major features and changes between 10.6 ES and 11.4 ES.
Upgrading from 10.6 should use take a few seconds with Please ensure that you do a of 10.6 before doing the upgrade.
The variable has no effect in 11.4 as all the features are already in 11. The variable is deprecated and should be remove from existing config files.
As long as no new 11.4 features are used (by CREATE TABLE or DML's) and the new variable is 0 (default) one should be able to use a 10.6 slave of 11.4 master.
New JSON function JSON_SCHEMA_VALID to validate a JSON document against a JSON schema, as documented by the JSON Schema Draft 2020. This function can also be used in a CHECK constraint to verify that only JSON documents are stored in the database which include required items and that the values are within a given range, length, etcetera.
New JSON functions JSON_EQUALS() and JSON_NORMALIZE() for easier comparison of two JSON documents and for normalizing JSON objects to be comparable, for example when a unique key based on JSON data is needed.
New function JSON_OVERLAPS(), which compares JSON documents to determine if they have any key-value pairs or array elements in common.\
New function JSON_KEY_VALUE(<json_doc>,<json_path>), which extracts key/value pairs from a JSON object. The JSON path parameter is used to only return key/value pairs for matching JSON objects.
Example:\
The function JSON_KEY_VALUE() can be used as an argument to JSON_TABLE(), which allows adding the key to a result set.
Example:
New function JSON_ARRAY_INTERSECT(<array1>, <array2>), used to find the intersection between two JSON arrays.
Example:
The new JSON function JSON_OBJECT_TO_ARRAY(<json_doc>) is used to convert all JSON objects found in a JSON document to JSON arrays where each item in the outer array represents a single key-value pair from the object.
Example:
Resulting arrays can be compared using JSON_ARRAY_INTERSECT():
The new JSON function JSON_OBJECT_FILTER_KEYS(<json_doc>,<array_keys>) returns key/value pairs from a JSON string for keys defined in <array_keys>.
Example:
By using JSON_ARRAY_INTERSECT() and JSON_KEY() as arguments for JSON_OBJECT_FILTER_KEYS(), a comparison of two JSON strings is possible where only the same keys are compared, not the key/value pairs.\
Example (only show key/value pairs of json1 where the key exists in json2):
To define the position in a JSON array from the end to the beginning, negative indexes or last can be used as the last element of an array for an JSON array of a JSON path, where the JSON path is used as a parameter in a JSON function.
Range notation for JSON path using the keyword to define a range of elements.
New function NATURAL_SORT_KEY() which can be used to sort strings naturally.
Example: A string "v10" would be sorted after a string "v9"
New function SFORMAT() for custom formats of strings. The function uses a string including formatting options and a set of given values to generate a custom formatted string.
New function RANDOM_BYTES() which returns a binary string of a length between 1 and 1024 bytes. This nondeterministic value is generated by the random number generator of the SSL library, so it generates an arbitrary length string of cryptographic random bytes that are suitable for cryptographic use.
The encryption functions AES_ENCRYPT() and AES_DECRYPT() now support adding the two new parameters initialization vector (iv) and block encryption mode (mode).
Syntax for older release series:
New syntax:
If no mode is provided it will be used from the new system variable block_encryption_mode
Example (using the mode from system variable block_encryption_mode):
Example (mode provided as argument):
The new options %Z and %z can be used for the format string of the DATE_FORMAT function for adding time zone information to the date string
%Z Time zone abbreviation
%z Numeric time zone +hhmm or -hhmm presenting the hour and minute offset from UTC
Example:
The SQL function KDF() is a key derivation function, useful for generating encryption keys from a user provided password or a passphrase. It can be used to generate encryption keys for encryption functions such as AES_ENCRYPT.
kdf_name is "hkdf" or "pbkdf2_hmac"
width (in bits) can be any number divisible by 8
info is a non-secret parameter of the hkdf method, it allows to generate different encryption keys for different purposes from the same secret password
iterations is a positive numeric parameter of the pbkdf2_hmac method, larger values make the password more difficult to brute-force.
Example:
The function CONV() , which converts a number between numeric base systems, now supports conversions up to base 62. This allows conversions to encodings to capital letters A-Z, lower case letters a-z, and numbers 0-9. The old limit was 36, not including lower case letters.
Example:
New data type UUID for more efficient storage of UUIDs
New data type INET4 to store IPv4 addresses as 4-byte binary strings. Benefits of storing IPv4 addresses in the INET4 data type are:
Validation of incorrect values
Comparisons
Sorting
Functions like CAST
Changed default behavior TIMESTAMP field properties
The default for explicit_defaults_for_timestamp is set to ON resulting in removing the nonstandard behavior for TIMESTAMP fields in CREATE TABLE
Stored Functions qualifiers for IN, OUT, INOUT, and IN OUT. The qualifiers are following the syntax already used for stored procedures and take the differences for Oracle into account when using the Oracle compatibility mode (sql_mode=ORACLE).
MariaDB Enterprise Server now supports descending indexes. Composite indexes can be used with differently ordered columns to get a significant performance boost in the corresponding ORDER BY use cases.
New, Detailed Replication Lag Representation
New Information Schema Table For Password Related Data
GTID binlog events now include the thread ID
Automatic SST user account management for Galera
PARSEC authentication plugin
Extended TIMESTAMP Maximum Value
For 64 bit systems the maximum value for the TIMESTAMP data type has been extended from ‘2038-01-19 03:14:07 UTC’ to ‘2106-02-07 06:28:15 UTC’ without changing the storage format.
System versioned tables use the maximum value of TIMESTAMP for their row_end field to indicate a currently valid value. These values should be changed changed to the new maximum value:
Option To Limit Disk Space Used For Temporary Files And Tables
When internal in-memory temporary tables are reaching a memory limit, they need to be stored on disk in directories defined via the tmpdir system variable.
Two new system variables have been added to define the maximum storage to be used for such temporary tables and other internally created temporary files:
max_tmp_session_space_usage
The Software Bill of Materials (SBOM) JSON file is generated in the downloads archive
Vector Search capability has now been added to the MariaDB Enterprise Server 11.4 release. This explains the idea of the new vector search feature in detail ()
Vector Embeddings
Vector embeddings are numerical representations [0.2, -0.5, 0.8, 0.1, ...] that capture semantic meaning or features of data in a multi-dimensional space. The embedding transforms simple to complex data such as text, images, audio, or video into a series of numbers (a vector) where similar items are positioned together in the multi-dimensional vector space.
For example, a word embedding of the word "dog" would be close in a vector embedding space to the word "puppy", whereas "dog" would not be close to the word "airplane". The embedding representation can be used in similarity search, recommendation systems, or more generally in traditional AI/ML systems and GenAI systems.
New Data Type VECTOR(N)
With the RC release a new data type VECTOR(N) has been added to represent the vector column, where N is the number of dimensions.
Example:
Conversion Functions
VEC_FromText() converts a text representation of the vector (a json array of numbers) to a vector (little-endian IEEE float sequence of bytes, 4 bytes per float).
Example:
VEC_ToText() converts a binary vector into a json array of numbers (floats).
Comparison Functions
Comparing vectors, calculating how close they are, is the key functionality needed by an application working with vector search. Two functions exist for calculating the distance between vectors. Which one to use depends on the application and on how the vectors were generated.
VEC_DISTANCE_EUCLIDEAN() takes two vectors and computes the straight line (L2) Euclidean distance between two multi-dimensional points in the vector space
New server internal which makes all schema changes (ALTER TABLE commands) non-blocking.
For instant ALTER TABLE operations (e.g., where ALGORITHM=INSTANT is used) OSC is not needed. However, for all other ALTER operations OSC provides significant benefits in reducing the locking time to a bare minimum.
The OSC feature works by creating a change buffer for storing changes during the copying of data from the old format to the new one. While data is copied from the old table structure to the new one all changes are stored in the change buffer and the table is fully accessible. Once the copying process is complete the change buffer is applied to the new data structure only requiring a very short locking period.
Having an internal OSC in the server eliminates the need for using external command line tools in order to reduce table locks. These external tools often need to create complicated structures in the database (like triggers and stored procedures) and certain race conditions can lead to the operations never finishing.
In MariaDB Enterprise Server 11.4 a default ALTER operation will be an OSC operation if possible. If the operation cannot be performed as an OSC then another algorithm will be used. If the option LOCK=NONE is explicitly specified in the ALTER statement, then the operation will fail if it cannot be done as an OSC.
CONVERT PARTITION and CONVERT TABLE used with ALTER TABLE can be used to convert a partition into a table or vise versa
Exchange a Partition or Convert a Table Without Validation
The process of exchanging a partition with a table or converting a table to a partition can be a very slow operation, especially for larger tables because for each new data row, the partitioning definitions need to be verified to validate that the new row should indeed be in this partition.
This process can now be sped up by disabling this validation. This new feature should be used with care, as it can lead to inconsistencies if the partitioning rules are not met.
The new addition to ALTER TABLE is:
Syntax extension to not require PARTITION keyword in each partition definition
Stored routines are now taking changes to metadata into account whenever the stored routine is called, done for any object a stored routine depends on.
In older release series a reconnect was needed before a stored routine was able to update its metadata from altered objects
Example:
In the above example both calls of the stored procedure p1 would have returned the same result set with the older release series.
Temporary tables are now included in information_schema.tables and included in SHOW TABLES and SHOW TABLE STATUS
Example:
General Support of Packages for Stored Routines
Before MariaDB Enterprise Server 11.4, the CREATE PACKAGE feature, as well as CREATE PACKAGE BODY, were only supported with sql_mode = ORACLE. They can now be used with any SQL mode.
Example:
System-Versioned Tables can automate the creation of new HISTORY partitions partitioned by INTERVAL/LIMIT using the keyword AUTO when creating a table.
In this case a new HISTORY partition will be created on a monthly basis, storing old versions of the table data.
Information About Application-time Period Tables
New views PERIOD and KEY_PERIOD_USAGE are added to information_schema.
View PERIODS includes the columns
TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
View KEY_PERIOD_USAGE includes the columns
CONSTRAINT_CATALOG
CONSTRAINT_SCHEMA
Two new columns are added to the COLUMNS view of information_schema
IS_SYSTEM_TIME_PERIOD_START
IS_SYSTEM_TIME_PERIOD_END
A dump of historical data for system versioned tables is now possible via the new option --as-of for mariadb-dump
System versioned tables can now be dumped and restored by mariadb-dump
The new parameter mariadb-dump parameter --dump-history dumps all historical data
To restore from a dump file the new parameter system_versioning_insert_history needs to be enabled to allow direct inserts into ROW_START and ROW_END columns
The existing parameter secure_timestamp needs to be set to a value which allows changing session timestamps
The command-line tool mariadb-dump now supports the new option --order-by-size. The new option can be used to create a dump of the tables of a database according to their size, smaller tables first.
Parallelism for mariadb-dump
When mariadb-dump is used with the option -T / --tab= to produce tab-separated text-format data files per table, the new option --parallel (synonym --use-threads) can be used to use several threads in parallel to dump the table data to their .txt files. Parallelism also works if the option --single-tansaction is used.
The option
New collations based on the Unicode Collation Algorithm (UCA) 14.0.0 have been added for the character sets utf8mb3, utf8mb4, ucs2, utf16, utf32
One neutral and 22 language specific collations have been added
Case sensitive, case insensitive, and nopad variants have been added
Collations (how to compare characters) are now separated from character sets (how to store characters). Collation names no longer have to include character set names, and the same collation can apply to many character sets
Improved contraction performance in UCA collations
Improved UCA collation performance for utf8mb3 and utf8mb4
Full UNICODE support for MariaDB command-line tools on recent versions of Windows (Windows 10 1909 or later, Windows 11, Windows Server 2020 supported). The server my.ini config file is now also encoded in UTF8. Command-line client mariadb.exe uses utf8mb4 by default.
The default collation used for a character set can now be changed globally or for a session via the new system variable character_set_collations. The default collation will be used whenever a character set is defined for a database object without defining the collation.
When not defining a character set the default collation is still the one defined with the system variable collation_server.
This is also preparatory work for changing default collations to use the UCA 14.0.0 standard. In particular, this variable will allow replication between servers with different default collations.
Optimizations to information schema system tables
The information schema provides tables with metadata about stored procedures and stored routines, which are often used by third party tools, and MariaDB Connectors to retrieve details about existing routines. Previously, a high number of rows in these tables would have resulted in a performance impact. We have made a number of internal improvements to eliminate the performance impact completely for use cases, where metadata had to be queried regularly.
New optimizer cost model, a change from a more rule-based to a cost-based model. Huge effort went into improving the calculations of the optimizer costs, taking into account state of the art SSD disks. The new implementation also takes the different characteristics of a storage engine into account.
If a key lookup cannot be used, the optimizer can now make better choices when to use index scan, table scan, index merges, or other methods to join data.
While one model may work well for a specific use case, it may not be the right model for other use cases. With the changes we've made, it's now possible to fine-tune the optimizer by changing costs for different metrics.
Changes to the optimizer now allow the use of an index for a comparison of a DATE function to a constant value.
The optimizer also has been enhanced to allow single-table UPDATE and DELETE to take advantage of semi-join optimization.
Improved optimizer performance in a case of join with many eq_ref tables
Automatic SST User Account Management for MariaDB Enterprise Cluster
The State Snapshot Transfer (SST) method, needed to provide a full data copy to a new node, requires a dedicated account to access the remote server (donor) during the SST process.
The new MariaDB Enterprise Cluster (Galera) creates the user internally for the time of an SST, which makes the need to have an account created manually obsolete. This also removes the requirement to have a user and password provided via a configuration file. Having the user created by Galera also ensures that the needed privileges are set.
For MariaDB Galera Cluster, configurations are set using one system variable as a semicolon separated list of options, the system variable wsrep_provider_options. MariaDB Community Server system variables are limited to a length of 2048 characters, which is not sufficient for the Galera options in some use cases, and also hard to maintain as a DBA.
A new plugin is available, enabled via the plugin-wsrep-provider option. The options are split into separate options, if the plugin is used. The use of the plugin is optional.
Incompatibility change: Replication is now using Global Transaction IDs (GTID) by default to make replicas crash safe
The default of CHANGE MASTER TO for master_use_gtid changes from no to slave_pos
A fresh slave start, a RESET SLAVE, or a CHANGE MASTER TO without the defining master_use_gtid is replicating in the GTID based mode using gtid_slave_pos as the position to start downloading transactions from the primary
Global Limitation of Space Used by Binary Logs
The new system variable max_binlog_total_size (alias binlog_space_limit) enables binary log purging when the total size of all binary logs exceeds the specified threshold. The default for max_binlog_total_size is 0, meaning that there is no limit. The system variable can be changed without restarting the server.
The new system variable
Index for Binary Log on GTIDs
An index is now created on the GTIDs of the binary log, which allows a connecting replica to find the position it should start from without the need to scan the whole binary log.
The new system variable binlog_gtid_index (default ON) can be used to disable the creation of indexes.
GTID Binlog Events Now Include Thread ID
The thread ID and the corresponding statement can now be retrieved from binary logs.
The output of mariadb-dump also includes the thread ID.
A new option 'slave_max_statement_time' for the SQL thread has been added to allow to set a maximum allowed execution time for a replicated query
Allows to control the maximum time a replica can be behind a primary if the primary goal is to have a small replication lack, with the cost to be out of sync. It is therefore disabled by default.
The binary log filter options binlog-do-db, binlog-ignore-db, and binlog-row-event-max-size are now visible as system variables.
Example:
New "SQL_BEFORE_GTIDS" and "SQL_AFTER_GTIDS" for START REPLICA UNTIL
The new options SQL_BEFORE_GTIDS and SQL_AFTER_GTIDS for START REPLICA UNTIL allow user control of whether the replica stops before or after a provided GTID state. Its syntax is:
When providing SQL_BEFORE_GTIDS="<gtid_list>", for each domain specified in the gtid_list, the replica will execute transactions up to the GTID found, and immediately stop processing events in that domain without executing the transaction of the specified GTID.
Once all domains have stopped, the replica will stop. Events originating from domains that are not specified in the list are not replicated.
START SLAVE UNTIL SQL_AFTER_GTIDS="<gtid_list>" is an alias to the default behavior of START SLAVE UNTIL master_gtid_pos="<gtid_list>", the known behavior before MariaDB Enterprise Server 11.4.
The replica will execute transactions originating from domain ids provided in the list, and will stop once all transactions provided in the UNTIL list have all been executed.
Example:
If a primary server has a binary log consisting of the following GTIDs:
Given a fresh replica (i.e., one with an empty GTID position, @@gtid_slave_pos=") is started with SQL_BEFORE_GTIDS, i.e.,
the resulting gtid_slave_pos of the replica will be "1-1-1" because the replica will execute only events from domain 1. When it sees the transaction with sequence number 2 it immediately stops without executing it.
If the replica is started with SQL_AFTER_GTIDS, i.e.,
the resulting gtid_slave_pos of the replica will be "1-1-2" because the replica will execute only events from domain 1. But in this case it stops after executing the provided GTID.
New, detailed replication lag representation
The Seconds_Behind_Master field of SHOW REPLICA STATUS can be complex and confusing, especially when parallel replication, delayed replication, or the option sql_slave_skip_counter is used. To help provide a consistent view of replication lag, three new fields have been added to the statement's output to provide specific timing information about the state of the IO and SQL threads.
Master_last_event_time
Timestamp of the last event read from the primary by the IO thread
Slave_last_event_time
Timestamp from the primary of the last event committed on the replica
Master_Slave_time_diff
The difference of the above two timestamps
New optimistic ALTER TABLE for replicas. When enabled by binlog_alter_two_phase = 1 (not default), an ALTER TABLE is executed on the primary server and is replicated and "started" on the replica server more or less in parallel to the primary server. Thus, the possibly huge replication lag between a primary and replica server due to a long running ALTER TABLE on the primary can be avoided.
The command line tool mariadb-binlog now supports the use of global transaction IDs (GTID) for the options start-position and stop-position. mariadb-binlog can now be used to produce results filtered by the defined GTIDs.
The command-line tool mariadb-binlog now supports the new options --do-domain-ids, --ignore-domain-ids, and --ignore-server-ids. mariadb-binlog can now be used to produce results filtered by domain ids server ids.
Client to Server connection now SSL Encrypted by Default
Using SSL/TLS has been simplified with MariaDB Enterprise Server 11.4. Before version 11.4, proper SSL configuration required multiple manual steps for the server, and all the clients connecting to it.
Now the client can verify the server self-signed certificate without any configuration whatsoever. The server completely automatically generates the SSL certificate and the client automatically verifies it as needed.
This simplification allows the server to now require SSL encrypted connections by default and to refuse unencrypted connections. Additionally, MariaDB Enterprise Server 11.4 allows users to verify SSL certificates using their fingerprints.
New (Password Authentication using Response Signed with Elliptic Curves).
PARSEC improves security over old authentication plugins by introducing salted passwords, time consuming key derivation function, and a client-side scramble to ensure that man-in-the-middle attackers cannot control the client response.
Example on how to create a user using the new authentication plugin:
This will result in:
The new plugin password_reuse_check can be used to validate that a password cannot be reused. The number of days until a password can be reused can be configured via a new parameter password_reuse_check_interval
New allowlist for MariaDB Galera Cluster node to restrict the nodes which can join a cluster to increase security .
A new system variable wsrep_allowlist can be used to define a list of IP addresses. Only nodes from these IP addresses can join a running
The new SQL syntax GRANT .. TO PUBLIC can now be used to easily grant privileges to databases or tables for any user, who has access to the server.
SHOW GRANTS FOR PUBLIC is an enhancement to the existing SHOW GRANTS syntax to retrieve all privileges granted to public
The fine grained privileges have been removed from the SUPER privilege.
The SUPER privilege is still used for some special cases, like using DES_ENCRYPT and DES_DECRYPT without an explicit key, for debug settings, and some system variables for changing them with SET GLOBAL.
New privilege SHOW CREATE ROUTINE
Before MariaDB Enterprise Server 11.4 a user only could see the definition of a routine, a stored feature, or function, when either of the following was met:
They had been granted the SELECT privilege for the mysql.procs table
Example with the new privilege SHOW CREATE ROUTINE:
SHOW CREATE ROUTINE privilege can be granted globally, per schema, or on individual routines.
Retrieve Users Privileges on a Specific Table
MariaDB Server provides information about privileges a user has to a table in different views in the INFORMATION_SCHEMA, split between global, schema, and table privileges. Before MariaDB Enterprise Server 11.4, there was no easy way to list all the tables a user has access to, this information has to be queried from several tables.
MariaDB Enterprise Server 11.4 now provides a new view privileges_by_table_by_level in the SYS schema that lists the privilege and privilege level per user, schema, and table.
Example:
A new information Schema view, USERS, has been added, which DBAs can use to get insights about password related information for a user.
This information can be used:
by an application to inform a user about a password about to expire or an account which is at risk of being blocked due to the number of wrong passwords entered
by DBAs to query users which have been blocked because of too many invalid passwords entered
The new view includes the fields:
USER - A string including user name and host
PASSWORD_ERRORS - A counter with the current number of wrong passwords entered
Engine-defined attributes can now also be defined per-partition for more flexible configurations.
The space occupied by freed pages within the InnoDB system tablespace can be reclaimed by adding an :#autoshrink attribute to #innodb_data_file_path#, like:
This allows the system tablespace to be truncated after the last allocated page within it, all the way to the specified minimum size (here: 12MiB). In older release series InnoDB data files never shrink in size during normal operation. One could shrink .ibd files by rebuilding tables with OPTIMIZE TABLE, or the undo tablespace files by SET GLOBAL innodb_undo_log_truncate=ON.
Shrink temporary InnoDB tablespaces without restart
Before MariaDB Enterprise Server 11.4 the only way to reclaim disk space used by temporary InnoDB tablespaces was to restart the server, as temporary tablespaces are deleted when you stop the server, and are recreated with their configured size.
Restarting the server is not always possible, while you still need to reclaim disk space. MariaDB Enterprise Server 11.4 can solve this problem by executing
This triggers to reclaim the disk space, but existing tables will not be removed.
Example:
The process to import a InnoDB tablespace is now simplified. While the old process required to first create a table and to discard the tablespace before executing ALTER TABLE IMPORT TABLESPACE, now ALTER TABLE IMPORT TABLESPACE is the only command needed.
Example:
The InnoDB storage engine has gone through additional code cleanup and we have removed some configuration parameters used by the InnoDB Change Buffering feature, a feature which was disabled for earlier release series.
New system variables like innodb_log_file_buffering, innodb_data_file_buffering, innodb_log_file_write_through, and innodb_data_file_write_through have been added to allow better control for log files and data files. They can be set dynamically while the Server is running.
Changes to the InnoDB redo log format to reduce write amplification, which can result in better performance.
The system variables innodb_write_io_threads and innodb_read_io_threads are now dynamic, and their values can be changed without restarting the server
The SPIDER storage engine now allows the use of engine-defined attributes (table options), similar to other storage engines, and more convenient than the current method of providing parameters via COMMENT for a table.
Improved error reporting for INSERT that inserts multiple rows. The property ROW_NUMBER in GET DIAGNOSTICS allows retrieval of the row number that caused the error or warning.
Implementation of JSON histograms with detailed histogram collection, used when histogram_type=JSON_HB (not the default) is set. Using JSON histograms results in more precise data statistics over string data types or when columns have highly-uneven data distribution. More precise statistics allow the optimizer to create better query plans resulting in faster queries.
ANALYZE [FORMAT=JSON] <select> has been extended to allow analyzing a query which is currently running in another connection by running SHOW ANALYZE FORMAT=JSON for <conn_id>.
ANALYZE FORMAT=JSON now shows the time spent in the query optimizer
In some cases optimizing the query can take a while. ANALYZE FORMAT=JSON now reports time as "query_optimization": { "r_total_time_ms": NNNN.NNN } in the JSON string
SHOW EXPLAIN for <conn_id>, which returns an EXPLAIN for a query running in another connection, has been extended to return the more detailed JSON output by using the syntax SHOW EXPLAIN [FORMAT=JSON] FOR <conn_id>.
Syntax EXPLAIN [ FORMAT=JSON] FOR CONNECTION <conn_id> is also supported.
New status monitoring features for MariaDB Enterprise Cluster:
New thread states in PROCESSLIST for MariaDB Galera Cluster allow better tracking of a session status
"waiting to execute in isolation"
"waiting for TOI DDL"
The new value SENT_ROWS in the information schema table PROCESSLIST includes the number of rows sent by the current statement, shown in the processlist.
Selects with functions show the total number of rows sent by the main statement and all functions
Stored procedures show the total number of rows sent per stored procedure statement
INSERT RETURNING and DELETE RETURNING show the total number of rows sent for the returning data set
Example:
The SQL Error Log Plugin can be used to log errors sent to clients for later analysis. When option sql_error_log_with_db_and_thread_info=ON is set, the log file is now also showing thread id, and the current default schema for the error.
See also: All MariaDB Enterprise Releases
Log write buffering added to the and plugins ()
The buffering is controlled by the added variables:
server_audit_file_buffer_size - defines the size of the buffer. The default value is 0 meaning there's no buffering at all. Setting non-zero value enables the buffering with the buffer of the specified size aligned by 8192. The maximum value is 65536.
EXCHANGE PARTITION partition_name WITH TABLE tbl_name [{WITH | WITHOUT} VALIDATION]
CONVERT TABLE normal_table TO partition_definition [{WITH | WITHOUT} VALIDATION]CREATE TABLE t1 (id INT);
INSERT INTO t1 VALUES (100);
CREATE PROCEDURE p1() SELECT * FROM t1;
CALL p1;+------+
| id |
+------+
| 100 |
+------+ALTER TABLE t1 ADD COLUMN b INT DEFAULT 0;
CALL p1;+------+------+
| id | b |
+------+------+
| 100 | 0 |
+------+------+CREATE DATABASE test;
USE test;
CREATE TABLE t1 (id INT);
CREATE TEMPORARY TABLE t2_temp (id INT);
SHOW FULL TABLE;+----------------+-----------------+
| Tables_in_test | Table_type |
+----------------+-----------------+
| t2_temp | TEMPORARY TABLE |
| t1 | BASE TABLE |
+----------------+-----------------+SELECT table_schema, table_name, table_type FROM information_schema.tables WHERE table_schema='test';+--------------+------------+------------+
| table_schema | table_name | table_type |
+--------------+------------+------------+
| test | t2_temp | TEMPORARY |
| test | t1 | BASE TABLE |
+--------------+------------+------------+DELIMITER $$
CREATE OR REPLACE PACKAGE myPkg
PROCEDURE p1();
FUNCTION f1() RETURNS INT;
END;
$$
CREATE OR REPLACE PACKAGE BODY myPkg
-- variable declarations
DECLARE v1 INT DEFAULT 1;
DECLARE v2 INT DEFAULT 10;
-- routine declarations
PROCEDURE p1()
BEGIN
SELECT v1, v2;
END;
FUNCTION f1() RETURNS INT
BEGIN
RETURN v1;
END;
-- package initialization
SET v1=v1 + 2;
END;
$$
DELIMITER ;
SELECT myPkg.f1();+------------+
| myPkg.f1() |
+------------+
| 3 |
+------------+CALL myPkg.p1();+------+------+
| v1 | v2 |
+------+------+
| 3 | 10 |
+------+------+CREATE TABLE t1 (x INT) WITH SYSTEM VERSIONING
PARTITION BY SYSTEM_TIME INTERVAL 1 months AUTO;SET @@character_set_collations='utf8mb4=uca1400_ai_ci';
CREATE DATABASE test_with_charset CHARACTER SET utf8mb4;
CREATE DATABASE test;
SELECT SCHEMA_NAME,DEFAULT_COLLATION_NAME FROM SCHEMATA WHERE SCHEMA_NAME LIKE "test%";+-------------------+------------------------+
| SCHEMA_NAME | DEFAULT_COLLATION_NAME |
+-------------------+------------------------+
| test_with_charset | utf8mb4_uca1400_ai_ci |
| test | utf8mb4_general_ci |
+-------------------+------------------------+DATE(datetime_column) = constSHOW GLOBAL VARIABLES WHERE
Variable_name LIKE 'binlog_do_db' OR
Variable_name LIKE 'binlog_ignore_db' OR
Variable_name LIKE 'binlog_row_event_max_size';+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| binlog_do_db | |
| binlog_ignore_db | |
| binlog_row_event_max_size | 8192 |
+---------------------------+-------+START SLAVE UNTIL (SQL_BEFORE_GTIDS|SQL_AFTER_GTIDS)="<gtid_list>"0-1-1
1-1-1
0-1-2
1-1-2
0-1-3
1-1-3START SLAVE UNTIL SQL_BEFORE_GTIDS="1-1-2"START SLAVE UNTIL SQL_AFTER_GTIDS="1-1-2"CREATE USER 'MariaDBUser'@'%' IDENTIFIED VIA PARSEC USING PASSWORD('MyPassword123!');SHOW GRANTS FOR MariaDBUser@'%';
Grants FOR MariaDBUser@%
GRANT USAGE ON *.* TO `MariaDBUser`@`%` IDENTIFIED VIA parsec USING 'P0:lhXyNv1cIxpB8EnTxR7ON7S7:1l3rWRW1/jw45yrvYXB8eh02wzk7lcJcz4CMcWw2b+8'SHOW grants;+--------------------------------------------------+
| Grants for user1@% |
+--------------------------------------------------+
| GRANT USAGE ON *.* TO `user1`@`%` |
| GRANT SELECT, EXECUTE ON `test`.* TO `user1`@`%` |
+--------------------------------------------------+SHOW CREATE PROCEDURE myProc \G*************************** 1. row ***************************
Procedure: myProc
sql_mode: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Create Procedure: NULL
character_set_client: utf8mb3
collation_connection: utf8mb3_general_ci
Database Collation: utf8mb4_general_ciSHOW grants;+-----------------------------------------------------------------------+
| Grants for user1@% |
+-----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `user1`@`%` |
| GRANT SELECT, EXECUTE, SHOW CREATE ROUTINE ON `test`.* TO `user1`@`%` |
+-----------------------------------------------------------------------+SHOW CREATE PROCEDURE myProc \G*************************** 1. row ***************************
Procedure: myProc
sql_mode: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `myProc`()
BEGIN
SELECT "My Definiton of a Stored Procedure";
END
character_set_client: utf8mb3
collation_connection: utf8mb3_general_ci
Database Collation: utf8mb4_general_ciCREATE DATABASE test;
USE test;
CREATE TABLE t1 (id INT);
CREATE USER user1;
GRANT SELECT, UPDATE ON *.* TO user1;
CREATE USER user2;
GRANT SELECT ON test.* TO user2;
CREATE USER user3;
GRANT SELECT ON test.t1 TO user3;
SELECT * FROM sys.privileges_by_table_by_level WHERE GRANTEE NOT LIKE "'root'@'%'";+--------------+------------+-------------+-----------+--------+
| TABLE_SCHEMA | TABLE_NAME | GRANTEE | PRIVILEGE | LEVEL |
+--------------+------------+-------------+-----------+--------+
| test | t1 | 'user1'@'%' | SELECT | GLOBAL |
| test | t1 | 'user1'@'%' | UPDATE | GLOBAL |
| test | t1 | 'user2'@'%' | SELECT | SCHEMA |
| test | t1 | 'user3'@'%' | SELECT | TABLE |
+--------------+------------+-------------+-----------+--------+[mariadb]
...
innodb_data_file_path=ibdata1:12M;ibdata2:50M:autoextend:autoshrinkSET GLOBAL innodb_truncate_temporary_tablespace_now=1;CREATE TEMPORARY TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL)ENGINE=InnoDB;
INSERT INTO t1 SELECT seq, seq FROM seq_1_to_65536;
DROP TABLE t1;
SELECT NAME, FILE_SIZE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME="innodb_temp
orary";+------------------+-----------+
| NAME | FILE_SIZE |
+------------------+-----------+
| innodb_temporary | 79691776 |
+------------------+-----------+SET GLOBAL INNODB_TRUNCATE_TEMPORARY_TABLESPACE_NOW= 1;
SELECT NAME, FILE_SIZE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME="innodb_temp
orary";+------------------+-----------+
| NAME | FILE_SIZE |
+------------------+-----------+
| innodb_temporary | 12582912 |
+------------------+-----------+FLUSH TABLES t1 FOR EXPORT;
--copy_file $MYSQLD_DATADIR/test/t1.cfg $MYSQLD_DATADIR/test/t2.cfg
--copy_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/t2.frm
--copy_file $MYSQLD_DATADIR/test/t1.ibd $MYSQLD_DATADIR/test/t2.ibd
UNLOCK TABLES;
ALTER TABLE t2 IMPORT TABLESPACE;2022-03-24 13:10:43 0 [Note] WSREP: REPORTING SST PROGRESS: '{ "from": 1, "to": 3, "total": 23106759472, "done": 23106759472, "indefinite": -1 }'SELECT * FROM processlist\G*************************** 1. row ***************************
...
*************************** 2. row ***************************
ID: 6
USER: root
HOST: localhost
DB: test
COMMAND: Query
TIME: 1
STATE: Sending data
INFO: select * from t1
TIME_MS: 1340.406
STAGE: 0
MAX_STAGE: 0
PROGRESS: 0.000
MEMORY_USED: 89856
MAX_MEMORY_USED: 392544
EXAMINED_ROWS: 0
SENT_ROWS: 3895737
QUERY_ID: 436
INFO_BINARY: select * from t1
TID: 100DEFAULT CURRENT_TIMESTAMP or ON UPDATE CURRENT_TIMESTAMP are not set anymore for the first TIMESTAMP field in a table if not explicitly setA TIMESTAMP field does not get the property NOT NULL set anymore if not explicitly set
The old behavior can be achieved by setting the properties explicitly or by setting explicit_defaults_for_timestamp to OFF
ALTER TABLE can be used for this conversion
A new option --update-history for mariadb-dump allows converting row_end values to the new maximum while running a dump
max_tmp_total_space_usage – to limit the total disc storage used by the MariaDB Server instance
Any query which does result in exceeding the limit of temporary storage will return with an error.
Two new status variables can be used to monitor the currently used storage:
tmp_space_used
max_tmp_space_used
See also . The space used per session is also shown in the view process_list in the information schema.
Example:
VEC_DISTANCE_COSINE() measures the cosine distance between two vectors in a multi-dimensional vector space
Example:
Configuration Options
The vector search feature requires some for controlling the general behavior. Four new system variables have been added:
mhnsw_max_cache_size - Upper limit for one MHNSW vector index cache
mhnsw_default_distance - Default value for the DISTANCE vector index option
mhnsw_default_m - Default value for the M vector index option
mhnsw_ef_search - Minimal number of result candidates to look for in the vector index for ORDER BY ... LIMIT N queries.
PERIOD_NAMESTART_COLUMN_NAME
END_COLUMN_NAME
to list Application-time period tables, the name defined for a period, and the columns used for start and end timestamps.
CONSTRAINT_NAMETABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
PERIOD_NAME
--parallel--use-threads--slave-connections-needed-for-purge1The new status variable binlog_disk_use can be used to query the disk space currently used by the binary logs.
binlog_gtid_index_page_size (default 4096) defines the page size to use for the binary log GTID index.The new system variable binlog_gtid_index_span_min (default 65536) controls the sparseness of the binary log GTID index.
The new status variables binlog_gtid_index_hit and binlog_gtid_index_miss can be used for monitoring purposes. A miss is an indication that the index file is missing.
READ ONLY ADMIN privilege from the SUPER privilege and making it a new privilege. Hence the READ ONLY ADMIN privilege now needs to be granted explicitly, if this user should have write access to a read only replica (a replica having read_only=1 set).The user was the definer of the Stored Procedure
The new privilege SHOW CREATE ROUTINE, has been introduced to enable any user with this privilege to view the definition of a stored routine.
Example without privilege SHOW CREATE ROUTINE:
An account is blocked, if max_password_errors is reached
NULL for accounts with privilege CONNECTION ADMIN
PASSWORD_EXPIRATION_TIME - The date and time when the password expires or NULL, if the password never expires
"waiting for flow control"
"waiting for certification"
MariaDB Enterprise Cluster has added a new feature to save wsrep node status changes in a dedicated machine readable JSON file. This allows an easier way for reading and interpreting the status file by an external monitoring tool. A filename needs to be specified via the option wsrep_status_file to enable the feature.
This JSON file also includes details about a node eviction status to the JSON file to report that a Galera node needs to be restarted to join the cluster.
MariaDB Enterprise Cluster now includes progress reporting of MariaDB Enterprise Backup based SST when wsrep-debug=1 is set and the tool pv is installed. The SST progress report is then written into the server log:
server_audit_sync_log_file - flushes the buffer to the log file. While the log record is in the buffer, it cannot be seen in the log file. And if there are not many events to log, the time before records can be observed can be significant. So user can do SET GLOBAL server_audit_log_file=1 to this variable to force write the buffer to the file, to make sure he doesn't miss the recent records.
Two new fields are available via SHOW REPLICA STATUS (MENT-2129)
Connects_Tried, which provides the number of attempts the replica has made to connect to the primary, and
Master_Retry_Count, which provides the number of times the replica will attempt to connect to a primary before giving up.
The authentication plugin caching_sha2_password has been added, not loaded by default (MDEV-37600)
SELECT VEC_ToText(x'e360d63ebe554f3fcdbc523f4522193f5236083d');
+---------------------------------------------------------+
| VEC_ToText(x'e360d63ebe554f3fcdbc523f4522193f5236083d') |
+---------------------------------------------------------+
| [0.418708,0.809902,0.823193,0.598179,0.033255] |
+---------------------------------------------------------+SELECT VEC_DISTANCE_COSINE(VEC_FROMTEXT('[1,2,3]'), VEC_FROMTEXT('[3,5,7]'));+-----------------------------------------------------------------------+
| VEC_DISTANCE_COSINE(VEC_FROMTEXT('[1,2,3]'), VEC_FROMTEXT('[3,5,7]')) |
+-----------------------------------------------------------------------+
| 0.00258509695694209 |
+-----------------------------------------------------------------------+SELECT JSON_OVERLAPS('{"A": 1, "B": {"C":2}}', '{"A": 2, "B": {"C":2}}') AS is_overlap;
+---------------------+
| is_overlap |
+---------------------+
| 1 |
+---------------------+SELECT JSON_KEY_VALUE('[[1, {"key1":"val1", "key2":"val2"}, 3], 2, 3]', '$[0][1]');+-----------------------------------------------------------------------------+
| JSON_KEY_VALUE('[[1, {"key1":"val1", "key2":"val2"}, 3], 2, 3]', '$[0][1]') |
+-----------------------------------------------------------------------------+
| [{"key": "key1", "value": "val1"}, {"key": "key2", "value": "val2"}] |
+-----------------------------------------------------------------------------+SELECT jt.* FROM JSON_TABLE(
JSON_KEY_VALUE('[[1, {"key1":"val1", "key2":"val2"}, 3], 2, 3]', '$[0][1]'),'$[*]'
COLUMNS (
k VARCHAR(20) PATH '$.key',
v VARCHAR(20) PATH '$.value',
id FOR ORDINALITY )) AS jt;+------+------+------+
| k | v | id |
+------+------+------+
| key1 | val1 | 1 |
| key2 | val2 | 2 |
+------+------+------+SET @array1= '[1,2,3]';
SET @array2= '[1,2,4]';
SELECT json_array_intersect(@array1, @array2) AS result;+--------+
| result |
+--------+
| [1, 2] |
+--------+SET @json1= '[[1,2,3],[4,5,6],[1,1,1]]';
SET @json2= '[[1,2,3],[4,5,6],[1,3,2]]';
SELECT json_array_intersect(@json1, @json2) AS result;+------------------------+
| result |
+------------------------+
| [[1, 2, 3], [4, 5, 6]] |
+------------------------+SET @json1= '{ "a" : [1,2,3] , "b": {"key1": "val1", "key2": {"key3": "val3"}} }';
SELECT JSON_OBJECT_TO_ARRAY(@json1) AS result;+-----------------------------------------------------------------------+
| result |
+-----------------------------------------------------------------------+
| [["a", [1, 2, 3]], ["b", {"key1": "val1", "key2": {"key3": "val3"}}]] |
+-----------------------------------------------------------------------+SET @json1='{"a":[1,2,3],"b":{"key1":"val1","key2":{"key3":"val3"}}}';
SET @json2='{"a":[1,2,3]}';
SELECT JSON_OBJECT_TO_ARRAY(@json1) INTO @array1;
SELECT JSON_OBJECT_TO_ARRAY(@json2) INTO @array2;
SELECT JSON_ARRAY_INTERSECT(@array1,@array2) as result;+--------------------+
| result |
+--------------------+
| [["a", [1, 2, 3]]] |
+--------------------+SET @json1= '{ "a": 1, "b": 2, "c": 3}';
SELECT JSON_OBJECT_FILTER_KEYS (@json1, ' ["b", "c"] ') AS result;+------------------+
| result |
+------------------+
| {"b": 2, "c": 3} |
+------------------+SET @json1= '{ "a": 1, "b": 2, "c": 3}';
SET @json2= '{"b" : 10, "c": 20, "d": 30}';
SELECT JSON_OBJECT_FILTER_KEYS (@json1, json_array_intersect(json_keys(@json1), json_keys(@json2))) AS result;+------------------+
| result |
+------------------+
| {"b": 2, "c": 3} |
+------------------+SELECT JSON_REMOVE(@json, '$.A[-10]');
SELECT JSON_REMOVE(@json, '$.A[last]');SELECT JSON_REMOVE(@json, '$.A[1 to 3]');AES_ENCRYPT(str,key_str)AES_ENCRYPT(str, key, [, iv [, mode]])SELECT @@block_encryption_mode;+-------------------------+
| @@block_encryption_mode |
+-------------------------+
| aes-128-ecb |
+-------------------------+SELECT HEX(AES_ENCRYPT('MariaDB','mykey','vector')) AS result;+----------------------------------+
| result |
+----------------------------------+
| CD0352A4B2FB18A592C04FF8CDA6C2F2 |
+----------------------------------+SELECT AES_DECRYPT(x'CD0352A4B2FB18A592C04FF8CDA6C2F2','mykey','vector') AS result;+---------+
| result |
+---------+
| MariaDB |
+---------+SELECT HEX(AES_ENCRYPT('MariaDB','mykey','thisismy256vector','aes-256-cbc')) AS result;+----------------------------------+
| result |
+----------------------------------+
| CD6C47183B89A813557BFD639A893CE3 |
+----------------------------------+SELECT AES_DECRYPT(x'CD6C47183B89A813557BFD639A893CE3','mykey','thisismy256vector','aes-256-cbc') AS result;+---------+
| result |
+---------+
| MariaDB |
+---------+DATE_FORMAT(DATE, format)SELECT DATE_FORMAT(NOW(), '%W %d %M %Y %H:%i:%s %Z %z');+--------------------------------------------------+
| DATE_FORMAT(NOW(), '%W %d %M %Y %H:%i:%s %Z %z') |
+--------------------------------------------------+
| Tuesday 21 November 2023 13:28:34 EST -0500 |
+--------------------------------------------------+KDF(key_str, salt [, {info | iterations} [, kdf_name [, width ]]])SELECT hex(kdf('foo', 'bar', 'info', 'hkdf'));+----------------------------------------+
| hex(kdf('foo', 'bar', 'info', 'hkdf')) |
+----------------------------------------+
| 710583081D40A55F0B573A76E02D8975 |
+----------------------------------------+insert into tbl values (aes_encrypt(@secret_data, kdf("Passw0rd", "NaCl", "info", 'hkdf'), "iv"));SELECT CONV(61,10,36);+----------------+
| CONV(61,10,36) |
+----------------+
| 1P |
+----------------+SELECT CONV(61,10,62);+----------------+
| CONV(61,10,62) |
+----------------+
| z |
+----------------+CREATE TABLE myVectorSearch (
id INT PRIMARY KEY,
v VECTOR(5) NOT NULL,
VECTOR INDEX (v)
);select hex(vec_fromtext('[1,2,3]'));
+------------------------------+
| hex(vec_fromtext('[1,2,3]')) |
+------------------------------+
| 0000803F0000004000004040 |
+------------------------------+INSERT INTO v VALUES
(1, x'e360d63ebe554f3fcdbc523f4522193f5236083d'),
(2, x'f511303f72224a3fdd05fe3eb22a133ffae86a3f'),
(3,x'f09baa3ea172763f123def3e0c7fe53e288bf33e'),
(4,x'b97a523f2a193e3eb4f62e3f2d23583e9dd60d3f'),
(5,x'f7c5df3e984b2b3e65e59d3d7376db3eac63773e'),
(6,x'de01453ffa486d3f10aa4d3fdd66813c71cb163f'),
(7,x'76edfc3e4b57243f10f8423fb158713f020bda3e'),
(8,x'56926c3fdf098d3e2c8c5e3d1ad4953daa9d0b3e'),
(9,x'7b713f3e5258323f80d1113d673b2b3f66e3583f'),
(10,x'6ca1d43e9df91b3fe580da3e1c247d3f147cf33e');SELECT id FROM v
ORDER BY VEC_DISTANCE_EUCLIDEAN(v, x'6ca1d43e9df91b3fe580da3e1c247d3f147cf33e');+----+
| id |
+----+
| 10 |
| 7 |
| 3 |
| 9 |
| 2 |
| 1 |
| 5 |
| 4 |
| 6 |
| 8 |
+----+MariaDB Enterprise Server 11.4.8-5 is a Stable (GA) maintenance release of MariaDB Enterprise Server 11.4, released on 2025-09-08
Release date: 8 Sep 2025
MariaDB Enterprise Server 11.4.8-5 is a Stable (GA) maintenance release of MariaDB Enterprise Server 11.4. This release includes a variety of fixes.
This release incorporates MariaDB ColumnStore engine version 23.10.6
Repositories for RedHat 10 x86_64 and aarch64 have been added
Support added for Red Hat Enterprise Linux 10, AlmaLinux 10, Rocky Linux 10 and Oracle Linux 10
MariaDB systemd multi-instance service was changed to not attempt changes to the permissions on its pam helper server. This prevents unconstructive behavior and errors in the systemd journal when starting the mariadb@.service ()
Adding (with ALTER TABLE) a UNIQUE constraint that is USING HASH to a table with foreign keys could've caused the table to become corrupted. ()
Server crashes in do_mark_index_columns instead of ER_DUP_ENTRY on partitioned table ()
CREATE OR REPLACE with self-referencing CHECK hangs forever, cannot be killed ()
Segfault on INTERSECT ALL with UNION in Oracle mode ()
This commit fixes a bug where Aria tables are used in (master->slave1->slave2) and a backup is taken on slave2. In this case it is possible that the replication position in the backup, stored in mysql.gtid_slave_pos, will be wrong. This will lead to replication errors if one is trying to use the backup as a new slave. (
After a successful shrinking of innodb_buffer_pool_size, there will be no message about it in the server error log. After a failed shrinking of innodb_buffer_pool_size, the adaptive hash index will not be re-enabled if innodb_adaptive_hash_index was ON when SET GLOBAL innodb_buffer_pool_size=... started to execute. ()
ALTER TABLE require ALTER privilege on sequence from DEFAULT value expression ()
Deadlock does not rollback transaction fully ()
parallel slave ALTER-SEQUNCE attempted to binlog out-of-order (
Remove the error codes added by the MDEV-36032 patch ()
Seconds_Behind_Master Spike at Log Rotation on Parallel Replica ()
Assertion 'vers_conditions.delete_history' failed upon PREPARE ()
DML committed within XA transaction block after deadlock error and implicit rollback ()
Performance regression with encrypted InnoDB log ()
For the complete list of changes in this release, see the .
In alignment to the enterprise lifecycle, MariaDB Enterprise Server 11.4.8-5 is provided for:
AlmaLinux 8 (x86_64, ARM64)
AlmaLinux 9 (x86_64, ARM64)
AlmaLinux 10 (x86_64, ARM64)
Debian 11 (x86_64, ARM64)
Some components of MariaDB Enterprise Server are supported on a subset of platforms. See for details.
Maria-backup would crash during the 'maria_recovery' part. This could happen if server was doing repair or creating indexes while the backup was running. (MDEV-36860)
MariaDB server crash when a query includes a derived table containing unnamed column. (MDEV-24588)
Incorrect handling of UTF-8 characters (and other character sets requiring more than a single byte representation) in the minimum/maximum positions of a table during the execution of ANALYZE TABLE tbl PERSISTENT FOR ALL resulted in an endless loop consuming more memory and prevented the server from terminating. (MDEV-36765)
Fatal InnoDB error: Unknown error Temp file write failure (MDEV-36017)
ASAN errors in Binary_string::alloced_length / reset_stmt_params (MDEV-32694)
semi sync makes the master unresponsive when a replica is stopped (MDEV-36934)
json_extract crashes in Item_func_json_extract::read_json (MDEV-21530)
MariaDB 10.11.9 Signal 11 crash on second Stored Procedure call (MDEV-36814)
When innodb_buffer_pool_size is being shrunk while there are no data pages cached, InnoDB could hang or crash. (MDEV-37263)
A replica would crash while replicating UPDATE and DELETE DML statements that target a table which previously had a partition that was converted to a separate table via ALTER TABLE .. CONVERT PARTITION .. TO TABLE. For example, if the command looked like ALTER TABLE t1 CONVERT PARTITION p1 TO TABLE t_new; the replica would crash when trying to update/deleterows in table t1 after running the command. (MDEV-36906)
Crash in add_keyuses_for_splitting() when joining with a derived table (MDEV-30711)
Inconsistency detected - create sequence (MENT-2297)
MariaDB Enterprise Backup failed after upgrade (MENT-2401)
Possible crash on server start when CREATE SERVER has been used before (MENT-2388)
Replica stops with "Found invalid event in binary log" (MENT-2385)
In certain cases privileges on sequences were too restrictive, for example, SELECT on a table might've erroneously required INSERT privilege on a sequences (MDEV-36870)
AUTO_INCREMENT leads to non-serializable on results (MDEV-36330)
UNIQUE constraint that was USING HASH and UNIQUE constrant WITHOUT OVERLAPS could be violated under heavy load in READ COMMITTED transaction isolation mode. (MDEV-37199)
Fresh MariaDB 11.4 installation gives errors when configuring utf8 (MDEV-36815)
Split Materialized code: last_refills is never set in 11.0+ (MDEV-36323)
UNIQUE KEY USING HASH accepting duplicate records (MENT-2324)
Crash recovery after bulk load data reports corruption (MDEV-37192)
Don't generate index_merge plans, if a column is present in both Secondary Key and Primary Key indexes and either of the indexes include it with DESC order (as the scan itself is not a ROR scan). (MDEV-36410)
Incorrect handling of null values on join conditions. (MDEV-37057)
DROP DEFAULT makes SHOW CREATE non-idempotent (MDEV-29001)
Possible wrong results when split materialized optimization is used with nullable join conditions. (MDEV-37230)
Microsoft Windows (x86_64) (MariaDB Enterprise Cluster excluded)
Oracle Linux 8 (x86_64, ARM64)
Oracle Linux 9 (x86_64, ARM64)
Oracle Linux 10 (x86_64, ARM64)
Red Hat Enterprise Linux 8 (x86_64, ARM64)
Red Hat Enterprise Linux 9 (x86_64, ARM64, PPC64LE)
Red Hat Enterprise Linux 10 (x86_64, ARM64)
Rocky Linux 8 (x86_64, ARM64)
Rocky Linux 9 (x86_64, ARM64)
Rocky Linux 10 (x86_64, ARM64)
SUSE Linux Enterprise Server 15 (x86_64, ARM64)
Ubuntu 22.04 (x86_64, ARM64)
Ubuntu 24.04 (x86_64, ARM64)
Microsoft Windows (x86_64) (Without MariaDB Enterprise Cluster (Galera) support)
Red Hat UBI 8 (x86_64, ARM64)
Red Hat UBI 8 is part of the Enterprise Server Docker Image. It does not support MariaDB Enterprise Cluster (Galera) or MariaDB ColumnStore.
Segmented key cache for Aria (MENT-2361)
A new variable (default 1) to define the number of segments has been added. The default disables the new feature.
Backport fixes for Vectors to MariaDB Enterprise 11.4 (MENT-2365)
Overflow/inf in vec_distance_euclidean
Sporadic segmentation faults possibly related to vector search
Incorrect error/docs for Vector column lengths (max = 65532
Unexpected ER_TABLE_EXISTS_ERROR on primary or replica upon CREATE OR REPLACE for partitioned table
Cannot access shared MEM_ROOT without a lock
Can't find record in 't1' on INSERT to Vector table
Create vector table failed with VECTOR INDEX when innodb_force_primary_key=on
Assertion when adding FK to MyISAM/Aria table with a vector index
UBSAN: 32801 is outside the range of representable values of type 'short'
Always release ctx in mhnsw_delete_all
Optimise dot_product by loop-unrolling by a factor of 4
Vector index search allocates too much memory for large ef_search
ALTER performs vector truncation without WARN_DATA_TRUNCATED or similar warnings/errors
DATA/INDEX DIRECTORY options are ignored for vector index
DATA/INDEX DIRECTORY handling is inconsistent
Assert with vector index and very long PK
InnoDB: Failing assertion: prebuilt->select_lock_type != LOCK_NONE || srv_read_only_mode || trx->read_view.is_open()
Crash on disconnect when dropped Aria table with vector key under lock
InnoDB assert with vector index under LOCK TABLES
mhnsw: support powerpc64 SIMD instructions
mhnsw: support aarch64 SIMD instructions
IGNORED attribute has no effect on vector keys
IMPORT TABLESPACE does not work for tables with vector, although allowed
Vector-related error messages worth improving when possible
Adding a regular index on a vector column leads to invalid table structure
Vector values do not survive mariadb-dump / restore
Server crashes in Charset::mbminlen / Item_func_vec_fromtext::val_str upon mixing vector type with string
Server crashes in mhnsw_read_first upon using vector key with views
Server crashes when checking/updating a table having vector key after enabling innodb_force_primary_key
ALTER TABLE re-creating vector key is no-op with non-copying alter algorithms (default)
Server crash in FVector::distance_to upon concurrent SELECT
Server crashes in Item_func_vec_distance_common::get_const_arg
Non-copying ALTER does not pad VECTOR column, vector search further does not work
Assertion bitmap_is_set(&read_partitions, next->id) failed in int partition_info::vers_set_hist_part(THD *)
Segmented key cache for Aria (MENT-2361)
A new variable (default 1) to define the number of segments has been added. The default disables the new feature.
Backport fixes for Vectors to MariaDB Enterprise 11.4 (MENT-2365)
Overflow/inf in vec_distance_euclidean
Sporadic segmentation faults possibly related to vector search
Incorrect error/docs for Vector column lengths (max = 65532
Unexpected ER_TABLE_EXISTS_ERROR on primary or replica upon CREATE OR REPLACE for partitioned table
Cannot access shared MEM_ROOT without a lock
Can't find record in 't1' on INSERT to Vector table
Create vector table failed with VECTOR INDEX when innodb_force_primary_key=on
Assertion when adding FK to MyISAM/Aria table with a vector index
UBSAN: 32801 is outside the range of representable values of type 'short'
Always release ctx in mhnsw_delete_all
Optimise dot_product by loop-unrolling by a factor of 4
Vector index search allocates too much memory for large ef_search
ALTER performs vector truncation without WARN_DATA_TRUNCATED or similar warnings/errors
DATA/INDEX DIRECTORY options are ignored for vector index
DATA/INDEX DIRECTORY handling is inconsistent
Assert with vector index and very long PK
InnoDB: Failing assertion: prebuilt->select_lock_type != LOCK_NONE || srv_read_only_mode || trx->read_view.is_open()
Crash on disconnect when dropped Aria table with vector key under lock
InnoDB assert with vector index under LOCK TABLES
mhnsw: support powerpc64 SIMD instructions
mhnsw: support aarch64 SIMD instructions
IGNORED attribute has no effect on vector keys
IMPORT TABLESPACE does not work for tables with vector, although allowed
Vector-related error messages worth improving when possible
Adding a regular index on a vector column leads to invalid table structure
Vector values do not survive mariadb-dump / restore
Server crashes in Charset::mbminlen / Item_func_vec_fromtext::val_str upon mixing vector type with string
Server crashes in mhnsw_read_first upon using vector key with views
Server crashes when checking/updating a table having vector key after enabling innodb_force_primary_key
ALTER TABLE re-creating vector key is no-op with non-copying alter algorithms (default)
Server crash in FVector::distance_to upon concurrent SELECT
Server crashes in Item_func_vec_distance_common::get_const_arg
Non-copying ALTER does not pad VECTOR column, vector search further does not work
Assertion bitmap_is_set(&read_partitions, next->id) failed in int partition_info::vers_set_hist_part(THD *)
MariaDB Enterprise Server 11.4.5-3 is a Stable (GA) maintenance release of MariaDB Enterprise Server 11.4, released on 2025-03-19
MariaDB Enterprise Server 11.4.5-3 is a Stable (GA) maintenance release of MariaDB Enterprise Server 11.4. This release includes a variety of fixes.
MariaDB Enterprise Server 11.4.5-3 was released on 19 Mar 2025.
CVE (with link)
CVSS base score
This release incorporates MariaDB ColumnStore engine version .
The vector search capability has now been added to the MariaDB Enterprise Server 11.4 release. The linked explains the idea of the new vector search feature in detail. ()
Vector embeddings are numerical representations [0.2, -0.5, 0.8, 0.1, ...] that capture semantic meaning or features of data in a multi-dimensional space. The embedding transforms simple to complex data such as text, images, audio, or video into a series of numbers (a vector) where similar items are positioned together in the multi-dimensional vector space.
For example, a word embedding of the word "dog" would be close in a vector embedding space to the word "puppy", whereas "dog" would not be close to the word "airplane". The embedding representation can be used in similarity search, recommendation systems, or more generally in traditional AI/ML systems and GenAI systems.
With the RC release a new data type VECTOR(N) has been added to represent the vector column, where N is the number of dimensions.
Example:
VEC_FromText() converts a text representation of the vector (a json array of numbers) to a vector (little-endian IEEE float sequence of bytes, 4 bytes per float).
Example:
VEC_ToText() converts a binary vector into a json array of numbers (floats).
Example:
Comparing vectors, calculating how close they are, is the key functionality needed by an application working with vector search. Two functions exist for calculating the distance between vectors. Which one to use depends on the application and on how the vectors were generated.
VEC_DISTANCE_EUCLIDEAN() takes two vectors and computes the straight line (L2) Euclidean distance between two multi-dimensional points in the vector space
Example:
VEC_DISTANCE_COSINE() measures the cosine distance between two vectors in a multi-dimensional vector space
Example:
The vector search feature requires some for controlling the general behavior. Four new system variables have been added:
mhnsw_max_cache_size - Upper limit for one MHNSW vector index cache
mhnsw_default_distance - Default value for the DISTANCE vector index option
mhnsw_default_m - Default value for the M vector index option
Starting with this release we generate a Software Bill of Materials (SBOM) JSON file provided in the downloads archive, which can be reached from the "All Files" link on the MariaDB Enterprise Server downloads page ()
New parameter --skip-freed-pages for Innochecksum. Use this parameter to not get freed undo logs reported as existing undo log pages. ()
Galera protocol versions are now shown by show status - change available with installation of galera library 26.4.21+ ()
Fix incorrect writing of timestamp into binary log, causing discrepancy upon binlog replaying ()
Fix trigger created with "CREATE TRIGGER table1_after_insert AFTER INSERT" which is adding rows to another table using "FOR EACH ROW insert into table2(id, name) values (NEW.id, NEW.name);" that did not work correctly when if bulk inserts are used by the application. Only the first row of the bulk insert would be added to the table (
Fix client crash the command after client sets character set to utf32 ()
Fix possible crash where server could not construct a geomery object from the input ()
Fix possible InnoDB hang while running out of buffer pool ()
Fix possible Spider thread hang in 'Update' state on 2nd INSERT ()
Fix sporadic reporting of success when a deadlock error occurs under --ps-protocol BF aborted transaction ()
Fix rare cases where binlog entries could receive incorrect timestamps on secondary nodes of a Galera cluster, potentially impacting replication accuracy ()
For an authentication with the ed25519 authentication plugin the password of the CREATE USER statement is now masked in the audit log ()
Conditions with SP local variables are now pushed into derived table. Previous behaviour caused slow performance and table scans instead of using the pushed down condition ()
NULL-aware materialization with IN predicate and single column no longer skips building sorted Ordered_key structures ()
Cloning of table statistics while saving the InnoDB table stats is now avoided ()
For the complete list of changes in this release, see the .
In alignment with , MariaDB Enterprise Server 11.4.5-3 is provided for:
Debian 11 (x86_64, ARM64)
Debian 12 (x86_64, ARM64)
Red Hat Enterprise Linux 8 (x86_64, ARM64)
Red Hat Enterprise Linux 9 (x86_64, ARM64, PPC64LE)
Some components of MariaDB Enterprise Server are supported on a subset of platforms. See for details.
mhnsw_ef_search - Minimal number of result candidates to look for in the vector index for ORDER BY ... LIMIT N queries.MariaDB now supports MySQL 8.0 binlog events, including PARTIAL_UPDATE_ROWS_EVENT, TRANSACTION_PAYLOAD_EVENT, and HEARTBEAT_LOG_EVENT_V2. (MDEV-35643)
InnoDB deadlock output query length increased to improve visibility of deadlocked statements. (MDEV-32576)
History is now stored on the same partitions on different Galera nodes when system versioning is enabled (MDEV-35096)
Fix assertion falilure and possible index corruption with unique key and nopad collation without DESC or HASH keys (MDEV-30111)
After changing the table definition for the system table 'mysql.servers', a following execution of CREATE SERVER would previously lead to a server crash.
NOTE: System tables should never be modified by a user anyhow (MDEV-33783)
FIx streaming replication transaction crash with innodb_snapshot_isolation (MDEV-35281)
Fix sporadic failure of async replication on Galera async replica nodes with parallel replication enabled (MDEV-35465)
Fix failing assertion causing disruption and replication failure (MDEV-24035)
Fix possible failure of wsrep_sst_rsync SST script if user specified aria_log_dir_path different from default data directory (MDEV-35387)
Fix connection hang after query on a partitioned table with UNION and LIMIT ROWS EXAMINED (MDEV-35571)
Fix server crash in get_sort_by_table/make_join_statistics after INSERT into a view with ORDER BY (MDEV-29935)
Fix possible hang during CREATE TABLE...SELECT error handling, especially with innodb_snapshot_isolation enabled (MDEV-35647)
Fix incorrect locking order of LOCK_log/LOCK_commit_ordered, and LOCK_global_system_variables (MDEV-29744)
Fix possible memory leak on SHUTDOWN (MDEV-35326)
Fix possible memory leak while shutting down server after installing the auth_gssapi plugin (MDEV-35575)
Fix possible crash on DELETE from a HEAP table (MDEV-22695)
Fix possible server crash when using INSERT DELAYED on tables with virtual columns. (MDEV-26891)
Fix possible crash during index traversal using tree_search_next. (MDEV-28130)
Fix possible hang or crash during InnoDB purge with HASH indexes during ALTER TABLE (MDEV-25654)
Fix possible hang or crash where zero offset applied to null pointer (MDEV-35864)
Fix possible crash on bootup in spider_sys_open_table (MDEV-32822, MDEV-34302, MDEV-34925)
Fix possible Spider crash or hang when the first byte of a connection key is changed (MDEV-34849)
Fix possible runtime error caused by XA RECOVER applying a zero offset to a null pointer (MDEV-35549)
Fix assertion failure on cascading foreign key update of table with vcol index in parent (MDEV-29182)
FIx assertion failure where CURRENT_USER was not correctly copied during condition pushdown (MDEV-35090)
Fix cluster node hang during shutdown if threadpool is used (MDEV-35710)
Calling a stored routine that executes a join on three or more tables and referencing not-existent column name in the USING clause could previously result in a crash on its second invocation. (MDEV-24935)
Fix possible assertion failure when Galera cluster is in 'split-brain' state due to loss of communication between nodes (fix requires Galera library 26.4.21+) (MENT-2175)
Fix assertion failure when executing XA PREPARE (and possibly other XA statements) on Galera cluster nodes (MENT-2212)
Fix assertion failure when executing XA statements on Galera cluster nodes (MENT-2214)
In rare cases, an ALTER TABLE or other operation could previously hang when using NBO mode on a cluster with very low network latencies (for example, when both nodes are running on the same physical machine) (MENT-2215)
MariaDB Cluster and ALTER INPLACE running in Total Order Isolation (wsrep_OSU_method=TOI) now correctly abort a DML INSERT operation in InnoDB (MDEV-33064)
Fix possible crash in wsrep_check_sequence (MDEV-33245)
MariaDB Audit now detects all DCLs forms for masking a password (MDEV-35522)
Fix potential issue in secondary Index with ROW_FORMAT=COMPRESSED and Change buffering enabled (MDEV-35679)
sql_mode='NO_UNSIGNED_SUBTRACTION' now works for multiple unsigned integers (MDEV-35651)
Fix doublewrite recovery of innodb_checksum_algorithm=full_crc32 encrypted pages (MDEV-34898)
START TRANSACTION, when triggering an implicit commit as a COMMIT or ROLLBACK has not been executed before, now resets optional characteristics added to the last START TRANSACTION command (MDEV-35335)
mariadb-binlog can now correctly process more than one logfile when --stop-datetime is specified (MDEV-35528)
Rows in table mysql.gtid_slave_pos are now correctly deleted on Galera nodes when wsrep_gtid_mode = 1 is used, which previously lead to wrong information about replica delays (MDEV-34924)
EXCHANGE PARTITION now works for tables with unique blobs (MDEV-35612)
Fix issue where functions in default values in tables with certain character sets could break SHOW CREATE and mariadb-dump (MDEV-29968)
Setting pseudo_thread_id to a value exceeding 4 bytes previously resulted in truncation when written to the binary log (MDEV-35646)
A BEFORE INSERT Trigger previously returned with error "Field 'xxx' doesn't have a default value", if a NULL value was added for a column defined NOT NULL without explicit value and no DEFAULT specified (MDEV-19761)
Undefined behavior could occur when attempting to perform INSERT DELAYED on a Galera cluster node. (MDEV-35852)
Fix issue where ON UPDATE SET NULL could not be specified on a NOT NULL column (MDEV-35445)
algorithm = instant can now correctly be used if a table has partitions and one tries to change a column with an index which is not the partitions key. This previously gave error "ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: ADD INDEX. Try ALGORITHM=NOCOPY" (MDEV-34813)
Fix issue where DROP TABLE on child and UPDATE of parent table can cause a metadata lock BF-BF conflict when applied concurrently. (MDEV-35018)
Can now correctly add a foreign key on a table with a long UNIQUE multi-column index that contains a foreign key as a prefix (MDEV-33658)
Fix possibly wrong result using a degenerated subquery (SELECT <expr>) with window function (MDEV-35869)
The "Failed to write to mysql.slow_log" error no longer shown without a detailed reason for the error (MDEV-20281)
Fix debian-start script failure when using non-standard socket path (MDEV-35907)
wsrep_sst_mariadb-backup.sh no longer uses --use-memory default (100MB) resulting in prepare stage which could take hours (MDEV-35749)
Replicate_* fields in Show-Slave-Status may be truncated, impacting replication monitoring. (MENT-2238)
AlmaLinux 9 (x86_64, ARM64)
Rocky Linux 8 (x86_64, ARM64)
Rocky Linux 9 (x86_64, ARM64)
SUSE Linux Enterprise Server 15 (x86_64, ARM64)
Ubuntu 20.04 (x86_64, ARM64)
Ubuntu 22.04 (x86_64, ARM64)
Ubuntu 24.04 (x86_64, ARM64)
Microsoft Windows (x86_64) (Without MariaDB Enterprise Cluster (Galera) support)
Red Hat UBI 8 (x86_64, ARM64)
Red Hat UBI 8 is part of the Enterprise Server Docker Image. It does not support MariaDB Enterprise Cluster (Galera) or MariaDB ColumnStore.
4.9
MariaDB Enterprise Server 11.4.7-4 is a Stable (GA) maintenance release of MariaDB Enterprise Server 11.4, released on 2025-06-11
MariaDB Enterprise Server 11.4.7-4 is a Stable (GA) maintenance release of MariaDB Enterprise Server 11.4. This release includes a variety of fixes.
MariaDB Enterprise Server 11.4.7-4 was released on 11 Jun 2025.
CVE (with link)
CVSS base score
This release incorporates MariaDB ColumnStore engine version 23.10.6
New user variable, analyze_max_length, default value 4G. Any field that is bigger than this value in bytes will be ignored by ANALYZE TABLE PERSISTENT to not collect statistics for long char/varchars unless it is specified in FOR COLUMNS(). ()
SBOM now includes 'license' and 'copyright' information, improving security compliance and dependency tracking. ()
Get option group suffix from $MARIADB_GROUP_SUFFIX in addition to $MYSQL_GROUP_SUFFIX ()
MariaDB effectively running as root CAP_DAC_OVERRIDE (
A multi-table UPDATE ... ORDER BY ... LIMIT statement could update the wrong rows when the ORDER BY clause was resolved by using temporary and filesort. ()
Assertion InnoDB searching row in wrong partition for multiple system versioned DELETE with same timestamp and same multistatement transaction ()
A query using a subquery in form:
WHERE col IN (SELECT ... LEFT JOIN tbl ON tbl.column=reference_outside_subquery)
could cause a crash in the optimizer. The essential part is that ON expression has only two kinds of references: 1.to inner side of the outer join and 2. to outside the subquery. ()
Incorrect error handling on DDL with FULLTEXT INDEX ()
ALTER TABLE…SEQUENCE does not work correctly with InnoDB ()
Race condition between log_t::resize_start() and log_t::resize_abort() ()
mariadb-backup --backup crash during innodb_undo_log_truncate=ON, innodb_encrypt_log=ON ()
InnoDB system tables cannot be optimized or defragmented ()
mysqldump does not preserve case of table names in generated sql ()
The collation utf8mb4_0900_bin is defined as an alias for utf8mb4_bin while it should be an alias of utf8mb4_nopad_bin, causing wrong comparison results. ()
CREATE INDEX fails to heal a FOREIGN KEY constraint ()
The untested ha_spider::index_first_internal constructs broken queries ()
Incorrect query result for comparisons of binary_column NOT LIKE binary_column ()
USER_STATISTICS.BUSY_TIME is in microseconds ()
When a CREATE TABLE .. SELECT errors while inserting data, a user would expect that all changes are rolled back and the table would not exist after executing the query; however, the error was accidentally ignored in the code, and the table would still exist. (
Wrong cardinality estimation for the derived table leads to slow plan with LATERAL DERIVED ()
If the join_condition is specified via USING (column_list), the query plan depends on the sequence of tables in the query ()
Cost estimates for materialized derived tables are poor ()
Doubled memory usage (11.4.4 <-> 11.4.5) ()
For the complete list of changes in this release, see the .
In alignment to the enterprise lifecycle, MariaDB Enterprise Server 11.4.7-4 is provided for:
AlmaLinux 8 (x86_64, ARM64)
AlmaLinux 9 (x86_64, ARM64)
Debian 11 (x86_64, ARM64)
Debian 12 (x86_64, ARM64)
Some components of MariaDB Enterprise Server are supported on a subset of platforms. See for details.
CREATE TABLE myVectorSearch (
id INT PRIMARY KEY,
v VECTOR(5) NOT NULL,
VECTOR INDEX (v)
);SELECT hex(vec_fromtext('[1,2,3]'));+------------------------------+
| hex(vec_fromtext('[1,2,3]')) |
+------------------------------+
| 0000803F0000004000004040 |
+------------------------------+SELECT VEC_ToText(x'e360d63ebe554f3fcdbc523f4522193f5236083d');+---------------------------------------------------------+
| VEC_ToText(x'e360d63ebe554f3fcdbc523f4522193f5236083d') |
+---------------------------------------------------------+
| [0.418708,0.809902,0.823193,0.598179,0.033255] |
+---------------------------------------------------------+INSERT INTO v VALUES
(1, x'e360d63ebe554f3fcdbc523f4522193f5236083d'),
(2, x'f511303f72224a3fdd05fe3eb22a133ffae86a3f'),
(3,x'f09baa3ea172763f123def3e0c7fe53e288bf33e'),
(4,x'b97a523f2a193e3eb4f62e3f2d23583e9dd60d3f'),
(5,x'f7c5df3e984b2b3e65e59d3d7376db3eac63773e'),
(6,x'de01453ffa486d3f10aa4d3fdd66813c71cb163f'),
(7,x'76edfc3e4b57243f10f8423fb158713f020bda3e'),
(8,x'56926c3fdf098d3e2c8c5e3d1ad4953daa9d0b3e'),
(9,x'7b713f3e5258323f80d1113d673b2b3f66e3583f'),
(10,x'6ca1d43e9df91b3fe580da3e1c247d3f147cf33e');SELECT id FROM v
ORDER BY VEC_DISTANCE_EUCLIDEAN(v, x'6ca1d43e9df91b3fe580da3e1c247d3f147cf33e');+----+
| id |
+----+
| 10 |
| 7 |
| 3 |
| 9 |
| 2 |
| 1 |
| 5 |
| 4 |
| 6 |
| 8 |
+----+SELECT VEC_DISTANCE_COSINE(VEC_FROMTEXT('[1,2,3]'), VEC_FROMTEXT('[3,5,7]'));+-----------------------------------------------------------------------+
| VEC_DISTANCE_COSINE(VEC_FROMTEXT('[1,2,3]'), VEC_FROMTEXT('[3,5,7]')) |
+-----------------------------------------------------------------------+
| 0.00258509695694209 |
+-----------------------------------------------------------------------+Progress reporting is only supported for MariaDBmy_getopt compares option names case sensitively (MDEV-27126)
Systemd: Restart on OOM (MDEV-36009)
Support has been added for Oracle Linux 8 and 9
Race conditions between ALTER TABLE or OPTIMIZE TABLE and the purge of transaction history were fixed. (MDEV-36122)
Server crashes when resizing default innodb buffer pool after setting innodb-buffer-pool-chunk-size to 1M (MDEV-34677)
Server aborts while deleting the record in spatial index (MDEV-35420)
The server could crash when an UPDATE is about to commit concurrently with a CREATE INDEX that includes VIRTUAL columns (MDEV-36281)
Upgrades fail on Windows (MDEV-36128)
ASAN errors in dict_sys_t::load_table / get_foreign_key_info after failing to load a table (MDEV-33167)
ALTER TABLE…DROP COLUMN after a failed ALTER TABLE…DROP COLUMN could lead to a server crash (MDEV-36236)
Server crashes when creating a table using function with a return type sys_refcursor (MDEV-36409)
Assertion `thd->lex == sp_instr_lex' failed in LEX *sp_lex_instr::parse_expr(THD *, sp_head *, LEX *) (MDEV-36377)
Crash on `DECLARE spvar1 ROW TYPE OF cursor1` after a table recreation (MDEV-36462)
Field pointer may be uninitialized in fill_record (MDEV-36181)
Protocol_text allocates memory without error checking, potentially leading to server crashes. (MDEV-35640)
A primary server could crash when a semi-sync connection is stopped, if the primary previously disabled semi-sync replication while the connection was already up (and `rpl_semi_sync_master_wait_no_slave=0`). (MDEV-36359)
Incorrect undo logging for indexes on virtual columns whose index ID does not fit in 32 bits (MDEV-36613)
Memory leak after failed CREATE TABLE…SELECT; crash on CREATE TABLE…SELECT that reads from multiple tables (MDEV-36504)
Assertion `src != ((void *)0)' failed in my_casedn_8bit (MDEV-36565)
With wsrep_ignore_apply_errors = 0, the node crashes due to assertion thd->is_error() failed in Sql_cmd_dml::prepare(), shown in the logs (MDEV-35946)
In some cases, if there are MDL locks (for example, when LOCK TABLE is executed), a node could get stuck in the system thread due to incorrect handling of metadata locks (MDL) in server code when a transaction was BF aborted. (MDEV-35941)
Regression after the fix for MDEV-31413 - sometimes the server crashes with an assertion in wsrep::transaction::before_rollback(), for example when using OPTIMIZE TABLE on an ARIA table with wsrep_osu_method=RSU. (MDEV-32631)
SST failure occurs when gtid_strict_mode is enabled under high load, such as OLTP load is active on the primary node. A typical symptom of this error is the presence of the diagnostic "[ERROR] mariadbd: Error writing file 'binlog'", in the debug version it is also possible to crash on assertion in the wsrep::transaction::before_rollback() function with the message "Assertion `state() == s_executing || state() == s_preparing || state() == s_prepared || state() == s_must_abort || state() == s_aborting || state() == s_cert_failed || state() == s_must_replay' failed". (MDEV-34891)
In Galera, creating sequence with a small cache leads to signal 6 error: [ERROR] WSREP: FSM: no such a transition REPLICATING -> COMMITTED. (MDEV-33850)
Under high load wsrep internal thread may terminate due to memory pressure conditions, but this is not a crash, however in debug version user may encounter assertion in wsrep_to_isolation_begin() function with following message: "int wsrep_to_isolation_begin(THD*, const char*, const char*, const TABLE_LIST*, const Alter_info*, const key_array*, const HA_CREATE_INFO*): Assertion `(0)' failed." (MDEV-36116)
Assertion `commit_trx' failed in innobase_commit() (ha_innodb.cc). An INSERT with sql_log_bin=0 is still replicated in Galera (per MDEV-7205), despite binary logging being disabled. This results in a partial binlog bypass, requiring a two-phase commit (2PC). During 2PC, the INSERT is first prepared (entering the PREPARED state in InnoDB), and on commit, the new assertion from MDEV-24035 fails, causing a crash with "Assertion 'commit_trx' failed" in logs. (MDEV-35658)
A Galera node might hang if foreign key (FK) and unique key (UK) checks are disabled on multiple appliers executing INSERTs into the same table, because InnoDB might treat these operations as bulk inserts, leading one applier to acquire a table-level lock. If another applier with a lower sequence number then waits for this lock, a deadlock can occur within Galera. Specifically, the lock holder waits for the earlier applier to commit, while the earlier applier is blocked by the lock. (MDEV-36360)
When a sequence is used and inserts run in parallel on multiple Galera nodes, a transaction may be aborted after passing certification. If it then attempts to roll back, the binlog statement cache—which includes reserved sequence values—may be written prematurely. This causes a crash with the diagnostic "WSREP: FSM: no such a transition REPLICATING -> COMMITTED" in the logs, as the transaction is supposed to replay and only write to the binlog during the final commit. (MDEV-33589)
A Galera node may hang due to improper mutex handling: a thread held lock_sys.wait_mutex while triggering a streaming replication rollback, which also tried to acquire THD::LOCK_thd_kill, leading to incorrect mutex usage. In debug versions, this leads to diagnostics like "safe_mutex: Found wrong usage of mutex 'wait_mutex' and 'LOCK_thd_data'", but in both debug and release versions, there is some probability that the node may hang. (MDEV-36509)
Assertion `!level_and_file.second->being_compacted' failed in LevelCompactionBuilder::SetupInitialFiles (MDEV-16523)
Assertion `ikey_.type == kTypeValue' failed in rocksdb::CompactionIterator::NextFromInput (MDEV-15164)
corruption when query cache cannot allocate block (MDEV-34075)
Stack looping and SIGSEGV in Item_args::walk_args on UPDATE (MDEV-31647)
Server crash in find_field_in_tables, Assertion `name' failed in find_field_in_table_ref (MDEV-25012)
Semi-sync Replica Can't Kill Dump Thread When Using SSL (MDEV-36663)
Long server_audit_file_path causes buffer overflow (MDEV-36245)
Server crash when inserting from derived table containing insert target table (MDEV-32086)
Check when doing ALTER TABLE table_name sequence=1 that table can be a sequence (MDEV-36032)
Bad value for the variable "Buffer pool size" (MDEV-21203)
Doublewrite recovery of innodb_checksum_algorithm=full_crc32 page_compressed pages does not work (MDEV-36180)
In sql_mode=ORACLE, package body variables are not allowed as FETCH targets (MDEV-36047)
Segfault on concurrent ALTER and SELECT for partitioned table (MDEV-31122)
ST_PointFromWKB ignores SRID argument and always creates the POINT with 0 for it's SRID (MDEV-32619)
When executing SELECT MIN using loose index scan, if at least one of the WHERE condition is "f IS NULL", a memory violation may happen resulting in unexpected behaviour (MDEV-36220)
Error while installing MariaDB on Windows Server 2022 due to antivirus interference. (MDEV-35983)
mariadb-dump used wrong quoting character (MDEV-36268)
After a corrupted table on one node triggers the cluster to vote to evict a node that failed a transaction, the current master can’t commit any more and hangs. (MDEV-34998, MENT-2081)
JSON_UNQUOTE doesn't work with emojis (MDEV-35614)
TO_CHAR FM format not recognized in SQL_MODE=Oracle (MDEV-36216)
decreasing innodb_buffer_pool_size at runtime does not release memory (MDEV-32339)
CREATE-or-REPLACE-SELECT with ROW binlog format may not log DROP TABLE events, potentially causing replication issues. (MDEV-35499)
MDEV-32157 intended to fix spider wrapper so that it is case insensitive, among other things. However that fix was incomplete, as the udf spider_direct_sql may still require case sensitivity. MDEV-35807 fixes this. (MDEV-35807)
MariaDB service manager reports “WSREP state transfer ongoing...” via the system log although the transfer is complete. The script defined in `wsrep_notify_cmd` is not called after the state transfer, preventing the service manager from updating its status. (MDEV-35969)
Creating partitioned tables is disallowed when wsrep_osu_method=TOI and wsrep_strict_ddl=ON, preventing alteration or deletion of partitioned tables. (MDEV-27861)
Mysqlbinlog --stop-position does not warn if EOF not reached with --read-from-remote-server (MDEV-35694)
Attempting to create a CONNECT engine table results in "non-InnoDB sequences in Galera cluster" error message in logs due to an incorrect engine check. (MDEV-35748)
Incorrect result for BETWEEN over unique blob prefix (MDEV-36235)
find_order_in_list mismatch when order item needs fixing() (MDEV-36607)
innodb_snapshot_isolation=1 gives error for not committed row changes (MDEV-36639)
MariaDB Backup returns with an error like "Error on file ./test/t1#P#p513.MYD open during `test`.`t1` table copy for partitioned MyISAM tables when running out of file handles (MDEV-36437)
User without any privileges to a sequence can read from it and modify it via column default (MDEV-36413)
User has unauthorized access to a sequence through a view with security invoker (MDEV-36380)
mysql_stmt_errno() returns 0 after an error in mysql_stmt_execute() (MDEV-35953)
For transactions committing in one-phase using rollback-capable engines, if binlogging fails during commit, the overall transaction would still commit, when it should roll-back. (MDEV-35506)
Wrong results from tables with a single record and an aggregate (MDEV-35238)
Unexpected error 1264 'Out of Range Value for Column' when inserting into ... select ... from a spider table (MDEV-35874)
Wrong result in loose index scan (MDEV-36118)
group by handler missing constant fields when selecting from a view (MDEV-36307)
Tests calling the udf spider_copy_tables fail with --view-protocol (MDEV-36335)
LSN allocation is a bottleneck (MDEV-21923)
make mariadb-backup to force an innodb checkpoint (MDEV-30000)
reorganise innodb buffer pool (and remove buffer pool chunks) (MDEV-29445)
dict_stats_fetch_from_ps() unnecessarily holds exclusive dict_sys.latch (MDEV-35436)
FLUSH TABLES will no longer cause InnoDB persistent statistics to be reloaded. RENAME TABLE will. This change of logic improves the performance in general, and avoids a case where statistics for relatively rarely modified tables are never updated. (MDEV-35000)
The Linux memory pressure interface, which could previously not be disabled and could cause performance anomalies, was rewritten and is disabled by default. (MDEV-34863)
Stall and crash when page cleaner fails to generate free pages during Async flush (MDEV-36226)
Large N-way OR causes a lot of index_merge variants to be created and discarded (MDEV-34620)
Oracle Linux 8 (x86_64, ARM64)
Oracle Linux 9 (x86_64, ARM64)
Red Hat Enterprise Linux 8 (x86_64, ARM64)
Red Hat Enterprise Linux 9 (x86_64, ARM64, PPC64LE)
Rocky Linux 8 (x86_64, ARM64)
Rocky Linux 9 (x86_64, ARM64)
SUSE Linux Enterprise Server 15 (x86_64, ARM64)
Ubuntu 20.04 (x86_64, ARM64)
Ubuntu 22.04 (x86_64, ARM64)
Ubuntu 24.04 (x86_64, ARM64)
Microsoft Windows (x86_64) (Without MariaDB Enterprise Cluster (Galera) support)
Red Hat UBI 8 (x86_64, ARM64)
Red Hat UBI 8 is part of the Enterprise Server Docker Image. It does not support MariaDB Enterprise Cluster (Galera) or MariaDB ColumnStore.
5.5
4.9
4.9
4.9
MariaDB Enterprise Server 11.4.3-1 is a Release Candidate (RC) release of MariaDB Enterprise Server 11.4, released on 2024-11-19
MariaDB Enterprise Server 11.4.3-1 is the first Release Candidate release of MariaDB Enterprise Server 11.4.
The changes listed here are relative to MariaDB Enterprise Server 10.6.19-15
Software in release candidate is not recommended for production workloads.
MariaDB Enterprise Server 11.4.3-1 was released on 2024-11-19.
With InnoDB storage engine, the process to import an InnoDB tablespace has been simplified. ()
Prior to this release, the process was to create a table, discard the tablespace, then execute ALTER TABLE IMPORT TABLESPACE.
Starting with this release, ALTER TABLE IMPORT TABLESPACE is the only command needed.
With InnoDB storage engine, space occupied by freed pages within the InnoDB system tablespace can be reclaimed. ()
Prior to this release, InnoDB data files would never shrink during normal operation. .ibd files could be shrunk by rebuilding tables with OPTIMIZE TABLE and undo tablespace files using SET GLOBAL innodb_undo_log_truncate=ON
Starting with this release, an :autoshrink attribute has been added for the
With InnoDB storage engine, system variable changes provide improved control of log files and data files: ()
The and system variables have been added for log file control. These system variables are boolean and can be set dynamically while the server is running.
The and system variables have been added for data file control. These system variables are boolean and can be set dynamically while the server is running.
With InnoDB storage engine, the temporary InnoDB tablespaces can now be shrunk without restart
Before MariaDB Enterprise Server 11.4 the only way to reclaim disk space used by temporary InnoDB tablespaces was to restart the server, as temporary tablespaces are deleted when you stop the server and are recreated with their configured size
The disk space can now be reclaimed, tables in use will not be removed. The command to trigger the new feature is:
Example:
With Spider storage engine, engine-defined attributes (table options) are accepted. Previously, Spider required parameters to be provided via COMMENT for a table: ()
Spider storage engine system variable defaults have changed.
With the Spider storage engine the preferred way to specify Spider parameters is now to use the dedicated Spider table options. Abusing the table COMMENT clause is now deprecated ()
With MyRocks storage engine, log files can be stored in a user-defined directory specified by the . ()
Stored function parameters can be qualified with IN, OUT, INOUT, and IN OUT: ()
When a parameter is qualified with IN, a value is passed to the function.
is new server internal functionality which makes all schema changes (ALTER TABLE commands) non-blocking. ()
OSC targets a problem previously solvable using third-party solutions, in a way which reduces operational impact. Some aspects of the OSC implementation are operationally significant:
OSC performs internal Copy-Apply-Replace: First, the altered table gets copied, then the online changes get applied. A short table lock occurs when applying last changes and renaming the tables. The binary log is not used in this process. This is significant because some third-party approaches to this problem depend on client connections which can be subject to connection timeouts and similar factors.
• Starting with this release, metadata changes are reflected without a reconnect:
Temporary tables are now included in information_schema.TABLES, in SHOW TABLES output, and in SHOW TABLE STATUS output. ()
For example:
For operations that insert multiple rows, error reporting has been improved: ()
In , the ROW_NUMBER property allows retrieval of the row number that caused the error or warning:
Information Schema system table optimizations: ()
When is queried and the WHERE clause filters on SPECIFIC_SCHEMA and SPECIFIC_NAME, an index is used to avoid a full table scan.
When is queried and the WHERE
The statement returns the query itself as a warning, which can be obtained via .
SHOW ANALYZE [FORMAT=JSON] FOR CONNECTION_ID can analyze a query running in another connection: ()
ANALYZE FORMAT=JSON now shows the time spent in the query optimizer. ()
With , the new allows tables to be dumped in order of size (smallest tables first): ()
This new option is useful when the is specified and the backup contains tables that are truncated frequently. Since tables that are truncated frequently tend to be smaller, those tables will be backed up earlier, which reduces the chance that the backup will fail with the .
The can now be used to set the transaction isolation: ()
The tx_isolation system variable is still available as an alias, but it has been deprecated and will be removed in a later release.
The SQL Error Log Plugin, used to log errors sent to clients for later analysis, has been enhanced. When option sql_error_log_with_db_and_thread_info=ON is set, the log file is now also showing thread id and the current default schema for the error.
When mariadb-dump is used with the option -T / --tab= to produce tab-separated text-format data files per table, the new option --parallel (synonym --use-threads) can be used to use several threads in parallel to dump the table data to their .txt files.
MariaDB Query Optimizer performs cost-based optimizations with an understanding of storage engine-specific costs: ()
The query optimizer now defaults to assume SSD storage is used. Costs for disk access can be overridden.
can be tuned by setting the following system variables via configuration file, command-line parameter, or the :
Optimizer costs can be tuned per storage engine by prefixing the system variable with the storage engine name.
Current optimizer costs for each storage engine can be queried via
For JOIN with many eq_ref tables, query performance is improved: ()
A table can be converted into a partition with ALTER TABLE .. CONVERT TABLE .. TO PARTITION: ()
The ALTER TABLE .. CONVERT TABLE .. TO PARTITION operation was previously backported to MariaDB Enterprise Server 10.6.11-6.
A partition can be converted into a table with ALTER TABLE .. CONVERT PARTITION .. TO TABLE: ()
The ALTER TABLE .. CONVERT PARTITION .. TO TABLE operation was previously backported to MariaDB Enterprise Server 10.6.11-6.
syntax has been extended, so the PARTITION keyword is optional in each partition definition: ()
Engine-defined attributes can be defined per-partition: ()
Exchanging partition or converting a table is now possible without a validation of the partitioning expression
This new feature should be used with care, as it can lead to inconsistencies if the partitioning rules are not met.
The new addition to ALTER TABLE is:
History partition creation can be automated using the AUTO keyword when partitioned by INTERVAL or LIMIT: ()
In the above example, a new history partition to store historical row versions is created on a monthly basis.
can backup historical data from system-versioned tables if the is specified. ()
can perform a dump of historical data as of a point in time if the is specified. ()
More Information about Application-time Period Tables is now available in the information schema
General Support of Packages for Stored Routines has been added
Before MariaDB Enterprise Server 11.4, the CREATE PACKAGE feature, as well as CREATE PACKAGE BODY, were only supported with sql_mode = ORACLE. They can now be used with any SQL mode.
Example:
Descending indexes are supported: ()
When used with a composite index, can be used to get a significant performance boost for queries that perform ORDER BY operations on columns in different orders than the defined order.
In previous releases, MariaDB Enterprise Server already supported the DESC option for ORDER BY, but the optimizer would use the ascending index. For a composite index, the optimizer would have to use an index and perform a file sort.
Performing an ORDER BY .. ASC on multiple columns still shows "Using index" in the EXPLAIN output:
With this change, performing a mix of ORDER BY .. ASC, .. DESC on multiple columns also shows "Using index" in the EXPLAIN output:
JSON_KEY_VALUE() extracts key/value pairs from a JSON object. ()
Syntax: JSON_KEY_VALUE(<json_doc>, <json_path>)
**The <json_path> specifies the JSON objects whose key/value pairs should be returned. For example:
+-----------------------------------------------------------------------------+ | JSON_KEY_VALUE('[[1, {"key1":"val1", "key2":"val2"}, 3], 2, 3]', '$[0][1]') | +-----------------------------------------------------------------------------+ | [{"key": "key1", "value": "val1"}, {"key": "key2", "value": "val2"}] | +-----------------------------------------------------------------------------+
JSON_OBJECT_TO_ARRAY() converts all JSON objects found in a JSON document to JSON arrays. ()
Syntax: JSON_OBJECT_TO_ARRAY(<json_doc>)
For example:
Resulting arrays can be compared using JSON_ARRAY_INTERSECT(). For example:
JSON_OBJECT_FILTER_KEYS() returns key/value pairs from a JSON string for keys in an array. ()
Syntax: JSON_OBJECT_FILTER_KEYS(<json_doc>,<array_keys>)
For example:
Using JSON_ARRAY_INTERSECT() and JSON_KEY() as arguments for JSON_OBJECT_FILTER_KEYS(), a comparison of two JSON strings is possible where only the same keys are compared, not the key/value pairs. For example:
can be used to compare two documents and determine if they are equal. ()
The JSON_EQUALS() function was previously backported to MariaDB Enterprise Server 10.4.25-16, 10.5.16-11, and 10.6.8-4.
# can be used to normalize two JSON documents to make them more comparable. ()
can be used to validate a JSON document against a JSON schema, as documented by the . ()
This function can also be used in a CHECK constraint to verify that JSON documents are only stored in the database if they include required items and that the values are within a given range and length.
Negative indexes can be used to access values in JSON arrays relative to the end of the array when a JSON Path expression is used as a parameter to a JSON function. ()
The last index can be used to access the last value in a JSON array when a JSON Path expression is used as a parameter to a JSON function. ()
A range of indexes can be used to access the values in that range in a JSON array when a JSON Path expression is used as a parameter to a JSON function. ()
The TIMESTAMP range of values was extended from '2038-01-19 03:14:07 UTC', to '2106-02-07 06:28:15 UTC'.
The storage format is not changed, and new tables can be read by old MariaDB servers as long as timestamp values are within the old timestamp range.
INET4 values can now be compared with INET6 values and can be inserted into INET6 columns; the server does automatically convert INET4 value into INET6 as needed.
UUID data type is added to store UUIDs more efficiently. () The UUID data type was previously backported to MariaDB Enterprise Server 10.6.9-5.
INET4 data type is added to store IPv4 addresses as BINARY(4), where each byte stores one octet. ()
The data type provides the following functionality:
Validation of incorrect values
Comparisons
Sorting
Functions like CAST()
New time zone options for function DATE_FORMAT()
The new options %Z and %z can be used for the format string of the function
for adding time zone information to the date string.
%Z Time zone abbreviation
%z Numeric time zone +hhmm or -hhmm presenting the hour and minute offset from UTC
Example:
SQL function KDF() for key derivation
A possible use case is to generate encryption keys from a user provided password or a passphrase. It can be used to generate encryption keys for encryption functions such as AES_ENCRYPT.
Example:
Function CONV() now supports conversions up to base 62
The function CONV(), which converts a number between numeric base systems, now supports conversions up to base 62.
This allows conversions to encodings to capital letters A-Z, lower case letters a-z, and numbers 0-9.
and allow specifying the initialization vector (iv) and block encryption mode (mode). ()
AES_ENCRYPT syntax prior to this release: AES_ENCRYPT(<str>, <key_str>)
AES_ENCRYPT syntax starting with this release: AES_ENCRYPT(<str>, <key>, [, iv [, mode]])
• For example, specifying the mode as an argument:
returns a binary string of a length between 1 and 1024 bytes. ()
This nondeterministic value is generated by the cryptographically secure pseudo random generator (CSPRNG) of the SSL library, so it generates an arbitrary length string of cryptographic random bytes that are suitable for cryptographic use.
can be used to perform a natural sort of strings. ()
This function uses the fmtlib library for string formatting similar to Python, Rust, C++20.
CRC32() computes a cyclic redundancy check (CRC) as a 32-bit unsigned value using the ISO 3309 polynomial. ()
The CRC can now be computed in pieces, using an optional second parameter: CRC32('String') is equal to CRC32(CRC32('Str','ing')).
The character_set_collations system variable allows the default collation for a character set to be changed globally or for a session. ()
Starting with this release, the default collation is used whenever a character set is defined for a database object but the collation is not defined.
Starting with this release, when the character set is not defined, the default collation is as specified by the collation_server system variable.
Collations based on the Unicode Collation Algorithm (UCA) 14.0.0 have been added for the character sets : ()
One neutral and 22 language specific collations have been added.
Accent sensitive, accent insensitive, case sensitive, case insensitive, no-pad variants have been added.
Collation names for new UCA 14.0.0 collations can be specified without the character set prefix, because the character set prefix can be automatically detected from the context. For example,
Client to server connection now requires SSL encryption by default
Using SSL (a more correct term would be TLS, but in reality SSL is more commonly used) has been simplified with MariaDB Enterprise Server 11.4.
Before version 11.4, proper SSL configuration required multiple manual steps for the server and all the clients connecting to it.
Now the client can verify the server self-signed certificate without any configuration whatsoever. The server completely automatically generates the SSL certificate and the client automatically verifies it as needed.
Example with the new privilege SHOW CREATE ROUTINE:
New view in the SYS schema to retrieve user privileges per specific table
View privileges_by_table_by_level in the SYS schema lists the privilege and privilege level per user, schema, and table.
Example:
New Information Schema Table For Password Related Data ()
A new information Schema view, USERS, has been added, which DBAs can use to get insights about password related information for a user. This information can be used:
by an application to inform a user about a password about to expire or an account which is at risk of being blocked due to the number of wrong passwords entered
This will result in:
The implements a way to prevent a user from setting a password that had been set for that user previously. ()
The specifies the number of days before a password can be reused.
The plugin only affects a SQL statement that sets a user password using a literal password string. It cannot check the password of a SQL statement that makes use of a hashed password value.
Upon upgrade, each user that has the SUPER privilege will be granted the privileges removed from SUPER, so that the user's capabilities will not change. The SUPER privilege is still used for some special cases, including:
*** Calling and without an explicit key*** Dynamically changing certain system variables with
*** Changing certain debug settings** Due to this change, the consistency of read-only replicas are now protected when users with the SUPER privilege attempt to write to a read-only replica if they do not also have the .
*** Read-only replicas are replica servers that have set to ensure that they stay consistent with the primary.*** If a user with the SUPER privilege requires write access to a read-only replica server, the user must be explicitly granted the READ ONLY ADMIN privilege.
New option to limit the space used by binary bogs per server instance
The new system variable max_binlog_total_size (alias binlog_space_limit) enables binary log purging when the total size of all binary logs exceeds the specified threshold.
The default for max_binlog_total_size is 0, meaning that there is no limit.
An index is now created on the GTIDs of the binary log, which allows a connecting replica to find the position it should start from without the need to scan the whole binary log.
The new system variable binlog_gtid_index (default ON) can be used to disable the creation of indexes.
The new system variable binlog_gtid_index_page_size (default 4096
For all storage engines, is divided into two phases to prevent long-running DDL statements from causing replication lag on replicas: ()
Enabled by setting , which is not the default.
Two-phase ALTER TABLE is optimistic, so the operation begins on the replica server before it finishes on the primary server.
The --start-position command-line option can set the starting GTID position as a comma-separated list of GTIDs. For each specified GTID domain, the GTID position is exclusive, so an event is only printed if its sequence number is greater than the sequence number specified for that domain.
The --stop-position command-line option can set the ending GTID position as a comma-separated list of GTIDs. For each specified GTID domain, the GTID position is inclusive, so an event is only printed if its sequence number is greater than or equal to the sequence number specified for that domain.
Both command-line options require each GTID in the comma-separated list to have a different domain ID.
The --do-domain-ids command-line option can set domain IDs that should be read as a comma-separated list of domain IDs. If an event's GTID does not have one of the specified domain IDs, the event is not printed.
The --ignore-domain-ids command-line option can set domain IDs that should be ignored as a comma-separated list of domain IDs. If an event's GTID has one of the specified domain IDs, the event is not printed.$ mariadb-binlog --start-position='0-1-1001,1-2-1000' \ --stop-position='0-1-2000,1-2-1050' mariadb-bin.000001
The --start-position command-line option can set the starting GTID position as a comma-separated list of GTIDs. For each specified GTID domain, the GTID position is exclusive, so an event is only printed if its sequence number is greater than the sequence number specified for that domain.
The following changes pertain to Galera Cluster with MariaDB Enterprise Server 11.4:
Automatic SST User Account Management with Galera ()
The State Snapshot Transfer (SST) method, needed to provide a full data copy to a new node, requires a dedicated account to access the remote server (donor) during the SST process.
MariaDB Enterprise Cluster (Galera) now creates the user internally for the time of an SST, which makes the need to have an account created manually obsolete. This removes the requirement to have a user and password provided via a configuration file. Having the user created by Galera also ensures that the needed privileges are set.
Node state changes can be saved to a machine-readable JSON file configured by the : ()
The JSON file can be read by monitoring tools.
When wsrep_status_file is set to a path, the node state changes are written to the specified file.
When wsrep_status_file is set to none, this functionality is disabled.
Progress reporting is only supported for MariaDB Enterprise Backup-based SST, so must be set.
Progress reporting is only enabled when is set.
When progress=1 is set, progress reporting goes to standard error (stderr).
Progress reporting is only supported for MariaDB Enterprise Backup-based SST, so must be set.
Progress reporting is only enabled is set.
When progress=1 is set, progress reporting goes to standard error (stderr).
In alignment to the , MariaDB Enterprise Server 11.4.5-3 is provided for:
Debian 11 (x86_64, ARM64)
Debian 12 (x86_64, ARM64)
Red Hat Enterprise Linux 8 (x86_64, ARM64)
Red Hat Enterprise Linux 9 (x86_64, ARM64, PPC64LE)
Some components of MariaDB Enterprise Server are supported on a subset of platforms. See for details.
MariaDB Enterprise Server 11.4.4-2 is the first Stable (GA) release of MariaDB Enterprise Server 11.4, released on 2025-01-16
For example:
innodb_data_file_pathWith :autoshrink, the InnoDB system tablespace can be truncated after the last allocated page within it, down to the specified minimum size.
For example, with this configuration the InnoDB system tablespace can be shrunk down to 12MiB:
With InnoDB storage engine, performance of bulk inserts is improved. (MDEV-25036)
With InnoDB storage engine, changes to the InnoDB redo log format reduce write amplification, which can result in better performance. (MDEV-14425)
With InnoDB storage engine, the InnoDB change buffer has been removed: (MDEV-29694)
With modern storage speeds, the InnoDB change buffer tends to add more overhead, rather than providing a performance gain.
The removal of the InnoDB change buffer also simplifies the internal recovery process.
The innodb_change_buffering and innodb_change_buffer_max_size system variables have been removed.
The , , , , , , , , , and status variables have been removed.
With InnoDB storage engine, the Prefix Index Queries Optimization is always used: (MDEV-28540)
This feature was originally implemented as an optional optimization in MariaDB Server 10.1.
The and status variables have been removed.
With InnoDB storage engine, multiple undo tablespaces are now enabled by default, so that the default configuration enables undo logs to be truncated while the server is running: (MDEV-29986)
Truncation does not apply to undo logs in the system tablespace.
innodb_undo_tablespaces default changed from 0 to 3.
To reclaim space, =ON must be set
innodb_undo_log_truncate=ON can have a performance impact for some workloads. In those cases, undo truncation can be enabled by temporarily setting the following:
OUT, the function returns a value to the caller.When a parameter is qualified with INOUT or IN OUT, a value is passed to the function, and the function also returns a value to the caller.
OUT, INOUT, and INOUT can only be used when called from SET and not when called from SELECT
OUT, INOUT, and INOUT allow a function to return more than one value, which allows for more complex and nested functions.
In previous releases, the qualifiers were supported for stored procedures, but not for stored functions.
Starting with this release, the qualifiers are accepted in stored functions using the same syntax previously used for stored procedures.
When is set, the behavior is adjusted to match the behavior of Oracle.
Changed default behavior for field properties: (MDEV-28632)
Previous to this release, implementation-specific behavior was present by default for the first TIMESTAMP column in a table. This behavior added DEFAULT current_timestamp() ON UPDATE current_timestamp() to the TIMESTAMP field properties.
Starting this release, the implementation-specific behavior for TIMESTAMP field properties is disabled by default. The default value of the is changed to OFF
As a result of this change, new TIMESTAMP columns without explicit default values will be created with DEFAULT NULL
OSC is asynchronous: Changes from applications are first stored in an online change buffer. This is significant because some third-party approaches to this problem are synchronous and as result impact the execution of other transactions.
OSC is trigger-less: Only server internal handlers for a DML-side check if ALTER TABLE is in progress are used. INSERT, UPDATE, or DELETE triggers based on stored routines are not used. This is significant because some third-party approaches to this problem depend on triggers.
By default, when an ALTER operation cannot be executed INSTANT, OSC will be used. If OSC cannot be used, another algorithm will be used.
If the LOCK=NONE option is explicitly specified in the ALTER statement, or if the equivalent statement ALTER ONLINE TABLE is used, the operation will be performed if it can be done as OSC and fails otherwise.
As an override to this new behavior, if the old_mode system variable is set with LOCK_ALTER_TABLE_COPY, the old behavior is preferred when LOCK=NONE is not explicitly set. (MDEV-31812)
Stored routine calls reflect all changes to metadata for objects the stored routine depends on. (MDEV-5816)
Prior to this release, a reconnect was needed before a stored routine was able to update its metadata from altered objects. For example, absent a reconnect:
ROUTINE_SCHEMAROUTINE_NAMEcan show the query plan for a query running in another connection: (MDEV-25956)
The can now be used to set a transaction to read-only. (MDEV-21921)
Process list now includes the number of rows sent by the statement. The new value SENT_ROWS in the information schema table PROCESSLIST includes the number of rows sent by the current statement, shown in the processlist.
SELECTS with functions show the total number of rows sent by the main statement and all functions
Stored procedures show the total number of rows sent per stored procedure statement
INSERT RETURNING and DELETE RETURNING show the total number of rows sent for the returning data set
Example:
Parallelism also works if the option --single-transaction is used.
The option --parallel has been added to mariadb-import as a synonym to --use-threads, which has been available before.
optimizer_key_lookup_cost
Engine
Sets the cost to find a key entry in the index.
optimizer_row_copy_cost
Engine
Sets the cost to find the next key entry in the index.
optimizer_rowid_compare_cost
Engine
Sets the cost to compare two rowid values.
optimizer_rowid_copy_cost
Engine
Sets the cost to copy a rowid from the index.
optimizer_row_lookup_cost
Engine
Sets the cost to find a row based on the rowid. The rowid is stored in the index with the key.
optimizer_row_next_find_cost
Engine
Sets the cost to find the next row.
optimizer_scan_setup_cost
Session
Sets the cost to start a table or index scan. The default low value configures the optimizer to use index lookups for tables with very few rows.
optimizer_where_cost
Session
Sets the cost to execute the WHERE clause for every row found. As this value is increases, the optimizer is more likely to choose plans which read fewer rows.
Default changed for system variable from 1 to 2 to enable prune join prefixes
New status variable Optimizer_join_prefixes_check_calls
An index can now be used when comparing the return value of the to a constant value. (MDEV-8320)
Single-table and can now benefit from semi-join optimization. (MDEV-7487)
JSON histograms with detailed histogram collection: (MDEV-26519)
Enabled when is set, which is now the default.
JSON histograms result in more precise data statistics for string data types or when columns have highly-uneven data distribution.
With more precise data statistics the optimizer can create better query plans, resulting in faster queries.
New views PERIOD and KEY_PERIOD_USAGE are added to information_schema.
View PERIODS includes the columns
TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
PERIOD_NAME
START_COLUMN_NAME
END_COLUMN_NAMEto list Application-time period tables, the name defined for a period and the columns used for start and end timestamps.
View KEY_PERIOD_USAGE includes the columns
CONSTRAINT_CATALOG
CONSTRAINT_SCHEMA
Two new columns are added to the COLUMNS view of information_schema
IS_SYSTEM_TIME_PERIOD_START
IS_SYSTEM_TIME_PERIOD_END
For example, using the following example table:
For example, this function can be used when defining a unique key on JSON data.
The JSON_NORMALIZE() function was previously backported to MariaDB Enterprise Server 10.4.25-16, 10.5.16-11, and 10.6.8-4.
JSON_OVERLAPS() can be used to compare two JSON documents to determine if they have any key-value pairs or array elements in common. (MDEV-27677)
The old limit was 36, not including lower case letters.
Example:
AES_DECRYPT syntax prior to this release: AES_DECRYPT(<str>, <key_str>)
AES_DECRYPT syntax starting with to this release: AES_DECRYPT(<str>, <key>, [, iv [, mode]])
The block_encryption_mode system variable specifies which mode will be used if the mode is not specified as a function argument.
For example, using the default mode from the block_encryption_mode:
Characters are sorted in alphabetical order, whereas numbers are sorted, such that "10" is greater than "9".
For example, "v10" would appear after the string "v9".
SFORMAT() formats strings based on the specified options and values to generate a custom formatted string. (MDEV-25015)
CRC32C() can be used to compute checksums using the alternate Castagnoli polynomial.
uca1400_german_as_ciutf8mb4_uca1400_german_as_ciWhen the information_schema.COLLATIONS table is queried for metadata about the new UCA 14.0.0 collations, the COLLATION_NAME column contains the collation name without a character set prefix, and the CHARACTER_SET_NAME column contains NULL, which indicates that these collations can apply to multiple character sets.
When the information_schema.COLLATION_CHARACTER_SET_APPLICABILITY table is queried for character set applicability of the new UCA 14.0.0 collations, the COLLATION_NAME column also contains the collation name without a character set prefix. A newFULL_COLLATION_NAMEcolumn has been added, which contains the full collation name (with a character set prefix) for all collations, including new UCA 14.0.0 collations.
Improved contraction performance in UCA collations.
Improved UCA collation performance for the utf8mb3 and utf8mb4 character sets.
On Microsoft Windows, MariaDB command-line tools now include full Unicode support. (MDEV-26713)
Unicode support is available on Microsoft Windows 10 1909 or later, Microsoft Windows 11, and Microsoft Windows Server 2020.
The my.ini configuration file is now UTF-8 encoded.
The mariadb.exe command-line client uses as the default character set.
A default configuration now refuses unencrypted connections.
New Privilege SHOW CREATE ROUTINE to enable any user with this privilege to view the definition of a stored routine.
Before MariaDB Enterprise Server 11.4 a user only could see the definition of a routine, a stored feature, or function, when:
SELECT privilege exists for the mysql.procs table
The user is the definer of the Stored Procedure
SHOW CREATE ROUTINE privilege can be granted globally, per schema, or on individual routines.
Example without privilege SHOW CREATE ROUTINE:
The new view includes the fields:
USER – A string including user name and host PASSWORD_ERRORS – A counter with the current number of wrong passwords entered
Reset to 0 when a correct password has been entered
An account is blocked, if max_password_errors is reached
NULL for accounts with privilege CONNECTION ADMIN
PASSWORD_EXPIRATION_TIME – The date and time when the password expires or NULL, if the password never expires
New Authentication Plugin — PARSEC (Password Authentication using Response Signed with Elliptic Curves) (MENT-2142)
PARSEC improves security over old authentication plugins by introducing salted passwords, time consuming key derivation function, and a client-side scramble to ensure that man-in-the-middle attackers cannot control the client response.
Example on how to create a user using the new authentication plugin:
The password_reuse_check plugin was previously backported to MariaDB Enterprise Server 10.4.25-16, 10.5.16-11, and 10.6.8-4.
GRANT .. TO PUBLIC can be used to grant privileges to all currently authenticated users and newly authenticated users on the system. (MDEV-5215)
SHOW GRANTS FOR PUBLIC retrieves all privileges granted to public. (MDEV-5215)
Fine-grained privileges have been removed from the SUPER privilege: (MDEV-29668, MDEV-29596)|=Fine-grained privilege removed from SUPER as of ES 11.4.4-2|
The system variable can be changed without restarting the server.
New system variable --slave-connections-needed-for-purge set to 1 by default.
Assures that binary log purging will not happen until at least that many replicas are connected and do not need purged binary logs anymore.
New status variable binlog_disk_use provides the disk space currently used by the binary logs.
New options SQL_BEFORE_GTIDS and SQL_AFTER_GTIDS for START REPLICA UNTIL
The new options SQL_BEFORE_GTIDS and SQL_AFTER_GTIDS for START REPLICA UNTIL allow the user to control of whether the replica stops before or after a provided GTID state.
Its syntax is:
The new system variable binlog_gtid_index_span_min (default 65536) controls the sparseness of the binary log GTID index.
The new status variables binlog_gtid_index_hit and binlog_gtid_index_miss can be used for monitoring purposes. A miss is an indication that the index file is missing.
GTID binlog events now include the thread ID (MENT-2180)
The thread ID and the corresponding statement can now be retrieved from binary logs
The output of mariadb-binlog also includes the thread ID
Binary log filter options binlog-do-db, binlog-ignore-db, and binlog-row-event-max-size are now visible as system variables. (MDEV-30188)
For example:
START ALTER event when the operation starts, and either a COMMIT ALTER event or a ROLLBACK ALTER event when the operation finishes depending on whether it succeeds or fails.By default, replication uses Global Transaction IDs (GTID), which makes replicas crash-safe. (MDEV-19801)
This change impacts backward compatibility.
In previous releases, when TO was executed without explicitly specifying MASTER_USE_GTID, it would default to MASTER_USE_GTID=no.
Starting with this release, when is executed without explicitly specifying MASTER_USE_GTID, it defaults to MASTER_USE_GTID=slave_pos. With MASTER_USE_GTID=slave_pos, the replica server uses the as the GTID position.
This change can cause new behavior to occur when performing the following operations:
Setting up a new replica with without specifying MASTER_USE_GTID
Freshly starting a stopped replica with if the replica configuration does not explicitly have MASTER_USE_GTID set.
When MASTER_LOG_FILE and MASTER_LOG_POS are explicitly set, MASTER_USE_GTID=no is implicitly set.
For mariadb-binlog, the start and stop positions can be specified as GTIDs: (MDEV-4989)
The --stop-position command-line option can set the ending GTID position as a comma-separated list of GTIDs. For each specified GTID domain, the GTID position is inclusive, so an event is only printed if its sequence number is greater than or equal to the sequence number specified for that domain.
Both command-line options require each GTID in the comma-separated list to have a different domain ID.
New connection states in SHOW [FULL] PROCESSLIST and information_schema.PROCESSLIST better reflect the state of the connection: (MDEV-26352)
Progress reporting for MariaDB Enterprise Backup-based SST by configuring the progress option in the [sst] option group: (MDEV-26971)
progress is set to a path, progress reporting is written to the specified file.When progress is set to none, progress reporting is disabled.
rlimit can be used to set a rate limit in bytes. The value can use a suffix to represent a unit: k for kilobytes, m for megabytes, g for gigabytes, and t for terabytes.
The pv utility must be installed for SST progress reporting.
When progress reporting is enabled, the following SST progress message is written to the MariaDB log during an SST:
When wsrep_status_file is set to none, this functionality is disabled.
Progress reporting for MariaDB Enterprise Backup-based SST by configuring the progress option in the [sst] option group: (MDEV-26971)
progress is set to a path, progress reporting is written to the specified file.When progress is set to none, progress reporting is disabled.
rlimit can be used to set a rate limit in bytes. The value can use a suffix to represent a unit: k for kilobytes, m for megabytes, g for gigabytes, and t for terabytes.
The pv utility must be installed for SST progress reporting.
When progress reporting is enabled, the following SST progress message is written to the MariaDB log during an SST.
AlmaLinux 9 (x86_64, ARM64)
Rocky Linux 8 (x86_64, ARM64)
Rocky Linux 9 (x86_64, ARM64)
SUSE Linux Enterprise Server 15 (x86_64, ARM64)
Ubuntu 20.04 (x86_64, ARM64)
Ubuntu 22.04 (x86_64, ARM64)
Ubuntu 24.04 (x86_64, ARM64)
Microsoft Windows (x86_64) (Without MariaDB Enterprise Cluster (Galera) support)
Red Hat UBI 8 (x86_64, ARM64)
Red Hat UBI 8 is part of the Enterprise Server Docker Image. It does not support MariaDB Enterprise Cluster (Galera) or MariaDB ColumnStore.
REMOTE_DATABASE
database
The remote database that contains the remote table
REMOTE_SERVER
srv
The IP address or hostname of the remote server that contains the remote table
REMOTE_TABLE
tbl
The remote table
optimizer_disk_read_cost
Engine
Sets the time in microseconds required to read a 4K block from storage. The default value is tuned for an SSD reading at 400 MB/second.
optimizer_index_block_copy_cost
Engine
Sets the cost to lock a block in the global cache and copy it to the local cache. The cost applies to every block accessed, regardless of whether the block is already cached.
optimizer_key_compare_cost
Engine
Sets the cost to compare two key values.
optimizer_key_copy_cost
Engine
waiting to execute in isolation
The connection is executing a DDL statement with , but the operation requires other concurrent operations to finish first, so the DDL statement can be executed in isolation.
waiting for TOI DDL
Another connection is executing a DDL statement with , so this connection must wait for the DDL statement to finish.
waiting for flow control
The connection is committing a transaction, but transactions are currently paused due to flow control, so the connection is waiting for the cluster to catch up and unpause transactions.
waiting for certification
The connection is committing a transaction, but it is waiting for the other cluster nodes to certify the transaction.
Sets the cost to copy a key value from the index to the local buffer while searching for a key value.
Prior to this release, the process was to create a table, discard the tablespace, then execute ALTER TABLE IMPORT TABLESPACE.
Starting with this release, ALTER TABLE IMPORT TABLESPACE is the only command needed.
For example:
With InnoDB storage engine, space occupied by freed pages within the InnoDB system tablespace can be reclaimed. (MDEV-14795)
Prior to this release, InnoDB data files would never shrink during normal operation. .ibd files could be shrunk by rebuilding tables with OPTIMIZE TABLE and undo tablespace files using SET GLOBAL innodb_undo_log_truncate=ON
Starting with this release, an :autoshrink attribute has been added for the innodb_data_file_path system variable.
With :autoshrink, the InnoDB system tablespace can be truncated after the last allocated page within it, down to the specified minimum size.
For example, with this configuration the InnoDB system tablespace can be shrunk down to 12MiB:
With InnoDB storage engine, system variable changes provide improved control of log files and data files: (MDEV-30136)
The innodb_log_file_buffering and innodb_log_file_write_through system variables have been added for log file control. These system variables are boolean and can be set dynamically while the server is running.
The innodb_data_file_buffering and innodb_data_file_write_through system variables have been added for data file control. These system variables are boolean and can be set dynamically while the server is running.
The has been deprecated.
With InnoDB storage engine, performance of bulk inserts is improved. ()
With InnoDB storage engine, changes to the InnoDB redo log format reduce write amplification, which can result in better performance. ()
With InnoDB storage engine, the InnoDB change buffer has been removed: ()
With modern storage speeds, the InnoDB change buffer tends to add more overhead, rather than providing a performance gain.
The removal of the InnoDB change buffer also simplifies the internal recovery process.
The and system variables have been removed.
With InnoDB storage engine, the Prefix Index Queries Optimization is always used: ()
This feature was originally implemented as an optional optimization in MariaDB Server 10.1.
The and status variables have been removed.
With InnoDB storage engine, multiple undo tablespaces are now enabled by default, so that the default configuration enables undo logs to be truncated while the server is running: ()
Truncation does not apply to undo logs in the system tablespace.
default changed from 0 to 3.
With InnoDB storage engine, the temporary InnoDB tablespaces can now be shrunk without restart
Before MariaDB Enterprise Server 11.4 the only way to reclaim disk space used by temporary InnoDB tablespaces was to restart the server, as temporary tablespaces are deleted when you stop the server and are recreated with their configured size
The disk space can now be reclaimed, tables in use will not be removed. The command to trigger the new feature is:
Example:
With Spider storage engine, engine-defined attributes (table options) are accepted. Previously, Spider required parameters to be provided via COMMENT for a table: (MDEV-27106)
REMOTE_DATABASE
database
The remote database that contains the remote table
REMOTE_SERVER
srv
The IP address or hostname of the remote server that contains the remote table
REMOTE_TABLE
tbl
The remote table
Spider storage engine system variable defaults have changed.
With the Spider storage engine the preferred way to specify Spider parameters is now to use the dedicated Spider table options. Abusing the table COMMENT clause is now deprecated (MDEV-28861)
With MyRocks storage engine, log files can be stored in a user-defined directory specified by the rocksdb_log_dir system variable. (MDEV-27791)
Stored function parameters can be qualified with IN, OUT, INOUT, and IN OUT: (MDEV-10654)
When a parameter is qualified with IN, a value is passed to the function.
When a parameter is qualified with OUT, the function returns a value to the caller.
When a parameter is qualified with INOUT or IN OUT, a value is passed to the function, and the function also returns a value to the caller.
OUT, INOUT, and INOUT can only be used when called from SET and not when called from SELECT
OUT, INOUT, and INOUT allow a function to return more than one value, which allows for more complex and nested functions.
In previous releases, the qualifiers were supported for stored procedures, but not for stored functions.
Starting with this release, the qualifiers are accepted in stored functions using the same syntax previously used for stored procedures.
When is set, the behavior is adjusted to match the behavior of Oracle.
Changed default behavior for field properties: ()
Previous to this release, implementation-specific behavior was present by default for the first TIMESTAMP column in a table. This behavior added DEFAULT current_timestamp() ON UPDATE current_timestamp() to the TIMESTAMP field properties.
Starting this release, the implementation-specific behavior for TIMESTAMP
is new server internal functionality which makes all schema changes (ALTER TABLE commands) non-blocking. (MDEV-16329)
OSC targets a problem previously solvable using third-party solutions, in a way which reduces operational impact. Some aspects of the OSC implementation are operationally significant:
OSC performs internal Copy-Apply-Replace: First, the altered table gets copied, then the online changes get applied. A short table lock occurs when applying last changes and renaming the tables. The binary log is not used in this process. This is significant because some third-party approaches to this problem depend on client connections which can be subject to connection timeouts and similar factors.
OSC is asynchronous: Changes from applications are first stored in an online change buffer. This is significant because some third-party approaches to this problem are synchronous and as result impact the execution of other transactions.
OSC is trigger-less: Only server internal handlers for a DML-side check if ALTER TABLE is in progress are used. INSERT, UPDATE, or DELETE triggers based on stored routines are not used. This is significant because some third-party approaches to this problem depend on triggers.
By default, when an ALTER operation cannot be executed INSTANT, OSC will be used. If OSC cannot be used, another algorithm will be used.
If the LOCK=NONE option is explicitly specified in the ALTER statement, or if the equivalent statement ALTER ONLINE TABLE is used, the operation will be performed if it can be done as OSC and fails otherwise.
As an override to this new behavior, if the old_mode system variable is set with LOCK_ALTER_TABLE_COPY, the old behavior is preferred when LOCK=NONE is not explicitly set. ()
Stored routine calls reflect all changes to metadata for objects the stored routine depends on. ()
Prior to this release, a reconnect was needed before a stored routine was able to update its metadata from altered objects. For example, absent a reconnect:
• Starting with this release, metadata changes are reflected without a reconnect:
Temporary tables are now included in information_schema.TABLES, in SHOW TABLES output, and in SHOW TABLE STATUS output. (MDEV-12459)
For example:
For operations that insert multiple rows, error reporting has been improved: (MDEV-10075)
In GET DIAGNOSTICS, the ROW_NUMBER property allows retrieval of the row number that caused the error or warning:
Information Schema system table optimizations: (MDEV-20609)
When is queried and the WHERE clause filters on SPECIFIC_SCHEMA and SPECIFIC_NAME, an index is used to avoid a full table scan.
When is queried and the WHERE clause filters on ROUTINE_SCHEMA and ROUTINE_NAME, an index is used to avoid a full table scan.
can show the query plan for a query running in another connection: ()
The statement returns the query itself as a warning, which can be obtained via .
SHOW ANALYZE [FORMAT=JSON] FOR CONNECTION_ID can analyze a query running in another connection: (MDEV-27021)
ANALYZE FORMAT=JSON now shows the time spent in the query optimizer. (MDEV-28926)
With , the new --order-by-size command-line option allows tables to be dumped in order of size (smallest tables first): (MDEV-28074)
This new option is useful when the is specified and the backup contains tables that are truncated frequently. Since tables that are truncated frequently tend to be smaller, those tables will be backed up earlier, which reduces the chance that the backup will fail with the ER_TABLE_DEF_CHANGED error code.
The can now be used to set the transaction isolation: (MDEV-21921)
The tx_isolation system variable is still available as an alias, but it has been deprecated and will be removed in a later release.
The can now be used to set a transaction to read-only. ()
Process list now includes the number of rows sent by the statement. The new value SENT_ROWS in the information schema table PROCESSLIST includes the number of rows sent by the current statement, shown in the processlist.
SELECTS with functions show the total number of rows sent by the main statement and all functions
Stored procedures show the total number of rows sent per stored procedure statement
The SQL Error Log Plugin, used to log errors sent to clients for later analysis, has been enhanced. When option sql_error_log_with_db_and_thread_info=ON is set, the log file is now also showing thread id and the current default schema for the error.
When mariadb-dump is used with the option -T / --tab= to produce tab-separated text-format data files per table, the new option --parallel (synonym --use-threads) can be used to use several threads in parallel to dump the table data to their .txt files.
Parallelism also works if the option --single-transaction is used.
The option --parallel has been added to mariadb-import as a synonym to --use-threads, which has been available before.
MariaDB Query Optimizer performs cost-based optimizations with an understanding of storage engine-specific costs: (MDEV-26974)
The query optimizer now defaults to assume SSD storage is used. Costs for disk access can be overridden.
Optimizer costs can be tuned by setting the following system variables via configuration file, command-line parameter, or the :
optimizer_disk_read_cost
Engine
Sets the time in microseconds required to read a 4K block from storage. The default value is tuned for an SSD reading at 400 MB/second.
optimizer_index_block_copy_cost
Engine
Sets the cost to lock a block in the global cache and copy it to the local cache. The cost applies to every block accessed, regardless of whether the block is already cached.
optimizer_key_compare_cost
Engine
Sets the cost to compare two key values.
optimizer_key_copy_cost
Engine
Optimizer costs can be tuned per storage engine by prefixing the system variable with the storage engine name.
Current optimizer costs for each storage engine can be queried via information_schema.OPTIMIZER_COSTS
For JOIN with many eq_ref tables, query performance is improved: (MDEV-28852)
New system variable
Default changed for system variable from 1 to 2 to enable prune join prefixes
New status variable Optimizer_join_prefixes_check_calls
An index can now be used when comparing the return value of the to a constant value. ()
Single-table and can now benefit from semi-join optimization. ()
JSON histograms with detailed histogram collection: ()
Enabled when is set, which is now the default.
JSON histograms result in more precise data statistics for string data types or when columns have highly-uneven data distribution.
With more precise data statistics the optimizer can create better query plans, resulting in faster queries.
A table can be converted into a partition with ALTER TABLE .. CONVERT TABLE .. TO PARTITION: (MDEV-22165)
The ALTER TABLE .. CONVERT TABLE .. TO PARTITION operation was previously backported to MariaDB Enterprise Server 10.6.11-6.
A partition can be converted into a table with ALTER TABLE .. CONVERT PARTITION .. TO TABLE: (MDEV-22166)
The ALTER TABLE .. CONVERT PARTITION .. TO TABLE operation was previously backported to MariaDB Enterprise Server 10.6.11-6.
syntax has been extended, so the PARTITION keyword is optional in each partition definition: (MDEV-26471)
Engine-defined attributes can be defined per-partition: (MDEV-5271)
Exchanging partition or converting a table is now possible without a validation of the partitioning expression
This new feature should be used with care, as it can lead to inconsistencies if the partitioning rules are not met.
The new addition to ALTER TABLE is:
History partition creation can be automated using the AUTO keyword when partitioned by INTERVAL or LIMIT: (MDEV-17554)
In the above example, a new history partition to store historical row versions is created on a monthly basis.
can backup historical data from system-versioned tables if the is specified. (MDEV-16029)
can perform a dump of historical data as of a point in time if the is specified. (MDEV-16355)
More Information about Application-time Period Tables is now available in the information schema
New views PERIOD and KEY_PERIOD_USAGE are added to information_schema.
View PERIODS includes the columns
TABLE_CATALOG
Two new columns are added to the COLUMNS view of information_schema
IS_SYSTEM_TIME_PERIOD_START
IS_SYSTEM_TIME_PERIOD_END
General Support of Packages for Stored Routines has been added
Before MariaDB Enterprise Server 11.4, the CREATE PACKAGE feature, as well as CREATE PACKAGE BODY, were only supported with sql_mode = ORACLE. They can now be used with any SQL mode.
Example:
Descending indexes are supported: (MDEV-13756)
When used with a composite index, can be used to get a significant performance boost for queries that perform ORDER BY operations on columns in different orders than the defined order.
In previous releases, MariaDB Enterprise Server already supported the DESC option for ORDER BY, but the optimizer would use the ascending index. For a composite index, the optimizer would have to use an index and perform a file sort.
For example, using the following example table:
• Performing an ORDER BY .. ASC on multiple columns still shows "Using index" in the EXPLAIN output:
• With this change, performing a mix of ORDER BY .. ASC, .. DESC on multiple columns also shows "Using index" in the EXPLAIN output:
JSON_KEY_VALUE() extracts key/value pairs from a JSON object. (MDEV-30145)
Syntax: JSON_KEY_VALUE(<json_doc>, <json_path>)
The <json_path> specifies the JSON objects whose key/value pairs should be returned. For example:
• JSON_KEY_VALUE() can be used as an argument to JSON_TABLE(), adding the key to a result set. For example:
JSON_OBJECT_TO_ARRAY() converts all JSON objects found in a JSON document to JSON arrays. (MDEV-26182)
Syntax: JSON_OBJECT_TO_ARRAY(<json_doc>)
For example:
Resulting arrays can be compared using JSON_ARRAY_INTERSECT(). For example:
JSON_OBJECT_FILTER_KEYS() returns key/value pairs from a JSON string for keys in an array. (MDEV-26182)
Syntax: JSON_OBJECT_FILTER_KEYS(<json_doc>,<array_keys>)\
For example:
Using JSON_ARRAY_INTERSECT() and JSON_KEY() as arguments for JSON_OBJECT_FILTER_KEYS(), a comparison of two JSON strings is possible where only the same keys are compared, not the key/value pairs. For example:
can be used to compare two documents and determine if they are equal. (MDEV-16375)
The JSON_EQUALS() function was previously backported to MariaDB Enterprise Server 10.4.25-16, 10.5.16-11, and 10.6.8-4.
# can be used to normalize two JSON documents to make them more comparable. (MDEV-23143)
For example, this function can be used when defining a unique key on JSON data.
The JSON_NORMALIZE() function was previously backported to MariaDB Enterprise Server 10.4.25-16, 10.5.16-11, and 10.6.8-4.
can be used to compare two JSON documents to determine if they have any key-value pairs or array elements in common. ()
can be used to validate a JSON document against a JSON schema, as documented by the JSON Schema Draft 2020. (MDEV-27128)
This function can also be used in a CHECK constraint to verify that JSON documents are only stored in the database if they include required items and that the values are within a given range and length.
Negative indexes can be used to access values in JSON arrays relative to the end of the array when a JSON Path expression is used as a parameter to a JSON function. (MDEV-22224)
The last index can be used to access the last value in a JSON array when a JSON Path expression is used as a parameter to a JSON function. (MDEV-22224)
A range of indexes can be used to access the values in that range in a JSON array when a JSON Path expression is used as a parameter to a JSON function. (MDEV-27911)
The TIMESTAMP range of values was extended from '2038-01-19 03:14:07 UTC', to '2106-02-07 06:28:15 UTC'.
The storage format is not changed, and new tables can be read by old MariaDB servers as long as timestamp values are within the old timestamp range.
INET4 values can now be compared with INET6 values and can be inserted into INET6 columns; the server does automatically convert INET4 value into INET6 as needed.
UUID data type is added to store UUIDs more efficiently. (MDEV-4958) The UUID data type was previously backported to MariaDB Enterprise Server 10.6.9-5.
INET4 data type is added to store IPv4 addresses as BINARY(4), where each byte stores one octet. (MDEV-23287)
The data type provides the following functionality:
Validation of incorrect values
Comparisons
Sorting
Functions like CAST()
New time zone options for function DATE_FORMAT()
The new options %Z and %z can be used for the format string of the function
for adding time zone information to the date string.
%Z Time zone abbreviation
%z Numeric time zone +hhmm or -hhmm presenting the hour and minute offset from UTC
Example:
SQL function KDF() for key derivation
A possible use case is to generate encryption keys from a user provided password or a passphrase. It can be used to generate encryption keys for encryption functions such as AES_ENCRYPT.
Example:
Function CONV() now supports conversions up to base 62
The function CONV(), which converts a number between numeric base systems, now supports conversions up to base 62.
This allows conversions to encodings to capital letters A-Z, lower case letters a-z, and numbers 0-9.
The old limit was 36, not including lower case letters.
Example:
and allow specifying the initialization vector (iv) and block encryption mode (mode). (MDEV-9069)
AES_ENCRYPT syntax prior to this release: AES_ENCRYPT(<str>, <key_str>)
AES_ENCRYPT syntax starting with this release: AES_ENCRYPT(<str>, <key>, [, iv [, mode]])
AES_DECRYPT syntax prior to this release: AES_DECRYPT(<str>, <key_str>)
AES_DECRYPT syntax starting with to this release: AES_DECRYPT(<str>, <key>, [, iv [, mode]])
The block_encryption_mode system variable specifies which mode will be used if the mode is not specified as a function argument.
For example, using the default mode from the block_encryption_mode:
For example, specifying the mode as an argument: <<sql inline=false>> SELECT HEX(AES_ENCRYPT('MariaDB','mykey','thisismy256vector','aes-256-cbc')) as result;
returns a binary string of a length between 1 and 1024 bytes. (MDEV-25704)
This nondeterministic value is generated by the cryptographically secure pseudo random generator (CSPRNG) of the SSL library, so it generates an arbitrary length string of cryptographic random bytes that are suitable for cryptographic use.
can be used to perform a natural sort of strings. (MDEV-4742)
Characters are sorted in alphabetical order, whereas numbers are sorted, such that "10" is greater than "9".
For example, "v10" would appear after the string "v9".
formats strings based on the specified options and values to generate a custom formatted string. ()
This function uses the fmtlib library for string formatting similar to Python, Rust, C++20.
CRC32() computes a cyclic redundancy check (CRC) as a 32-bit unsigned value using the ISO 3309 polynomial. (MDEV-27208)
The CRC can now be computed in pieces, using an optional second parameter: CRC32('String') is equal to CRC32(CRC32('Str','ing')).
CRC32C() can be used to compute checksums using the alternate Castagnoli polynomial.
The character_set_collations system variable allows the default collation for a character set to be changed globally or for a session. (MDEV-30164)
Starting with this release, the default collation is used whenever a character set is defined for a database object but the collation is not defined.
Starting with this release, when the character set is not defined, the default collation is as specified by the collation_server system variable.
Collations based on the Unicode Collation Algorithm (UCA) 14.0.0 have been added for the character sets : (MDEV-27009)
One neutral and 22 language specific collations have been added.
Accent sensitive, accent insensitive, case sensitive, case insensitive, no-pad variants have been added.
Collation names for new UCA 14.0.0 collations can be specified without the character set prefix, because the character set prefix can be automatically detected from the context. For example, uca1400_german_as_ci can be specified instead of utf8mb4_uca1400_german_as_ci. Collation names with character set prefixes are accepted for the new UCA 14.0.0 collations, but they are optional.
When the is queried for metadata about the new UCA 14.0.0 collations, the COLLATION_NAME column contains the collation name without a character set prefix, and the CHARACTER_SET_NAME column contains NULL, which indicates that these collations can apply to multiple character sets.
When the is queried for character set applicability of the new UCA 14.0.0 collations, the COLLATION_NAME column also contains the collation name without a character set prefix. A newFULL_COLLATION_NAMEcolumn has been added, which contains the full collation name (with a character set prefix) for all collations, including new UCA 14.0.0 collations.
Improved contraction performance in UCA collations.
Improved UCA collation performance for the utf8mb3 and utf8mb4 character sets.
On Microsoft Windows, MariaDB command-line tools now include full Unicode support. ()
Unicode support is available on Microsoft Windows 10 1909 or later, Microsoft Windows 11, and Microsoft Windows Server 2020.
The my.ini configuration file is now UTF-8 encoded.
The mariadb.exe
Client to server connection now requires SSL encryption by default
Using SSL (a more correct term would be TLS, but in reality SSL is more commonly used) has been simplified with MariaDB Enterprise Server 11.4.
Before version 11.4, proper SSL configuration required multiple manual steps for the server and all the clients connecting to it.
Now the client can verify the server self-signed certificate without any configuration whatsoever. The server completely automatically generates the SSL certificate and the client automatically verifies it as needed.
A default configuration now refuses unencrypted connections.
New Privilege SHOW CREATE ROUTINE to enable any user with this privilege to view the definition of a stored routine.
Before MariaDB Enterprise Server 11.4 a user only could see the definition of a routine, a stored feature, or function, when:
SELECT privilege exists for the mysql.procs table
Example with the new privilege SHOW CREATE ROUTINE:
New view in the SYS schema to retrieve user privileges per specific table
View privileges_by_table_by_level in the SYS schema lists the privilege and privilege level per user, schema, and table.
Example:
New Information Schema Table For Password Related Data (MENT-2145)
A new information Schema view, USERS, has been added, which DBAs can use to get insights about password related information for a user. This information can be used:
by an application to inform a user about a password about to expire or an account which is at risk of being blocked due to the number of wrong passwords entered
by DBAs to query users which have been blocked because of too many invalid passwords entered
The new view includes the fields:
USER – A string including user name and host PASSWORD_ERRORS – A counter with the current number of wrong passwords entered
Reset to 0 when a correct password has been entered
An account is blocked, if max_password_errors is reached
New Authentication Plugin — PARSEC (Password Authentication using Response Signed with Elliptic Curves) ()
PARSEC improves security over old authentication plugins by introducing salted passwords, time consuming key derivation function, and a client-side scramble to ensure that man-in-the-middle attackers cannot control the client response.
Example on how to create a user using the new authentication plugin:
This will result in:
The implements a way to prevent a user from setting a password that had been set for that user previously. (MDEV-5245)
The specifies the number of days before a password can be reused.
The plugin only affects a SQL statement that sets a user password using a literal password string. It cannot check the password of a SQL statement that makes use of a hashed password value.
The plugin makes use of password history records stored in the . Each row in the table stores a cryptographic hash and a date. The hashed data includes information about the affected user and the password that is being set. Because it is a one-way cryptographic hash, the stored data cannot be used to extract the prior password values nor which user the historical record is associated with.
The password_reuse_check plugin was previously backported to MariaDB Enterprise Server 10.4.25-16, 10.5.16-11, and 10.6.8-4.
can be used to grant privileges to all currently authenticated users and newly authenticated users on the system. ()
retrieves all privileges granted to public. ()
Fine-grained privileges have been removed from the : (, )|=Fine-grained privilege removed from as of ES 11.4.4-2|
Upon upgrade, each user that has the SUPER privilege will be granted the privileges removed from SUPER, so that the user's capabilities will not change. The SUPER privilege is still used for some special cases, including:
*** Calling and without an explicit key*** Dynamically changing certain system variables with
*** Changing certain debug settings** Due to this change, the consistency of read-only replicas are now protected when users with the SUPER privilege attempt to write to a read-only replica if they do not also have the .
*** Read-only replicas are replica servers that have set to ensure that they stay consistent with the primary.*** If a user with the SUPER privilege requires write access to a read-only replica server, the user must be explicitly granted the READ ONLY ADMIN privilege.
New option to limit the space used by binary bogs per server instance
The new system variable max_binlog_total_size (alias binlog_space_limit) enables binary log purging when the total size of all binary logs exceeds the specified threshold.
The default for max_binlog_total_size is 0, meaning that there is no limit.
The system variable can be changed without restarting the server.
New system variable --slave-connections-needed-for-purge set to 1 by default.
Assures that binary log purging will not happen until at least that many replicas are connected and do not need purged binary logs anymore.
New status variable binlog_disk_use provides the disk space currently used by the binary logs.
New options SQL_BEFORE_GTIDS and SQL_AFTER_GTIDS for START REPLICA UNTIL
The new options SQL_BEFORE_GTIDS and SQL_AFTER_GTIDS for START REPLICA UNTIL allow the user to control of whether the replica stops before or after a provided GTID state.
When providing SQL_BEFORE_GTIDS="<gtid_list>", for each domain specified in the gtid_list, the replica will execute transactions up to the GTID found, and immediately stop processing events in that domain without executing the transaction of the specified GTID. Once all domains have stopped, the replica will stop. Events originating from domains that are not specified in the list are not replicated.
START SLAVE UNTIL SQL_AFTER_GTIDS="<gtid_list>" is an alias to the default behavior of START SLAVE UNTIL master_gtid_pos="<gtid_list>", the known behavior before MariaDB Enterprise Server 11.4.
The replica will execute transactions originating from domain ids provided in the list, and will stop once all transactions provided in the UNTIL list have all been executed.
An index is now created on the GTIDs of the binary log, which allows a connecting replica to find the position it should start from without the need to scan the whole binary log.
The new system variable binlog_gtid_index (default ON) can be used to disable the creation of indexes.
The new system variable binlog_gtid_index_page_size (default 4096) defines the page size to use for the binary log GTID index.
GTID binlog events now include the thread ID ()
The thread ID and the corresponding statement can now be retrieved from binary logs
The output of mariadb-binlog also includes the thread ID
Binary log filter options binlog-do-db, binlog-ignore-db, and binlog-row-event-max-size are now visible as system variables. ()
For example:
For all storage engines, is divided into two phases to prevent long-running DDL statements from causing replication lag on replicas: (MDEV-11675)
Enabled by setting , which is not the default.
Two-phase ALTER TABLE is optimistic, so the operation begins on the replica server before it finishes on the primary server.
Two events are written to the binary log on the primary server: a START ALTER event when the operation starts, and either a COMMIT ALTER event or a ROLLBACK ALTER event when the operation finishes depending on whether it succeeds or fails.
By default, replication uses Global Transaction IDs (GTID), which makes replicas crash-safe. ()
This change impacts backward compatibility.
In previous releases, when TO was executed without explicitly specifying MASTER_USE_GTID, it would default to MASTER_USE_GTID=no.
For mariadb-binlog, the start and stop positions can be specified as GTIDs: ()
The --start-position command-line option can set the starting GTID position as a comma-separated list of GTIDs. For each specified GTID domain, the GTID position is exclusive, so an event is only printed if its sequence number is greater than the sequence number specified for that domain.
The --stop-position command-line option can set the ending GTID position as a comma-separated list of GTIDs. For each specified GTID domain, the GTID position is inclusive, so an event is only printed if its sequence number is greater than or equal to the sequence number specified for that domain.
Both command-line options require each GTID in the comma-separated list to have a different domain ID.
For , events can be filtered based on the domain IDs and server IDs in the event's GTID: (, )
The --do-domain-ids command-line option can set domain IDs that should be read as a comma-separated list of domain IDs. If an event's GTID does not have one of the specified domain IDs, the event is not printed.
The --ignore-domain-ids command-line option can set domain IDs that should be ignored as a comma-separated list of domain IDs. If an event's GTID has one of the specified domain IDs, the event is not printed.$ mariadb-binlog --start-position='0-1-1001,1-2-1000' \ --stop-position='0-1-2000,1-2-1050' mariadb-bin.000001
The --start-position command-line option can set the starting GTID position as a comma-separated list of GTIDs. For each specified GTID domain, the GTID position is exclusive, so an event is only printed if its sequence number is greater than the sequence number specified for that domain.
The --stop-position command-line option can set the ending GTID position as a comma-separated list of GTIDs. For each specified GTID domain, the GTID position is inclusive, so an event is only printed if its sequence number is greater than or equal to the sequence number specified for that domain.
Both command-line options require each GTID in the comma-separated list to have a different domain ID.
The following changes pertain to Galera Cluster with MariaDB Enterprise Server 11.4:
Automatic SST User Account Management with Galera (MENT-2144)
The State Snapshot Transfer (SST) method, needed to provide a full data copy to a new node, requires a dedicated account to access the remote server (donor) during the SST process.
MariaDB Enterprise Cluster (Galera) now creates the user internally for the time of an SST, which makes the need to have an account created manually obsolete. This removes the requirement to have a user and password provided via a configuration file. Having the user created by Galera also ensures that the needed privileges are set.
New connection states in and better reflect the state of the connection: ()
waiting to execute in isolation
The connection is executing a DDL statement with , but the operation requires other concurrent operations to finish first, so the DDL statement can be executed in isolation.
waiting for TOI DDL
Another connection is executing a DDL statement with , so this connection must wait for the DDL statement to finish.
waiting for flow control
The connection is committing a transaction, but transactions are currently paused due to flow control, so the connection is waiting for the cluster to catch up and unpause transactions.
waiting for certification
The connection is committing a transaction, but it is waiting for the other cluster nodes to certify the transaction.
Node state changes can be saved to a machine-readable JSON file configured by the : (MDEV-26971)
The JSON file can be read by monitoring tools.
When wsrep_status_file is set to a path, the node state changes are written to the specified file.
When wsrep_status_file is set to none, this functionality is disabled.
Progress reporting for MariaDB Enterprise Backup-based SST by configuring the progress option in the [sst] option group: ()
Progress reporting is only supported for MariaDB Enterprise Backup-based SST, so must be set.
Progress reporting is only enabled when is set.
When progress=1 is set, progress reporting goes to standard error (stderr).
When progress is set to a path, progress reporting is written to the specified file.
When progress is set to none, progress reporting is disabled.
rlimit can be used to set a rate limit in bytes. The value can use a suffix to represent a unit: k for kilobytes, m for megabytes, g for gigabytes, and t for terabytes.
The pv utility must be installed for SST progress reporting.
When progress reporting is enabled, the following SST progress message is written to the MariaDB log during an SST:
When wsrep_status_file is set to none, this functionality is disabled.
Progress reporting for MariaDB Enterprise Backup-based SST by configuring the progress option in the [sst] option group: ()
Progress reporting is only supported for MariaDB Enterprise Backup-based SST, so must be set.
Progress reporting is only enabled when is set.
When progress=1 is set, progress reporting goes to standard error (stderr).
When progress is set to a path, progress reporting is written to the specified file.
When progress is set to none, progress reporting is disabled.
rlimit can be used to set a rate limit in bytes. The value can use a suffix to represent a unit: k for kilobytes, m for megabytes, g for gigabytes, and t for terabytes.
The pv utility must be installed for SST progress reporting.
When progress reporting is enabled, the following SST progress message is written to the MariaDB log during an SST:
In alignment with enterprise lifecycle, MariaDB Enterprise Server 11.4.4-2 is provided for:
Debian 11 (x86_64, ARM64)
Debian 12 (x86_64, ARM64)
Red Hat Enterprise Linux 8 (x86_64, ARM64)
Red Hat Enterprise Linux 9 (x86_64, ARM64, PPC64LE)
AlmaLinux 8 (x86_64, ARM64)
AlmaLinux 9 (x86_64, ARM64)
Rocky Linux 8 (x86_64, ARM64)
Rocky Linux 9 (x86_64, ARM64)
SUSE Linux Enterprise Server 15 (x86_64, ARM64)
Ubuntu 20.04 (x86_64, ARM64)
Ubuntu 22.04 (x86_64, ARM64)
Ubuntu 24.04 (x86_64, ARM64)
Microsoft Windows (x86_64) (Without MariaDB Enterprise Cluster (Galera) support)
Red Hat UBI 8 (x86_64, ARM64)
Red Hat UBI 8 is part of the Enterprise Server Docker Image. It does not support MariaDB Enterprise Cluster (Galera) or MariaDB ColumnStore.
Some components of MariaDB Enterprise Server might not support all platforms. For additional information, see MariaDB Corporation Engineering Policies".
FLUSH TABLES t1 FOR EXPORT;
--copy_file $MYSQLD_DATADIR/test/t1.cfg $MYSQLD_DATADIR/test/t2.cfg
--copy_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/t2.frm
--copy_file $MYSQLD_DATADIR/test/t1.ibd $MYSQLD_DATADIR/test/t2.ibd
UNLOCK TABLES;
ALTER TABLE t2 IMPORT TABLESPACE;[mariadb]
...
innodb_data_file_path=ibdata1:12M;ibdata2:50M:autoextend:autoshrinkSET GLOBAL innodb_undo_log_truncate=ON;SET GLOBAL innodb_truncate_temporary_tablespace_now=1;CREATE TEMPORARY TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL)ENGINE=InnoDB;
INSERT INTO t1 SELECT seq, seq FROM seq_1_to_65536;
DROP TABLE t1;
SELECT NAME, FILE_SIZE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME="innodb_temp
orary";+------------------+-----------+
| NAME | FILE_SIZE |
+------------------+-----------+
| innodb_temporary | 79691776 |
+------------------+-----------+SET GLOBAL INNODB_TRUNCATE_TEMPORARY_TABLESPACE_NOW= 1;
SELECT NAME, FILE_SIZE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME="innodb_temp
orary";+------------------+-----------+
| NAME | FILE_SIZE |
+------------------+-----------+
| innodb_temporary | 12582912 |
+------------------+-----------+CREATE TABLE t1 (id INT);
INSERT INTO t1 VALUES (100);
CREATE PROCEDURE p1() SELECT * FROM t1;
CALL p1;+------+
| id |
+------+
| 100 |
+------+ALTER TABLE t1 ADD COLUMN b INT DEFAULT 0;
CALL p1;+------+
| id |
+------+
| 100 |
+------+CREATE TABLE t1 (id INT);
INSERT INTO t1 VALUES (100);
CREATE PROCEDURE p1() SELECT * FROM t1;
CALL p1;+------+
| id |
+------+
| 100 |
+------+ALTER TABLE t1 ADD COLUMN b INT DEFAULT 0;
CALL p1;+------+------+
| id | b |
+------+------+
| 100 | 0 |
+------+------+CREATE DATABASE test;
USE test;
CREATE TABLE t1 (id INT);
CREATE TEMPORARY TABLE t2_temp (id INT);
SHOW FULL TABLE;+----------------+-----------------+
| Tables_in_test | Table_type |
+----------------+-----------------+
| t2_temp | TEMPORARY TABLE |
| t1 | BASE TABLE |
+----------------+-----------------+SELECT table_schema, table_name, table_type FROM information_schema.TABLES WHERE table_schema='test';+--------------+------------+------------+
| table_schema | table_name | table_type |
+--------------+------------+------------+
| test | t2_temp | TEMPORARY |
| test | t1 | BASE TABLE |
+--------------+------------+------------+GET DIAGNOSTICS CONDITION 1 @failed_row=ROW_NUMBER;SHOW EXPLAIN FOR 1;SHOW ANALYZE FOR 1;$ mariadb-dump \
--user=USER \
--password='PASSWORD' \
--all-databases \
--single-transaction \
--order-by-sizeSELECT * FROM processlist\G*************************** 1. row ***************************
...
*************************** 2. row ***************************
ID: 6
USER: root
HOST: localhost
DB: test
COMMAND: Query
TIME: 1
STATE: Sending data
INFO: select * from t1
TIME_MS: 1340.406
STAGE: 0
MAX_STAGE: 0
PROGRESS: 0.000
MEMORY_USED: 89856
MAX_MEMORY_USED: 392544
EXAMINED_ROWS: 0
SENT_ROWS: 3895737
QUERY_ID: 436
INFO_BINARY: select * from t1
TID: 100ALTER TABLE partitioned_tab
CONVERT TABLE tab1
TO PARTITION part_name VALUES LESS THAN (1000000);ALTER TABLE partitioned_tab
CONVERT PARTITION part_name
TO TABLE tab1;CREATE TABLE partitioned_tab (
col1 INT
)
PARTITION BY RANGE(col1) (
part1 VALUES LESS THAN (1000000),
part2 VALUES LESS THAN (2000000),
part3 VALUES LESS THAN (3000000),
part4 VALUES LESS THAN (4000000),
part5 VALUES LESS THAN (5000000),
part_end VALUES LESS THAN MAXVALUE
);CREATE TABLE remote_spider_tab (
id INT,
str VARCHAR(255),
PRIMARY KEY(id)
) ENGINE=Spider
PARTITION BY RANGE(id) (
PARTITION east_part VALUES LESS THAN (100) REMOTE_SERVER="mdb-east.example.org" REMOTE_TABLE="tab1",
PARTITION west_part VALUES LESS THAN MAXVALUE REMOTE_SERVER="mdb-west.example.org", REMOTE_TABLE="tab1"
);EXCHANGE PARTITION partition_name WITH TABLE tbl_name [{WITH | WITHOUT} VALIDATION]
CONVERT TABLE normal_table TO partition_definition [{WITH | WITHOUT} VALIDATION]CREATE TABLE t1 (x INT) WITH SYSTEM VERSIONING
PARTITION BY SYSTEM_TIME INTERVAL 1 months AUTO;DELIMITER $$
CREATE OR REPLACE PACKAGE myPkg
PROCEDURE p1();
FUNCTION f1() RETURNS INT;
END;
$$
CREATE OR REPLACE PACKAGE BODY myPkg
-- variable declarations
DECLARE v1 INT DEFAULT 1;
DECLARE v2 INT DEFAULT 10;
-- routine declarations
PROCEDURE p1()
BEGIN
SELECT v1, v2;
END;
FUNCTION f1() RETURNS INT
BEGIN
RETURN v1;
END;
-- package initialization
SET v1=v1 + 2;
END;
$$
DELIMITER ;
SELECT myPkg.f1();+------------+
| myPkg.f1() |
+------------+
| 3 |
+------------+CALL myPkg.p1();+------+------+
| v1 | v2 |
+------+------+
| 3 | 10 |
+------+------+CREATE TABLE sections (
top_level INT,
sub_level INT,
INDEX top_asc_sub_asc (top_level ASC, sub_level ASC),
INDEX top_asc_sub_desc (top_level ASC, sub_level DESC),
INDEX top_desc_sub_asc (top_level DESC, sub_level ASC),
INDEX top_desc_sub_desc (top_level DESC, sub_level DESC)
);
INSERT INTO sections VALUES
(1, 1), (1, 2), (2, 1), (2, 2),
(3, 1), (3, 2), (3, 3);EXPLAIN SELECT * FROM sections
ORDER BY top_level ASC, sub_level ASC;+------+-------------+----------+-------+---------------+-----------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------+-------+---------------+-----------------+---------+------+------+-------------+
| 1 | SIMPLE | sections | index | NULL | top_asc_sub_asc | 10 | NULL | 7 | Using index |
+------+-------------+----------+-------+---------------+-----------------+---------+------+------+-------------+EXPLAIN SELECT * FROM sections
ORDER BY top_level ASC, sub_level DESC;+------+-------------+----------+-------+---------------+------------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------+-------+---------------+------------------+---------+------+------+-------------+
| 1 | SIMPLE | sections | index | NULL | top_asc_sub_desc | 10 | NULL | 7 | Using index |
+------+-------------+----------+-------+---------------+------------------+---------+------+------+-------------+SELECT JSON_KEY_VALUE('[[1, {"key1":"val1", "key2":"val2"}, 3], 2, 3]', '$[0][1]');
```**
• JSON_KEY_VALUE() can be used as an argument to JSON_TABLE(), adding the key to a result set. For example:
```sql
SELECT jt.\* FROM JSON\_TABLE(\
JSON\_KEY\_VALUE('\[\[1, {"key1":"val1", "key2":"val2"}, 3], 2, 3]', '$\[0]\[1]'),'$\[\*]'\
COLUMNS (\
k VARCHAR(20) PATH '$.KEY',\
v VARCHAR(20) PATH '$.value',\
id FOR ORDINALITY )) AS jt;
+------+------+------+\
\| k | v | id |\
+------+------+------+\
\| key1 | val1 | 1 |\
\| key2 | val2 | 2 |\
+------+------+------+
* \##JSON\_ARRAY\_INTERSECT()## finds the intersection between two JSON arrays. (MDEV-26182)\
\*\* Syntax: ##JSON\_ARRAY\_INTERSECT(, )##\
\*\* For example:<>SET @array1= '\[1,2,3]';\
SET @array2= '\[1,2,4]';\
SELECT json\_array\_intersect(@array1, @array2) as result;
+--------+\
\| result |\
+--------+\
\| \[1, 2] |\
+--------+
SET @json1= '\[\[1,2,3],\[4,5,6],\[1,1,1]]';\
SET @json2= '\[\[1,2,3],\[4,5,6],\[1,3,2]]';\
SELECT json\_array\_intersect(@json1, @json2) as result;
+------------------------+\
\| result |\
+------------------------+\
\| \[\[1, 2, 3], \[4, 5, 6]] |\
+------------------------+
SET @json1= '{ "a" : \[1,2,3] , "b": {"key1": "val1", "key2": {"key3": "val3"\}} }';\
SELECT JSON\_OBJECT\_TO\_ARRAY(@json1) AS result;
+-----------------------------------------------------------------------+
| result |
+-----------------------------------------------------------------------+
| [["a", [1, 2, 3]], ["b", {"key1": "val1", "key2": {"key3": "val3"}}]] |
+-----------------------------------------------------------------------+SET @json1='{"a":\[1,2,3],"b":{"key1":"val1","key2":{"key3":"val3"\}}}';\
SET @json2='{"a":\[1,2,3]}';\
SELECT JSON\_OBJECT\_TO\_ARRAY(@json1) INTO @array1;\
SELECT JSON\_OBJECT\_TO\_ARRAY(@json2) INTO @array2;\
SELECT JSON\_ARRAY\_INTERSECT(@array1,@array2) AS result;+--------------------+
| result |
+--------------------+
| [["a", [1, 2, 3]]] |
+--------------------+SET @json1= '{ "a": 1, "b": 2, "c": 3}';
SELECT JSON_OBJECT_FILTER_KEYS (@json1, ' ["b", "c"] ') AS result;+------------------+
| result |
+------------------+
| {"b": 2, "c": 3} |
+------------------+
SET @json1= '{ "a": 1, "b": 2, "c": 3}';
SET @json2= '{"b" : 10, "c": 20, "d": 30}';
SELECT JSON_OBJECT_FILTER_KEYS (@json1, json_array_intersect(json_keys(@json1), json_keys(@json2))) AS result;
+------------------+
| result |
+------------------+
| {"b": 2, "c": 3} |
+------------------+
SELECT JSON_OVERLAPS('{"A": 1, "B": {"C":2}}', '{"A": 2, "B": {"C":2}}') AS is_overlap;+---------------------+
| is_overlap |
+---------------------+
| 1 |
+---------------------+SELECT JSON_REMOVE(@json, '$.A\[-10]')SELECT JSON\_REMOVE(@json, '$.A\[last]');SELECT JSON_REMOVE(@json, '$.A[1 TO 3]');DATE_FORMAT(DATE, format)SELECT DATE_FORMAT(NOW(), '%W %d %M %Y %H:%i:%s %Z %z');+--------------------------------------------------+
| DATE_FORMAT(NOW(), '%W %d %M %Y %H:%i:%s %Z %z') |
+--------------------------------------------------+
| Tuesday 21 November 2023 13:28:34 EST -0500 |
+--------------------------------------------------+KDF(key_str, salt [, {info | iterations} [, kdf_name [, width ]]])* `kdf_name` is "hkdf" or "pbkdf2_hmac"
* `width` (in bits) can be any number divisible by 8
* `info` is a non-secret parameter of the hkdf method, it allows to generate different encryption keys for different purposes from the same secret password
* `iterations` is a positive numeric parameter of the pbkdf2_hmac method. Larger values make the password more difficult to brute-force.SELECT hex(kdf('foo', 'bar', 'info', 'hkdf'));+----------------------------------------+
| hex(kdf('foo', 'bar', 'info', 'hkdf')) |
+----------------------------------------+
| 710583081D40A55F0B573A76E02D8975 |
+----------------------------------------+INSERT INTO tbl VALUES (aes\_encrypt(@secret\_data, kdf("Passw0rd", "NaCl", "info", 'hkdf'), "iv"));SELECT CONV(61,10,36);+----------------+
| CONV(61,10,36) |
+----------------+
| 1P |
+----------------+SELECT CONV(61,10,62);+----------------+
| CONV(61,10,62) |
+----------------+
| z |
+----------------+
SELECT @@block_encryption_mode;+-------------------------+
| @@block_encryption_mode |
+-------------------------+
| aes-128-ecb |
+-------------------------+SELECT HEX(AES\_ENCRYPT('MariaDB','mykey','VECTOR')) AS result;+----------------------------------+
| result |
+----------------------------------+
| CD0352A4B2FB18A592C04FF8CDA6C2F2 |
+----------------------------------+
```sql
SELECT AES_DECRYPT(x'CD0352A4B2FB18A592C04FF8CDA6C2F2','mykey','VECTOR') AS result;+---------+
| result |
+---------+
| MariaDB |
+---------+
SELECT HEX(AES_ENCRYPT('MariaDB','mykey','thisismy256vector','aes-256-cbc')) AS result;+----------------------------------+
| result |
+----------------------------------+
| CD6C47183B89A813557BFD639A893CE3 |
+----------------------------------+SELECT AES_DECRYPT(x'CD6C47183B89A813557BFD639A893CE3','mykey','thisismy256vector','aes-256-cbc') AS result;+---------+
| result |
+---------+
| MariaDB |
+---------+
SELECT SFORMAT("MariaDB version {}", VERSION());
SET @@character_set_collations='utf8mb4=uca1400_ai_ci';
CREATE DATABASE test_with_charset CHARACTER SET utf8mb4;
CREATE DATABASE test;
SELECT SCHEMA_NAME,DEFAULT_COLLATION_NAME FROM SCHEMATA WHERE SCHEMA_NAME LIKE "test%";+-------------------+------------------------+
| SCHEMA_NAME | DEFAULT_COLLATION_NAME |
+-------------------+------------------------+
| test_with_charset | utf8mb4_uca1400_ai_ci |
| test | utf8mb4_general_ci |
+-------------------+------------------------+
SHOW grants;+--------------------------------------------------+
| Grants for user1@% |
+--------------------------------------------------+
| GRANT USAGE ON _._ TO `user1`@`%` |
| GRANT SELECT, EXECUTE ON `test`.* TO `user1`@`%` |
+--------------------------------------------------+SHOW CREATE PROCEDURE myProc \G*************************** 1. row ***************************
Procedure: myProc
sql_mode: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Create Procedure: NULL
character_set_client: utf8mb3
collation_connection: utf8mb3_general_ci
Database Collation: utf8mb4_general_ciSHOW grants;+-----------------------------------------------------------------------+
| Grants for user1@% |
+-----------------------------------------------------------------------+
| GRANT USAGE ON _._ TO `user1`@`%` |
| GRANT SELECT, EXECUTE, SHOW CREATE ROUTINE ON `test`.* TO `user1`@`%` |
+-----------------------------------------------------------------------+SHOW CREATE PROCEDURE myProc \G*************************** 1. row ***************************
Procedure: myProc
sql_mode: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `myProc`()
BEGIN
SELECT "My Definiton of a Stored Procedure";
END
character_set_client: utf8mb3
collation_connection: utf8mb3_general_ci
Database Collation: utf8mb4_general_ciCREATE DATABASE test;
USE test;
CREATE TABLE t1 (id INT);
CREATE USER user1;
GRANT SELECT, UPDATE ON _._ TO user1;
CREATE USER user2;
GRANT SELECT ON test.* TO user2;
CREATE USER user3;
GRANT SELECT ON test.t1 TO user3;
SELECT * FROM sys.privileges_by_table_by_level WHERE GRANTEE NOT LIKE "'root'@'%'";+--------------+------------+-------------+-----------+--------+
| TABLE_SCHEMA | TABLE_NAME | GRANTEE | PRIVILEGE | LEVEL |
+--------------+------------+-------------+-----------+--------+
| test | t1 | 'user1'@'%' | SELECT | GLOBAL |
| test | t1 | 'user1'@'%' | UPDATE | GLOBAL |
| test | t1 | 'user2'@'%' | SELECT | SCHEMA |
| test | t1 | 'user3'@'%' | SELECT | TABLE |
+--------------+------------+-------------+-----------+--------+
CREATE USER 'MariaDBUser'@'%' IDENTIFIED VIA PARSEC USING PASSWORD('MyPassword123!');SHOW GRANTS FOR MariaDBUser@'%';\
Grants FOR MariaDBUser@%\
GRANT USAGE ON _._ TO `MariaDBUser`@`%` IDENTIFIED VIA parsec USING 'P0:lhXyNv1cIxpB8EnTxR7ON7S7:1l3rWRW1/jw45yrvYXB8eh02wzk7lcJcz4CMcWw2b+8'START SLAVE UNTIL (SQL_BEFORE_GTIDS|SQL_AFTER_GTIDS)="<gtid_list>"
* When providing `SQL_BEFORE_GTIDS="<gtid_list>"`, for each domain specified in the gtid_list, the replica will execute transactions up to the GTID found, and immediately stop processing events in that domain without executing the transaction of the specified GTID. Once all domains have stopped, the replica will stop. Events originating from domains that are not specified in the list are not replicated.
* `START SLAVE UNTIL SQL_AFTER_GTIDS="<gtid_list>"` is an alias to the default behavior of `START SLAVE UNTIL master_gtid_pos="<gtid_list>"`, the known behavior before MariaDB Enterprise Server 11.4.
* The replica will execute transactions originating from domain ids provided in the list, and will stop once all transactions provided in the `UNTIL` list have all been executed.SHOW GLOBAL VARIABLES WHERE
Variable_name LIKE 'binlog_do_db' OR
Variable_name LIKE 'binlog_ignore_db' OR
Variable_name LIKE 'binlog_row_event_max_size';+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| binlog_do_db | |
| binlog_ignore_db | |
| binlog_row_event_max_size | 8192 |
+---------------------------+-------+
$ mariadb-binlog --start-position='0-1-1001,1-2-1000'\
\--stop-position='0-1-2000,1-2-1050'\
mariadb-bin.000001$ mariadb-binlog --do-domain-ids='0,1'\
\--do-server-ids='1,2'\
mariadb-bin.000001[mariadb]
wsrep_status_file=galera_status.json[mariadb]
wsrep_sst_method=mariadb-backup
wsrep_debug=1
[sst]
progress=1
rlimit=100m[mariadb]
wsrep_sst_method=mariadb-backup
wsrep_debug=1
[sst]
progress=1
rlimit=100mFLUSH TABLES t1 FOR EXPORT;
--copy_file $MYSQLD_DATADIR/test/t1.cfg $MYSQLD_DATADIR/test/t2.cfg
--copy_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/t2.frm
--copy_file $MYSQLD_DATADIR/test/t1.ibd $MYSQLD_DATADIR/test/t2.ibd
UNLOCK TABLES;
ALTER TABLE t2 IMPORT TABLESPACE;[mariadb]
...
innodb_data_file_path=ibdata1:12M;ibdata2:50M:autoextend:autoshrinkSET GLOBAL innodb_undo_log_truncate=ON;SET GLOBAL innodb_truncate_temporary_tablespace_now=1;CREATE TEMPORARY TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL)ENGINE=InnoDB;
INSERT INTO t1 SELECT seq, seq FROM seq_1_to_65536;
DROP TABLE t1;
SELECT NAME, FILE_SIZE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME="innodb_temp
orary";+------------------+-----------+
| NAME | FILE_SIZE |
+------------------+-----------+
| innodb_temporary | 79691776 |
+------------------+-----------+SET GLOBAL INNODB_TRUNCATE_TEMPORARY_TABLESPACE_NOW= 1;
SELECT NAME, FILE_SIZE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLESPACES WHERE NAME="innodb_temp
orary";+------------------+-----------+
| NAME | FILE_SIZE |
+------------------+-----------+
| innodb_temporary | 12582912 |
+------------------+-----------+CREATE TABLE t1 (id INT);
INSERT INTO t1 VALUES (100);
CREATE PROCEDURE p1() SELECT * FROM t1;
CALL p1;+------+
| id |
+------+
| 100 |
+------+ALTER TABLE t1 ADD COLUMN b INT DEFAULT 0;
CALL p1;+------+
| id |
+------+
| 100 |
+------+CREATE TABLE t1 (id INT);
INSERT INTO t1 VALUES (100);
CREATE PROCEDURE p1() SELECT * FROM t1;
CALL p1;+------+
| id |
+------+
| 100 |
+------+ALTER TABLE t1 ADD COLUMN b INT DEFAULT 0;
CALL p1;+------+------+
| id | b |
+------+------+
| 100 | 0 |
+------+------+CREATE DATABASE test;
USE test;
CREATE TABLE t1 (id INT);
CREATE TEMPORARY TABLE t2_temp (id INT);
SHOW FULL TABLE;+----------------+-----------------+
| Tables_in_test | Table_type |
+----------------+-----------------+
| t2_temp | TEMPORARY TABLE |
| t1 | BASE TABLE |
+----------------+-----------------+SELECT table_schema, table_name, table_type FROM information_schema.TABLES WHERE table_schema='test';+--------------+------------+------------+
| table_schema | table_name | table_type |
+--------------+------------+------------+
| test | t2_temp | TEMPORARY |
| test | t1 | BASE TABLE |
+--------------+------------+------------+GET DIAGNOSTICS CONDITION 1 @failed_row=ROW_NUMBER;SHOW EXPLAIN FOR 1;SHOW ANALYZE FOR 1;$ mariadb-dump \
--user=USER \
--password='PASSWORD' \
--all-databases \
--single-transaction \
--order-by-sizeSELECT * FROM processlist\G*************************** 1. row ***************************
...
*************************** 2. row ***************************
ID: 6
USER: root
HOST: localhost
DB: test
COMMAND: Query
TIME: 1
STATE: Sending data
INFO: select * from t1
TIME_MS: 1340.406
STAGE: 0
MAX_STAGE: 0
PROGRESS: 0.000
MEMORY_USED: 89856
MAX_MEMORY_USED: 392544
EXAMINED_ROWS: 0
SENT_ROWS: 3895737
QUERY_ID: 436
INFO_BINARY: select * from t1
TID: 100ALTER TABLE partitioned_tab
CONVERT TABLE tab1
TO PARTITION part_name VALUES LESS THAN (1000000);ALTER TABLE partitioned_tab
CONVERT PARTITION part_name
TO TABLE tab1;CREATE TABLE partitioned_tab (
col1 INT
)
PARTITION BY RANGE(col1) (
part1 VALUES LESS THAN (1000000),
part2 VALUES LESS THAN (2000000),
part3 VALUES LESS THAN (3000000),
part4 VALUES LESS THAN (4000000),
part5 VALUES LESS THAN (5000000),
part_end VALUES LESS THAN MAXVALUE
);CREATE TABLE remote_spider_tab (
id INT,
str VARCHAR(255),
PRIMARY KEY(id)
) ENGINE=Spider
PARTITION BY RANGE(id) (
PARTITION east_part VALUES LESS THAN (100) REMOTE_SERVER="mdb-east.example.org" REMOTE_TABLE="tab1",
PARTITION west_part VALUES LESS THAN MAXVALUE REMOTE_SERVER="mdb-west.example.org", REMOTE_TABLE="tab1"
);EXCHANGE PARTITION partition_name WITH TABLE tbl_name [{WITH | WITHOUT} VALIDATION]
CONVERT TABLE normal_table TO partition_definition [{WITH | WITHOUT} VALIDATION]CREATE TABLE t1 (x INT) WITH SYSTEM VERSIONING
PARTITION BY SYSTEM_TIME INTERVAL 1 months AUTO;DELIMITER $$
CREATE OR REPLACE PACKAGE myPkg
PROCEDURE p1();
FUNCTION f1() RETURNS INT;
END;
$$
CREATE OR REPLACE PACKAGE BODY myPkg
-- variable declarations
DECLARE v1 INT DEFAULT 1;
DECLARE v2 INT DEFAULT 10;
-- routine declarations
PROCEDURE p1()
BEGIN
SELECT v1, v2;
END;
FUNCTION f1() RETURNS INT
BEGIN
RETURN v1;
END;
-- package initialization
SET v1=v1 + 2;
END;
$$
DELIMITER ;
SELECT myPkg.f1();+------------+
| myPkg.f1() |
+------------+
| 3 |
+------------+CALL myPkg.p1();+------+------+
| v1 | v2 |
+------+------+
| 3 | 10 |
+------+------+CREATE TABLE sections (
top_level INT,
sub_level INT,
INDEX top_asc_sub_asc (top_level ASC, sub_level ASC),
INDEX top_asc_sub_desc (top_level ASC, sub_level DESC),
INDEX top_desc_sub_asc (top_level DESC, sub_level ASC),
INDEX top_desc_sub_desc (top_level DESC, sub_level DESC)
);
INSERT INTO sections VALUES
(1, 1), (1, 2), (2, 1), (2, 2),
(3, 1), (3, 2), (3, 3);EXPLAIN SELECT * FROM sections
ORDER BY top_level ASC, sub_level ASC;+------+-------------+----------+-------+---------------+-----------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------+-------+---------------+-----------------+---------+------+------+-------------+
| 1 | SIMPLE | sections | index | NULL | top_asc_sub_asc | 10 | NULL | 7 | Using index |
+------+-------------+----------+-------+---------------+-----------------+---------+------+------+-------------+EXPLAIN SELECT * FROM sections
ORDER BY top_level ASC, sub_level DESC;+------+-------------+----------+-------+---------------+------------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------+-------+---------------+------------------+---------+------+------+-------------+
| 1 | SIMPLE | sections | index | NULL | top_asc_sub_desc | 10 | NULL | 7 | Using index |
+------+-------------+----------+-------+---------------+------------------+---------+------+------+-------------+SELECT JSON_KEY_VALUE('[[1, {"key1":"val1", "key2":"val2"}, 3], 2, 3]', '$[0][1]');+-----------------------------------------------------------------------------+
| JSON_KEY_VALUE('[[1, {"key1":"val1", "key2":"val2"}, 3], 2, 3]', '$[0][1]') |
+-----------------------------------------------------------------------------+
| [{"key": "key1", "value": "val1"}, {"key": "key2", "value": "val2"}] |
+-----------------------------------------------------------------------------+SELECT jt.* FROM JSON_TABLE(
JSON_KEY_VALUE('[[1, {"key1":"val1", "key2":"val2"}, 3], 2, 3]', '$[0][1]'),'$[*]'
COLUMNS (
k VARCHAR(20) PATH '$.KEY',
v VARCHAR(20) PATH '$.value',
id FOR ORDINALITY )) AS jt;+------+------+------+
| k | v | id |
+------+------+------+
| key1 | val1 | 1 |
| key2 | val2 | 2 |
+------+------+------+
* ##JSON_ARRAY_INTERSECT()## finds the intersection between two JSON arrays. (MDEV-26182)
** Syntax: ##JSON_ARRAY_INTERSECT(<array1>, <array2>)##
** For example:<<sql inline=false>>SET @array1= '[1,2,3]';
SET @array2= '[1,2,4]';
SELECT json_array_intersect(@array1, @array2) as result;+--------+
| result |
+--------+
| [1, 2] |
+--------+SET @json1= '[[1,2,3],[4,5,6],[1,1,1]]';
SET @json2= '[[1,2,3],[4,5,6],[1,3,2]]';
SELECT json_array_intersect(@json1, @json2) AS result;+------------------------+
| result |
+------------------------+
| [[1, 2, 3], [4, 5, 6]] |
+------------------------+SET @json1= '{ "a" : [1,2,3] , "b": {"key1": "val1", "key2": {"key3": "val3"}} }';
SELECT JSON_OBJECT_TO_ARRAY(@json1) AS result;+-----------------------------------------------------------------------+
| result |
+-----------------------------------------------------------------------+
| [["a", [1, 2, 3]], ["b", {"key1": "val1", "key2": {"key3": "val3"}}]] |
+-----------------------------------------------------------------------+SET @json1='{"a":[1,2,3],"b":{"key1":"val1","key2":{"key3":"val3"}}}';
SET @json2='{"a":[1,2,3]}';
SELECT JSON_OBJECT_TO_ARRAY(@json1) INTO @array1;
SELECT JSON_OBJECT_TO_ARRAY(@json2) INTO @array2;
SELECT JSON_ARRAY_INTERSECT(@array1,@array2) AS result;+--------------------+
| result |
+--------------------+
| [["a", [1, 2, 3]]] |
+--------------------+SET @json1= '{ "a": 1, "b": 2, "c": 3}';
SELECT JSON_OBJECT_FILTER_KEYS (@json1, ' ["b", "c"] ') AS result;+------------------+
| result |
+------------------+
| {"b": 2, "c": 3} |
+------------------+SET @json1= '{ "a": 1, "b": 2, "c": 3}';
SET @json2= '{"b" : 10, "c": 20, "d": 30}';
SELECT JSON_OBJECT_FILTER_KEYS (@json1, json_array_intersect(json_keys(@json1), json_keys(@json2))) AS result;+------------------+
| result |
+------------------+
| {"b": 2, "c": 3} |
+------------------+SELECT JSON_OVERLAPS('{"A": 1, "B": {"C":2}}', '{"A": 2, "B": {"C":2}}') AS is_overlap;+---------------------+
| is_overlap |
+---------------------+
| 1 |
+---------------------+SELECT JSON_REMOVE(@json, '$.A[-10]')SELECT JSON_REMOVE(@json, '$.A[last]');SELECT JSON_REMOVE(@json, '$.A[1 TO 3]');DATE_FORMAT(DATE, format)SELECT DATE_FORMAT(NOW(), '%W %d %M %Y %H:%i:%s %Z %z');+--------------------------------------------------+
| DATE_FORMAT(NOW(), '%W %d %M %Y %H:%i:%s %Z %z') |
+--------------------------------------------------+
| Tuesday 21 November 2023 13:28:34 EST -0500 |
+--------------------------------------------------+KDF(key_str, salt [, {info | iterations} [, kdf_name [, width ]]])* `kdf_name` is "hkdf" or "pbkdf2_hmac"
* `width` (in bits) can be any number divisible by 8
* `info` is a non-secret parameter of the hkdf method, it allows to generate different encryption keys for different purposes from the same secret password
* `iterations` is a positive numeric parameter of the pbkdf2_hmac method. Larger values make the password more difficult to brute-force.SELECT hex(kdf('foo', 'bar', 'info', 'hkdf'));+----------------------------------------+
| hex(kdf('foo', 'bar', 'info', 'hkdf')) |
+----------------------------------------+
| 710583081D40A55F0B573A76E02D8975 |
+----------------------------------------+INSERT INTO tbl VALUES (aes_encrypt(@secret_data, kdf("Passw0rd", "NaCl", "info", 'hkdf'), "iv"));SELECT CONV(61,10,36);+----------------+
| CONV(61,10,36) |
+----------------+
| 1P |
+----------------+SELECT CONV(61,10,62);+----------------+
| CONV(61,10,62) |
+----------------+
| z |
+----------------+SELECT @@block_encryption_mode;+-------------------------+
| @@block_encryption_mode |
+-------------------------+
| aes-128-ecb |
+-------------------------+SELECT HEX(AES_ENCRYPT('MariaDB','mykey','VECTOR')) AS result;+----------------------------------+
| result |
+----------------------------------+
| CD0352A4B2FB18A592C04FF8CDA6C2F2 |
+----------------------------------+SELECT AES_DECRYPT(x'CD0352A4B2FB18A592C04FF8CDA6C2F2','mykey','VECTOR') AS result;+---------+
| result |
+---------+
| MariaDB |
+---------++----------------------------------+
| result |
+----------------------------------+
| CD6C47183B89A813557BFD639A893CE3 |
+----------------------------------+SELECT AES_DECRYPT(x'CD6C47183B89A813557BFD639A893CE3','mykey','thisismy256vector','aes-256-cbc') AS result;+---------+
| result |
+---------+
| MariaDB |
+---------+SELECT SFORMAT("MariaDB version {}", VERSION());SET @@character_set_collations='utf8mb4=uca1400_ai_ci';
CREATE DATABASE test_with_charset CHARACTER SET utf8mb4;
CREATE DATABASE test;
SELECT SCHEMA_NAME,DEFAULT_COLLATION_NAME FROM SCHEMATA WHERE SCHEMA_NAME LIKE "test%";+-------------------+------------------------+
| SCHEMA_NAME | DEFAULT_COLLATION_NAME |
+-------------------+------------------------+
| test_with_charset | utf8mb4_uca1400_ai_ci |
| test | utf8mb4_general_ci |
+-------------------+------------------------+SHOW grants;+--------------------------------------------------+
| Grants for user1@% |
+--------------------------------------------------+
| GRANT USAGE ON *.* TO `user1`@`%` |
| GRANT SELECT, EXECUTE ON `test`.* TO `user1`@`%` |
+--------------------------------------------------+SHOW CREATE PROCEDURE myProc \G*************************** 1. row ***************************
Procedure: myProc
sql_mode: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Create Procedure: NULL
character_set_client: utf8mb3
collation_connection: utf8mb3_general_ci
Database Collation: utf8mb4_general_ciSHOW grants;+-----------------------------------------------------------------------+
| Grants for user1@% |
+-----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `user1`@`%` |
| GRANT SELECT, EXECUTE, SHOW CREATE ROUTINE ON `test`.* TO `user1`@`%` |
+-----------------------------------------------------------------------+SHOW CREATE PROCEDURE myProc \G*************************** 1. row ***************************
Procedure: myProc
sql_mode: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `myProc`()
BEGIN
SELECT "My Definiton of a Stored Procedure";
END
character_set_client: utf8mb3
collation_connection: utf8mb3_general_ci
Database Collation: utf8mb4_general_ciCREATE DATABASE test;
USE test;
CREATE TABLE t1 (id INT);
CREATE USER user1;
GRANT SELECT, UPDATE ON *.* TO user1;
CREATE USER user2;
GRANT SELECT ON test.* TO user2;
CREATE USER user3;
GRANT SELECT ON test.t1 TO user3;
SELECT * FROM sys.privileges_by_table_by_level WHERE GRANTEE NOT LIKE "'root'@'%'";+--------------+------------+-------------+-----------+--------+
| TABLE_SCHEMA | TABLE_NAME | GRANTEE | PRIVILEGE | LEVEL |
+--------------+------------+-------------+-----------+--------+
| test | t1 | 'user1'@'%' | SELECT | GLOBAL |
| test | t1 | 'user1'@'%' | UPDATE | GLOBAL |
| test | t1 | 'user2'@'%' | SELECT | SCHEMA |
| test | t1 | 'user3'@'%' | SELECT | TABLE |
+--------------+------------+-------------+-----------+--------+CREATE USER 'MariaDBUser'@'%' IDENTIFIED VIA PARSEC USING PASSWORD('MyPassword123!');SHOW GRANTS FOR MariaDBUser@'%';
Grants FOR MariaDBUser@%
GRANT USAGE ON *.* TO `MariaDBUser`@`%` IDENTIFIED VIA parsec USING 'P0:lhXyNv1cIxpB8EnTxR7ON7S7:1l3rWRW1/jw45yrvYXB8eh02wzk7lcJcz4CMcWw2b+8'START SLAVE UNTIL (SQL_BEFORE_GTIDS|SQL_AFTER_GTIDS)="<gtid_list>"SHOW GLOBAL VARIABLES WHERE
Variable_name LIKE 'binlog_do_db' OR
Variable_name LIKE 'binlog_ignore_db' OR
Variable_name LIKE 'binlog_row_event_max_size';+---------------------------+-------+
| Variable_name | Value |
+---------------------------+-------+
| binlog_do_db | |
| binlog_ignore_db | |
| binlog_row_event_max_size | 8192 |
+---------------------------+-------+$ mariadb-binlog --start-position='0-1-1001,1-2-1000' \
--stop-position='0-1-2000,1-2-1050' \
mariadb-bin.000001$ mariadb-binlog --do-domain-ids='0,1' \
--do-server-ids='1,2' \
mariadb-bin.000001[mariadb]
wsrep_status_file=galera_status.json[mariadb]
wsrep_sst_method=mariadb-backup
wsrep_debug=1
[sst]
progress=1
rlimit=100m[mariadb]
wsrep_sst_method=mariadb-backup
wsrep_debug=1
[sst]
progress=1
rlimit=100mCONSTRAINT_NAMETABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
PERIOD_NAME
The , , , , , , , , , and status variables have been removed.
innodb_undo_log_truncate=ON can have a performance impact for some workloads. In those cases, undo truncation can be enabled by temporarily setting the following:
As a result of this change, new TIMESTAMP columns without explicit default values will be created with DEFAULT NULL
INSERT RETURNING and DELETE RETURNING show the total number of rows sent for the returning data set
Example:
TABLE_SCHEMA
TABLE_NAME
PERIOD_NAME
START_COLUMN_NAME
END_COLUMN_NAMEto list Application-time period tables, the name defined for a period and the columns used for start and end timestamps.
View KEY_PERIOD_USAGE includes the columns
CONSTRAINT_CATALOG
CONSTRAINT_SCHEMA
CONSTRAINT_NAME
TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
PERIOD_NAME
The user is the definer of the Stored Procedure
SHOW CREATE ROUTINE privilege can be granted globally, per schema, or on individual routines.
Example without privilege SHOW CREATE ROUTINE:
NULL for accounts with privilege CONNECTION ADMIN
PASSWORD_EXPIRATION_TIME – The date and time when the password expires or NULL, if the password never expires
Its syntax is:
The new system variable binlog_gtid_index_span_min (default 65536) controls the sparseness of the binary log GTID index.
The new status variables binlog_gtid_index_hit and binlog_gtid_index_miss can be used for monitoring purposes. A miss is an indication that the index file is missing.
MASTER_USE_GTID=slave_pos. With MASTER_USE_GTID=slave_pos, the replica server uses the as the GTID position.This change can cause new behavior to occur when performing the following operations:
Setting up a new replica with without specifying MASTER_USE_GTID
Freshly starting a stopped replica with if the replica configuration does not explicitly have MASTER_USE_GTID set.
Resetting a replica with
When MASTER_LOG_FILE and MASTER_LOG_POS are explicitly set, MASTER_USE_GTID=no is implicitly set.
Sets the cost to copy a key value from the index to the local buffer while searching for a key value.
optimizer_key_lookup_cost
Engine
Sets the cost to find a key entry in the index.
optimizer_row_copy_cost
Engine
Sets the cost to find the next key entry in the index.
optimizer_rowid_compare_cost
Engine
Sets the cost to compare two rowid values.
optimizer_rowid_copy_cost
Engine
Sets the cost to copy a rowid from the index.
optimizer_row_lookup_cost
Engine
Sets the cost to find a row based on the rowid. The rowid is stored in the index with the key.
optimizer_row_next_find_cost
Engine
Sets the cost to find the next row.
optimizer_scan_setup_cost
Session
Sets the cost to start a table or index scan. The default low value configures the optimizer to use index lookups for tables with very few rows.
optimizer_where_cost
Session
Sets the cost to execute the WHERE clause for every row found. As this value is increases, the optimizer is more likely to choose plans which read fewer rows.
This page is: Copyright © 2025 MariaDB. All rights reserved.
This page is: Copyright © 2025 MariaDB. All rights reserved.
This page is: Copyright © 2025 MariaDB. All rights reserved.
This page is: Copyright © 2025 MariaDB. All rights reserved.
This page is: Copyright © 2025 MariaDB. All rights reserved.
This page is: Copyright © 2025 MariaDB. All rights reserved.
This page is: Copyright © 2025 MariaDB. All rights reserved.