背景
一台 CentOS7.5 环境需要安装 xtrabackup,但安装时遇到依赖问题,本文讲解如何优雅地解决依赖问题。
现象如下:
#下载xtrabackup rpm安装包
[root@192-168-199-131 ~]# wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.26/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm
#安装时发现缺少依赖
[root@192-168-199-131 ~]# rpm -ivh percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm
warning: percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 8507efa5: NOKEY
error: Failed dependencies:
libev.so.4()(64bit) is needed by percona-xtrabackup-24-2.4.26-1.el7.x86_64
perl(DBD::mysql) is needed by percona-xtrabackup-24-2.4.26-1.el7.x86_64
perl(Digest::MD5) is needed by percona-xtrabackup-24-2.4.26-1.el7.x86_64
rsync is needed by percona-xtrabackup-24-2.4.26-1.el7.x86_64
错误做法1——百度
网上不可能有所有软件安装包的依赖解决方法,而且版本不一样,依赖项的解决可能也不一样,百度只会浪费时间。
错误做法2——一个一个解决依赖
在 6 年前,我会使用yum search
命令一个一个找到依赖包来解决,例如:
yum search perl |grep -i DBD |grep -i mysql
#此时可以找到可用的依赖包 perl-DBD-MySQL.x86_64
yum install perl-DBD-MySQL.x86_64
使用上述办法,把所有的四个依赖包名称都找出来,如图
然后,yum install 就可以解决了。
yum install libev.x86_64 perl-DBD-MySQL.x86_64 perl-Digest-MD5.x86_64 rsync.x86_64 -y
...(安装过程略)
[root@192-168-199-131 ~]# rpm -ivh percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm
warning: percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 8507efa5: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:percona-xtrabackup-24-2.4.26-1.el################################# [100%]
这是一个方法,但不优雅。
正确做法——直接yum install/localinstall这个rpm包
因为 yum install rpm 包会自动到 yum 仓库尝试解决依赖问题,无需人为干预。
如果服务器可以联网,则
#直接yum install远程rpm包地址
yum install https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.26/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm -y
如果服务器不能联网,但有内部 yum 源,则
# 用其他机器先下载rpm包,然后上传到服务器后,yum localinstall,本地安装。
yum localinstall percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm -y


扩展——新的问题:网络受限,需要离线安装
如果我的环境是内网环境,并且没有内部yum源怎么办?
方法一——搭建本地或内网yum源
本地搭建 yum 源 找台内网网络通的服务器搭建内网 yum 源
搭建本地/内网 yum 源需要 CentOS7.5 的 IOS 镜像,比较耗时耗力,我主要是介绍下面这种更通用的方法。
方法二——拷贝yum缓存
找一台可以 yum 的服务器,例如自己笔记本上起个 CentOS7.5 的 vmware 修改 yum 配置文件,使 yum 安装后保留 rpm 包
vi /etc/yum.conf
[main]
cachedir=/var/cache/yum
keepcache=1
#将 keepcache=0 修改为 keepcache=1
#保留的rpm安装包在 /var/cache/yum
执行 yum install https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.26/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm -y
安装 rpm 包。依赖默认 rpm 包保留在 var/cache/yum下,要安装的包默认在 var/tmp/yum-root-xxx 里,找出来并拷贝上传到需要安装的服务器上。
tar zcvf 7.tar.gz /var/cache/yum/x86_64/7
ll /var/tmp/yum-root-ouhT6O/percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm
需要安装的服务器里,把 7.tar.gz 解压到 var/cache/yum/x86_64/7,把 percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm 上传到 tmp,执行以下命令安装
cd /tmp
yum -C install percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm -y
-C 参数为强制走 yum 缓存安装。
方法三——最佳方法: 只下载依赖包
使用 yum install --downloadonly
下载包的依赖
笔记本的 vmware CentOS7.5 上执行以下
mkdir -p /tmp/xtrabackup
wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.26/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm
yum install --downloadonly \
--downloaddir=/tmp/xtrabackup/ \
percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm
tar zxvf /tmp/xtrabackup.tar.gz /tmp/xtrabackup
--downloadonly 只下载 --downloaddir 下载保存的目录

传输到要安装软件的服务器上后,执行以下,就可以成功解压安装软件了。
tar zxvf /tmp/xtrabackup.tar.gz -C /
cd /tmp/xtrabackup
yum localinstall *.rpm -y
---分割线---
同样的替代方案也可以选择用 yumdownloader,两者实际一样的。
只是 yum install --downloadonly
默认会把依赖包全下载下来,而 yumdownloader 默认不下载依赖包,他提供参数--resolve
来选择是否下载依赖包,例如 yumdownloader numactl
表示在 yum 源上下载 numactl 包 "numactl-2.0.12-5.el7.x86_64.rpm" 而不下载他的依赖包。
用法如下:
# 安装 yumdownloader
yum install yum-utils -y
yumdownloader --destdir=/tmp/xtrabackup --resolve percona-xtrabackup-24-2.4.26-1.el7.x86_64.rpm
--destdir 下载保存的目录 --resolve 解决依赖
结论
"方法三——最佳方法: 只下载依赖包" 是解决安装包依赖问题最优雅的方法,这也是我做 ansible playbook 实现软件离线部署时,常用的收集软件依赖包的办法。




