alternatives能用来管理多版本MySQL吗?
上一阵客户环境遇到了一个问题,MySQL
数据库升级8.0
启动成功后并未使用原数据目录,而是重新初始化了默认目录/usr/lib/mysql
并作为数据目录使用。
经过排查发现客户/etc/my.cnf
指向了/etc/alternatives/my.cnf
文件,里面是初始/etc/my.cnf
,并非后期优化调整过的参数文件,因此使用优化过的配置文件替换并重启成功。但也因此带给我一个疑惑,什么是alternatives
,alternatives
能用来管理多版本MySQL
吗?
什么是alternatives
alternatives的功能
alternatives
是存在于Linux系统内自带的一个二进制命令,不需要单独安装,用来在相同功能的软件或软件的不同版本之间进行切换控制。例如,对于python2.7
、python3.6
和python3.8
,可以通过alternatives
快捷实现版本的切换和管理;或者sh
、bash
和zsh
不同解释器做默认解释器之间的控制切换。在Ubuntu系统中名字是update-alternatives
。
底层是使用软链接替换特定名称的可执行程序,通过为该名称绑定不同的软链接对应文件来实现后台软件的替换。
以切换版本为例,alternatives
能够自动选择高版本程序作为默认程序,或者使用管理员指定的版本作为默认的程序。对于版本的选择存在两种模式:
- 自动模式
基于权重进行判断,高权重为默认版本,通常新安装的高版本都权重高,自动成为默认版本。 - 手动模式
管理员特殊指定一个版本为默认版本,即便后来装了更新的版本,默认版本依旧不变。
在使用之前,先来了解一下相关术语:
通用名称:一个名字,例如/usr/bin/editor
,通过alternatives
系统,指向具有该功能的众多文件中的一个。
符号链接:如果不做进一步限定,指的是在alternatives
目录中的一个符号链接,系统管理员应该对其进行调整。
alternatives目录:默认/etc/alternatives
,包含符号链接。
管理目录:默认/var/lib/alternatives
,包含alternatives
状态信息。
链接组:一个相关链接集合,会同时更新。
主链接:链接组中的某个链接,决定了组内其他链接的配置方式。
从链接:由主链接控制的链接组中的一个链接。
2. 如何使用alternatives
以centos7
为例,执行alternatives
命令可以看到它的常用参数:
[root@localhost ~]# alternatives
alternatives(备用)版本 1.7.6 - 版权 (C) 2001 红帽公司
在 GNU 公共许可条款下,本软件可被自由地重发行。
用法:alternatives --install <链接> <名称> <路径> <优先度>
[--initscript <服务>]
[--family <family>]
[--slave <链接> <名称> <路径>]*
alternatives --remove <名称> <路径>
alternatives --auto <名称>
alternatives --config <名称>
alternatives --display <名称>
alternatives --set <名称> <路径>
alternatives --list
common options: --verbose --test --help --usage --version --keep-missing
--altdir <目录> --admindir <目录>
通过--install
可以添加一个指定名称的链接组。--install
选项后的<名称>
是主链接的通用名称,<链接>
是它的符号链接名称,<路径>
是主链接的替换方案,<优先度>
是该路径在链接组中的权重。
同理--slave
后面的<链接>
<名称>
<路径>
也是类似含义,--slave
可以重复指定,每个后面都要包含此三个参数。
如果在alternatives系统记录中已存在指定的主符号链接,则所提供的信息将作为一组新的替代方案添加到该组中。否则,将添加一个新的组(设置为自动模式),并将其与此信息关联起来。如果该组处于自动模式,并且新添加的替代方案的优先级高于该组中已安装的任何其他替代方案,则符号链接将被更新,使其指向新添加的替代方案。
--initscript
后面的<服务>
指的是该替代方案所对应的任何关联初始化脚本的名称。如果指定--initscript
,该替代方案系统将通过 chkconfig 来管理与该替代方案相关的初始化脚本,根据哪个替代方案处于激活状态,来注册和注销该初始化脚本。
注意:--initscript
是红帽系特有的选项。
--family
功能用于对相似的选项进行分组。如果该组处于手动模式,且当前使用的选项被移除,那么其他选项将尝试将链接更改为具有相同<family>
且优先级最高的其他选项。
注意:--family
也是红帽系特有的选项。
--remove
用来删除一个alternative和它相关的全部从链接。--remove
选项后的<名称>
指的是alternatives目录里面的名称,<路径>
指的是<名称>
能被链接的一个相关文件名。如果<名称>
确实与<路径>
相关联,那么该<名称>
将会被更新,使其指向另一个合适的替代项;如果没有这样的替代项,则该<名称>
将被删除。相关从链接也会自动更新或删除。如果链接当前并未指向某个路径,那么就不会有任何链接发生改变;只会删除有关该替代路径的信息。
--set
将链接组<名称>
的符号链接和从属项设置为<路径>
,并将链接组设置为手动模式。
--config
向用户展示一个配置菜单,用于选择主链路以及链路组<名称>
的从属链路。一旦完成选择,该链路组将设置为手动模式。
--auto
切换链路组<名称>
为自动模式。主链路和从链路都会指向最高权重的替代方案。
--display
显示名称为<名称>
的主链接的链接组的相关信息。所显示的信息包括该组的模式(自动或手动)、当前符号链接所指向的备用选项、其他可用的备用选项(及其对应的从属选项)以及当前已安装的最高优先级的备用选项。
--list
显示全部链接组信息,第一列为名称,第二列为模式,第三列为当前主链接指向。
alternatives如何管理多版本MySQL
在工作中,我经常会遇到客户那边升级数据库时无法提供更多服务器,只能进行本地升级的情况,当然一般情况下可以停服务升级,但是也存在有些客户无法停服务升级,且只有一台服务器的情况,那么在一台服务器上如何管理两个不同版本的MySQL
呢?
安装MySQL
如果使用RPM
包的方式我们知道高版本会覆盖掉低版本,所以如果要同时安装两个不同版本的MySQL
,我们可以采用RPM+二进制包
或者二进制包+二进制包
的方式,此处为了方便后续管理,我采用二进制包+二进制包的方式进行安装。安装完毕后如下:
[root@localhost ~]# ps -ef|grep mysqld
root 108069 36005 0 15:16 pts/2 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe
mysql 109254 108069 1 15:16 pts/2 00:00:01 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql84 --datadir=/data/mysql84/data --plugin-dir=/usr/local/mysql84/lib/plugin --user=mysql --log-error=/data/mysql84/mysql-error.log --open-files-limit=65000 --pid-file=/data/mysql84/mysqld.pid --socket=/data/mysql84/mysql.sock --port=3307
root 110186 36005 1 15:17 pts/2 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe
mysql 111299 110186 40 15:17 pts/2 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql80 --datadir=/data/mysql80/data --plugin-dir=/usr/local/mysql80/lib/plugin --user=mysql --log-error=/data/mysql80/mysql-error.log --open-files-limit=65000 --pid-file=/data/mysql80/mysqld.pid --socket=/data/mysql80/mysql.sock --port=3306
root 111394 36005 0 15:17 pts/2 00:00:00 grep --color=auto mysqld
添加MySQL替代方案
我们使用/usr/local/mysql
作为MySQL
的默认安装目录,/etc/my.cnf
作为MySQL
的默认配置文件,通过调整对应的后端软链接系统文件来控制MySQL
的默认操作版本。
将MySQL8.4
加入alternatives
管理:
alternatives --install /usr/local/mysql mysql /usr/local/mysql84 100 --family mysql --slave /etc/my.cnf mycnf /etc/my84.cnf
将MySQL8.0
加入alternatives
管理:
alternatives --install /usr/local/mysql mysql /usr/local/mysql80 80 --family mysql --slave /etc/my.cnf mycnf /etc/my80.cnf
查看当前MySQL命令默认版本:
[root@localhost ~]# mysql -V
mysql Ver 8.4.4 for Linux on x86_64 (MySQL Community Server - GPL)
查看当前alternatives
方案:
[root@localhost ~]# alternatives --list
libnssckbi.so.x86_64 auto /usr/lib64/pkcs11/p11-kit-trust.so
ld auto /usr/bin/ld.bfd
mta auto /usr/sbin/sendmail.postfix
mysql auto /usr/local/mysql84
[root@localhost ~]# alternatives --display mysql
mysql - 状态为自动。
链接当前指向 /usr/local/mysql84
/usr/local/mysql84 - family mysql priority 100
从 mycnf:/etc/my84.cnf
/usr/local/mysql80 - family mysql priority 80
从 mycnf:/etc/my80.cnf
当前“最佳”版本是 /usr/local/mysql84。
可以看到当前是自动模式,选择了权重最高的8.4版本,我们可以手动设置为8.0,命令如下:
[root@localhost ~]# alternatives --config mysql
共有 2 个提供“mysql”的程序。
选项 命令
-----------------------------------------------
*+ 1 mysql (/usr/local/mysql84)
2 mysql (/usr/local/mysql80)
按 Enter 保留当前选项[+],或者键入选项编号:2
[root@localhost ~]# alternatives --list
libnssckbi.so.x86_64 auto /usr/lib64/pkcs11/p11-kit-trust.so
ld auto /usr/bin/ld.bfd
mta auto /usr/sbin/sendmail.postfix
mysql manual /usr/local/mysql80
[root@localhost ~]# alternatives --display mysql
mysql - 状态为手工。
链接当前指向 /usr/local/mysql80
/usr/local/mysql84 - family mysql priority 100
从 mycnf:/etc/my84.cnf
/usr/local/mysql80 - family mysql priority 80
从 mycnf:/etc/my80.cnf
当前“最佳”版本是 /usr/local/mysql84。
[root@localhost ~]# mysql -V
mysql Ver 8.0.41 for Linux on x86_64 (MySQL Community Server - GPL)
可以看到当前是手工模式,选择了8.0版本。
将模式切换回自动,命令如下:
[root@localhost ~]# alternatives --auto mysql
[root@localhost ~]# alternatives --list
libnssckbi.so.x86_64 auto /usr/lib64/pkcs11/p11-kit-trust.so
ld auto /usr/bin/ld.bfd
mta auto /usr/sbin/sendmail.postfix
mysql auto /usr/local/mysql84
[root@localhost ~]# alternatives --display mysql
mysql - 状态为自动。
链接当前指向 /usr/local/mysql84
/usr/local/mysql84 - family mysql priority 100
从 mycnf:/etc/my84.cnf
/usr/local/mysql80 - family mysql priority 80
从 mycnf:/etc/my80.cnf
当前“最佳”版本是 /usr/local/mysql84。
这样在我们存在多版本命令的时候,使用不同版本命令时不需要添加完整路径,让我们使用起来更加方便。
总结
alternatives帮助我们在使用多版本命令时更简便,管理也更加简单,但是也需要注意在切换时,有些文件的依赖也需要一同切换,否则容易导致误操作了其他版本的情况。