日常Web运维

说说在MySQL5.7迁到MariaDB10.2时栽的一部分坑

在老早之前,就听说了MySQL在被甲骨文收了之后就不怎么安分了,于是有了性能相对好点的MariaDB。除了两者接口基本兼容之外,另外他们的数据格式其实有相通的地方。所以,这才让迁移成为了可能。

迁移方法

在迁移之前,需要注意一下,版本一定要对应好。

  • MySQL 5.6 需要安装 MariaDB 10.0+来迁移
  • MySQL 5.7 需要安装 MariaDB 10.2+来迁移
  • MySQL 8.0+的乖乖用mysqldump导出吧

导入软件源

毕竟ubuntu 18.04自己的源里面的MariaDB的版本只到10.1,所以要装MariaDB 10.2的话,需要自己导入源。

注:Debian 9自带源中,MySQL是MariaDB的一个别名,所以不需要迁移了。

在自己的终端中输入:

$ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
$ sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/10.2/ubuntu bionic main'
$ sudo apt update

如果使用的是Ubuntu 16.04,需要把其中的bionic改为xenial

改装MariaDB

这里其实很简单,安装MariaDB即可覆盖MySQL:

$ sudo apt install mariadb-server mariadb-client

随后进行一下数据库升级:

$ mysql_upgrade -u root -p

各种奇怪的锅

其实这个MariaDB,有很多很多奇奇怪怪的地方,包括但不限于以下的,需要接一下锅。

  • 提供了一套sys-V的启动方法,只是是使用mysqladmin关服的
  • 默认的root用户是使用unix-socket来认证的
  • 回送systemd的方式会被ubuntu系统的apparmor拦截的

无法使用mysqladmin shutdown直接关服

这种情况,多出现在从MySQL直接迁移到MariaDB的情况。默认的MariaDB是使用unix-socket来认证的,所以在root用户情况下是不需要密码即可完成的,而在别的用户上,是无论如何都登不上去的。

root无法执行mysqladmin

这时候需要给root修改认证插件为unix-socket,使得可以在不加-p的时候直接运行。

update mysql.user set plugin = "unix_socket" where user = "root";
flush privileges;

认证时提示Plugin 'unix_socket' is not loaded

这时候给/etc/mysql/mariadb.conf.d/50-server.cnf[mysqld]加上这样一句话:

[mysqld]
# ...
plugin-load-add = auth_socket.so

之后来一个restart一下即可。

使用systemctl启停卡住,超时后返回Job for mariadb.service failed because a timeout was exceeded.

在这个源提供的启动脚本,包括了SysV的和systemd的,而不像官方源的一样,mysql.service只是mariadb.service的一个别名。同时,与apparmor的不适应,使得无法将启动完成的参数传回systemd。这时候可能需要一些爆改。

禁用SysV的启动脚本

$ sudo /lib/systemd/systemd-sysv-install disable mysql

禁用apparmor对MariaDB服务的限制

/etc/apparmor.d/usr.sbin.mysqld里面加入以下内容:

/usr/sbin/mysqld {
}

然后再运行:

$ sudo aa-disable /usr/sbin/mysqld
$ sudo reboot

如果提示命令不存在,需要安装包apparmor-utils

一个有关“说说在MySQL5.7迁到MariaDB10.2时栽的一部分坑”的想法

发表评论

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