MariaDB之与MySQL的兼容性比较

MariaDB之与MySQL的兼容性比较

MariaDB是为了替换MySQL的一个二进制发行版本

因为各种现实原因,MariaDB是用来替换同版本的MySQL的不同的二进制发行版本(如MySQL5.1MariaDB5.1/5.2/5.3都是兼容的,MySQL5.5MariaDB5.5是兼容的,实际上它与MariaDB10.0也同样兼容)。这意味着:

  • 数据和表定义文件(.frm)是二进制兼容的

    • 后文会介绍具体的不兼容特性

  • 全部的客户端API、协议在结构上是一致的

  • 全部的文件名称、二进制、路径、端口、套接字等等,都应该是相同的

  • 全部的MySQL驱动(PHPPerlPythonJava.NETMyODBCRubyMySQLC等等)在MariaDB中不需要修改即可使用

    • 在与PHP5集成时有已知的安装问题(老版本的PHP5客户端会检查依赖库的兼容性存在缺陷)

  • mysql-client包在MariaDB中同样工作

  • 共享的client库与MySQLclient库二进制兼容

这意味着大多数情况下,你可以轻松卸载MySQL并安装MariaDB,建议你这么做。(无需转换任何数据文件如果你使用的主版本号完全一致,如5.1.然而,你仍然需要通过执行mysql_upgrade来完成升级。这可以保证msyql的权限表和事件表得到更新以包含MariaDB新增的字段。

我们通过每个月将MySQL的代码合入到MariaDB来保证我们与MySQL的兼容性同时也会将OracleMySQL上所做的缺陷修改和新增特性加入到MariaDB中。

我们做了大量的工作来更新升级脚本,现在使用升级脚本将MySQL5.0升级到MariaDB5.1将会比升级到MySQL5.1更加容易.

换言之,MariaDB拥有很多的新增选项、扩展、存储引擎、在MySQL中还未修改的缺陷。你可以在MariaDB分布页面找到不同版本间特性差异。

MariaDB5.1MySQL5.1的不兼容性

在一些极少的情况下,MariaDB必须牺牲于MySQL的兼容性来提供更多更好的信息,下文列出了使用MariaDB5.1替换MySQL5.1的过程中所有已知的用户级不兼容性:

  • 安装包名以MariaDB打头而非MySQL

  • 计时不同,因为MariaDB在很多情况下比MySQL更快

  • mysqld在读取my.cnf配置文件时也会读取mariadb

  • 不能使用与MariaDB不同版本的MySQL的二进制存储引擎库与MariaDB协同工作。(这是因为服务器内部结构THD对于MariaDBMySQL是不同的,而且通常MySQL的不同版本之间THD也是不同的)。这通常不是问题,因为用户不会加载更新的存储引擎,同时MariaDB也会提供比MySQL更多的存储引擎。

  • CHECKSUMTABLE可能给出不同的结果,因为MariaDB不会忽略字段的NULL值,而MySQL5.1会忽略。(将来的MySQL版本会采取与MariaDB相同的计算方法)。你可以通过为mysqld指定—old选项强制按照老的方式生成CHECKSUM,因此,当你指定了--old选项以后,CHECKSUM命令执行速度将会减慢因为它必须一行一行计算生成CHECKSUM

  • 慢查询(原文为slowquery log,译者注)日志包含更多的关于查询的信息,因此当你有脚本解析满查询日志时可能会有问题

  • MariaDB默认会占用稍多的内存,因为我们缺省使能了MariaDB中的Aria存储引擎来处理内部临时表,如果你希望MariaDB占用更少的内存(以性能损失为代价)可以通过设置aria_pagecache_buffer_size=1M来实现(缺省值为128M

  • 如果你使用了MariaDB中新的命令选项或新特性或新的存储引擎,重新迁移至MySQL将不会太轻松

MariaDB5.2MySQL5.1的不兼容性

除了上述MariaDB5.1MySQL5.1的不兼容性之外,还有以下几点:

  • 新增了值为IGNORE_BAD_TABLE_OPTIONSSQL_MODE。如果该选项没有被设置,当在表、字段、索引属性上使用了存储引擎不支持的属性时会出错。这一改变可能会在数据库mysql的错误日志中增加关于表定义时使用了错误选项的告警,可以通过mysql_upgrade来修改这一问题

MariaDB5.3MySQL5.1MariaDB5.1的不兼容性

  • 定义视图时指定了ALGORITHM=MERGEALGORITHM=TEMPTABLE的视图会出现偶发性交换(accidentallyswapped)。必须带该选项重新创建视图才能解决这个问题。

  • 一些跟转换错误相关的错误信息变化,因为MariaDB在错误信息中提供了更多关于出错的信息

  • MariaDB才有的错误码移动到1900以后以避免与MySQL的错误码冲突

  • MariaDB现在支持在所有的上下文中使用毫秒。而MySQL在一些上下文中会丢失datetimetime的毫秒值

  • MariaDB中的UNIX_TIMESTAMP(日期字符串常量)返回包含6个整数的时间戳,而MySQL不会返回一个整数。这通常在使用UNIX_TIMESTAMP作为分割函数时出现问题。可以通过使用FLOOR(UNIX_TIMESTAMP(...))或改变日期字符串为日期数字,如20080101000000

  • MariaDB执行更加严格的datedatetimetimestamp值检查。如UNIX_TIMESTAMP('x')现在返回NULL而不是0

  • --maria-启动选项被移除,现在应该使--aria-前缀来替代这些老的命令(MariaDB5.2支持两种)

  • SHOWPROCESSLIST增加列Progress显示出命令的进度。可以通过指定mysqld的启动选项—old-mode=NO_PROGRESS_INFO--old标识(参考OLD_MODE

  • INFORMATION_SCHEMA.PROCESSLIST增加3列用来描述处理进度:STAGE,MAX_STAGE,PROGRESS.

  • /*M!/*M!#####打头的长注释会被执行

  • 如果使用了max_user_connections=0(支持任意数量的用户连接)选项启动mysqld,将不能通过指定全局变量来修改mysqld运行时配置。因为带该选项启动时,mysqld将不会分配特定数量的结构(通常还会为每会话分配互斥锁),如果动态修改该变量,将会导致访问错误的计数器,如果希望运行时修改配置,应该在启动时指定该值为一个足够大的值

  • 可以通过设置max_user_connections=-1来禁止用户连接到服务器(需同时设置全局变量和grant选项)。全局变量不会影响SUPER权限用户

  • IGNORE指令不会忽略全部错误(如fatal错误),仅忽略那些安全的错误

MariaDB5.5MariaDB5.3的不兼容性

XtraDB

XtraDB的提供者是PerconaPercona不再提供全部早期XtraDB特性,所以MariaDB5.5中也不再提供这些特性。

MariaDB5.5中不再支持的XtraDB选项

以下特性MariaDB5.5中将不再支持:

  • innodb_adaptive_checkpoint;使用 innodb_adaptive_flushing_method代替.

  • innodb_auto_lru_dump; 使用innodb_buffer_pool_restore_at_startup代替 (innodb_buffer_pool_load_at_startup in MariaDB 10.0).

  • innodb_blocking_lru_restore;使用 innodb_blocking_buffer_pool_restore代替.

  • innodb_enable_unsafe_group_commit

  • innodb_expand_import; 使用innodb_import_table_from_xtrabackup代替.

  • innodb_extra_rsegments;使用 innodb_rollback_segments代替.

  • innodb_extra_undoslots

  • innodb_fast_recovery

  • innodb_flush_log_at_trx_commit_session

  • innodb_overwrite_relay_log_info

  • innodb_pass_corrupt_table;使用 innodb_corrupt_table_action代替.

  • innodb_use_purge_thread

  • xtradb_enhancements

XtraDB选项缺省值变化

选项

原值

新值

innodb_change_buffering

inserts

all

innodb_flush_neighbor_pages

1

area

XtraDB 5.5新增选项



XtraDB / InnoDB5.5.中新增如下选项(XtraDB信息中不再支持选项同步)

  • innodb_adaptive_flushing_method

  • innodb_adaptive_hash_index_partitions

  • innodb_blocking_buffer_pool_restore

  • innodb_buffer_pool_instances

  • nnodb_buffer_pool_restore_at_startup

  • innodb_change_buffering_debug

  • innodb_corrupt_table_action

  • innodb_flush_checkpoint_debug

  • innodb_force_load_corrupted

  • innodb_import_table_from_xtrabackup

  • innodb_large_prefix

  • innodb_purge_batch_size

  • innodb_purge_threads

  • innodb_recovery_update_relay_log

  • innodb_rollback_segments

  • innodb_sys_columns

  • innodb_sys_fields

  • innodb_sys_foreign

  • innodb_sys_foreign_cols

  • innodb_sys_tablestats

  • innodb_use_global_flush_log_at_trx_commit

  • innodb_use_native_aio

参阅Perconas5.5升级指导

MariaDB 5.5MariaDB5.3MySQL5.5的不兼容性

  • 通过选项ALGORITHM=MERGEALGORITHM=TEMPTABLE定义的试图在 MariaDBMySQL中偶发交换!必须指定这些参数重新创建试图来解决这个问题。

  • INSERTIGNORE在主键重复错误时会给出警告.可以通过设置OLD_MODE=NO_DUP_KEY_WARNINGS_WITH_IGNORE来关闭告警(查阅OLD_MODE).

  • MariaDB5.5.31之前 ,X'HHHH'是二进制字符串的标准SQL语法,被错误的认为等同于0xHHHH,根据上下文可能是数字或字符串。在5.5.31 在所有上下文都被视为字符串(永不会被认为是数字),引入一个与早期MariaDB不兼容特性,同样与所有的MySQL版本也不兼容.查看CAST的更多范例

  • 查看MariaDB5.5 MySQL5.5系统变量差异引起的崩溃

MariaDB 10.0MariaDB 5.5 / MySQL 5.5的不兼容性

  • MariaDB10.0 SETOPTION 语法被废弃, MySQL5.6. 仅适用 SET.

MariaDB 10.0 MySQL 5.6的不兼容性

  • 全部 MySQL二进制程序 (mysqld,myisamchk etc.) 给出警告如果在选项中适用了前缀(--big-table替换为--big-tables).MariaDB 二进制程序和其他UNIX程序采用相同方式适用这些选项但并不给出警告

  • MariaDB GTID MySQL5.6不兼容。意味着不能讲MySQL5.6作为MariaDB10.0的备份。但是,MariaDB10.0可以是MySQL5.6或任务早期MySQL/MariaDB版本的备份

  • 为使CREATETABLE ... SELECT 与基于语法或基于行的工作方式一致,默认复制为CREATEOR REPLACE TABLE并在从服务器上执行。这样做的好处是如果从服务器在CREATE... SELECT指间宕机也可以继续工作

    • 课使用slave-ddl-exec-mode变量来指定CREATETABLE DROPTABLE将会如何复制

  • 查看MariaDB5.5 MySQL5.5系统变量差异引起的崩溃

  • MySQL 5.6缺省启用性能表。考虑到性能问题,MariaDB10.0缺省禁用该特性。可以通过指定mysqld启动选项为--performance-schema来启用该特性

老的,不再受支持的选项

如果你在配置文件/etc/my.cnf或其他my.cnf配置文件中使用了以下选项,应该删除这些配置,在MySQL5.1 或更新版本中总是true



  • skip-bdb

替换MySQLRPM

如果希望卸载MySQLRPM 并安装MariaDB,切记MySQLRPM 卸载时会重命名/etc/my.cnf/etc/my.cnf.rpmsave.

在安装完MariaDB以后,应该执行以下命令使得老的配置仍然可以工作:

mv -vi/etc/my.cnf.rpmsave /etc/my.cnf

IMariaDB MySQL-Proxy的不兼容性

MySQL客户端API可以通过MySQL-Proxy连接MariaDB,但是MariaDB的客户端 API将会受到进度报告信息如MySQL-Proxy未实现,要获取所有情况下兼容性只需要在客户端和拂去禁用进度报告。



相关连接

MariaDBvs MySQL - Features

Movingfrom MySQL

TroubleshootingInstallation Issues

Projectsand applications that works with MariaDB

你可能感兴趣的:(database)