《MariaDB原理与实现》试读:1.3 MariaDB的版本与兼容性
出于实用的目的,MariaDB是相同版本MySQL的二进制深度替代者,例如MariaDB 5.1、MariaDB 5.2和MariaDB 5.3对应于MySQL 5.1,MariaDB 5.5 对应于MySQL 5.5,MariaDB 10.0对应于MySQL 5.6。
MariaDB与MySQL的兼容性主要体现在以下几个方面。
数据文件和表定义文件是二进制兼容的。
所有的客户端API和协议都是兼容的。
所有的文件名、二进制文件、路径、端口号等都是相同的。
所有的连接器,包括PHP、Perl、Python、Java、.NET、Ruby、MySQL的连接器在MariaDB上都是可以正常使用的,不需要进行任何改动。
可以使用MySQL的客户端连接到MariaDB上。
也就是说,在大多数情况下,卸载已有的MySQL并安装对应版本的MariaDB,就可以工作得很好,不需要转换任何的数据文件,前提是使用对应版本的MariaDB,例如使用MariaDB 5.1替换MySQL5.1。同时,你必须还要运行mysql_upgrade来完成升级,确保你的MySQL权限和事件表更新了MariaDB的新字段。
MariaDB每个月都会与MySQL代码库合并来确保兼容性,并添加Oracle修正的bug和特性。MariaDB在脚本升级方面也做了大量的工作,从MySQL 5.0升级到MariaDB 5.1比从MySQL 5.0升级到MySQL 5.1更容易。
1.3.1 MariaDB 5.1和MySQL 5.1的不兼容性
为了使MariaDB提供更多、更有用的信息,在极少的一些情况下会导致MariaDB和MySQL不兼容。下面列出了从用户角度来看MariaDB 5.1与MySQL 5.1的所有不兼容性。
安装包的名称以MariaDB开头,而不是以MySQL开头。
在my.cnf配置文件中,可以使用[mariadb]来替代[mysqld]。
在MariaDB中加载其他二进制的存储引擎时,如果该存储引擎不是使用对应的MariaDB版本编译的,那么该二进制的存储引擎将不可用。这是因为服务器的内部数据结构THD在MariaDB和MySQL中是不同的,而且在MariaDB/MySQL的不同版本中也是不同的。通常这不是问题,因为对于大多数人来说,不需要加载二进制的存储引擎,MariaDB本身就拥有比MySQL更多的存储引擎。
表的校验可能产生不同的结果,因为MariaDB在校验的时候并不忽略NULL列(新式校验方法),而MySQL 5.1在校验的时候会忽略NULL列(旧式校验方法)。在MariaDB中,开启mysqld --old选项,你将会得到旧式的校验结果。但需要注意的是,MyISAM存储引擎和Aria存储引擎内部使用的是新式校验方式,所以当你使用了--old选项时,CHECKSUM命令将会执行得很慢,因为执行该命令的时候需要一行一行地扫描表的数据,然后按照“旧式”的方法生成校验结果。
MariaDB的慢查询日志包含了更多关于查询的信息,如果你使用已有的慢查询日志解析脚本对MariaDB的慢查询日志进行解析可能会出现问题。
MariaDB占用的内存通常会比MySQL多一点,因为在默认情况下,MariaDB会启用Aria存储引擎来操作内部临时表。如果想让MariaDB占用较少的内存(这将会牺牲一些性能),你可以设置aria_pagecache_buffer_size的值为1MB(默认值为128MB)。
如果你正在使用MariaDB的新选项、新特性或者新存储引擎,那么就不能在MySQL和MariaDB之间进行切换。
1.3.2 MariaDB 5.2和MySQL 5.1的不兼容性
除了上一节中列出的MariaDB 5.1和MySQL 5.1的不兼容性之外,MariaDB 5.2还有一些地方与MySQL 5.1不兼容。例如新增SQL_MODE的取值IGNORE_BAD_TABLE_OPTIONS,该选项会忽略由于存储引擎不支持某些选项而导致的错误。
1.3.3 MariaDB 5.3和MySQL 5.1、MariaDB 5.2的不兼容性
MariaDB 5.3不仅与MySQL 5.1在某些地方不兼容,同时与MariaDB 5.2也有一些地方不兼容。
由于转换而导致的错误,MariaDB提供了更加详细的说明。
MariaDB的错误编号已经从1900开始,目的是避免与MySQL的错误编号产生冲突。
MariaDB从5.3开始,内部使用的时间精度为微秒,而在MySQL内部以及5.3以前版本的MariaDB中,时间精度为毫秒。
在MariaDB中返回的是包含6位小数的时间戳,但是MySQL返回的时间戳是不带小数的。当你使用UNIX_TIMESTAMP 作为分区函数时,会导致一些问题。修复这些问题可以使用FLOOR(UNIX_TIMESTAMP())函数代替或者是将日期字符串改成日期数字,如20080101000000。
MariaDB对于类型date、datetime和timestamp值的检查更加严格,如 UNIX_TIMESTAMP("x") 返回的是NULL,而不是0。
SHOW PROCESSLIST 拥有一个额外的进度列,显示了命令的执行进度。通过启动mysqld时携带--old-mode=NO_PROGRESS_INFO或者--old选项来禁用该功能。
INFORMATION_SCHEMA.PROCESSLIST表新增了3个字段用于扩展命令执行进度报告功能,即STAGE、MAX_STAGE和PROGRESS。
若长注释以/*M!或者/*M!#####开头,注释内的命令将会被执行。
MariaDB在启动mysqld时,如果使用了max_user_connections=0(即不对连接数加以限制)参数,那么在mysqld运行的时候不能改变全局变量max_user_connections的值。这是因为启动mysqld时带上max_user_connections=0,MariaDB内部不会分配计数结构。如果之后改变了这个变量,将会导致错误的计数。
可以将max_user_connections设置为1阻止用户连接服务器,但拥有SUPER权限的用户还是可以连接上的。
IGNORE指令不会忽略所有的错误,仅仅会忽略安全的错误。
1.3.4 MariaDB 5.5和MariaDB 5.3的不兼容性
XtraDB存储引擎之前版本中的某些选项在XtraDB 5.5中将不再支持,具体包括以下几个方面。
innodb_adaptive_checkpoint:使用innodb_adaptive_flushing_method替代。
innodb_auto_lru_dump:使用innodb_buffer_pool_restore_at_startup替代。
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_segment替代。
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 5.5的某些选项的默认值发生了改变,主要有以下几项。
innodb_change_buffering的旧默认值为inserts,新默认值为all。
innodb_flush_neighbor_pages的旧默认值为1,新默认值为area。
XtraDB 5.5添加了一些新的选项,具体如下:
innodb_adaptive_flushing_method
innodb_adaptive_hash_index_partitions
innodb_blocking_buffer_pool_restore
innodb_buffer_pool_instances
innodb_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
1.3.5 MariaDB 5.5与MariaDB 5.3和MySQL 5.5的不兼容性
除了1.3.4节介绍的XtraDB在MariaDB 5.5和MariaDB 5.3中的不兼容性,MariaDB 5.5与MariaDB 5.3和MySQL 5.5还具有以下几个不兼容的地方。
INSERT IGNORE会对重复键值给出警告信息。通过设置OLD_MODE=NO_DUP_KEY_WARNINGS_ WITH_IGNORE,可以关闭INSERT IGNORE对重复键值的警告。
X'HHHH'在标准SQL语法中是用来表示二进制字符串的,但在MariaDB 5.5.31之前,它将被错误地理解为数字,和0xHHHH的作用一致。而在MariaDB 5.5.31中,该问题已被修复了,X'HHHH'只能表示字符串。
1.3.6 MariaDB 10.0和MySQL 5.6的不兼容性
作为MariaDB目前最新的版本,MariaDB 10.0与MySQL 5.6的不兼容性包括以下几个方面。
如果仅仅给出了选项的前缀部分,例如使用--big-table取代--big-tables,MySQL将会给出警告,而MariaDB将会正常工作。也就是说,只要给出的前缀部分能够唯一地标识该选项即可。
MariaDB的GTID和MySQL 5.6的GTID不能兼容,也就是说MySQL 5.6不能作为MariaDB 10.0的从库。
为了使CREATE TABLE ... SELECT命令在基于行模式复制和基于命令模式复制的情况下都能正常工作,MariaDB中CREATE TABLE ... SELECT命令在从库上将会被转化成CREATE OR RPLACE命令执行。这样的好处是即便从库在执行CREATE TABLE ... SELECT命令时宕机了,仍然能够正常工作。