본문 바로가기

Tech/Postgresql

[Postgresql] pg_dumpall 활용 경험

Postgresql DB가 동작중이던 서버가 날아감에 따라...gk.. (replica고 뭐고 딱 DB 하나 떠있었음...)

예전에 백업된 데이터를 다시 import 해야하는 상황이였다.

다행히도 pg_dumpall로 백업해놓은 dump file이 있었다.

이 dump file을 다시 적용했던 경험을 작성하려한다.

 

환경은 실 서비스에 적용하기 이전에 테스트 용으로 띄워서 테스트했다. (Docker Container)

 

1. Python Django REST Framework를 사용한 API 서버

2. Postgresql DB

 

Postgresql 서버가 통채로 날아가는 경우를 경험하는건 처음이고, pg_dumpall로 export된 DB 백업 파일을 Import하는 것도 처음이였다.

 

백업을 진행하기 이전에 pg_dumpall로 export된 dump 파일을 확인 해보니, DB 생성부터 덤프 시점까지 모든 정보가 있는 SQL Query File이였다. (Insert, Update는 없고. COPY, ALTER 등이 존재한다.)

 

 

일단 API서버와 Postgresql를 Docker container로 띄운 후, postgresql dump file을 Import 하려했다.

dump file을 import 할 수 있는 방법은 다양하다.

 

1. 덤프파일이 컨테이너 안에 있는 경우 (docker cp를 통해 이동시킨 경우 혹은 Volume 등..)

psql -f <dump file> -U <user> <database>

2. 덤프파일이 컨테이너 외부에 있는 경우

cat <dump file> | docker exec -i <container> psql -U <user> -d <database>

 

위 방법 중 아무거나 하나 해도 된다. 

둘다 SQL Query를 라인바이 라인으로 실행하기때문이다.

 

나는 여기서부터 삽질했다...

 

위 커맨드를 작성했는데 dump file의 일부 쿼리가 실패하는 것이였다.

이유는 already exists 였고, 이 에러가 발생하는 이유는 다음과 같았다.

 

Django Base의 API 서버에서 서비스 실행 시, Postgresql에 DB migration을 진행했던 것이다.

그러다보니, postgresql DB에 migration된 일부 테이블들이 존재했고.

테이블이 있는 상태에서, 그 당시 pg_dumpall로 dump했을때 테이블 정보를 그대로 다시 COPY 하려하니, 중복 에러가 발생한거다.

 

처음에는 pg_dumpall에서 COPY를 Overwrite하게 쓸수있는 옵션?이 있나 찾아봤다.

COPY Query로 기존 Table을 Overwrite하는 방법은 없다고한다. (못찾은건가..)

 

대부분의 방법은 중복이 발생하는 부분을 삭제하고 Import를 하라는 것이였다.

(이때 삭제에도 Delete Query와 Truncate Query가있다.)

 

DELETE 와 TRUNCATE 의 차이점

DELETE 와 TRUNCATE는 TABLE의 내용을 지우는 의미에서는 같은 기능입니다. 하지만 같은기능을 두개의 명령어로 사용할 필요는 없겠죠? 그래서 두 명령어의 차이점에 대해 알아보겠습니다. TRUNCATE는 DD

pointnet.tistory.com

 

어차피 지금 dump file을 import하는 이유가, DB 서버가 아예 날아간 상태여서 초기 상태였고,

API Server에서 migration 한 데이터는 dump 파일에도 동일하게 있는 상태라, migration으로 생성된 데이터들을 다 삭제해도 괜찮았다.

해당 데이터베이스를 Drop하고 다시 Create해준 후, 

위 커맨드를 다시 실행하니 정상적으로 Import 된 것을 확인했다.

 

백업의 중요성을 다시한번 느꼈고.....

주기적으로 DB 백업하는 스크립트를 생성해서 별도로 관리하도록 cron job을 생성해놨다,

 

PS.

pg_dumpall은 Database 전체를 dump한다면

pg_dump는 Table별 dump가 가능하다. 좀 더 세부적으로 백업하고 싶다면 pg_dump를 활용하자.

 

 

반응형