Перейти к основному содержанию

RPM — Thread died in Berkeley DB library

Oracle Linux

Свежий баг. Редкий, но встречается. У меня случился на Oracle Linux.

Симптомы только косвенные. Началась утечка CPU на виртуальной машине. Прошло несколько дней, гипервизор стал жаловаться на процессор:

cpu

Смотрю статистику использования CPU гипервизора и вижу такую картину:

cpu

Видно утечку, ищем виновника.

linux

Графики производительности помогают легко найти виртуальную машину с утечкой CPU. Заглянем ей в консоль.

cpu

Опа, процессоры сожраны запросами к RPM. Выполняю:

rpm -qa

Запрос зависает, Ctrl + C со скрежетом убиваем текущий процесс. Заново делаю тот же запрос, вот и виновник торжества:

ошибка: rpmdb: BDB0113 Thread/process 9817/139781811808320 failed: BDB1507 Thread died in Berkley DB library
ошибка: ошибка(5)  db_30973 из dbenv->failchk: BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery
ошибка: невозможно открыть индекс Packages используя db5 -  (-30973)

rpm

Быстрое решение проблемы

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

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

Немного терпения.

cpu

С облегчением.

cpu

Еще больше вариантов восстановления

http://wiki.rosalab.ru/ru/index.php/Если_упала_база_RPM

  1. rm -f /var/lib/rpm/__db.*
    /usr/lib/rpm/bin/rpmdbchk
    
  2. db52_recover -vh /var/lib/rpm
  3. perl -MURPM -e 'URPM::DB::convert("/", "btree", 1, 1)'
  4. rm -f /var/lib/rpm/__db*
    rpm -vv --rebuilddb
  5. urpmi.recover --list-safe
    # (найти стабильное состояние и откатить на нужное количество транзакций, обозначенных датами)
    urpmi.recover --transactions --rollback 3
    
  6. # копируем из /var/log последний здоровый rpmpkgs в удобное место.
    cp /var/log/rpmpkgs /home/username
    cp /var/lib/rpm/ /var/lib/rpm-stored
    # чистим
    rm -f /var/lib/rpm/__db*
    rm -f /var/lib/rpm/Packages
    rm -f /var/lib/rpm/log/log*
    # создаём БД
    rpm -vv --rebuilddb
    # проверим
    urpmi wget,urpmi
    # скачаем все пакеты
    cat /home/username/rpmpkgs | xargs urpmi --no-install
    # поставим
    cat /home/username/rpmpkgs | xargs urpmi --justdb
    # или
    cat /home/username/rpmpkgs | xargs rpm -i -v --nodeps --noscripts --notriggers --justdb --excludepath /

Теги

 

Похожие материалы

Zabbix — мониторинг процессов в Linux

Для мониторинга процессов Linux в Zabbix уже есть готовое решение. Никаких скриптов и пользовательских переменных писать не понадобится. Удобство в том, что Zabbix просто возвращает количество процессов с таким именем, можно пользоваться, если несколько процессов с одинаковым именем.

Теги