Incompatibilities and Feature Differences Between MariaDB 10.4 and MySQL 8.0
The following is a list of incompatibilities and feature differences between MariaDB 10.4 and MySQL 8.0. It is based on the stable versions MySQL 8.0.22 and MariaDB 10.4.15. Note that MySQL 8 is an 'evergreen' release, so features may be added or removed in later releases.
- MyRocks, a storage engine with great compression
- Aria, MyISAM replacement with better caching.
- FederatedX (drop-in replacement for Federated)
Extensions and New Features
The most notable features available in MariaDB, but not in MySQL, are:
- Galera is a standard part of MariaDB Server.
- Temporal data tables in the form of:
- DML-only flashback, allowing instances, databases or tables to be rolled back to an old snapshot.
- Oracle compatibility mode
- Invisible Columns
- Table Value Constructors
- Semi-sync plugin merged into the server
- INTERSECT and EXCEPT
- OR REPLACE syntax for CREATE statements, such as CREATE OR REPLACE TABLE, CREATE OR REPLACE DATABASE, etc
- DELETE ... RETURNING
- PROXY protocol support
- Number of supported decimals in DECIMAL has increased from
- Added catchall for list partitions
- Oracle-style EXECUTE IMMEDIATE statement
- Lots of new JSON functions
- Microsecond Precision in Processlist
- Table Elimination
- Virtual Columns
- Extended User Statistics
- KILL all queries for a user
- Storage-engine-specific CREATE TABLE
- MariaDB supports more collations than MySQL, including
- FLUSH SSL command to reload SSL certificates without server restart.
IF NOT EXISTSclause added to INSTALL PLUGIN and
IF EXISTSclause added to UNINSTALL PLUGIN and UNINSTALL SONAME
- Enhancements to INFORMATION SCHEMA.PLUGINS table
- Group commit for the binary log. This makes replication notably faster!
- The binary log in MariaDB can be compressed.
- New server command, SHUTDOWN WAIT FOR ALL SLAVES, and a new mysqladmin shutdown --wait-for-all-slaves option, are added to instruct the server to wait for the last binlog event to be sent to all connected slaves before shutting down.
- BACKUP STAGE allows one to implement very efficient backups with minimal locking.
- Progress reporting for ALTER TABLE and LOAD DATA INFILE
- SHOW EXPLAIN gives the EXPLAIN plan for a query running in another thread.
- PCRE Regular Expressions (including REGEXP_REPLACE())
- HandlerSocket and faster HANDLER calls
When moving from MySQL 8.0 to MariaDB 10.4, please take note of the following incompatibilities:
- For a list of function differences, see Function Differences Between MariaDB 10.4 and MySQL 8.0
- For a list of system variable differences, see System Variable Differences Between MariaDB 10.4 and MySQL 8.0
- MariaDB's GTID is not compatible with MySQL's. Note that MariaDB and MySQL also have different GTID system variables, so these need to be adjusted when migrating.
- The unix_socket authentication plugin is now default on Unix-like systems, which is a major change to authentication in MariaDB. See Authentication from MariaDB 10.4 for an overview of the changes.
- Not all character sets and collations are supported across both MySQL and MariaDB. As of 10.4.14, MariaDB supports 40 character sets and 322 collations. As of 8.0.21, MySQL supports 41 character sets and 272 collations.
- To make CREATE TABLE ... SELECT work the same way in statement based and row based replication it's by default executed as CREATE OR REPLACE TABLE on the slave. One benefit of this is that if the slave dies in the middle of CREATE ... SELECT it will be able to continue.
- One can use the slave-ddl-exec-mode variable to specify how
DROP TABLEis replicated.
- One can use the slave-ddl-exec-mode variable to specify how
- Users created with MySQL's SHA256 password algorithm cannot be used in MariaDB 10.4.
- MariaDB stores JSON as true text, not in binary format as MySQL. MariaDB's JSON functions are much faster than MySQL's so there is no need to store in binary format, which would add complexity when manipulating JSON objects.
- For the same reason, MariaDB's JSON data type is an alias for LONGTEXT. If you want to replicate JSON columns from MySQL to MariaDB, you should store JSON objects in MySQL in a TEXT or LONGTEXT column or use statement based replication. If you are using JSON columns and want to upgrade to MariaDB, you need to either convert them to TEXT or use mysqldump to copy these tables to MariaDB.
- In MySQL, JSON is compared according to json values. In MariaDB JSON strings are normal strings and compared as strings.
- MariaDB 10.4 does not support MySQL's JSON operators (
- MariaDB 10.4 supports the standard by producing null and a warning for JSON_SEARCH when given invalid data, while MySQL produces an error.
- MariaDB never allows authentication via roles, while MySQL permits this.
- MySQL permits activating multiple roles at the same time. MariaDB can achieve the same result by creating an intermediate aggregate role.
- In the INFORMATION_SCHEMA.ENABLED_ROLES table, MySQL reports just the direct list of enabled roles, while MariaDB reports the enabled role, plus the effective inherited roles.
- MySQL extends the INFORMATION_SCHEMA.APPLICABLE_ROLES table .
- MySQL includes the tables INFORMATION_SCHEMA.ROLE_TABLE_GRANTS, INFORMATION_SCHEMA.ROLE_ROUTINE_GRANTS, INFORMATION_SCHEMA.ROLE_COLUMN_GRANTS, and INFORMATION_SCHEMA ADMINISTRABLE_ROLE_AUTHORIZATIONS.
- MySQL has the performance schema enabled by default. For performance reasons MariaDB 10.4 has it disabled by default. You can enable it by starting
mysqldwith the option
- MySQL features a new implementation of the performance_schema and a sys schema wrapper. These are only supported in MariaDB 10.5.
- In MariaDB 10.4, using FLUSH TABLES without any table list will only close tables not in use, and tables not locked by the FLUSH TABLES connection. If there are no locked tables, FLUSH TABLES will be instant and will not cause any waits, as it no longer waits for tables in use. When a table list is provided, the server will wait for the end of any transactions that are using the tables. In MySQL, FLUSH TABLES only waits for the statements to complete.
- MariaDB binaries (
mysqld, myisamchk etc.) give a warning if one uses a unique prefix of an option (such as
--big-tables). MySQL binaries require the full option name.
- MariaDB 10.4 implements InnoDB encryption in a different way to MySQL 8.0.
- MySQL's implementation of aborting statements that exceed a certain time to execute can only kill SELECTs, while MariaDB's can kill any queries (excluding stored procedures).
- MariaDB 10.4 does not support MySQL's
SELECT /*+ MAX_EXECUTION_TIME(n) */ ...- see Aborting Statements that Exceed a Certain Time to Execute.
- MySQL 8.0 does not support the Query Cache.
- MariaDB 10.4 does not support the MySQL Memcached plugin (which has been deprecated in MySQL 8.0). However, data stored using memcached can be retrieved because the data is stored as InnoDB tables. MariaDB is able to start successfully with an error message of not being able to find libmemcached.so library.
- MariaDB 10.4 does not support MySQL 8.0's ALTER TABLE...RENAME INDEX statements (supported in MariaDB 10.5).
- In MySQL,
X'HHHH', the standard SQL syntax for binary string literals, erroneously works in the same way as
0xHHHH, which could work as a number or string depending on the context. In MariaDB, this has been fixed to behave as a string in all contexts (and never as a number). See CAST and Hexadecimal Literals for more details and examples.
- In MariaDB 10.4, SHOW CREATE TABLE does not quote the DEFAULT value of an integer. MariaDB 10.2 and earlier, and MySQL, do. Since MariaDB can support defaults for BLOB and TEXT fields, while MySQL does not, SHOW CREATE TABLE will also append
DEFAULT NULLwhere no default is explicitly provided to nullable BLOB or TEXT fields in MariaDB.
- Since MariaDB supports INTERSECT and EXCEPT, these are both reserved words and can't be used as an identifier without being quoted.
- As a result of implementing Table Value Constructors, the VALUES function has been renamed to VALUE().
- MariaDB does not support the
--initializeoption. Use mysql_install_db instead. - MDEV-19010
- MariaDB 10.4 does not support the ngram and MeCab full-text parser plugins - MDEV-10267, MDEV-10268.
- MariaDB 10.4 does not support the MySQL X plugin.
- MariaDB 10.4 does not support MySQL 8's “native” InnoDB partitioning handler.
- MariaDB 10.4 does not support CREATE TABLESPACE for InnoDB.
- The MySQL 8.0 and MariaDB 10.4 INFORMATION_SCHEMA.COLUMNS table contain slightly different fields.