본문 바로가기
DB/Postgresql

Postgresql DB 백업 및 복구하여 서버 이전하는 방법

by 권세희 2026. 1. 10.

우선 백업 서버가 따로 있고 백업서버에서 DB서버를 접속해서 백업서버의 postgres 클라이언트로 pg_dump를 백업 파일을 생성하는 경우에는 백업 및 복구는 낮은 버전에서 높은 버전은 불가능하다.

ex) postgres 16 버전의 데이터베이스를 백업 서버의 14 버전 pg_dump을 통해서 백업 불가

이럴 경우엔 백업 서버에서 postgres 16 버전의 클라이언트를 새로 깔면 된다.

 

DB 백업 파일은 전체 백업과 특정 DB의 백업으로 구분된다.

Postgresql은 pg_dump와 pg_dumpall을 통해서 백업 가능하며, 증분백업이 불가능하다.

 

백업 파일 생성 방법

1. pg_dumpall을 사용하여 cluster 전체의 글로벌 객체(사용자, 권한, tablespace)를 먼저 백업하는 globals-only 백업 필요

2. 특정 DB을 백업하는 경우 pg_dump 사용

백업파일 용량이 크면 파일 압축을 해서 백업을 한다.

 

백업 파일 복구 방법

1. Role 복구

psql -U postgres -f roles.sql

2. DB 복구

대상DB만 없다면 대상DB를 생성한 뒤 DB 복구한다.

psql -U postgres -d 대상DB -f backup.sql

psql이나 pg_restore을 사용한다.

15GB 데이터 복구 시 20분 정도 소요되며, 14버전의 스키마와 데이터를 16버전으로 복구했을때 특이사항은 없었다.

 

Troubleshooting

ROLE 복구 시 주의할 점

1)

오류코드: ERROR: role "existing_role" already exists

-> 백업 파일 복구 시 기존 role이 있다면 에러코드가 나오고 복구할 때 role 생성하지 않는다. (기존 role의 권한/속성 자체는 안 바뀜)

but, 아래 ALTER문으로 role의 비밀번호가 바뀔수있다.

ALTER ROLE ex WITH NOSUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS PASSWORD 'XXXXXXXXXXX';

해결방법:  --no-role-passwords로 globals 다시 뜨거나 OR 수동으로 기존 Role의 비밀번호를 ALTER 문을 없앤다.

 

2)

오류 코드: ERROR: require a VALID UNTIL option

원인: credcheck extension 설정으로 인해 CREATE ROLE 시 에러 발생

해결방법:  해당 세션에서만 credcheck 비활성화

SET credcheck.password_valid_until = 0;
SET credcheck.password_valid_max = 0;

 

시스템상 영구 적용이기에 추천하지 않는 방법이다.

ALTER SYSTEM SET credcheck.password_valid_until = 0;
ALTER SYSTEM SET credcheck.password_valid_max = 0;
SELECT pg_reload_conf();