programing

postgresql 오류 PANIC: 올바른 체크포인트 레코드를 찾을 수 없습니다.

i4 2023. 5. 26. 20:43
반응형

postgresql 오류 PANIC: 올바른 체크포인트 레코드를 찾을 수 없습니다.

postgres 서버(v9.0.1)를 로드하면 시작할 수 없는 패닉이 발생합니다.

패닉: 올바른 체크포인트 레코드를 찾을 수 없습니다.

이걸 어떻게 고칠 수 있을까요?

트랜잭션 로그에서 존재하지 않거나 손상된 체크포인트 레코드를 찾고 있습니다.이 경우 다음을 실행하여 확인할 수 있습니다.

# Postgres >= 10
pg_resetwal DATADIR

# Postgres < 10
pg_resetxlog DATADIR

트랜잭션 로그가 손상된 경우 다음과 같은 메시지가 표시됩니다.

The database server was not shut down cleanly.  
Resetting the transaction log might cause data to be lost.  
If you want to proceed anyway, use `-f` to force reset.

그런 다음 지침에 따라 다음과 같이 실행할 수 있습니다.-f강제 업데이트:

# Postgres >= 10
pg_resetwal -f DATADIR

# Postgres < 10
pg_resetxlog -f DATADIR 

그러면 트랜잭션 로그가 재설정됩니다.그러나 Postgre에서 설명한 대로 데이터베이스가 불확실한 상태로 유지될 수 있습니다.SQL 설명서:

한다면pg_resetwal는 음에대유데효확수불없평다합니다고에 대한 를 결정할 수 합니다.pg_control당신은 어쨌든 그것을 강제로 진행할 수 있습니다.-f(으) 데이터를 할 수 합니다.이 경우에는 누락된 데이터에 대해 타당한 값이 대체됩니다.대부분의 필드가 일치할 것으로 예상할 수 있지만 다음 OID, 다음 트랜잭션 ID 및 epoch, 다음 다중 트랜잭션 ID 및 오프셋, WAL 시작 위치 필드에 대해 수동 지원이 필요할 수 있습니다.이러한 필드는 아래에 설명된 옵션을 사용하여 설정할 수 있습니다.필드에 할 수 없는 에는 다음과 같이 입력합니다.-f여전히 사용할 수 있지만 복구된 데이터베이스는 평소보다 훨씬 더 의심스러운 상태로 처리해야 합니다. 즉, 즉시 덤프 및 다시 로드가 필요합니다.덤프하기 전에 데이터베이스에서 데이터 수정 작업을 실행하지 마십시오. 이러한 작업을 수행하면 손상이 더 심해질 수 있습니다.

9.1.7을 실행하고 있으며 다음을 성공적으로 실행했습니다.

/usr/lib/postgresql/9.1/bin/pg_resetxlog -f /var/lib/postgresql/9.1/main

에 대한 의 마지막 .pg_resetxlog명령은 postgres가 데이터베이스 데이터를 저장하는 디스크의 위치여야 합니다.

여기에 표시된 대로 pg_resetxlog를 실행하면 안 됩니다.이것을 언급하는 답은 나쁜 충고입니다.복사/복제 인스턴스의 컨텍스트에서 오류가 발생했다고 가정할 때 링크를 사용하여 복사/복제를 보다 간편하게 수행할 수 있습니다.pg_basebackup

도커의 경우,

이 오류로 인해 컨테이너가 지속적으로 중지되고 다시 시작됩니다.첫 번째 단계는 컨테이너를 실행하여 컨테이너로 실행하고 pg_resetwal 또는 pg_resetxlog를 실행할 수 있도록 하는 것입니다.포스트그레스 도커 계층 정보에서 우리는 다음을 볼 수 있습니다.

ENTRYPOINT는 ["docker-entrypoint.sh "]이고 CMD는 ["postgres"]입니다.

도커 입구 지점sh 스크립트는 인수로 전달된 모든 Linux 명령을 실행합니다.

도커에 있는 경우 /bin/bash를 전달하면 기본 CMD가 재정의되고 컨테이너 셸에 액세스할 수 있습니다.

docker run -it -v /my_data:/var/lib/postgresql/data postgres:9.6.22 /bin/bash

여기서 /var/lib/postgresql/data는 컨테이너 내부의 postgres 데이터 디렉토리입니다.

컨테이너 안에 들어가면 postgres 버전에 따라 아래 명령을 실행합니다.트랜잭션 로그(WAL)가 재설정됩니다.

포스트그레스 > = 10

pg_resetwal /var/lib/postgresql/data

포스트그레스 < 10

pg_resetxlog /var/lib/postgresql/data

이 스레드의 최상위 답변은 pg_resetwal 명령에 대해 자세히 설명합니다.

