PostgreSQL에서 기존 데이터가 있는 상태에서 복원하기

2025. 2. 23. 23:30·개발 (Development)/PostgreSQL

PostgreSQL에서 기존 데이터가 있는 상태에서 .tar 형식의 백업 파일을 pg_restore 명령어로 복원하면 여러 가지 상황이 발생할 수 있습니다. 데이터 충돌을 방지하고 안전하게 복원하는 방법은 아래와 같습니다.

1. .tar 백업 파일 복원 방법

1.1 기존 데이터를 유지하면서 복원 (추가/병합)

pg_restore -U username -d dbname backup.tar
  • 기본적으로 기존 데이터는 유지되며, 백업된 데이터가 추가됩니다.
  • 동일한 PRIMARY KEY나 UNIQUE 값이 있는 경우 오류가 발생할 수 있습니다.

1.2 기존 데이터를 삭제하고 복원 (초기화 후 복원)

기존 테이블/데이터 삭제 후 복구 (--clean 옵션)

pg_restore -U username -d dbname --clean backup.tar
  • 기존 테이블과 데이터를 삭제한 후 복원합니다.
  • DROP TABLE 등의 명령어가 실행되므로 데이터가 완전히 초기화됩니다.

데이터베이스 전체 삭제 후 복구

dropdb dbname
createdb dbname
pg_restore -U username -d dbname backup.tar
  • 데이터베이스를 완전히 삭제한 후 다시 생성하여 복구하는 방식입니다.
  • 기존 데이터와 충돌할 위험이 없습니다.

2. 특정 데이터만 복원하는 방법

.tar 형식의 백업은 pg_restore -l 옵션을 사용하여 내부 내용을 확인할 수 있습니다.

pg_restore -l backup.tar

출력 예시:

1; 3079 TABLE public.users
2; 3080 TABLE public.orders
3; 3081 SEQUENCE public.orders_id_seq

이제 특정 테이블만 복원할 수도 있습니다.

2.1 특정 테이블만 복원

pg_restore -U username -d dbname -t users backup.tar
  • 특정 테이블(users)만 복원할 수 있습니다.

2.2 테이블 구조만 복원 (--schema-only 옵션)

pg_restore -U username -d dbname --schema-only backup.tar
  • 테이블 구조(DDL)만 복원하고 데이터는 삽입하지 않습니다.

2.3 데이터만 복원 (--data-only 옵션)

pg_restore -U username -d dbname --data-only backup.tar
  • 기존 테이블 구조는 유지하고 데이터만 추가합니다.
  • 중복된 데이터가 있을 경우 오류가 발생할 수 있습니다.

3. 기존 데이터 보호 및 안전한 복구 방법

기존 데이터가 있는 상태에서 .tar 백업을 안전하게 복원하려면 다음 방법을 고려하세요.

3.1 새로운 데이터베이스에 먼저 복원한 후 비교

createdb new_db
pg_restore -U username -d new_db backup.tar
  • 새로운 데이터베이스에 복원한 후, 기존 데이터와 비교하여 필요한 데이터만 병합합니다.

3.2 트랜잭션을 활용하여 시뮬레이션

BEGIN;
pg_restore -U username -d dbname --data-only backup.tar;
ROLLBACK;  # 문제가 없으면 ROLLBACK 대신 COMMIT 실행
  • 실행 후 문제가 없을 경우 COMMIT;을 실행합니다.

3.3 중복 데이터를 방지하기 위해 ON CONFLICT 전략 적용

  • INSERT ... ON CONFLICT DO NOTHING 또는 DO UPDATE를 활용하여 중복을 방지합니다.

결론

  • .tar 백업을 복구하면 기존 데이터가 유지되지만, 중복된 데이터가 있으면 충돌이 발생할 수 있습니다.
  • --clean 옵션을 사용하면 기존 데이터를 삭제하고 복구할 수 있지만 주의가 필요합니다.
  • 가장 안전한 방법은 새로운 데이터베이스에 먼저 복원 후 기존 데이터와 비교하는 방식입니다.
반응형

'개발 (Development) > PostgreSQL' 카테고리의 다른 글

[PostgreSQL] 요소 별 최신 데이터 조회하기  (0) 2025.03.22
[PostgreSQL] PostgreSQL에서 특정 값의 존재 여부 확인하여 조회하기  (0) 2025.03.16
[PostgreSQL] SQL Error Handling  (0) 2025.02.23
[PostgreSQL] JSON 컬럼에서 Key-Value 추출 및 MyBatis 연동  (0) 2025.02.23
[PostgreSQL/TimescaleDB] Hypertable과 Chunk를 포함한 최소 크기 덤프 방법  (0) 2025.02.17
'개발 (Development)/PostgreSQL' 카테고리의 다른 글
  • [PostgreSQL] 요소 별 최신 데이터 조회하기
  • [PostgreSQL] PostgreSQL에서 특정 값의 존재 여부 확인하여 조회하기
  • [PostgreSQL] SQL Error Handling
  • [PostgreSQL] JSON 컬럼에서 Key-Value 추출 및 MyBatis 연동
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (235)
      • 개발 (Development) (168)
        • Algorithm (1)
        • Angular (1)
        • AWS (7)
        • DeepSeek (2)
        • Docker (7)
        • Git (3)
        • Java (34)
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (7)
        • PostgreSQL (38)
        • Python (33)
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (11)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (12)
      • 기타 (Others) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Linux
    docker
    Kubernetes
    오답노트
    파이썬
    pandas
    MyBatis
    DevOps
    자바
    데이터분석
    JSON
    PostgreSQL
    Linux master
    Vue.js
    javascript
    백준
    리눅스 마스터 2급 2차
    deepseek
    java
    AWS
    백준자바
    Kafka
    springboot
    python
    ADsP
    리눅스 마스터 2급
    JPA
    timescaledb
    백준알고리즘
    백준온라인저지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
PostgreSQL에서 기존 데이터가 있는 상태에서 복원하기
상단으로

티스토리툴바