---
title: "PostgreSQL 덤프를 다른 버전으로"
description: "PostgreSQL 10 이상의 pg_dump 파일을 PostgreSQL 13~18에서 불러와지는 스크립트로 변환. 같은 테이블, 키, 데이터와 모든 변경 보고서."
canonical: https://intosql.com/ko/postgresql-to-postgresql
last_updated: 2026-10-15
---

# PostgreSQL 덤프를 다른 버전으로

pg_dump나 pg_dumpall의 일반 덤프(.sql 또는 .sql.gz)를 놓으면, 어느 버전이 쓴 덤프든 PostgreSQL 13~18에서 불러와지는 스크립트 하나를 받아요. IDENTITY, enum, 배열, jsonb는 그대로이고, 확장 기능의 타입은 텍스트가 되며, 모든 변경은 보고서에 나와요.

[PostgreSQL에서 PostgreSQL로 마이그레이션 가이드](https://intosql.com/docs/migrations/postgresql-to-postgresql)

[PostgreSQL에서 PostgreSQL로의 데이터 타입](https://intosql.com/docs/types/postgresql-to-postgresql)

## 파일과 스크립트에서 바뀌는 점

각 행은 변환기가 적용하는 규칙이며, 규칙이 데이터를 바꿀 때 보고서에 쓰는 줄이 함께 나와요.

| 파일에서 | 스크립트에서 | 보고서 줄 |
| --- | --- | --- |
| varchar(n), char(n), text | 같은 타입 |  |
| numeric(p,s), numeric without a precision, NaN and Infinity | 같은 타입과 값 |  |
| money | numeric(19,2) | `type_replaced` |
| enum types | 같은 enum 타입, 테이블보다 먼저 만듦 |  |
| enum columns holding values outside their labels | 체크 제약 없는 text | `enum_check_skipped` |
| composite and range types the dump defines, extension types (citext, hstore, ltree, PostGIS) and multiranges | PostgreSQL의 텍스트를 담은 text | `type_replaced` |
| citext | text, 정확히 비교 | `case_insensitive_collation` |
| json, jsonb | 같은 타입 |  |
| timestamp with time zone | timestamptz, 같은 시점 |  |
| time, time with time zone | 같은 타입 |  |
| infinity, -infinity and BC dates | 유지 |  |
| NaN and Infinity in numeric, real and double precision | 유지 |  |
| generated columns | 같은 생성 열 |  |
| generated columns with functions IntoSQL doesn't write | 값을 담은 일반 열 | `generated_not_translated` |
| defaults with functions IntoSQL doesn't write | 기본값 없음 | `default_not_translated` |
| CHECK constraints with functions IntoSQL doesn't write | 만들지 않음 | `check_skipped` |
| CHECK ... NOT VALID | 행 다음에 NOT VALID로 추가 |  |
| gin, gist, brin and hash indexes, partial and expression indexes | 만들지 않음 | `index_skipped` |
| foreign keys to tables the dump doesn't create | 만들지 않음 | `foreign_key_skipped` |
| NOT NULL columns with values that become NULL | NOT NULL 제거 | `not_null_relaxed` |
| partitioned tables | 모든 파티션의 행을 담은 하나의 테이블 | `partitions_dropped` |
| views, functions, procedures, triggers, rules, policies, extensions and types other than enums | 보고서에 나열 | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | 값으로 판단한 타입 | `no_schema` |
| expressions in INSERT values | NULL | `expression_value` |
| types IntoSQL doesn't know | text | `unknown_type` |
| text that isn't valid in its encoding | 잘못된 바이트를 대체 문자로 | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | 그대로 복사 | `mojibake_suspected` |

## 스크립트를 PostgreSQL에 불러오기

스크립트는 테이블을 만들고 행을 복사한 다음 키, 인덱스, 외래 키를 추가해요. 그래서 빨리 불러오고 첫 오류에서 멈춰요.

```shell
psql -v ON_ERROR_STOP=1 -d mydb -f postgresql.postgresql.sql
```

외래 키는 NOT VALID로 추가한 다음 검증해요. 어떤 행이 존재하지 않는 행을 가리키면, 중간에 실패하지 않고 어떤 제약인지 알려 줘요.

큰 덤프는 데이터베이스를 먼저 만들고, 서버와 같은 컴퓨터에서 psql로 스크립트를 실행하세요.

IntoSQL Pro는 데스크톱 앱이나 명령줄에서 파일을 PostgreSQL에 바로 불러와요. 스크립트를 따로 만들 필요가 없어요.

## 좋은 결과를 위한 PostgreSQL 덤프 방법

변환기는 덤프에 담긴 내용을 읽어요. 다음 옵션을 쓰면 더 많은 데이터가 덤프에 남아요:

- pg_dump의 기본값인 --format=plain은 SQL을 써요. custom 또는 directory 아카이브(-Fc, -Fd)는 데이터베이스 서버 없이 pg_restore -f dump.sql로 SQL이 돼요.
- --no-owner --no-privileges는 어차피 변환기가 건너뛰는 역할과 권한을 빼서 덤프가 작아져요.
- pg_dumpall은 모든 데이터베이스를 한 파일에 덤프해요. 각 데이터베이스의 테이블 이름에 그 데이터베이스 이름이 붙어서 충돌하지 않아요.

## 변환되지 않는 것

뷰, 트리거, 프로시저, 함수 등 PostgreSQL 자체 언어로 작성된 객체는 몰래 빠지지 않고 보고서에 이름으로 나와요. 불러올 PostgreSQL 버전에서 확인한 뒤 다시 만들 수 있어요.

## PostgreSQL 버전 간 이동 질문

### 덤프가 업로드되나요?

아니요. 변환기는 브라우저에서 실행되고 디스크의 덤프를 조각조각 읽으므로, 덤프가 컴퓨터 밖으로 나가지 않아요. 데스크톱 앱과 명령줄도 컴퓨터에서 변환해요.

### 덤프는 얼마나 커도 되나요?

변환기는 덤프 전체를 메모리에 올리지 않아요. 파일을 범위별로 두 번 읽고, 읽는 대로 스크립트를 써요. 수 GB 덤프도 브라우저, 데스크톱 앱, 명령줄에서 변환돼요.

### pg_dump -Fc 아카이브도 읽나요?

직접은 읽지 않아요. custom 아카이브는 바이너리 형식이에요. pg_restore -f dump.sql dump.backup을 실행하면 서버에 연결하지 않고 변환기가 읽는 일반 SQL로 바뀌어요. 아카이브를 받으면 변환기가 이렇게 알려 줘요.

### 어떤 PostgreSQL 버전의 덤프를 읽나요?

PostgreSQL 10 이상에서 pg_dump와 pg_dumpall로 만든, COPY 또는 INSERT 행이 담긴 덤프예요. 모든 테스트 덤프는 PostgreSQL 13과 18에서 만들고 원본과 셀 단위로 비교해요.

### serial과 identity 값은 유지되나요?

네. serial과 identity 열은 identity 열로 남고, 모든 행은 id를 유지해요. 각 카운터는 덤프의 시퀀스가 도달한 값부터 이어져요.

### 배열, enum 등 PostgreSQL 타입은 어떻게 되나요?

money를 빼면 배열, 범위, json과 jsonb, 비트 문자열은 그대로예요. enum 타입은 레이블과 함께 다시 만들어요. 확장이 제공하는 타입(citext, hstore, PostGIS)과 복합 타입은 텍스트가 되고, 보고서에 어떤 열인지 나와요.

### 함수, 트리거, 뷰는 어떻게 되나요?

변환하지 않고 보고서에 이름으로 나열하므로, 테이블을 불러온 뒤 다시 만들 수 있어요. NOT VALID 체크 제약은 행 다음에 여전히 NOT VALID 상태로 추가해요.

### 스크립트는 어떤 PostgreSQL 버전에서 불러올 수 있나요?

덤프를 만든 버전과 상관없이 PostgreSQL 13부터 18까지예요. 모든 버전에서 같은 스크립트를 불러올 수 있고, 문제가 생기면 첫 오류에서 멈춰요.

## PostgreSQL에서

- [PostgreSQL에서 MySQL로](https://intosql.com/ko/postgresql-to-mysql)
- [PostgreSQL에서 MariaDB로](https://intosql.com/ko/postgresql-to-mariadb)
- [PostgreSQL에서 SQLite로](https://intosql.com/ko/postgresql-to-sqlite)
- [PostgreSQL에서 SQL Server로](https://intosql.com/ko/postgresql-to-sql-server)
- [PostgreSQL에서 Oracle로](https://intosql.com/ko/postgresql-to-oracle)

## PostgreSQL로

- [MySQL에서 PostgreSQL로](https://intosql.com/ko/mysql-to-postgresql)
- [MariaDB에서 PostgreSQL로](https://intosql.com/ko/mariadb-to-postgresql)
- [SQL Server에서 PostgreSQL로](https://intosql.com/ko/sql-server-to-postgresql)
- [SQLite에서 PostgreSQL로](https://intosql.com/ko/sqlite-to-postgresql)
- [Oracle에서 PostgreSQL로](https://intosql.com/ko/oracle-to-postgresql)

## 가이드와 모든 조합

- [PostgreSQL에서 PostgreSQL로 마이그레이션 가이드](https://intosql.com/docs/migrations/postgresql-to-postgresql)
- [PostgreSQL에서 PostgreSQL로의 데이터 타입](https://intosql.com/docs/types/postgresql-to-postgresql)
- [모든 데이터베이스 조합](https://intosql.com/ko/database-migration)
