我的情况很奇怪。我有一台安装了 CentOS 6.6 版(最终版)的 Web 服务器,其中安装了 nginx、mysql、ISPConfig 和 Webmin,运行正常。最近,我注意到在使用 phpMyAdmin 时弹出一条消息,提示有新版本的 phpMyAdmin。Webmin 没有报告任何可用更新,因此我运行时"yum update"
收到许多错误,例如:
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
Eg. $releasever is not a valid release or hasnt been released yet/
在尝试了一些配置并执行了 之后"yum clean all"
,重新启动服务器,我可以再次运行 yum,但现在 yum 数据库似乎已被删除或发生了其他事情。当我运行时,"yum list installed"
我什么也得不到!当我运行时,"yum update"
我得到"No Packages marked for Update"
。所有存储库都已启用。所有软件包都已安装,但现在 yum db 中没有任何内容。例如,当我运行时,"yum install phpMyAdmin"
我得到:
Installing:
phpMyAdmin noarch 4.3.7-1.el6.remi remi 4.5 M
Installing for dependencies:
MAKEDEV x86_64 3.24-6.el6 base 89 k
apr x86_64 1.3.9-5.el6_2 base 123 k
apr-util x86_64 1.3.9-3.el6_0.1 base 87 k
apr-util-ldap x86_64 1.3.9-3.el6_0.1 base 15 k
audit-libs x86_64 2.3.7-5.el6 base 71 k
basesystem noarch 10.0-4.el6 base 4.7 k
bash x86_64 4.1.2-29.el6 base 907 k
binutils x86_64 2.20.51.0.2-5.42.el6 base 2.8 M
......
Transaction Summary
===========================
Install 158 Package(s)
Total download size: 98 M
Installed size: 346 M
Is this ok [y/N]:
这意味着 yum 迄今为止安装的所有内容现在都已从 yum db 中删除,但仍然安装。
有没有办法恢复 yum 数据库或让 yum 检测服务器已安装哪些软件包?
答案1
我以前也遇到过类似的情况。我采取了以下措施:
- 列出文件系统上的所有文件。
- 下载我有文件的 yum 存储库的 SQLite DB。
- 创建一个脚本,查询哪个包提供每个文件的 SQLite DB,然后重新安装这些包。
这确实不是最快的解决方案。如果这不是一个关键系统,我会重建它。
答案2
问题似乎是 RPM 数据库被彻底破坏了。我所做的就是使用所有原始 RPM 来更新数据库,而没有安装任何东西。
您可以在文件中查找已安装软件包的列表/root/install.log
,或者/var/log/yum.log*
如果您安装了 yum log。如果您没有日志文件,则可以使用此 PHP 脚本从 yum 数据库目录结构中收集所有已安装的软件包yumdb_scan.php。
我希望我的所有 RPM 都缓存了,但我最终通过在 RPM 搜索网站上搜索找到了所有内容。我还创建了另一个脚本来下载我已安装的所有内容,这些内容都位于基础操作系统上存储库。然后我收集了所有的 RPM 包,验证了我拥有所有的包,并创建了另一个脚本,用于rpm -Uvh --nodeps --justdb {$pckg}
更新每个已安装包的 RPM db,而不改变任何系统文件。
一切都完成得很好,现在我终于可以使用 yum 安装新软件包并使用 repos 更新旧软件包了。
所以我的步骤是:
- 在系统中搜索已安装的 RPM 并创建一个列出所有 RPM 的文件。
- 收集系统上安装的所有 RPM,并匹配所有版本。
- 用于
rpm -Uvh --nodeps --justdb <package-path>
将 RPM 记录放入 RPM 数据库而不安装任何文件。