Назад | Перейти на главную страницу

Почему поврежден индекс yum?

Иногда кеш yum повреждается, и мы видим такие ошибки:

error: db3 error(-30974) from dbenv->failchk: DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db3 -  (-30974)
error: cannot open Packages database in /var/lib/rpm

Обходной путь rm -f /var/lib/rpm/__db* а затем следующая команда «yum» регенерирует данные.

Мой вопрос: что может быть причиной этого? Есть ли какая-то общая задача, которая игнорирует блокировки или имеет другую проблему, которая вызывает это?

У нас есть сотни машин CentOS, и нет никакой модели, которая бы видела эту проблему. Это может быть проблема «один на миллион», что часто встречается в больших масштабах.

ПРИМЕЧАНИЕ. Я понимаю, что это очень «открытый» вопрос, но если ответ найдет причину, я вернусь и превращу вопрос в нечто более каноническое, что напрямую связано с конкретной проблемой.

В общем случае это происходит, когда rpm (или yum) дает сбой при обновлении rpmdb, который является хранилищем ключей и значений Berkeley DB и очень чувствителен. Когда происходит такой сбой, rpmdb остается в несогласованном состоянии, и возникает эта ошибка. Все остальные файлы в /var/lib/rpm содержат ту же информацию, но в менее эффективном формате, поэтому базу данных легко восстановить.

Это могут быть две заметные ошибки, которые вы, возможно, видели в старых системах CentOS. Большая, "неприятная и тонкая гонка в общей обратной записи страниц с mmap", как это указано в журнале изменений, была тихо исправлено в обновлении ядра в 2007 году. Вот этот представил себя немного иначе чем ваш отчет.

В один, который вы можете увидеть с 2009 года произошло, когда PackageKit убил yum в неподходящее время, и был также исправлен. Однако это, скорее всего, повлияет на настольные системы или серверы с графическим интерфейсом.

Все эти ошибки предшествуют EL 6, и вам следует почти никогда не увидите этого на EL 6 или 7, и вы не должны этого видеть, если ваши системы EL 5 обновлены. (Я понятия не имею о EL 4. Если он у вас есть, убейте его до того, как он распространится.) Тем не менее, что-нибудь из-за чего yum или rpm умирают, а работа с rpmdb может вызвать это. Это включает в себя то, что вы, скорее всего, увидите в наши дни, случайные космические лучи, переворачивающие биты, или кого-то, кто переусердствует с kill -9.

В RHEL 7 yum перехватывает больше сигналов во время фактического выполнения транзакции, и вы увидите сообщение (shutdown inhibited). Это должно помочь предотвратить большинство ситуаций, в которых кто-то или что-то прерывает транзакцию и вызывает эту проблему.