Перевод заметки из базы знаний Red Hat: DOC-6904 (https://access.redhat.com/kb/docs/DOC-6904)

Иногда база данных RPM “залипает”. Одной из причин этой проблемы - убийство процесса, работающего с базой данных, что приводит к неверной информации о состоянии блокировки и ограничению доступа последующих процессов к базе данных. Так что, необходимо убедиться, что процесс действительно завис до того, как убить его - если процесс использует большое количество процессорного времени, то возможно, что он продолжает выполнять полезную работу. Информация о состоянии блокировки должна быть восстановлена вручную, чтобы устранить “зависание” и позволить rpm нормально функционировать.

“Убийство” процесса (иногда это происходит при пропадании электропитания, иногда происходит в случае падения стороннего программного обеспечения без очистки информации о состоянии блокировки при выходе, иногда из-за нетерпеливого администратора) может привести к небольшим повреждениям базы данных RPM ‘SleepyCat db’. В таком случае, необходимо удалить файлы, хранящие информацию о состоянии блокировки (эти файлы начинают с двух нижних подчеркиваний, например, “__db”). Так как эти файлы автоматически создаются заново при отсутствии, это достаточно безопасная операция.

Предупреждение: очень важно убедиться, что никакой запущенных процесс не обращается к базе данных RPM, перед тем, как удалять ‘/var/lib/rpm/__db’. Если такая проверка затруднена, удаление __db должно производиться в single user mode. В действительности, init-скрипты RHEL делают это автоматически, так перезагрузки обычно достаточно.

Далее с осторожностью проделайте следующее:

  1. Перед попыткой восстановления базы, СНАЧАЛА сделайте резерную копию.

    cd /var/lib

    tar zcvf /var/preserve/rpmdb-[today’s date].tar.gz rpm

  2. Проверьте целостность с помощью

    # cd /var/lib/rpm
    # rm -f __db*
    # /usr/lib/rpm/rpmdb_verify Packages
    
  3. Далее проделайте следующее:

    mv Packages Packages.orig

    # /usr/lib/rpm/rpmdb_dump Packages.orig | /usr/lib/rpm/rpmdb_load Packages
    # /usr/lib/rpm/rpmdb_verify Packages
    # rpm -qa
    
  4. И в итоге восстановите базу данных

    rpm -vv –rebuilddb

Дополнительная информация: Подробные заметки о восстановлении базы данных RPM можно найти здесь: http://people.redhat.com/berrange/notes/rpmrecovery.html