CodeGym /행동 /SQL SELF /pg_restore로 데이터 복구하기

pg_restore로 데이터 복구하기

SQL SELF
레벨 43 , 레슨 3
사용 가능

너가 데이터베이스 관리자라면 백업을 만들고 나서 진짜 중요한 순간이 오지: 바로 데이터 복구! 이때 등장하는 주인공이 바로 pg_restore 명령어야. pg_dump가 백업을 만드는 슈퍼히어로였다면, pg_restore는 그 파트너로, 만들어진 백업에서 데이터를 다시 살려내는 역할을 해.

pg_restorepg_dump로 만든 바이너리 포맷(custom이나 directory)의 파일에서 데이터를 복구할 때 써. 만약 데이터베이스가 망가졌거나, 데이터를 새 서버로 옮기고 싶을 때 이 도구가 진짜 든든한 친구가 될 거야.

pg_restore가 필요한 이유:

  • 전체 데이터베이스뿐만 아니라, 스키마, 테이블, 데이터 등 개별 컴포넌트만 복구할 수도 있어.
  • 복구 과정을 세밀하게 컨트롤할 수 있어서 복잡한 복구 시나리오에 딱이야.

기본 명령어 문법

pg_restore를 쓸 때는 기본적으로 이런 식으로 명령어를 입력해:

pg_restore -U username -d database_name backup_file.dump

명령어 옵션 설명:

  • -U username: PostgreSQL에 접속할 때 쓸 유저 이름이야.
  • -d database_name: 데이터를 복구할 데이터베이스 이름.
  • backup_file.dump: pg_dumpcustom이나 directory 포맷으로 만든 백업 파일.

예를 들어, postgres 유저로 backup.dump 파일에서 university 데이터베이스를 복구하고 싶으면 이렇게 하면 돼:

pg_restore -U postgres -d university backup.dump

이 명령어를 실행하면 pg_restore가 복구를 시작해서 데이터를 데이터베이스에 넣어줄 거야!

백업 타입과 호환성

모든 백업이 똑같이 만들어지는 건 아니야. pg_dump로 백업을 만들 때 여러 포맷을 고를 수 있었던 거 기억나지? 그 중 일부만 pg_restore에서 쓸 수 있고, 나머지는 안 돼.

백업 포맷 설명 pg_restore 지원 여부
plain (텍스트) 복구 명령어가 들어있는 SQL 스크립트야. ❌ 아니
custom PostgreSQL 전용 포맷으로 압축된 백업이야. ✅ 응
directory 여러 파일로 저장된 디렉토리 형태의 백업이야. ✅ 응
tar TAR 포맷의 아카이브야. ✅ 응

텍스트 백업(plain)은 절대 pg_restore로 복구할 수 없어. 이런 파일은 psql 명령어로 직접 복구해야 해. 예를 들면:

psql -U username -d database_name -f backup.sql

pg_restore의 유연함: 복구 옵션

pg_restore가 인기 많은 이유 중 하나는 바로 유연함이야. 전체 데이터베이스뿐만 아니라, 원하는 부분만 골라서 복구할 수 있거든.

데이터 구조만 복구하기. 만약 데이터베이스 구조(테이블 스키마, 인덱스, 트리거 등)만 복구하고 싶으면 --schema-only 옵션을 써봐:

pg_restore -U postgres -d university --schema-only backup.dump

이건 데이터베이스 구조만 분석하거나 "빈" 복사본을 만들고 싶을 때 유용해.

데이터만 복구하기. 구조는 이미 있고, 데이터만 복구하고 싶으면 --data-only 옵션을 써:

pg_restore -U postgres -d university --data-only backup.dump

이렇게 하면 테이블 구조는 그대로 두고, 내용만 복구할 수 있어.

복구 전에 비우기. 가끔 이미 테이블이나 스키마가 데이터베이스에 있을 때가 있지. 복구 전에 지우고 싶으면 --clean 옵션을 써:

pg_restore -U postgres -d university --clean backup.dump

이 옵션을 쓰면 pg_restore가 먼저 기존 객체를 지우고, 그 다음에 백업에서 데이터를 복구해.

객체 필터링. pg_restore는 백업에서 원하는 객체만 골라서 복구할 수도 있어. --table 옵션을 써봐:

pg_restore -U postgres -d university --table=students backup.dump

이 예시는 students 테이블만 복구하는 거야.

SQL을 콘솔에 출력하기

복구할 때 실제로 어떤 SQL이 실행되는지 미리 보고 싶고, 바로 데이터베이스를 바꾸고 싶지 않으면 --list 옵션을 써봐:

pg_restore -l backup.dump

그리고 실행될 SQL 명령어를 텍스트로 보고 싶으면 --verbose를 추가해:

pg_restore -U postgres --verbose --schema-only backup.dump

복구 예시

  1. 전체 데이터베이스 복구하기.

가장 흔한 시나리오: 백업에서 데이터베이스 전체를 복구하고 싶을 때:

pg_restore -U postgres -d university backup.dump
  1. 특정 테이블만 복구하기.

예를 들어, courses 테이블 데이터만 날아갔다면, 그 테이블만 따로 복구할 수 있어:

pg_restore -U postgres -d university --table=courses backup.dump
  1. 데이터베이스 스키마만 복구하기.

테이블 구조만 복구하고 싶으면 이렇게 해:

pg_restore -U postgres -d university --schema-only backup.dump
  1. 객체를 새로 만들면서 복구하기.

기존 데이터를 덮어쓰고 싶으면:

pg_restore -U postgres -d university --clean backup.dump

복구할 때 자주 나오는 실수와 예방법

  • 버전 호환성 문제. 한 버전의 PostgreSQL에서 백업을 만들고, 다른(특히 더 옛날) 버전에서 복구하려고 하면 호환성 에러가 날 수 있어. 해결법: 백업 만들 때랑 복구할 때 같은 버전의 PostgreSQL을 쓰는 게 좋아.

  • "Role does not exist" 에러. 백업에 없는 역할(유저)이 쓰였는데, 복구 서버에 그 역할이 없으면 이 에러가 떠. 해결법: 미리 필요한 역할을 새 서버에 만들어 둬.

  • "Table already exists" 에러. 이미 있는 테이블을 복구하려고 하면 이 에러가 나와. --clean 옵션을 써서 충돌을 피할 수 있어.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION