postgres : 온라인 백업이 끝나기 전에 WAL이 종료 됨

Nov 12 2020

10TB 이상 크기의 Postgres 9.6을 실행하고 있습니다. S3를 저장소로 사용하는 자체 개발 도구 "pgrsync"를 사용하여 백업을 수행했습니다. 백업 파일과 WAL 아카이브는 모두 S3에 저장됩니다.

문제 : 복원을 시도하는 동안 일부 백업에 대해 WAL 아카이브 복원이 임의로 실패합니다.

이 경우 백업 시작 위치는 00000002000544C60000006B이고 중지 위치는 00000002000545210000008D, (pg_stop_backup () 출력 기준)이지만 005493D에서 그 사이에 중지하고 복원을 종료합니다. 복원을 다시 실행하면 정확히 같은 지점에서 중지됩니다. 다른 백업은 성공적으로 복원하는 동안 몇 가지 추가 백업에서 유사한 결과가 발생합니다.

백업 / 복원 프로세스 중에 일부 특정 WAL 파일이 손상되었음을 나타냅니다. 그것이 올바른 해석입니까?

질문 :

  1. WAL 파일이 손상되었는지 확인하는 방법이 있습니까?
  2. 데이터 손실없이 전진 할 수있는 방법이 있습니까? (나는 사용을 조심합니다 pg_resetxlog)

먼저 백업 파일 (WAL 위치에서 00000002000544C60000006B.0001E9A0.backup)

START WAL LOCATION: 544C6/6B01E9A0 (file 00000002000544C60000006B)
STOP WAL LOCATION: 54521/8D235490 (file 00000002000545210000008D)
CHECKPOINT LOCATION: 544C6/BA84E0A8
BACKUP METHOD: streamed
BACKUP FROM: master
START TIME: 2020-11-04 03:24:14 UTC
LABEL: inc04nov
STOP TIME: 2020-11-04 09:21:38 UTC

그런 다음 로그 파일 :

2020-11-11 06:38:08 UTC [21731]: [22299-1] user=,db=LOG:  restored log file "000000020005451D00000080" from archive
2020-11-11 06:38:08 UTC [21731]: [22300-1] user=,db=LOG:  restored log file "000000020005451D00000081" from archive
2020-11-11 06:38:08 UTC [21731]: [22301-1] user=,db=LOG:  restored log file "000000020005451D00000082" from archive
2020-11-11 06:38:08 UTC [21731]: [22302-1] user=,db=LOG:  restored log file "000000020005451D00000083" from archive
2020-11-11 06:38:08 UTC [21731]: [22303-1] user=,db=LOG:  restored log file "000000020005451D00000084" from archive
2020-11-11 06:38:08 UTC [21731]: [22304-1] user=,db=LOG:  restored log file "000000020005451D00000085" from archive
2020-11-11 06:38:08 UTC [21731]: [22305-1] user=,db=LOG:  restored log file "000000020005451D00000086" from archive
2020-11-11 06:38:08 UTC [21731]: [22306-1] user=,db=LOG:  restored log file "000000020005451D00000087" from archive
2020-11-11 06:38:08 UTC [21731]: [22307-1] user=,db=LOG:  restored log file "000000020005451D00000088" from archive
2020-11-11 06:38:08 UTC [21731]: [22308-1] user=,db=LOG:  restored log file "000000020005451D00000089" from archive
2020-11-11 06:38:08 UTC [21731]: [22309-1] user=,db=LOG:  restored log file "000000020005451D0000008A" from archive
2020-11-11 06:38:08 UTC [21731]: [22310-1] user=,db=LOG:  restored log file "000000020005451D0000008B" from archive
2020-11-11 06:38:08 UTC [21731]: [22311-1] user=,db=LOG:  redo done at 5451D/8AFFE500
2020-11-11 06:38:08 UTC [21731]: [22312-1] user=,db=LOG:  last completed transaction was at log time 2020-11-04 09:10:42.219935+00
2020-11-11 06:38:11 UTC [21731]: [22314-1] user=,db=FATAL:  WAL ends before end of online backup
2020-11-11 06:38:11 UTC [21731]: [22315-1] user=,db=HINT:  All WAL generated while online backup was taken must be available at recovery.
2020-11-11 06:38:13 UTC [21728]: [3-1] user=,db=LOG:  startup process (PID 21731) exited with exit code 1
2020-11-11 06:38:13 UTC [21728]: [4-1] user=,db=LOG:  terminating any other active server processes
2020-11-11 06:38:16 UTC [4559]: [1-1] user=postgres,db=postgresFATAL:  the database system is in recovery mode
2020-11-11 06:38:16 UTC [4561]: [1-1] user=postgres,db=postgresFATAL:  the database system is in recovery mode
2020-11-11 06:38:16 UTC [4576]: [1-1] user=postgres,db=postgresFATAL:  the database system is in recovery mode
2020-11-11 06:38:25 UTC [21728]: [5-1] user=,db=LOG:  database system is shut down

WAL 파일이 손상된 것 같습니다.

다음은 잘 복원 된 올바른 WAL 파일입니다.

-bash-4.2$ /usr/pgsql-9.6/bin/pg_xlogdump 000000020005451D0000008A | head -2
rmgr: Heap        len (rec/tot):    151/   151, tx: 3501354263, lsn: 5451D/8A0001D8, prev 5451D/89FFE1E8, desc: INSERT off 15, blkref #0: rel 3435996123/765803221/4171942326 blk 15806513
rmgr: Btree       len (rec/tot):     72/    72, tx: 3501354263, lsn: 5451D/8A000270, prev 5451D/8A0001D8, desc: INSERT_LEAF off 2, blkref #0: rel 3435996123/765803221/4171944289 blk 3881149

다음은 실제로 아카이브 복구 처리를 중지 한 WAL 파일입니다.

-bash-4.2$ /usr/pgsql-9.6/bin/pg_xlogdump 000000020005451D0000008B
pg_xlogdump: FATAL:  could not find a valid record after 5451D/8B000000

답변

1 LaurenzAlbe Nov 13 2020 at 22:42

이에 대한 유일한 설명은 복구 프로세스가 BACKUP_ENDWAL 항목을 본 적이 없다는 것 pg_stop_backup입니다. 즉, 호출 효과가 포함 된 WAL 세그먼트를 읽지 않는다는 것 입니다.

이제 함수를 실행했다고 설득력있게 주장합니다. 그렇지 않으면 backup_label이 함수에 의해 생성 된 파일이 비 독점 백업에 없을 것 입니다.

아카이브 복구는 복구 중에 WAL 세그먼트를 건너 뛸 수 없으므로 복구가 해당 세그먼트를 건너 뛰는 것은 불가능합니다.

몇 가지 설명이 남습니다.

  1. backup_label무언가가 섞여서 다른 백업 의 파일을 사용 했습니다.

  2. BACKUP_END항목이 포함되지 않은 다른 클러스터에서 동일한 이름의 WAL 세그먼트를 복원했습니다 .

  3. 타임 라인과 헷갈 렸고 백업 중에 타임 라인 스위치 BACKUP_END가 있었기 때문에 실제로는 00000003000545210000008D그 정도입니다.

    (가능한지 또는 타임 라인 전환으로 온라인 백업이 중단되는지 확실하지 않습니다. 테스트하지 않았습니다.)

모든 것이 예상 한대로라면 항목을 00000002000545210000008D포함해야합니다 BACKUP_END. 확인

pg_waldump 00000002000545210000008D | grep BACKUP_END

이 항목이 처리되는 즉시 PostgreSQL은 로그 줄을 내 보냅니다.

consistent recovery state reached