마지막으로 이 컨테이너를 종료하고 원래 CMD로 postgres DB 컨테이너를 시작할 수 있습니다.


일부 추가 정보

아래 오류가 표시되면 위에서 지정한 데이터 디렉토리가 잘못되었을 수 있습니다.

pg_resetxlog: 다음을 읽기 위해 "PG_VERSION" 파일을 열 수 없습니다.해당 파일 또는 디렉터리가 없습니다.

올바른 경로에 대한 PGDATA env 변수를 확인할 수 있습니다.

root@4650984c476b:/# printenv | grep PGDATA
PGDATA=/var/lib/postgresql/data

이전 버전의 postgres에서 아래 오류가 발생할 수 있습니다.

pg_tftxlog: "root"에서 실행할 수 없습니다.

이 문제는 아래 명령을 실행하여 해결할 수 있습니다.

gosu postgres pg_resetxlog /var/lib/postgresql/data

kubernetes, rancher v1과 같은 컨테이너 오케스트레이터의 경우 (도커 명령을 직접 실행할 수 없기 때문에) sleep과 같은 프로세스로 컨테이너를 시작해야 합니다.Orchestrator 매니페스트에서 아래를 cmd 또는 args로 전달합니다.

sleep infinity

또는

sh -c 'while sleep 3600; do :; done'

그런 다음 kubectl exec과 같은 도구를 사용하여 용기에 들어갑니다.내부에 들어가면 pg_resetwal/pg_resetxlog 명령을 실행할 수 있습니다.

지속적인 아카이빙을 수행하고 있습니까?이때 백업하는 경우 backup_label을 제거하는 것이 더 신중할 수 있습니다. pg_resetxlog심각한 일입니다.

다시 시작되지 않은 도커 Postgresql-13을 가지고 왔습니다.(데이터에 대한) 볼륨을 찾아 실행하여 수정했습니다.

볼륨 데이터 폴더에 있는 경우(예:/var/lib/docker/volumes/c4c8d637d9eee086265d732b2974690b731abcb23f47ca61bf75fe28526e31ce/_data

디렉터리의 소유자로 실행(나에게는 systemd-coredump 사용자였다)

sudo -u systemd-coredump /usr/lib/postgresql/13/bin/pg_resetwal -f .

동일한 Postgresql 버전이 설치되어 있어야 합니다.pg_resetwal볼륨의 일부가 아님)

일했다

로그에 유효한 체크포인트 레코드를 찾을 수 없습니다.Postgres가 $PGDATA/pg_xlog/ 디렉토리에서 WAL을 제대로 찾을 수 없습니다.pg_resetxlog 사용 시도

Windows Server의 경우 Postgresql에 "유효한 체크포인트 레코드를 찾을 수 없음" 오류가 표시되는 경우 걱정하지 마십시오. PowerShell에서 아래 명령을 실행하십시오.

C:\Program Files\Postgre 폴더를 엽니다.파워셸에서 SQL\12\bin을 실행합니다(와 같이).

.\pg_resetwal.exe -f -D "C:\Program Files\PostgreSQL\12\data"

전체 명령은 다음과 같습니다.

C:\Program Files\PostgreSQL\12\bin.\pg_resetwal.exe -f -D "C:\Program Files\PostgreSQL\12\data";

그런 다음 "Write-Ahead log reset" 메시지가 나타나면 postgresql 서비스를 100% 실행할 수 있습니다. 또한 Potgresql 서비스를 시작하기 전에 postgresql의 모든 실행 작업을 종료해야 합니다.

이 답변은 Postgres 14를 위한 것입니다.다음 단계 후 대기 로그에서 동일한 오류가 발생했습니다.

  1. 대기 상태로 로그인합니다.
  2. 다음 명령을 사용하여 백업을 만듭니다.

pg_basebackup -D $APP_BACKUP_PATH -FT -P -v -U 복제자 -w --no-password -h 10.29.51.98

  1. 생성된 출생성을 합니다.$APP_BACKUP_PATH/base.tar대기 데이터 디렉토리로 이동합니다.

  2. 대기를 다시 시작합니다.시작이 실패하고 다음 오류가 발생합니다.PANIC: could not locate a valid checkpoint record.

  3. 따라서 백업이 제대로 생성되지 않은 것으로 나타났습니다.추가 옵션을 사용하여 생성해야 합니다.-X stream.

  4. 업데이트된 백업을 재생성하고 대기 데이터 디렉토리에 적용한 후 이 오류 없이 대기 상태가 발생했습니다.

언급URL : https://stackoverflow.com/questions/8799474/postgresql-error-panic-could-not-locate-a-valid-checkpoint-record

반응형