《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命令时宕机了,仍然能够正常工作。

>MariaDB原理与实现

MariaDB原理与实现
作者: 张金鹏, 张成远, 季锡强
isbn: 7115385173
书名: MariaDB原理与实现
页数: 300
定价: 59.00元
出版社: 人民邮电出版社
装帧: 平装
出版年: 2015-3