Как перестроить поломанную базу 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.

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


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

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

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x