第 1 章 MariaDB概述

第 1 章 MariaDB概述

2008年MySQL首先被Sun公司收购,之后Sun公司又被Oracle公司收购,MySQL也被包含在这次收购中。在这两次收购过程中,出现了多个MySQL的开源分支,其中比较主流的分支有Percona Server、MariaDB和Drizzle等。它们都有活跃的用户社区和一定程度上的商业支持,均由独立的服务供应商支持。

MariaDB是众多MySQL开源分支中非常出色的一个。作为MySQL的深度替代者,MariaDB很好地兼容了MySQL。同时,MariaDB在MySQL的基础上做了很多扩展,包含了许多新特性,例如支持binlog group commit技术,支持虚拟列和动态列,支持多源复制,等等。在性能方面,MariaDB也做了很多优化,例如更快的子查询、更快的字符集转换、为MyISAM存储引擎添加了分段键值缓存,让MyISAM存储引擎在现代硬件体系上运行得更快,等等。本章中,我们将介绍MariaDB的一些基本信息。

本章的内容主要包括:

  • MariaDB的历史

  • MariaDB所做的事情

  • MariaDB的版本与兼容性

  • 编译和安装MariaDB

  • 联系社区

1.1 MariaDB的历史

在Sun收购MySQL之后,MySQL的创始人Monty Widenius离开了Sun公司,成立了Monty程序公司,创立了MariaDB,其主要目的是建立一个开放的开发环境,以鼓励外部人员参与。目前,MariaDB主要由社区开发和维护。

MariaDB对社区、开发者及用户的主要意义可以概括为以下几个方面:

  • 是一个永久开源的MySQL分支;

  • 高质量和持续性的开发测试及维护工作;

  • 来自社区开发者提交的补丁会被确认、接收和使用;

  • 维护MariaDB整个社区开发者的话语权,不会被某一个人或者组织完全控制;

  • 持续保持和MySQL的兼容性。

1.2 MariaDB所做的事情

MariaDB在MySQL的基础上做了许多工作,主要包括性能方面的优化以及许多新特性的支持。

1.2.1 更丰富的存储引擎

除了包含标准的MyISAM、BLACKHOLE、CSV、MEMORY、ARCHIVE、MERGE等存储引擎外,MariaDB的源代码和二进制包中还包含以下额外的存储引擎:

  • Aria

  • XtraDB

  • PBXT

  • FederatedX

  • OQGraph

  • SphinxSE

  • IBMDB2I

  • TokuDB

  • Cassandra

  • CONNECT

  • Sequence

  • Spider

1.2.2 性能的提升

MariaDB在很多地方都做了优化,其性能得到了不同程度的提升。MariaDB所做的优化主要包括以下几个方面。

  • 对子查询进行了优化,使子查询的速度得到了提升。

  • 更快、更安全的复制,引入了binlog group commit技术,使MariaDB在某些场景下事务的提交速度得到成倍提升。

  • 提升了在Windows平台下InnoDB异步IO子系统的性能。

  • 提高了MEMORY存储引擎索引的插入速度。

  • 为MyISAM存储引擎增加了分段键值缓存,提升了MyISAM存储引擎在现代硬件上的运行速度。

  • 表的校验更加快速。

  • 提升了字符集的转换效率。

  • 引入了线程池技术,解决了MySQL的最大连接数限制问题,降低了大量连接情况下的系统开销。

  • 使用Aria存储引擎的表作为临时表,提升了某些复杂查询的效率。

1.2.3 扩展和新特性

MariaDB是由社区开发和维护的,主要由用户的需求所驱动,如果某个功能对用户是有用的,MariaDB就会考虑将其加入进来,所以MariaDB包含了许多扩展和新特性。目前,MariaDB比较显著的扩展和特性主要包括以下几个。

  • 时间精度达到微秒级别。

  • 虚拟列的支持。

  • 动态列的支持。

  • 用户统计的扩展。

  • KILL命令的扩展,允许杀死某个用户的所有查询。

  • CREATE TABLE命令的扩展。

  • INFORMATION_SCHEMA.PLUGINS表的增强。

  • 引入了binlog group commit技术。

  • 命令的执行进度报告。

  • 更快的连接和子查询。

  • GIS功能的支持。

  • 支持多源复制,允许一个从库同时复制多个主库的数据。

  • GTID的支持,简化了复制的运行和维护工作。

  • 支持PCRE正则表达式。

1.2.4 更好的测试

MariaDB在测试方面也做了很多工作,主要表现在以下几个方面。

  • 更多的测试。

  • bug修复的测试。

  • 配置不同的编译选项,获得更好的测试效果。

  • 移除无效的测试。

1.2.5 尽量消除错误和警告

