如何从MySQL迁移到MariaDB?

日期: 2013-09-29 作者:lonelicloud 来源:TechTarget中国 英文

MySQL是世界上最流行的开源关系数据库。2008 年,Sun 收购 MySQL。然后 2010 年,甲骨文又收购了 Sun,于是 MySQL 落入了甲骨文(Oracle)手中。Oracle 与开源社区关系的一直不太好,甚至 MySQL 也被弄成了社区版和企业版,不能免费商业使用;MySQL 企业版的新功能不公开源代码,这样让用户很不爽。MariaDB 则没有这方面的问题。与 MySQL 相比,MariaDB 的优势在于:

  • 可免费商业使用(MySQL 则有社区版和企业版之分,拜 Oracle 所赐)
  • Maria 存储引擎
  • PBXT 存储引擎
  • XtraDB 存储引擎
  • FederatedX 存储引擎
  • 更快的复制查询处理
  • 线程池
  • 运行速度更快
  • 更多的扩展功能模块
  • 支持 Unicode 排序

于是我决定先在虚拟机上看看如何由 MySQL 迁移到 MariaDB,虽然难以预料的是,不知道 Michael Widenius 会不会在什么时候又将 MariaDB 卖给哪家大公司。

原来 MariaDB 的设计初衷之一就是完全兼容 MySQL,包括 API 和客户端协议,使之能轻松成为 MySQL 的代替品,所以由 MySQL 迁移到 MariaDB 基本上可以称之为“升级”,就好像软件升级版本一样。MariaDB 的技术文档上是这样写的:

  • 如果是相同的基础版本(如 5.5),可以直接卸载 MySQL 然后安装 MariaDB,这样就可以用了。甚至不需要备份然后还原数据库。当然,保险起见,升级前将所有的数据库都备份一下还是非常有必要的,以防万一。
  • 如果 MariaDB 的主版本高,在经过上面的卸载 MySQL 再安装 MariaDB 操作之后,需要使用 mysql_upgrade 升级一下。是的,甚至连命令行都与使用 MySQL 的时候一样。
  • 所有原先的客户端和连接器(PHP、Perl、Python、Java 等)都不需要做任何改变就能正常工作,因为 MariaDB 与 MySQL 使用的是相同的客户端协议,并且客户端库文件也是二进制兼容的。

2. 迁移操作记录(下面的 3 的方法更好)

这个 VPS 安装的是 CentOS,目前版本是 6.4,MySQL 版本是 5.5.31(使用了 remi 源),虚拟机的配置与此极度相似。刚开始不太了解,执行了这个比较傻的操作方式。参考 MariaDB 官方文档:How can I upgrade from MySQL to MariaDB?

0. 先备份数据库

数据库包含了自己的几乎所有重要内容,不管进行的操作是否有风险,先备份总是很必要的。

可以通过 phpMyAdmin 导出数据库。

也可以直接在系统里将所有数据库文件备份一份:

cp -R /var/lib/mysql /var/lib/mysql.bak

A. 先配置 MARIADB 的安装源。

MariaDB 官方提供了一个自动生成安装源配置文件的工具:https://downloads.mariadb.org/mariadb/repositories/。依次选择 Linux 发行版(Distro)、版本(Release),然后选择 MariaDB 版本号(目前只有 10.0 和 5.5)即可。(注意,MariaDB 10 是开发版本。)

MariaDB YUM 安装源的位置:http://yum.mariadb.org/。打开后看到的是 MariaDB 版本列表,按照需要的版本号点击进入下一层文件夹。

然后根据自己的 Linux 发行版,如 CentOS、Fedora、rhel(Red Hat Enterprise Linux)以及系统架构如 x86(表示 32 位操作系统) 或 amd64(表示 64 位操作系统)选择对应的文件夹。

例如,目前 MariaDB 的主版本是 5.5,我的 CentOS 是第 6 版(6.4)、 32 位的,就选择文件夹 centos6-x86/ 。现在浏览器中的地址显示为 http://yum.mariadb.org/5.5/centos6-x86/,这就是下面配置文件中的 baseurl。

对于本例,将下面的安装源配置保存为 MariaDB.repo,上传到服务器的 /etc/yum.repos.d文件夹:

[mariadb]

name = MariaDB

enable=1

priority=3

baseurl = http://yum.mariadb.org/5.5/centos6-x86

gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck=1

其中 priority=3 是针对 YUM 的 PRIORITIES 优先级插件的。

B. 卸载原来的 MYSQL 及相关包。

# yum remove mysql*

上面用 * 来匹配删除所有 mysql 数据包(包括因包依赖而删除的别的包,如 postfix)。因为直接安装的时候会出现冲突,例如:

