Por que o índice yum é corrompido?

10

Ocasionalmente, o cache do yum é corrompido e vemos erros como este:

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

A solução alternativa é rm -f /var/lib/rpm/__db* e, em seguida, o próximo comando "yum" regenera os dados.

Minha pergunta é: o que pode estar causando isso? Existe alguma tarefa comum que ignora bloqueios ou tem outro problema que causa isso?

Temos centenas de máquinas CentOS e não há um padrão para o qual veja esse problema. Pode ser uma questão "um em um milhão", que em grande escala é vista com frequência.

OBSERVAÇÃO: percebo que essa é uma pergunta muito "aberta", mas se uma resposta encontrar a causa, voltarei e transformarei a pergunta em algo mais canônico que esteja diretamente relacionado à questão específica.

    
por TomOnTime 30.07.2014 / 18:36

1 resposta

6

No caso geral, isso acontece quando o rpm (ou yum) falha ao atualizar o rpmdb, que é um armazenamento de valor de chave do Berkeley DB, e é muito sensível. Quando tal falha acontece, o rpmdb é deixado em um estado inconsistente e esse erro ocorre. Todos os outros arquivos em /var/lib/rpm contêm as mesmas informações, embora em um formato menos eficiente, para que o banco de dados seja facilmente reconstruído.

Dois erros notáveis que você pode ter visto em sistemas CentOS mais antigos podem causar isso. O grande , uma "corrida desagradável e sutil em write-back de página mmap'ed compartilhado" como aparece em o changelog, foi corrigido tranquilamente em uma atualização do kernel em 2007 . Este apresentou-se um pouco diferente do que o seu relatório.

A que você pode ver a partir de 2009 aconteceu quando o PackageKit matar o yum em um momento inoportuno, e também foi corrigido . Isso provavelmente afetaria sistemas de desktop ou servidores com uma GUI.

Todos esses erros são anteriores a EL 6, e você quase nunca deve ver isso ocorrer no EL 6 ou 7, nem deve ser visto se os seus sistemas EL 5 estiverem atualizados. (Eu não tenho idéia sobre EL 4. Se você tiver um, mate-o antes que ele se espalhe.) Dito isso, qualquer coisa que cause a morte do yum ou rpm enquanto estiver trabalhando com o rpmdb poderia causar isso. Isso inclui o que você provavelmente verá nos dias de hoje, raios cósmicos aleatórios que lançam bits, ou alguém que está recebendo excesso de zelo com kill -9 .

No RHEL 7, o yum intercepta mais sinais durante a execução real da transação e você verá a mensagem (shutdown inhibited) . Isso deve ajudar a evitar a maioria das situações em que alguém ou algo interrompe a transação e causa esse problema.

    
por 30.07.2014 / 21:10