为了避免潜在的问题,在编译程序的时候,不要忽略编译器的警告信息,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对于类型datedatetimetimestamp值的检查更加严格,如 UNIX_TIMESTAMP("x") 返回的是NULL,而不是0。

  • SHOW PROCESSLIST 拥有一个额外的进度列,显示了命令的执行进度。通过启动mysqld时携带--old-mode=NO_PROGRESS_INFO或者--old选项来禁用该功能。

  • INFORMATION_SCHEMA.PROCESSLIST表新增了3个字段用于扩展命令执行进度报告功能,即STAGEMAX_STAGEPROGRESS

  • 若长注释以/*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命令时宕机了,仍然能够正常工作。

1.4 编译和安装MariaDB

在使用MariaDB或者学习MariaDB之前,建议首先在你的机器上安装MariaDB。安装方式主要有两种,一是使用二进制安装包进行安装,二是使用源代码进行编译安装,下面我们分别进行介绍。

1.4.1 使用二进制安装包进行安装

使用二进制安装包安装MariaDB是非常简单的,主要步骤如下。

(1) 根据自己的系统平台,前往MariaDB官方网站获取MariaDB对应的二进制安装包:https://downloads.mariadb.org/

(2) 解压下载的安装包,将解压后的二进制文件复制到指定的目录:

shell> tar zxvf mariadb-10.0.6-x86_64.tar.gz
shell> cp -r mariadb-10.0.6-x86_64/* /usr/local/mariadb10/

(3) 创建MariaDB用户组和用户:

shell> groupadd maria
shell> useradd -r -g maria maria

(4) 改变目录权限:

shell> cd /usr/local/mysql
shell> sudo chown -R maria .
shell> sudo chgrp -R maria .

(5) 初始化MariaDB系统表:

shell> sudo scripts/mysql_install_db --user=maria
shell> sudo chown -R maria data

(6) 启动MariaDB server进程:

shell> cd /usr/local/mysql
shell> sudo bin/mysqld_safe --user=maria &

1.4.2 使用源代码进行编译安装

使用源代码编译安装MariaDB主要包括以下几个步骤。

(1) 获取MariaDB源代码包。前往MariaDB官方网站的下载页面(https://downloads.mariadb.org/)下载MariaDB的源代码。

(2) 解压MariaDB源代码包:

shell> tar zxvf mariadb-10.0.6.tar.gz

(3) 编译与安装MariaDB。

MariaDB 5.5以及更高的版本使用了cmake工具进行编译,具体的步骤如下所示。

(a) 首先你可以使用cmake的默认配置,也可以为cmake添加选项:

shell> cd mariadb-10.0.6
shell> cmake .

(b) 运行完cmake之后,建立和安装:

shell> make
shell> sudo make install

(c) 创建MariaDB用户组和用户:

shell> groupadd maria
shell> useradd -r -g maria maria

(d) 改变目录权限:

shell> cd /usr/local/mysql
shell> sudo chown -R maria .
shell> sudo chgrp -R maria .

(e) 初始化MariaDB系统表:

shell> sudo scripts/mysql_install_db --user=maria
shell> sudo chown -R maria data

(f) 启动MariaDB server进程:

shell> cd /usr/local/mysql
shell> sudo bin/mysqld_safe --user=maria &

(4) 连接到MariaDB server。此时,MariaDB已经安装完成,并且处于运行状态,可以使用客户端连接并进行操作:

shell> cd /usr/local/mysql
shell> bin/mysql -uroot

在执行cmake命令生成Makefile的时候,可以根据自己的需求为cmake添加不同的参数,达到定制Makefile的目的。执行cmake . -Lh命令,可以查看cmake可选的参数。表1-1列出了cmake可以携带的所有参数,并给出了它们的含义和默认值。

表 1-1 cmake参数列表

参数

描述

默认值

CMAKE_BUILD_TYPE

编译类型,可选的值包括:DebugReleaseRelWithDebInfoMinSizeRel

RelWithDebInfo

CMAKE_INSTALL_PREFIX

安装目录前缀

/usr/local/mysql

COMMUNITY_BUILD

是否是社区共建

ON

CONNECT_WITH_LIBXML2

是否支持使用LIBXML2连接存储引擎

ON

CONNECT_WITH_MYSQL

是否支持远程MySQL连接

ON

CONNECT_WITH_ODBC

是否支持ODBC连接

ON

CONNECT_WITH_XMAP

是否支持索引文件映射方式连接

ON

ENABLE_DEBUG_SYNC

是否启用同步调试

ON

ENABLE_GCOV

是否包含GCOV支持

ON

ENABLED_PROFILING

是否启用代码查询分析

ON

INSTALL_LAYOUT

安装目录布局。选项有STANDALONERPMDEBSVR4

STANDALONE

MYSQL_DATADIR

MySQL数据目录

/usr/local/mysql/data

ODBC_INCLUDE_DIR

包含sql.h文件的目录

/usr/include

ODBC_LIBRARY

指定ODBC驱动管理库

/usr/lib/libodbc.so

TMPDIR

存放MariaDB临时文件的路径

 

USE_ARIA_FOR_TMP_TABLES

使用Aria临时表

ON

WITH_ARCHIVE_STORAGE_ENGINE

归档静态连接到服务器

OFF

WITH_ARIA_STORAGE_ENGINE

是否安装Aria存储引擎

ON

WITH_BLACKHOLE_STORAGE_ENGINE

是否安装BLACKHOLE存储引擎

OFF

WITH_CONNECT_STORAGE_ENGINE

是否安装CONNECT存储引擎

OFF

WITH_EMBEDDED_SERVER

是否在嵌入式服务下编译MariaDB

OFF

WITH_EXTRA_CHARSETS

额外的字符集

all

WITH_FEDERATEDX_STORAGE_ENGINE

是否安装FederatedX存储引擎

OFF

WITH_FEEDBACK

是否安装FEEDBACK存储引擎

OFF

WITH_LIBWRAP

是否支持libwrap

OFF

WITH_LOCALES

是否静态关联LOCALES

OFF

WITH_METADATA_LOCK_INFO

是否静态关联METADATA_LOCK_INFO

OFF

WITH_PARTITION_STORAGE_ENGINE

是否安装PARTITION存储引擎

ON

WITH_PERFSCHEMA_STORAGE_ENGINE

是否安装PERFSCHEMA存储引擎

ON

WITH_QUERY_CACHE_INFO

是否静态关联QUERY_CACHE_INFO

OFF

WITH_QUERY_RESPONSE_TIME

是否静态关联QUERY_RESPONSE

OFF

WITH_READLINE

使用捆绑的readline

OFF

WITH_SEMISYNC_MASTER

是否静态关联SEMISYNC_MASTER

OFF

WITH_SEMISYNC_SLAVE

是否静态关联SEMISYNC_SLAVE

OFF

WITH_SEQUENCE_STORAGE_ENGINE

是否安装Sequence存储引擎

OFF

WITH_SPHINX_STORAGE_ENGINE

是否安装Sphinx存储引擎

OFF

WITH_TEST_SQL_DISCOVERY_STORAGE_ENGINE

是否安装TEST_SQL_DISCOVERY存储引擎

OFF

WITH_UNIT_TESTS

是否编译MariaDB单元测试

ON

WITH_VALGRIND

是否支持VALGRIND

OFF

WITH_XTRADB_STORAGE_ENGINE

是否安装XtraDB存储引擎

ON

WITH_ZLIB

是否支持zlib

system

1.5 联系社区

MariaDB是由社区进行开发和维护的,当你碰到MariaDB的相关问题时,可以与社区取得联系。下面我们给出几个社区的联系方式。

  • Launchpad团队和邮件列表。MariaDB项目托管在Launchpad上,一个好的开始是去加入Launchpad团队。下面简要介绍一下各个团队。

    • maria-discuss团队和邮件列表,适合MariaDB用户和一般讨论。

    • maria-docs团队和邮件列表,适合对于文档感兴趣的人。

    • maria-developers团队和邮件列表,适合一些想贡献代码或是密切关注MariaDB开发动态的人。

    • maria-captains团队和邮件列表,适合受信任的开发人员将代码合并到官方的分支。

  • MariaDB Commits列表。提交邮件发送到commit@mariadb.org。任何人都能够订阅提交邮件或是查阅相关提交档案。

  • MariaDB Captains。Maria-captains是MariaDB核心开发团队。只要有足够的技术、技能并且积极参与MariaDB开发,都能成为这个团队里的一员。

  • MariaDB公告列表。如果你只是想知道最新MariaDB的消息,如MariaDB的最新发行版本,你可以订阅annouce@mariadb.org,也可以查阅公告档案信息。

  • IRC。Maria项目官方IRC频道是irc.freenode.net/maria。irc:irc.freenode.net/maria-meeting频道用于官方会议。为了用户的利益,官方并没有为开发者单独设立一个频道。

  • 讨论组。你可以在许多的开源讨论组里找到研究MariaDB的人,如O'Reilly MySQL讨论组、OSCON和Open Source bridge。也可以参考MariaDB开发者所维护的讨论组列表:https://mariadb.org/en/conference/

  • 要求增加新特性。如果想要新增一个特性,既可以在MariaDB官方网站的JIRA系统中提交,也可以自己完成这个特性并且成为MariaDB的开发者。

  • MariaDB知识基础。MariaDB知识基础是一个手册,也是一个帮助文档,在这里你能提问和回答关于特定MariaDB/MySQL的一些问题。

1.6 小结

本章中,我们介绍了MariaDB的一些基本信息,首先概览了MariaDB的历史以及MariaDB主要做的一些事情,接着介绍了MariaDB和对应版本的MySQL的兼容性,最后讨论了如何对MariaDB进行编译和安装。

目录

  • 前言
  • 第 1 章 MariaDB概述
  • 第 2 章 MariaDB的扩展和新特性
  • 第 3 章 初识MariaDB源代码
  • 第 4 章 MariaDB基础数据结构
  • 第 5 章 MariaDB线程池
  • 第 6 章 二进制日志binlog
  • 第 7 章 binlog group commit技术
  • 第 8 章 复制
  • 第 9 章 数据结构和算法
  • 第 10 章 分布式数据库
  • 附录 A 数据库与IO资源控制