Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

RPM database를 rebuild하는 방법

Solution Unverified - Updated -

Environment

  • Red Hat Enterprise Linux 6
  • Red Hat Enterprise Linux 5
  • Red Hat Enterprise Linux 4
  • Red Hat Enterprise Linux 3
  • rpm

Issue

  • RPM database를 rebuild하는 방법을 알고 싶습니다.
  • rpm명령을 실행시 segfault가 발생합니다.
  • rpm -q명령을 실행할때 일부 패키지에서 아래와 같은 error가 나타납니다.
    rpmdb: /var/lib/rpm/Packages: unexpected file type or format
    error: cannot open Packages index using db3 - Invalid argument (22)
  • rpm명령이 아래와 같은 error가 나타나면서 중단됩니다.
    rpmdb: unable to join the environment
    error: db3 error(11) from dbenv->open: Resource temporarily unavailable
    error: cannot open Packages index using db3 - Resource temporarily unavailable(11)
    error: cannot open Packages database in /var/lib/rpm
  • rpm이거나 yum명령이 "rpmdb: Lock table is out of available locker entries"라는 정보가 나타납니다.
    $ rpm -qa
    ...
    rpmdb: Lock table is out of available locker entries
    error: db4 error(22) from db->close: Invalid argument

Resolution

아래의 순서에 따라 동작 해주시길 바랍니다.
1./var/spool/up2date아래의 모든 파일들을 삭제해야 합니다.

     #cd /var/spool/up2date
     #rm *
     #rm .*

2.system을 runlevel 1로 변경하여 RPM database가 손상되는것을 방지합니다.

주의사항: '/var/lib/rpm/_db*'을 삭제하기전에 다른 process가 RPM database를 접근하지 않게 하여야 합니다. RPM database를 접근하는 process를 check하기가 어렵기 때문에 single user mode에서 실행하는것이 편할 것입니다.

system을 single user mode로 기동시킨다음 stale lock가 있는지 확인해야 합니다.

     #init 1
     $lsof /var/lib/rpm | grep librpm
     $ps aux | egrep -e rpm -e yum -e up2date

확인후 "exit"로 single user mode에서 나오면 됩니다.

참조사항: single user mode에서 명령을 입력하시는것을 권장합니다. system이 single user mode에서 달릴때 모든 service가 정지될것입니다. 이 부분은 단지 권장사항이지 필수사항은 아닙니다.

1.rpm database를 repaire하기전에 backup을 해야 합니다.

     #cd /var/lib
     #tar zcvf /var/preserve/rpmdb-[today's date].tar.gz rpm

2.integrity를 확인합니다.

     #cd /var/lib/rpm
     #rm -f _db*        <=== stale locks를 피해야 합니다.
     #/usr/lib/rpm/rpmdb_verify Packages

3.계속하여 아래의 명령을 입력해주시길 바랍니다.

     #mv Packages Packages.orig
     #/usr/lib/rpm/rpmdb_dump Packages.orig | /usr/lib/rpm/rpmdb_load Packages
     #/usr/lib/rpm/rpmdb_verify Packages
     #rpm -qa

4.마지막으로 database를 rebuild하면 됩니다.

     #rpm -vv --rebuilddb

5.아래의 명령으로 RPM database의 유효성을 확인하면 됩니다.

     #cd /var/lib/rpm
     #/usr/lib/rpm/rpmdb_verify Packages

윗 방법으로 rpm database가 rebuild될것입니다. 만약 실패하였다면 backup로 복구하여야 하는데 복구한후 문제가 계속 존재할것입니다.
참조사항
- /var/log/rpmpkgs를 이용하여 rpm database를 restore하는 방법은 How to recover rpm database file /var/lib/rpm/Packages using /var/log/rpmpkgs (https://access.redhat.com/knowledge/node/23743)라는 문서를 참조해주시길 바랍니다.
- RPM database회복에 관하여 더 상세하게 알고 싶다면 아래의 사이트를 방문하시길 바랍니다. http://people.redhat.com/berrange/notes/rpmrecovery.html.

  • Component
  • rpm

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.