Так случилось, что в определенный момент база 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.
На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.
Профессионально занимаюсь системным администрированием Linux -серверов и баз данных (MySQL, PostgreSQL) на протяжении последних 24 лет.