Как перестроить поломанную базу RPM

Так случилось, что в определенный момент база RPM на одном из серверов повредилась, нельзя было удалить или установить пакеты с помощью пакетного менеджера yum, постоянно сыпались ошибки.

Как исправить базу RPM читайте ниже…

Исходные данные: ОС Oracle Linux 7;
Задач: Исправить ошибки в базе RPM

При попытке вызвать yum repolist как и любую другую команду получаем ошибку:

error: rpmdb: BDB0060 PANIC: fatal region error detected; run recovery
error: db5 error(-30973) from db->close: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
error: rpmdb: BDB1581 File handles still open at environment close
error: rpmdb: BDB1582 Open file handle: /var/lib/rpm/__db.001
error: rpmdb: BDB1582 Open file handle: /var/lib/rpm/__db.002
error: rpmdb: BDB1582 Open file handle: /var/lib/rpm/__db.003
error: rpmdb: BDB1582 Open file handle: /var/lib/rpm/Packages
error: rpmdb: BDB0060 PANIC: fatal region error detected; run recovery
error: db5 error(-30973) from dbenv->close: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery

Очевидно, что база RPM была повреждена и ее нужно восстановить.

1. Делаем копию базы на случай не успешной операции восстановления

tar -zcvf /root/rpmdb-$(date +"%d%m%Y").tar.gz  /var/lib/rpm

2. Удаляем все файлы вида __db.XXX

rm -f /var/lib/rpm/__db*

3. Попробуем проверить базу

/usr/lib/rpm/rpmdb_verify /var/lib/rpm/Packages

В ответ получаем ошибку:

rpmdb_verify: BDB0058 page 701: illegal page type or format
rpmdb_verify: BDB0061 PANIC: Invalid argument
rpmdb_verify: BDB3016 /var/lib/rpm/Packages: pgin failed for page 701
rpmdb_verify: BDB0060 PANIC: fatal region error detected; run recovery
rpmdb_verify: BDB0060 PANIC: fatal region error detected; run recovery
rpmdb_verify: BDB0060 PANIC: fatal region error detected; run recovery
rpmdb_verify: BDB0060 PANIC: fatal region error detected; run recovery
rpmdb_verify: /var/lib/rpm/Packages: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
BDB5105 Verification of /var/lib/rpm/Packages failed.
rpmdb_verify: BDB0060 PANIC: fatal region error detected; run recovery
rpmdb_verify: dbenv->close: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery

4. Попробуем выгрузить старую базу в новый файл (dump -> load):

cd /var/lib/rpm
mv Packages Packages.bak
/usr/lib/rpm/rpmdb_dump Packages.bak | /usr/lib/rpm/rpmdb_load Packages

Увы, но результат тот же — ошибка

rpmdb_dump: BDB0058 page 701: illegal page type or format
rpmdb_dump: BDB0061 PANIC: Invalid argument
rpmdb_dump: BDB3016 Packages.back: pgin failed for page 701
rpmdb_dump: BDB0060 PANIC: fatal region error detected; run recovery
rpmdb_dump: BDB5117 close: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
rpmdb_dump: BDB1581 File handles still open at environment close
rpmdb_dump: BDB1582 Open file handle: Packages.back
rpmdb_dump: BDB0060 PANIC: fatal region error detected; run recovery
rpmdb_dump: dbenv->close: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery

Если бы ошибки не было и операция dump -> load выполнилась успешно, то нужно было бы запустить rpmdb_verify для проверки корректности базы, например так:

/usr/lib/rpm/rpmdb_verify Packages

, а далее проверить результат работы команды

rpm -qa >/dev/null

если не будет ошибок, то база успешно отремонтирована, но у нас ошибка при операции dump -> load, поэтому попробуем пересоздать базу RPM.

5. Пересоздаем базу RPM

rpm -vv --rebuilddb

Результат работы с флагом —rebuilddb довольно большой, я приведу только начало вывода и конец:

D: rebuilding database /var/lib/rpm into /var/lib/rpmrebuilddb.1469
D: opening  db environment /var/lib/rpm private:0x401
D: opening  db index       /var/lib/rpm/Packages 0x400 mode=0x0
D: locked   db index       /var/lib/rpm/Packages
D: opening  db environment /var/lib/rpmrebuilddb.1469 private:0x401
D: opening  db index       /var/lib/rpmrebuilddb.1469/Packages (none) mode=0x42
D: opening  db index       /var/lib/rpmrebuilddb.1469/Packages 0x1 mode=0x42
D: disabling fsync on database
D:  read h#     257 Header SHA1 digest: OK (e0c8c938934d01c2bac3ea65b04b62169d7f6a22)
D: opening  db index       /var/lib/rpmrebuilddb.1469/Name (none) mode=0x42
D: opening  db index       /var/lib/rpmrebuilddb.1469/Name 0x1 mode=0x42
D: adding "python-gudev" to Name index.
.....
.....
.....
D: adding "85caae92e4be68ff7484ccc30c84757275434860" to Sha1header index.
D: closed   db index       /var/lib/rpm/Packages
D: closed   db environment /var/lib/rpm
D: closed   db index       /var/lib/rpmrebuilddb.1469/Sha1header
D: closed   db index       /var/lib/rpmrebuilddb.1469/Sigmd5
D: closed   db index       /var/lib/rpmrebuilddb.1469/Installtid
D: closed   db index       /var/lib/rpmrebuilddb.1469/Dirnames
D: closed   db index       /var/lib/rpmrebuilddb.1469/Triggername
D: closed   db index       /var/lib/rpmrebuilddb.1469/Obsoletename
D: closed   db index       /var/lib/rpmrebuilddb.1469/Conflictname
D: closed   db index       /var/lib/rpmrebuilddb.1469/Providename
D: closed   db index       /var/lib/rpmrebuilddb.1469/Requirename
D: closed   db index       /var/lib/rpmrebuilddb.1469/Group
D: closed   db index       /var/lib/rpmrebuilddb.1469/Basenames
D: closed   db index       /var/lib/rpmrebuilddb.1469/Name
D: closed   db index       /var/lib/rpmrebuilddb.1469/Packages
D: closed   db environment /var/lib/rpmrebuilddb.1469

Теперь проверим базу:

/usr/lib/rpm/rpmdb_verify /var/lib/rpm/Packages

Результат успешный:

BDB5105 Verification of /var/lib/rpm/Packages succeeded.

Попробуем получить список пакетов:

rpm -qa

Все успешно, ошибок нет.

В будущем для проверки и ремонта базы RPM можно использовать утилиту dcrpm.

На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.


Оставить комментарий

avatar
1000

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

  Подписаться  
Уведомление о