HDD 충돌 후 PostgreSQL 서버를 시작하면 FAILED STATE가 발생합니다


10

Fedora 15와 함께 사용 하고 PostgreSQL 9.1.4있습니다. Fedora는 최근에 충돌했습니다.

PostgreSQL 서버를 시작하려는 시도 :

service postgresql-9.1 start

준다

Starting postgresql-9.1 (via systemctl):  Job failed. See system logs and 'systemctl status' for details.
                                                       [FAILED]

, 비록 내가 시스템을 다시 부팅 한 후 처음으로 서버를 시작할 때 서버가 정상적으로 시작 .
그러나 사용하려고 psql하면이 오류가 발생합니다.

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/tmp/.s.PGSQL.5432"?

.s.PGSQL.5432파일이 시스템의 어느 곳에도 존재하지 않습니다. A는 locate .s.PGSQL.5432아무것도 출력하지 않습니다.


시스템 로그에는 다음이 있습니다.

Aug 14 17:31:58 localhost systemd[1]: postgresql-9.1.service: control process exited, code=exited status=1
Aug 14 17:31:58 localhost systemd[1]: Unit postgresql-9.1.service entered failed state.

systemctl status postgresql-9.1.service

준다

postgresql-9.1.service - SYSV: PostgreSQL database server.
          Loaded: loaded (/etc/rc.d/init.d/postgresql-9.1)
      Active: failed since Tue, 14 Aug 2012 17:31:58 +0530; 58s ago
     Process: 2811 ExecStop=/etc/rc.d/init.d/postgresql-9.1 stop (code=exited, status=1/FAILURE)
     Process: 12423 ExecStart=/etc/rc.d/init.d/postgresql-9.1 start (code=exited, status=1/FAILURE)
    Main PID: 2551 (code=exited, status=1/FAILURE)
      CGroup: name=systemd:/system/postgresql-9.1.service

fsync의 기본 설정을 변경하지 않았으므로 추측되었습니다 on. 나는 HDD에 있습니다. HDD가 추락했습니다.

HDD 충돌

HDD 충돌로 인해 fsckGUI 기반이 아닌 프롬프트 에서 매뉴얼이 실행되었습니다 . gazillion inodes 등을 복구합니다. 그 후 Ctrl+ Alt+로 시스템을 다시 시작했습니다 Delete.

PostgreSQL의 로그는 다음과 같습니다.

LOG:  database system was interrupted; last known up at 2012-08-14 17:31:57 IST
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  record with zero length at 0/41A4E58
LOG:  redo is not required
FATAL:  could not access status of transaction 1
DETAIL:  Could not open file "pg_multixact/offsets/0000": No such file or directory.
LOG:  startup process (PID 13016) exited with exit code 1
LOG:  aborting startup due to startup process failure

최신 정보

/var/lib/pgsql디렉토리 의 파일 시스템 레벨 사본을 작성한 후 서버를 시작하려고 시도 ./pg_resetxlog -f /var/lib/pgsql/9.1/data/하고 결과로 실행 하면 xlog -f /var/lib/pgsql/9.1/data/여전히 다음 과 같은 결과 가 나타납니다.

LOG:  database system was interrupted; last known up at 2012-08-14 18:46:36 IST
LOG:  database system was not properly shut down; automatic recovery in progress
LOG:  record with zero length at 0/6000078
LOG:  redo is not required
FATAL:  could not access status of transaction 1
DETAIL:  Could not open file "pg_multixact/offsets/0000": No such file or directory.
LOG:  startup process (PID 13766) exited with exit code 1
LOG:  aborting startup due to startup process failure

그리고 Postgres의 로그?
Milen A. Radev

@ MilenA.Radev postgres 로그로 질문을 업데이트했습니다.
ThinkingMonkey

pg_resetxlog좋은 일을하지 않았으므로 당신은 재미있는 영토에 있습니다. 충돌 전에이 데이터베이스의 백업이 있습니까?
Craig Ringer

@CraigRinger 예 백업이 있습니다. 나는 실제로이 타는 것을 즐기고있다.
ThinkingMonkey

트윗 담아 가기 당신은 백업이 좋은 몇 안되는 사람 중 하나입니다 :-). 솔직히 DB를 복구 할 수는 있지만 파일 시스템 손상으로 인해 중요한 파일이 손상되었으므로 Pg의 직감을 잘 아는 사람이 필요할 수도 있습니다. 서비스는 postgresql.org/support/professional_support에서 제공됩니다. 아마도 pg_multixact/offsets/0000Pg에 대한 더미 내용을 생각해 낼 수 있다면 ...
Craig Ringer

답변:


15

실제 답변은 PostgreSQL 로그에 /var/lib/pgsql/data/pg_log있습니다.

