PostgreSQL 9.1 핫 백업 오류 : 데이터베이스 시스템 시작 중


16

Postgres 9.1의 핫 백업을 잠시 동안 진행하고 있으며 일관된 문제가 발생했습니다. 슬레이브 서버에서 Postgres를 다시 시작하면 pgstartup 로그 파일과 pg_log 디렉토리 아래의 일일 로그 파일이 오류없이 읽 힙니다. 그러나 psql 명령을 사용하여 데이터베이스에 입력하려고하면 오류가 발생합니다.

치명적 : 데이터베이스 시스템이 시작 중입니다.

recovery.conf 파일도 recovery.done으로 바뀌지 않습니다. 이 오류를 광범위하게 조사했으며 동일한 응답을 일관되게 발견했습니다. Postgres를 다시 시작하기 전에 데이터베이스가 완전히 종료되지 않았습니다. Postgres를 다시 시작한 유일한 방법은 service postgresql-9.1 restart또는 /etc/init.d/postgresql-9.1 restart명령을 사용하는 것입니다. 이 오류가 발생하면 모든 프로세스를 종료하고 다시 데이터베이스를 다시 시작하려고 시도해도 여전히 동일한 오류가 발생합니다. 여기에서 어디로 가야 하고이 문제를 해결하는 방법을 잃어 버렸습니다. 다음은 핫 백업을 완료하기 위해 수행 한 정확한 프로세스입니다.

마스터 서버 구성 :

pg_hba.conf는 다음 줄을 추가했습니다 :

호스트 복제 postgres IPAddressOfSlaveServer 트러스트

postgresql.conf :

wal_level = 핫 스탠바이
max_wal_senders = 5
listen_address = '*'
포트 = 5432
max_wal_senders = 5
wal_keep_segments = 32

슬레이브 서버 구성 :

postgresql.conf :

hot_standby = 켜기

recovery.conf :

standby_mode = 켜기
primary_conninfo = host = IPAddressOfMasterServer
포트 = 5432
사용자 = postgres
restore_command = 'cp /var/lib/pgsql/9.1/data/pg_xlog/%f "% p"'

두 서버를 모두 구성한 후

마스터 서버에서 postgres 사용자로 변경하고 명령을 실행합니다.

psql -c "pg_start_backup ( 'label', true);를 선택하십시오.";
rsync -a -v -e ssh /var/lib/pgsql/9.1/data 슬레이브 : /var/lib/pgsql/9.1/data \
        --postmaster.pid 제외
pgsql -c "select pg_stop_backup ();";

슬레이브 서버와 데이터베이스를 동기화 한 후

슬레이브 서버를 다시 시작했는데 시작이 실패하지 않습니다. pgstartup.log는 다음과 같이 읽습니다.

성공. 이제 다음을 사용하여 데이터베이스 서버를 시작할 수 있습니다.

    /usr/pgsql-9.1/bin/postgres -D /var/lib/pgsql/9.1/data
또는
    /usr/pgsql/9.1/bin/pg_ctl -D /var/lib/pgsql/9.1/data -l 로그 파일 시작

현재 날짜 로그 파일 postgresql-Thu.log는 다음을 읽습니다.

로그 : 종료
로그 : 데이터베이스 시스템이 종료되었습니다
로그 : 2012 년 4 월 10 일에 복구시 데이터베이스 시스템이 종료되었습니다
로그 : 대기 모드로 전환
로그 : 아카이브에서 "logFileName"로그 파일을 복원했습니다.
로그 : 일관된 복구 상태가 0 / BF0000B0에 도달했습니다.
로그 : 다시 실행은 0 / BF000020에서 시작합니다
로그 : 아카이브에서 "logFileName"로그 파일을 복원했습니다.
로그 : 로그 파일 0의 예기치 않은 pageaddr 0/85000000, 세그먼트 192, 오프셋 0
로그 : 로그 파일 0의 예기치 않은 pageaddr 0/85000000, 세그먼트 192, 오프셋 0
로그 : 스트리밍 복제가 기본에 성공적으로 연결되었습니다

예기치 않은 pageaddr 및 postgres 아카이브에서 조사한 결과 이것이 정상이며 WAL (End-of-WAL)을 감지하는 예상되는 방법 중 하나라는 것을 이해하고 있습니다.

모든 조언을 주시면 감사하겠습니다.

답변:


11

"데이터베이스 시스템이 시작 중입니다."메시지 오류를 나타내지 않습니다. 치명적 수준 인 이유는 다음 설정에 관계없이 항상 로그에 기록하기 때문입니다 log_min_messages.

http://www.postgresql.org/docs/9.1/interactive/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHEN

rsync 후, 당신이 보여준 것을 실제로 실행 했습니까? :

pgsql -c "select pg_stop_backup ();";

