#Что означает ошибка
error: rpmdb: BDB0113 Thread/process failed: BDB1507 Thread died in Berkeley DB library
Ошибки error: rpmdb: BDB0113 Thread/process ... failed, error: db5 error(-30973) и rpmdb: Program version mismatch означают, что база данных RPM (/var/lib/rpm) повреждена: сбой при установке, прерванное обновление, нехватка места, аварийное отключение. Без базы yum и rpm не работают.
Перед восстановлением сделайте копию каталога.
Дальше пересоберите индексы базы.
База установленных пакетов может повредиться при аварийном отключении или прерванной установке. Её можно перестроить командой rpm --rebuilddb.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Аварийное завершение | yum прервали. | rpm --rebuilddb. |
| Остались блокировки | Файлы __db. | Удалите. |
| Диск заполнен | Нет места. | Освободите. |
| Ошибки файловой системы | Диск. | fsck. |
#Пошаговое решение
- Остановите yum и rpmПеред восстановлением базы RPM в CentOS запустите
pgrep -a -f "rpm|yum|dnf|PackageKit"и убедитесь, что нет реальной установки или обновления. Если процессы идут, дождитесь их окончания; не убивайте менеджер пакетов во время транзакции. При подозрении на зависание сохраните журнал и согласуйте остановку с администратором сервера. После этого проверьте свободное место на разделе, где находится база RPM, и только затем делайте её резервную копию. - Сделайте копию /var/lib/rpmСначала узнайте реальный путь базы командой
rpm --eval "%{_dbpath}". Под правами root убедитесь, что пакетные менеджеры не работают и место на другом диске достаточно для копии. Сделайте архив реального каталога базы в отдельное безопасное хранилище или сохраните снимок виртуальной машины, проверьте его наличие. Путь базы в CentOS и новых RHEL-подобных системах не всегда одинаков. - Определите формат RPM-базы, не удаляя файлы наугадНа CentOS 7 и более новых RPM может использовать разные форматы баз данных; расположение и содержимое
/var/lib/rpmнельзя считать универсальными. Выполнитеrpm --version,rpm --eval "%{_dbpath}"иls -lahдля полученного реального каталога. Убедитесь, что пакетные менеджеры не запущены, а копия каталога сохранена. Не выполняйтеrm __db.*автоматически и не удаляйте Packages/SQLite: формат, причина блокировки и безопасный способ восстановления требуют проверки. - Выполните rpm --rebuilddbТолько при подтверждённом повреждении индекса RPM и после резервного копирования используйте восстановление, соответствующее именно вашей версии RPM и её формату базы (Berkeley DB или SQLite). В терминале администратора сначала выполните
rpm --eval "%{_dbpath}"и проверьте права и доступность каталога; затем по документации вашего выпуска можно применитьsudo rpm --rebuilddb. После выполнения проверьтеrpm -qa | head,sudo dnf checkлибоyum checkдля старого CentOS. Если база продолжает сообщать ошибки, восстановите копию или привлеките специалиста вместо повторных пересборок. - Очистите кэш и проверьте yum checkУточните, какому приложению принадлежит кэш; сначала сохраните рабочие данные. Используйте штатную команду очистки именно этого приложения или пакетного менеджера, а не удаляйте произвольные системные каталоги.
- Проверьте базу после восстановления без изменения пакетовВыполните
rpm -qa | head,rpm -q rpmи штатную диагностическую команду менеджера пакетов, соответствующего вашему выпуску. Если ошибка rpmdb сохраняется, не запускайте цепочкуdb_dump/db_loadиз старых инструкций: сначала восстановите проверенную копию базы или привлеките администратора с учётом используемого RPM/SQLite/BDB. - Не удаляйте __db* без определения версии RPM и формата базы (SQLite или Berkeley DB)Linux · Терминал (Bash)КомандаНе удаляйте __db* без определения версии RPM и формата базы (SQLite или Berkeley DB). Запуск: терминал Linux с правами, указанными в команде. Сначала проверьте имя устройства и целевой путь.
rpm -qa >/dev/null
#Резервная копия и снятие блокировок
Остановите установку пакетов только штатно; проверьте ps aux | grep -E "[r]pm|[y]um|[d]nf". Запишите результат rpm --version и rpm --eval "%{_dbpath}". После проверенной резервной копии реальной базы можно попробовать sudo rpm --rebuilddb, если хватает места на диске и нет аппаратных ошибок. Не удаляйте файлы __db.* без подтверждения применимости к вашему формату RPM; SQLite требует другого подхода.
#Перестроение
Выполните sudo rpm --rebuilddb. Затем очистите кэш: sudo yum clean all (на новых системах sudo dnf clean all). Проверьте работу: rpm -qa | wc -l и sudo yum check. Для CentOS 8+/Stream/Alma/Rocky база в формате sqlite или ndb: sudo rpm --rebuilddb работает так же. Если rpm -qa по-прежнему падает, проверьте целостность: db_verify /var/lib/rpm/Packages (пакет libdb-utils).
#Если не помогло
Если rpm --rebuilddb не помог, сохраните точный текст ошибки, rpm --version, rpm --eval "%{_dbpath}", список файлов базы и состояние диска. Не выполняйте старые инструкции с db_dump, db_load или переименованием Packages на неизвестной версии RPM: восстановление Berkeley DB и SQLite различается. При необходимости восстановите базу из проверенной копии или обратитесь к администратору.