postgres : 온라인 백업이 끝나기 전에 WAL이 종료 됨
10TB 이상 크기의 Postgres 9.6을 실행하고 있습니다. S3를 저장소로 사용하는 자체 개발 도구 "pgrsync"를 사용하여 백업을 수행했습니다. 백업 파일과 WAL 아카이브는 모두 S3에 저장됩니다.
문제 : 복원을 시도하는 동안 일부 백업에 대해 WAL 아카이브 복원이 임의로 실패합니다.
이 경우 백업 시작 위치는 00000002000544C60000006B
이고 중지 위치는 00000002000545210000008D
, (pg_stop_backup () 출력 기준)이지만 005493D에서 그 사이에 중지하고 복원을 종료합니다. 복원을 다시 실행하면 정확히 같은 지점에서 중지됩니다. 다른 백업은 성공적으로 복원하는 동안 몇 가지 추가 백업에서 유사한 결과가 발생합니다.
백업 / 복원 프로세스 중에 일부 특정 WAL 파일이 손상되었음을 나타냅니다. 그것이 올바른 해석입니까?
질문 :
- WAL 파일이 손상되었는지 확인하는 방법이 있습니까?
- 데이터 손실없이 전진 할 수있는 방법이 있습니까? (나는 사용을 조심합니다
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
답변
이에 대한 유일한 설명은 복구 프로세스가 BACKUP_END
WAL 항목을 본 적이 없다는 것 pg_stop_backup
입니다. 즉, 호출 효과가 포함 된 WAL 세그먼트를 읽지 않는다는 것 입니다.
이제 함수를 실행했다고 설득력있게 주장합니다. 그렇지 않으면 backup_label
이 함수에 의해 생성 된 파일이 비 독점 백업에 없을 것 입니다.
아카이브 복구는 복구 중에 WAL 세그먼트를 건너 뛸 수 없으므로 복구가 해당 세그먼트를 건너 뛰는 것은 불가능합니다.
몇 가지 설명이 남습니다.
backup_label
무언가가 섞여서 다른 백업 의 파일을 사용 했습니다.BACKUP_END
항목이 포함되지 않은 다른 클러스터에서 동일한 이름의 WAL 세그먼트를 복원했습니다 .타임 라인과 헷갈 렸고 백업 중에 타임 라인 스위치
BACKUP_END
가 있었기 때문에 실제로는00000003000545210000008D
그 정도입니다.(가능한지 또는 타임 라인 전환으로 온라인 백업이 중단되는지 확실하지 않습니다. 테스트하지 않았습니다.)
모든 것이 예상 한대로라면 항목을 00000002000545210000008D
포함해야합니다 BACKUP_END
. 확인
pg_waldump 00000002000545210000008D | grep BACKUP_END
이 항목이 처리되는 즉시 PostgreSQL은 로그 줄을 내 보냅니다.
consistent recovery state reached