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 옵션을 사용하면 기존 데이터를 삭제하고 복구할 수 있지만 주의가 필요합니다.
- 가장 안전한 방법은 새로운 데이터베이스에 먼저 복원 후 기존 데이터와 비교하는 방식입니다.
반응형
'Coding > 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 |