file /usr/share/mysql/ukrainian/errmsg.sys from install of MariaDB-server-5.5.31-1.i686 conflicts with file from package mysql-libs-5.5.32-1.el6.remi.i686

嗯,好像因为将 php-mysql 也给删除了(实际上这个不该删除的),所以 phpMyAdmin 也因为依赖关系而被删除了,我没仔细看。

所以最好不要用通配符 *,而是选择性删除几个主要的,

# yum remove mysql mysql-server mysql-libs

但是这个我没有再测试,因为后面有更好的方法。

C. 然后安装 MARIADB 及相应 PHP 扩展。

也是指定几个主要的安装包,剩下的让 yum 自己进行依赖关系检查。

# yum install MariaDB-server MariaDB-client php-mysql

或者不安装 MariaDB-server 而改为具有同步多主群集特性(synchronous multi-master cluster)的 MariaDB Galera Cluster:

# yum install MariaDB-Galera-server MariaDB-client galera

这里比较搞笑的是,没注意前面把 php-mysql 给卸载了,结果运行数据库之后访问 WordPress,结果遭遇下面的错误:

Your PHP installation appears to be missing the MySQL extension which is required by WordPress.

D. 完成,修补

不管版本是否升级了,执行一下数据库升级指令总没有坏处:

# mysql_upgrade -p

看看数据库版本是不是升级了:

# mysql -u root -p -e ‘show global variables like “version”;’

Enter password:

+—————+—————-+

| Variable_name | Value |

+—————+—————-+

| version | 5.5.31-MariaDB |

+—————+—————-+

将 MariaDB 加入随系统自启动列表,

# chkconfig –levels 345 mysql on

嗯,以前 MySQL 的时候是 mysqld,现在是 mysql,就差了一个字母 d。

启动它,

# service mysql start

这个时候服务器上的网站应该已经可以正常工作了,访问数据库没有问题。

如果有必要,安装完 MariaDB 之后可以重新安装 postfix。如果发现 phpMyAdmin 提示无访问权限了,那就是被卸载了,需要重新安装和配置 phpMyAdmin。phpMyAdmin 之所以也会被删除,是因为之前安装的是针对 MySQL 的,不兼容 MariaDB,所以需要重新安装。

E. 配置文件

因为之前进行了卸载操作,所以原来的 phpMyAdmin 的配置文件都被清除了,需要重新配置。

而对于 MySQL 的配置文件 /etc/my.cnf,因为 MariaDB 虽然创建了一个 my.cnf.d 文件夹来存储自己的配置文件,但是它会首先加载 my.cnf,且原来 MySQL 的配置对 MariaDB 而言还是有效的。

但是也有些例外:

MariaDB 默认使用 Aria 存储引擎存储内部临时文件,而不是 MySQL 默认使用的 MyISAM。如果你有很多临时文件,最好增加参数 aria-pagecache-buffer-size 并设置为与key-buffer-size 相同的数值。

如果没有使用 MyISAM,则可以将 key-buffer-size 设置为一个极小的值,如 64K。

3. 较好的升级方法¶

2013.09.30

这个方法不行了,具体不知道为什么,还是按照上面的方法一步步来吧。

还是在上面介绍的系统配置下,先添加 MariaDB 安装源,然后直接执行系统升级,

# yum update –skip-broken

MariaDB 相关安装包会被安装,不需要的 MySQL 包将被卸载,并且升级之后不需要对系统进行修补了。看看输出的前面一部分:

==============================================================================================================

Package Arch Version Repository Size

==============================================================================================================

Installing:

MariaDB-Galera-server i686 5.5.29-1 mariadb 19 M

replacing mysql.i686 5.5.21-1.el6.remi

replacing mysql-server.i686 5.5.21-1.el6.remi

MariaDB-server i686 5.5.31-1 mariadb 32 M

replacing mysql-server.i686 5.5.21-1.el6.remi

MariaDB-shared i686 5.5.31-1 mariadb 1.0 M

replacing mysql-libs.i686 5.5.21-1.el6.remi

kernel i686 2.6.32-358.11.1.el6 updates 24 M

libjpeg-turbo i686 1.2.1-1.el6 base 176 k

replacing libjpeg.i686 6b-46.el6

Updating:

………

到这里才感觉到 MariaDB 的设计思想那个无缝替代 MySQL 不是噱头,而是实实在在的技术。于是我也就不急着给 VPS 升级到 MariaDB 了,反正过不了多久 CentOS 就会采用 MariaDB,到时候再自然而然地迁移吧。

 

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