MariaDB之与MySQL的兼容性比较
MariaDB是为了替换MySQL的一个二进制发行版本
因为各种现实原因,MariaDB是用来替换同版本的MySQL的不同的二进制发行版本(如MySQL5.1与MariaDB5.1/5.2/5.3都是兼容的,MySQL5.5与MariaDB5.5是兼容的,实际上它与MariaDB10.0也同样兼容)。这意味着:
-
数据和表定义文件(.frm)是二进制兼容的
-
后文会介绍具体的不兼容特性
-
-
全部的客户端API、协议在结构上是一致的
-
全部的文件名称、二进制、路径、端口、套接字等等,都应该是相同的
-
全部的MySQL驱动(PHP、Perl、Python、Java、.NET、MyODBC、Ruby、MySQLC等等)在MariaDB中不需要修改即可使用
-
在与PHP5集成时有已知的安装问题(老版本的PHP5客户端会检查依赖库的兼容性存在缺陷)
-
-
mysql-client包在MariaDB中同样工作
-
共享的client库与MySQL的client库二进制兼容
这意味着大多数情况下,你可以轻松卸载MySQL并安装MariaDB,建议你这么做。(无需转换任何数据文件如果你使用的主版本号完全一致,如5.1).然而,你仍然需要通过执行mysql_upgrade来完成升级。这可以保证msyql的权限表和事件表得到更新以包含MariaDB新增的字段。
我们通过每个月将MySQL的代码合入到MariaDB来保证我们与MySQL的兼容性同时也会将Oracle在MySQL上所做的缺陷修改和新增特性加入到MariaDB中。
我们做了大量的工作来更新升级脚本,现在使用升级脚本将MySQL5.0升级到MariaDB5.1将会比升级到MySQL5.1更加容易.
换言之,MariaDB拥有很多的新增选项、扩展、存储引擎、在MySQL中还未修改的缺陷。你可以在MariaDB分布页面找到不同版本间特性差异。
MariaDB5.1与MySQL5.1的不兼容性
在一些极少的情况下,MariaDB必须牺牲于MySQL的兼容性来提供更多更好的信息,下文列出了使用MariaDB5.1替换MySQL5.1的过程中所有已知的用户级不兼容性:
-
安装包名以MariaDB打头而非MySQL
-
计时不同,因为MariaDB在很多情况下比MySQL更快
-
mysqld在读取my.cnf配置文件时也会读取mariadb段
-
不能使用与MariaDB不同版本的MySQL的二进制存储引擎库与MariaDB协同工作。(这是因为服务器内部结构THD对于MariaDB和MySQL是不同的,而且通常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.2与MySQL5.1的不兼容性
除了上述MariaDB5.1与MySQL5.1的不兼容性之外,还有以下几点:
-
新增了值为IGNORE_BAD_TABLE_OPTIONS的SQL_MODE。如果该选项没有被设置,当在表、字段、索引属性上使用了存储引擎不支持的属性时会出错。这一改变可能会在数据库mysql的错误日志中增加关于表定义时使用了错误选项的告警,可以通过mysql_upgrade来修改这一问题
MariaDB5.3与MySQL5.1和MariaDB5.1的不兼容性
-
定义视图时指定了ALGORITHM=MERGE或ALGORITHM=TEMPTABLE的视图会出现偶发性交换(accidentallyswapped)。必须带该选项重新创建视图才能解决这个问题。
-
一些跟转换错误相关的错误信息变化,因为MariaDB在错误信息中提供了更多关于出错的信息
-
MariaDB才有的错误码移动到1900以后以避免与MySQL的错误码冲突
-
MariaDB现在支持在所有的上下文中使用毫秒。而MySQL在一些上下文中会丢失datetime或time的毫秒值
-
MariaDB中的UNIX_TIMESTAMP(日期字符串常量)返回包含6个整数的时间戳,而MySQL不会返回一个整数。这通常在使用UNIX_TIMESTAMP作为分割函数时出现问题。可以通过使用FLOOR(UNIX_TIMESTAMP(...))或改变日期字符串为日期数字,如20080101000000
-
MariaDB执行更加严格的date、datetime、timestamp值检查。如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.5与MariaDB5.3的不兼容性
XtraDB
XtraDB的提供者是Percona,Percona不再提供全部早期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 / InnoDB在5.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.5与MariaDB5.3和MySQL5.5的不兼容性
-
通过选项ALGORITHM=MERGE或ALGORITHM=TEMPTABLE定义的试图在 MariaDB和 MySQL中偶发交换!必须指定这些参数重新创建试图来解决这个问题。
-
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.0和MariaDB 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