MariaDB 11.0 和 MySQL 8.0 之间的不兼容性和功能差异
上周迁移一个MariaDB 11.0.2到MySQL 8.0.34,发现兼容性很差。所以查询了官网的一些说明。仅供参考
原文:https://mariadb.com/kb/en/incompatibilities-and-feature-differences-between-mariadb-11-0-and-mysql-8-/
MariaDB 与 MySQL 保持高水平的兼容性,大多数使用 MySQL 的应用程序都可以与 MariaDB 无缝协作。但是,请注意MariaDB 11.0和 MySQL 8.0 之间的以下不兼容性和功能差异。它基于版本 MySQL 8.0.34 和MariaDB 11.0.2。请注意,MySQL 8 是一个“常青”版本,因此可能会在后续版本中添加或删除功能。
存储引擎
除了标准的InnoDB、MyISAM、BLACKHOLE、CSV、MEMORY、ARCHIVE和MERGE存储引擎外, MariaDB 11.0还提供以下存储引擎:
- ColumnStore utilizes a massively parallel distributed data architecture and is designed for big data scaling to process petabytes of data.
- MyRocks, a storage engine with great compression
- S3 storage engine allows one to archive MariaDB tables in Amazon S3, or any third-party public or private cloud that implements S3 API.
- Aria, MyISAM replacement with better caching.
- CONNECT
- SEQUENCE
- Spider
- SphinxSE
- FederatedX (drop-in replacement for Federated)
- [OQGRAPH]
扩展和新功能
MariaDB 中最显着的功能(但 MySQL 中没有)是:
-
Galera是 MariaDB Server 的标准部分。
-
时态数据表的
形式为:
- 系统版本控制表(允许您查询和操作历史数据)。
- 应用程序时间段(允许您查询和操作数据的时间范围),包括WITHOUT OVERLAPS子句。
- 双时态表(结合了系统版本控制和应用程序时间段)。
-
仅 DML 闪回,允许实例、数据库或表回滚到旧快照。
-
Oracle兼容模式
-
MariaDB 支持多种其他语言的 本地化:保加利亚语、中文、格鲁吉亚语、印地语、塞尔维亚语和乌克兰语。
-
MariaDB对优化器进行了重大改进。
-
序列
-
表值构造函数
-
动态列支持
-
半同步插件合并到服务器中
-
相交/相交所有和除了/除了所有
-
CREATE语句的 OR REPLACE 语法,例如CREATE OR REPLACE TABLE、CREATE OR REPLACE DATABASE等
-
删除…返回、插入…返回、替换…返回
-
授予公众- MDEV-5215(博客文章)
-
用于设置锁定等待超时的 WAIT语法。
-
用于存储 UUID 的UUID数据类型。
-
用于存储 IPv6 和 IPv4 地址的 INET6和INET4数据类型。
-
SUPER 权限变得更加细化。
-
PROXY协议支持
-
多种压缩算法可作为插件使用
-
DECIMAL中支持的小数位数已从30增加到38
-
添加了列表分区的包罗万象
-
Oracle 风格的EXECUTE IMMEDIATE语句
-
许多新的JSON 函数
-
进程列表中的微秒精度
-
表消除
-
虚拟列
-
扩展用户统计
-
终止用户的所有查询
-
特定于存储引擎的 CREATE TABLE
-
MariaDB支持的排序规则(506) 比 MySQL (266) 更多。
-
FLUSH SSL命令可在不重新启动服务器的情况下重新加载 SSL 证书。
-
IF NOT EXISTS添加到INSTALL PLUGIN 的子句以及IF EXISTS添加到UNINSTALL PLUGIN和UNINSTALL SONAME 的子句
-
INFORMATION SCHEMA.PLUGINS 表的增强功能
-
二进制日志的组提交。这使得复制速度明显加快!
-
MariaDB中的二进制日志可以被压缩。
-
BACKUP STAGE允许人们以最少的锁定实现非常高效的备份。
-
ALTER TABLE和LOAD DATA INFILE的进度报告
-
SHOW EXPLAIN给出在另一个线程中运行的查询的 EXPLAIN 计划。MySQL 引入了 EXPLAIN FOR CONNECTION 语法来完成同样的事情。
-
PCRE 正则表达式(包括REGEXP_REPLACE())
-
HandlerSocket和更快的HANDLER调用
-
MySQL 8 不支持PROCEDURE ANALYZE
-
MySQL 8 不支持使用NULLN作为别名
不兼容性
从 MySQL 8.0 迁移到MariaDB 11.0时,请注意以下不兼容性:
-
有关功能差异的列表,请参阅MariaDB 11.0 和 MySQL 8.0 之间的功能差异
-
有关系统变量差异的列表,请参阅MariaDB 11.0 和 MySQL 8.0 之间的系统变量差异
-
MariaDB 不支持 MySQL 的 SET PERSIST - MDEV-16228
-
MariaDB 的 GTID 与 MySQL 不兼容。请注意,MariaDB 和 MySQL 也有不同的GTID 系统变量,因此在迁移时需要调整这些变量。
-
unix_socket 身份验证插件现在是类 Unix 系统上的默认插件,这是 MariaDB 中身份验证的重大变化。有关更改的概述, 请参阅MariaDB 10.4 的身份验证。
-
所有 mysql* 二进制文件现在都命名为 mariadb*(出于兼容性目的,先前命名的 mysql 保留为符号链接)
-
MySQL 和 MariaDB并不支持所有字符集和排序规则。从 11.0 开始,MariaDB 支持 40 个字符集和 506 种排序规则。从 8.0.34 开始,MySQL 支持 41 种字符集(额外的字符集 - MDEV-7495)和 286 种排序规则。 gb18030
-
MariaDB 将排序规则填充状态作为名称的一部分(例如utf8mb3_unicode_nopad_ci)来指示,而 MySQL 通过SHOW COLLATION中的额外列来指示填充状态。
-
为了使 CREATE TABLE … SELECT 在基于语句和基于行的复制中以相同的方式工作,默认情况下在从属设备上作为
CREATE OR REPLACE TABLE
执行。这样做的好处之一是,如果从属设备在 CREATE … SELECT 过程中死亡,它将能够继续。
- 可以使用slave-ddl-exec-mode变量来指定复制方式CREATE TABLE和DROP TABLE复制方式。
-
使用 MySQL 的 SHA256 密码算法创建的用户不能在MariaDB 11.0 - MDEV-9804中使用。
-
MariaDB 11.0不支持横向派生表 - MDEV-19078。
-
MariaDB 11.0不支持用户帐户的 CIDR 表示法 - MDEV-25515。
-
MariaDB 将JSON存储为真实文本,而不是像 MySQL 那样以二进制格式存储。MariaDB 的 JSON 函数比 MySQL 快得多,因此不需要以二进制格式存储,这会增加操作 JSON 对象时的复杂性。
-
出于同样的原因,MariaDB 的JSON 数据类型是LONGTEXT的别名。如果要将 JSON 列从 MySQL 复制到 MariaDB,您应该将 JSON 对象存储在 MySQL 中的 TEXT 或 LONGTEXT 列中,或者使用基于语句的复制。如果您使用 JSON 列并想要升级到 MariaDB,请使用mysql_json插件自动将 MySQL JSON 转换为 TEXT,或者您需要将它们转换为 TEXT 或使用mysqldump将这些表复制到 MariaDB。
-
在MySQL中,JSON是根据json值进行比较的。在 MariaDB 中,JSON 字符串是普通字符串,并作为字符串进行比较。
-
MariaDB 11.01不支持 MySQL 的 JSON 运算符 (->和->>) - MDEV-13594
-
MariaDB 11.0通过在给定无效数据时生成 null 和JSON_SEARCH警告来支持该标准,而 MySQL 会生成错误。
-
角色
- MariaDB 从不允许通过角色进行身份验证,而 MySQL 允许这样做。
- MySQL 允许同时激活多个角色。MariaDB可以通过创建中间聚合角色来达到相同的结果。
- 在INFORMATION_SCHEMA.ENABLED_ROLES 表中,MySQL 仅报告启用的角色的直接列表,而 MariaDB 报告启用的角色以及有效的继承角色。
- MySQL 扩展了INFORMATION_SCHEMA.APPLICABLE_ROLES 表。
- MySQL 包括表 INFORMATION_SCHEMA.ROLE_TABLE_GRANTS、INFORMATION_SCHEMA.ROLE_ROUTINE_GRANTS、INFORMATION_SCHEMA.ROLE_COLUMN_GRANTS 和 INFORMATION_SCHEMA ADMINISTRABLE_ROLE_AUTHORIZATIONS。
-
MySQL默认启用性能模式。出于性能原因,MariaDB 11.0默认禁用它。mariadbd您可以通过从选项开始启用它–performance-schema。
-
MariaDB 删除了InnoDB Change Buffer。
-
在MariaDB 11.0中,在没有任何表列表的情况下使用FLUSH TABLES只会关闭未使用的表以及未被 FLUSH TABLES 连接锁定的表。如果没有锁定的表,FLUSH TABLES 将是即时的并且不会导致任何等待,因为它不再等待正在使用的表。当提供表列表时,服务器将等待使用这些表的任何事务的结束。在 MySQL 中,FLUSH TABLES 仅等待语句完成。
-
如果使用选项的唯一前缀(例如代替) , MariaDB 二进制文件(mariadbd、myisamchk等)会发出警告。MySQL 二进制文件需要完整的选项名称。 --big-table``–big-tables
-
MariaDB 11.0以与 MySQL 8.0 不同的方式 实现InnoDB 加密。
-
MySQL 执行超过一定执行时间的中止语句只能杀死 SELECT,而 MariaDB 可以杀死任何查询(不包括存储过程)。
-
MariaDB 11.0不支持 MySQL SELECT /*+ MAX_EXECUTION_TIME(n) */ …- 请参阅中止超出特定执行时间的语句。
-
MySQL 8.0 不支持查询缓存。
-
MariaDB 11.01不支持 MySQL Memcached 插件(该插件在 MySQL 8.0 中已弃用)。但是,可以检索使用 memcached 存储的数据,因为数据存储为 InnoDB 表。MariaDB 能够成功启动,但出现无法找到 libmemcached.so 库的错误消息。
-
在 MySQL 中,X’HHHH’,二进制字符串文字的标准 SQL 语法,错误地以与 相同的方式工作0xHHHH,根据上下文,它可以作为数字或字符串工作。在 MariaDB 中,它已被修复为在所有上下文中都表现为字符串(而不是数字)。有关更多详细信息和示例, 请参阅CAST和十六进制文字。
-
在MariaDB 11.0中,SHOW CREATE TABLE不引用整数的默认值。MariaDB 10.2及更早版本和 MySQL 都是如此。由于 MariaDB 可以支持BLOB和TEXT字段的默认值,而 MySQL 不支持,因此SHOW CREATE TABLE也会DEFAULT NULL在没有显式向 MariaDB 中可为空的 BLOB 或 TEXT 字段提供默认值的情况下追加。
-
由于 MariaDB 支持INTERSECT和EXCEPT,因此它们都是保留字,如果不加引号 就不能用作标识符。
-
由于实现了表值构造函数,VALUES 函数已重命名为 VALUE()。
-
MariaDB的NOWAIT支持SELECT语句、LOCK TABLES和各种DDL语句,而MySQL的NOWAIT仅支持SELECT。
-
MariaDB 的NOWAIT无法添加到视图和存储过程,而 MySQL 可以 - MDEV-25247
-
MariaDB在写锁定时不支持RENAME表 - MDEV-30814
-
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transactionMariaDB在时间内返回“无法锁定”,而 MySQL 返回ERROR 3572 (HY000): Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set
-
MariaDB 不支持AES_ENCRYPT和AES_DECRYPT的可选init_vector参数或 block_encryption_mode 变量 - MDEV-9069
-
MariaDB 不支持该–initialize选项。请改用mariadb-install-db。- MDEV-19010
-
MariaDB 11.0不支持 ngram 和 MeCab 全文解析器插件 - MDEV-10267、MDEV-10268。
-
MariaDB 11.0不支持MySQL X 插件。
-
MariaDB 11.0.3之前的MariaDB 11.0不支持 MySQL 8 的“本机”InnoDB 分区处理程序 - MDEV-29253
-
MariaDB 11.0不支持为 InnoDB创建表空间。
-
MySQL 8.0 和MariaDB 11.0 INFORMATION_SCHEMA.COLUMNS表包含略有不同的字段。
-
MariaDB 11.0客户端可执行文件允许通过在命令行上仅指定连接属性来强制使用连接协议。请参阅mariadb 命令行客户端
-
MySQL 二进制日志包含 thread_id,而 MariaDB 的二进制日志不包含 - MDEV-7850
-
MySQL 不支持支持具有REF_SYSTEM_ID的空间数据类型列的空间参考系统 ID 的MariaDB 10.1语法。MySQL 8 推出,MariaDB 不支持。 CREATE SPATIAL REFERENCE SYSTEM
-
MariaDB 11.0不支持 RESTART 语句 - MDEV-30813
-
MariaDB 11.0不支持 SELECT FOR UPDATE 和 FOR SHARE 锁 - MDEV-17514