← 글 목록

notes

데이터베이스 백업 및 복원

데이터베이스 백업·복원 절차와 장애 대응 시 주의점 메모.


운영 중인 PostgreSQL을 DBeaver에서 백업하고 다른 DB에 복원했던 순서다. 스크린샷은 DBeaver 22 버전이라 메뉴 위치가 조금 다를 수 있다. DBeaver는 결국 내부에서 pg_dump와 pg_restore를 돌리는 거라, 맨 아래에 같은 일을 하는 명령도 같이 적어 두었다.

  • DBeaver에서 도구 → 백업으로 테이블을 고르고 Custom 형식으로 파일을 만든다.
  • 복원은 대상 DB에서 도구 → 복원으로 그 파일을 골라 돌리고, 끝나면 로그와 행 수를 확인한다.
  • 화면 뒤에서는 pg_dump -Fc와 pg_restore가 도는 거라 터미널에서도 똑같이 할 수 있다.

1. 데이터베이스 백업

  • 도구 → 백업 클릭

  • 백업할 테이블 선택 → 다음 클릭

  • 옵션 설정 → Start 클릭. Format은 Custom, Encoding은 UTF-8, 출력 폴더와 파일 이름 패턴만 맞춰 두면 된다.
  • 백업 완료 후 취소 클릭 → 백업 확인

2. 데이터베이스 복원

복원할 DB를 먼저 만들어 두고 그 DB에서 메뉴를 연다. 다른 DB에서 열면 엉뚱한 곳에 테이블이 쌓인다.

  • 도구 → 복원 클릭

  • 백업 파일 경로 설정, 옵션 선택 → Start 클릭. 기존 테이블을 지우고 다시 만들려면 Clean 옵션을 켜는데, 운영 DB에서는 두 번 확인하고 켠다.

  • 복원 완료 후 취소 클릭 → 복원 확인. 로그 끝에 errors ignored on restore 같은 줄이 뜨면 대부분 이미 있던 스키마나 권한 때문이라, 테이블 행 수까지 맞는지 본다.

3. 터미널에서 할 때

서버에서 cron으로 돌리거나 GUI가 없을 때는 명령으로 한다. 형식을 뭘로 떠냐에 따라 복원 도구가 달라진다.

나는 거의 Custom(-Fc)만 쓴다. 파일 하나로 끝나고, 필요한 테이블만 골라서 복원할 수 있어서다.

pg_dump / pg_restore 명령
# 백업 (Custom 형식)
pg_dump -h 127.0.0.1 -U postgres -d mydb -Fc -f dump-mydb-$(date +%Y%m%d).backup

# 테이블 하나만
pg_dump -h 127.0.0.1 -U postgres -d mydb -Fc -t public."KSAgree" -f agree.backup

# 복원 대상 DB 만들기
createdb -h 127.0.0.1 -U postgres mydb_restore

# 복원 (기존 객체 지우고 다시 만들려면 --clean --if-exists)
pg_restore -h 127.0.0.1 -U postgres -d mydb_restore --no-owner dump-mydb-20221211.backup

# Plain SQL로 떠서 psql로 넣기
pg_dump -h 127.0.0.1 -U postgres -d mydb > mydb.sql
psql -h 127.0.0.1 -U postgres -d mydb_restore < mydb.sql

다른 서버로 옮길 때는 버전을 꼭 본다. pg_restore는 자기보다 새 버전 pg_dump로 만든 파일을 못 읽는다. 소유자 계정이 다르면 --no-owner를 붙여야 권한 에러가 안 쌓인다.