그러나 조치를 취하기 전에 : 데이터가 중요한 경우 복구를 시도하기 전에 데이터베이스의 파일 시스템 레벨 사본을 작성해야합니다 . http://wiki.postgresql.org/wiki/Corruption을 참조 하십시오 . 전체 데이터 디렉토리를 복사해야합니다. Fedora에서는 /var/lib/pgsql/data기본적으로 설치에 문제가 없는지 확인하십시오.

게시 한 로그를 기반으로 어느 정도의 데이터베이스 손상이있을 수 있습니다. 데이터베이스가있는 스토리지 (하드 드라이브 또는 파일 시스템)가 손상되었을 가능성이 큽니다. 지금 사본을 가져 와서 다른 하드 드라이브 나 시스템에 넣으십시오 .

데이터 디렉토리의 전체 파일 시스템 레벨 사본을 작성한 후에 만 pg_resetxlog 를 사용 하여 손상된 트랜잭션 로그를 지우고 데이터베이스를 시작하십시오. 시작하더라도 손상 될 가능성이 높습니다. pg_dump그런 다음 다시 가져와 initdb덤프를 새로운 인스턴스로 복원 해야 합니다 .

그래도 여전히 시작할 수 없으면 pg_resetxlogresetxlog 후에 시작 시도의 업데이트 된 로그를 게시하십시오. 다음을 사용하여 독립형 모드에서 Pg를 시작해야 할 수 있습니다.

sudo -u postgres postgres --single -D /var/lib/pgsql/data -P -f i postgres

그래도 문제가 해결되지 않으면 backend>마지막 "postgres"를 연결하려는 DB 이름으로 바꾼 후 다시 시도하십시오. 당신은 수에 있어야합니다 SELECT, COPY테이블에서 데이터 등

그래도 작동 하지 않는 경우 ( 예 : 독립형 백엔드를 시작할 수없는 경우) 백업을 복원 할 시간이 될 것입니다. 이것을 읽는 다른 사람이 같은 입장에 있다면 숙련 된 PostgreSQL 컨설턴트 에게 문의 하여 데이터베이스에서 데이터를 복구 할 수 있는지 확인하십시오. 그들의 시간과 전문 지식을 지불 할 준비를하십시오.

파일 시스템이 손상되었을 수 있습니다

PostgreSQL 설치가 심각하게 손상되면 전체 파일 시스템이 손상되었을 수 있습니다. 백업에서 전체 시스템을 복원하거나 다시 설치하는 것이 좋습니다.

나는이 파일 시스템을 신뢰하지 않을 것 fsck또는 전혀 fsck.

드라이브를 스마트 테스트

또한 smartmontools에서 SMART하드 드라이브를 점검 하는 것이 좋습니다 smartctl. 그것이 /dev/hda될 것이라고 가정합니다 smartctl -d ata -a /dev/sda | less. 실패한 상태 테스트, uncorrectable_sectors높은 읽기 오류율, reallocated_sector_count가 2 또는 3을 초과하거나 0이 아닌 current_pending_sector를 찾으십시오. smartctl -d ata -t long /dev/sdaHDD에서 비파괴 적 자체 테스트를 실행 하려면 실행 하십시오 . 시스템의 정상적인 기능을 방해하지 않습니다. 예상 시간이 경과하면 smartctl -d ata /dev/sda다시 실행 하고 자체 테스트 로그를보고 시간이 지 났는지 확인하십시오.

이상이 없으면 드라이브를 교체하십시오.

앞으로는 smartd드라이브 오류에 대한 조기 경고 를 위해이 테스트를 자동화하는 것이 좋습니다.

이 게시물의 내용은 질문에 대한 업데이트로 인해 더 이상 사용되지 않습니다. 비슷한 문제를 해결하려면이 답변의 편집 기록을보십시오.


질문에 postgres 로그를 추가했습니다. 나는 기본 설정을 변경하지 않았 fsync으므로 추측되었습니다 on. 나는 HDD에 있습니다. 예, HDD가 추락했습니다. 디스크 공간이 부족하지 않습니다. 메모리 오류 / 과열 / 케이블 오버 / 트립 없음.
ThinkingMonkey

@ThinkingMonkey 어떤 종류의 "HDD 충돌"? 파일을 새 드라이브로 복사하기 위해 하드 드라이브에서 데이터 복구를 수행 했습니까? fsck파일 시스템 복구 를 실행 하고 수행 했습니까 ? 자세하게 부탁드립니다. 추락의 이야기를 쓰십시오.
Craig Ringer

HDD 충돌로에 대한 매뉴얼 fsck을 실행했습니다 . gazillion inodes 등을 복구합니다. 그 후 시스템이 다시 시작되었습니다. 질문에서 위의 내용도 업데이트했습니다.
ThinkingMonkey

@ThinkingMonkey 좋아, 답변이 업데이트되었습니다. TL; DR : / var / lib / pgsql의 완전한 파일 시스템 레벨 사본을 만든 다음 다음을 실행하십시오.pg_resetxlog
Craig Ringer

복사 및 resetxlog에 감사합니다. 곧 결과와 함께 돌아올 것입니다.
ThinkingMonkey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.