Search

[PostgreSQL] psql : database system shutdown was interrupted

요약
psql 사용시 발생할 수 있는 오류에 대한 해결 방법
썸네일
https://noticon-static.tammolo.com/dgggcrkxq/image/upload/v1583166732/noticon/wmdxye5yts7ncuiyb09e.png
작성일자
2024/04/17 11:48
수정일자
2024/05/18 08:05
스택
PostgreSQL
카테고리
TroubleShooting
태그
System Error
이 글은 이전 티스토리 블로그에서 이관한 자료입니다.

문제

PostgreSQL 서비스가 실행되지않고 Stderr로 해당 메시지가 반환되는 문제
database system shutdown was interrupted; last known up at <timestamp> invalid primary checkpoint record invalid secondary checkpoint record could not locate a valid checkpoint record startup process (PID) was terminated by signal 6 aborting startup due to startup process failure
Plain Text
복사

해결 방법

TL;DR

문제 진단

트랜잭션 로그에 이상이 있는지 확인하기 위해서 이하의 명령어를 사용
# Postgres >= 10 pg_resetwal -d DATADIR # Postgres < 10 pg_resetxlog -d DATADIR
Bash
복사
트랜잭션 로그에 이상이 있는 경우엔 이하와 같은 메시지가 출력된다.
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.

해결 방법

우선 postgresql의 PGDATA 디렉토리를 전부 백업하고 진행하세요.
이하의 명령어로 트랜잭션 로그와 pg_control의 제어 정보를 재설정할 수 있으나, 복구한 데이터베이스를 정상적으로 사용하긴 어려울 가능성이 매우 높다.
# Postgres >= 10 pg_resetwal -f DATADIR # Postgres < 10 pg_resetxlog -f DATADIR
Bash
복사
여기까지 정상적으로 진행이 됐다면 psql 명령어를 이용하여 데이터베이스의 조작이 가능하지만, 절대로 조작해선 안된다.
즉시 pg_dump, pg_dumpall 명령어를 이용하여 전체 데이터베이스 내용을 덤핑하고 initdb 명령으로 새 클러스터를 만들어 그곳에 덤프한 내용을 이용하여 데이터베이스를 restore 처리하는 것이 좋다.

설명

트랜잭션 로그가 꼬이는 경우는 매우 드물지만 완전히 발생하지 않는 문제는 아니다.
docker 강제 종료 혹은 시스템의 강제 종료, 하드디스크 공간 부족 등의 다양한 예기치 못한 상황에 이러한 문제가 생길 수 있으므로 주의 또 주의해야한다.
가장 좋은 방법은 역시 Active-Standby 방식으로 이중화하여 항상 건강한 Replication을 확보하는 것이 중요한거 같다.

참조

-