내가 아는 한, pgsql실행 파일이 없기 때문에 백업이 완료되지 않은 상태로 남아 있으며 슬레이브는 복구 모드에서 나오지 않습니다. 반면에, 당신은 실제로 run했을 것입니다. psql그렇지 않으면 슬레이브가 다음과 같은 성공 메시지를 어떻게 기록했는지 알 수 없기 때문입니다.

로그 : 일관된 복구 상태가 0 / BF0000B0에 도달했습니다.

과:

로그 : 스트리밍 복제가 기본에 성공적으로 연결되었습니다

이 시점에서 슬레이브에 연결을 시도 했습니까? 어떻게 된 거예요?

언급 한 "성공. 이제 시작할 수 있습니다 ..."메시지는에 의해 생성되며 initdb, 슬레이브 설정의 일부로 실행되어서는 안됩니다. 그래서 당신이 거기에 뭔가 혼란 스러울 것 같아요. 나는 또한 명백하게 상충되는 진술에 대해 우려하고 있습니다.

Postgres를 다시 시작한 유일한 방법은 서비스 postgresql-9.1 restart 또는 /etc/init.d/postgresql-9.1 restart 명령을 사용하는 것입니다. 이 오류가 발생하면 모든 프로세스를 종료하고 다시 데이터베이스를 다시 시작하려고합니다 ...

서비스 스크립트를 통해 서비스를 중지하려고 했습니까? 어떻게 된 거예요? 행에 추가 정보를 접두어로 추가하면 로그를 이해하는 데 도움이 될 수 있습니다. 우리는 사용:

log_line_prefix = '[%m] %p %q<%u %d %r> '

recovery.conf스크립트는 이상한 보인다. 마스터의 pg_xlog 디렉토리, 슬레이브의 활성 pg_xlog 디렉토리 또는 아카이브 디렉토리에서 복사하고 있습니까?


8

9.1이 아니라 9.3에 있다는 점을 제외하고는 이것에 대해서도 문제가있었습니다. 어쨌든 수정은 매우 사소한 것으로 판명되었습니다.

postgresql.conf파일은 노예로 마스터에서 복사되고 있었다, 나는 노예에 수정되지 않은를 떠난다. 나는 당신이해야 할 recovery.conf모든 파일 을 추가 하고 모든 것이 잘 될 것이라고 생각했다.

나는 노예의 postgresql.conf파일을 편집 하고 :

  • 댓글을 달았습니다 archive_mode=on
  • 주석 처리 된 archive명령; 과
  • 댓글을 달았습니다 hot_standby=on

그렇게했습니다 : 데이터베이스를 읽기 전용 서버로 가져 와서 읽기 전용 쿼리를 수락 할 수있었습니다.

pg_basebackup슬레이브 용 부트 스트랩 디렉토리를 생성 하는 스크립트 가 있습니다. 데이터베이스가있는 데이터 디렉토리입니다. postgresql.conf설명 된대로 슬레이브로 사용하기 전에 파일 을 수정해야합니다 pg_basebackup. 포스트 스크립트 에서는 매우 간단합니다 .


1
"comeded hot_standby = on"이라고 쓸 때 "실제로 hot_standby를 활성화하기 위해 # -comment-mark를 제거했습니다"라는 의미가 있다고 가정합니다. 대기, 장애 조치 준비 완료, 조회 불가). 마스터에서 wal_level = hot_standby를 사용하지 않고 기본 백업 덤프를 작성한 다음 슬레이브에서 hot_stanby를 설정 한 경우 hot_standby가 시작 및 실행되도록 슬레이브 db를 다시 덤프하고 다시 초기화해야합니다. 그렇지 않으면 치명적인 오류가 발생합니다.
Frederik Struck-Schøning

필요에 hot_standby = 그것은이 있어야합니다
Abhilash 슈라

7

흥미롭게도 나는 바울과는 반대로이 문제를 해결했습니다.

나는 덧붙였다 :

hot_standby = on

또는 오히려 #hot_standby = off위의 내용으로 변경되었습니다 . (이것은 9.5를 사용하고있었습니다)


1

나는 이것을 로그에 얻었습니다.

MSK FATAL:  the database system is starting up

서버의 무한 시작을 수정하려면 다음과 같이하십시오 : 서비스를 중지하고 (있는 경우) 프로세스 'postgres'를 중지하십시오 (보통 존재합니다). 콘솔에서 이것을 실행하십시오.

pg_resetxlog.exe -D ../Data -f

이 로그는 xLog 디렉토리에 서비스가 종료되기 전에 기록되지 않은 데이터가 있기 때문에 나타납니다. 그런 다음 서비스 시작시 해당 데이터를 수정하려고합니다. 때때로 시작이 멈추고 끝나지 않습니다. 명령은 고정 된 데이터로 시작하는 서비스를 적용하는이 고정되지 않은 데이터를 정리합니다. 수정되지 않은 데이터의 일부는 손실 될 수 있지만 데이터베이스 서버는 정상적으로 실행되며 앱에서 액세스 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.