Иногда кеш 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)
. Это должно помочь предотвратить большинство ситуаций, в которых кто-то или что-то прерывает транзакцию и вызывает эту проблему.