rpmdb 本身不提供 --verify 功能;rhel 8 及更早用 berkeley db,可用 db_verify 校验单个文件;rhel 9+ 改用 sqlite,应执行 sqlite3 /var/lib/rpm/packages "pragma integrity_check;" 验证完整性。

Linux 中没有 rpmdb --verify 这个命令,rpmdb 工具本身不提供“验证数据库索引一致性”的功能。RPM 数据库(/var/lib/rpm/)底层存储机制随系统版本演进已发生根本变化:RHEL/CentOS 6–8 使用 Berkeley DB(BDB),而 RHEL 9+ 及 Fedora 36+ 已全面切换为 SQLite。二者结构、校验方式和修复逻辑完全不同,不能混用同一套扫描逻辑。
先确认你用的是哪种 RPM 数据库后端
执行以下命令快速判断:
-
RHEL/CentOS 8 或更早:运行
rpm --version,若输出含4.11或更低(如4.11.3),且ls /var/lib/rpm/__db*存在文件,则为 Berkeley DB; -
RHEL 9+、Fedora 36+:运行
file /var/lib/rpm/Packages,若显示SQLite 3.x database,即为 SQLite 后端; - 也可直接查 rpmdb 实现:
rpm -E '%_rpmdb_backend'—— 输出berkeleydb或sqlite。
对 Berkeley DB 后端:用 db_verify 手动校验(仅限 BDB)
db_verify 是 Berkeley DB 自带的校验工具(来自 libdb-utils 包),不是 RPM 命令,也不能直接作用于 /var/lib/rpm/ 下的多个文件。它只能逐个校验单个 BDB 文件(如 Packages、Name 等):
- 安装依赖:
yum install libdb-utils(RHEL 8)或dnf install libdb-utils(RHEL 9 前期兼容模式); - 停止所有 rpm/yum/dnf 进程(避免锁冲突);
- 依次校验关键表:
db_verify /var/lib/rpm/Packages、db_verify /var/lib/rpm/Name、db_verify /var/lib/rpm/Group; - 若某文件报错(如
unexpected file type or format),说明该 BDB 文件已损坏,需重建 rpmdb(见下节)。
对 SQLite 后端:用 sqlite3 内置 integrity_check
RHEL 9+ 的 rpmdb 是标准 SQLite 数据库(单文件 /var/lib/rpm/Packages),可直接用 sqlite3 检查完整性:
- 确保
sqlite3已安装:dnf install sqlite3; - 执行完整校验:
sqlite3 /var/lib/rpm/Packages "PRAGMA integrity_check;"; - 正常返回
ok;若返回错误(如database disk image is malformed),说明数据库文件已损坏; - 注意:SQLite 不支持在线校验,必须保证无 rpm 进程正在访问该数据库(建议在 rescue 模式或停用 dnf 后操作)。
发现损坏后如何安全重建 rpmdb
无论 BDB 还是 SQLite,一旦确认损坏,**不要尝试手动编辑或修复**。应使用 rpm 自带的重建机制:
-
Berkeley DB(RHEL 8 及更早):
rm -f /var/lib/rpm/__db*; rpm --initdb,再从备份恢复(如有)或重新构建:rpm --rebuilddb; -
SQLite(RHEL 9+):
rm -f /var/lib/rpm/Packages; rpm --initdb,然后rpm --rebuilddb—— 此命令会从磁盘已安装文件反向重建数据库,耗时较长但可靠; - 重建前务必备份:
cp -a /var/lib/rpm /var/lib/rpm.backup.$(date +%s); - 重建后验证:
rpm -qa | head -20和rpm -V basesystem测试基本功能是否恢复。











