---
title: "브라우저에서 PostgreSQL을(를) MySQL로 마이그레이션"
description: "PostgreSQL 데이터베이스를 MySQL로 마이그레이션. pg_dump 파일을 같은 테이블, 키, 데이터의 스크립트로 바꾸고 모든 변경을 보고해요."
canonical: https://intosql.com/ko/postgresql-to-mysql
last_updated: 2026-10-15
---

# 브라우저에서 PostgreSQL을(를) MySQL로 마이그레이션

pg_dump나 pg_dumpall로 만든 .sql 또는 .sql.gz 일반 덤프를 놓으면, 같은 테이블, 키, 인덱스, 데이터를 담은 MySQL 스크립트를 다운로드할 수 있어요. MySQL이(가) 그대로 담을 수 없는 값과 옮기지 않는 객체는 모두 보고서에 나와요.

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

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

## PostgreSQL에서 MySQL로 바뀌는 점

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

| PostgreSQL에서 | MySQL에서 | 보고서 줄 |
| --- | --- | --- |
| boolean | tinyint(1) |  |
| varchar(n), char(n), text | 1024자까지는 varchar(n), 255자까지는 char(n), 그 이상은 text |  |
| numeric(p,s) past 65 digits or 30 decimals, and numeric values past what decimal(65,30) holds | varchar | `decimal_as_text` |
| money | decimal(19,2) | `type_replaced` |
| interval | PostgreSQL의 텍스트를 담은 varchar(100) | `type_replaced` |
| arrays (integer[], text[]...) | json 배열 | `type_replaced` |
| ranges, geometric types, tsvector, xml, hstore, composite and extension types | PostgreSQL의 텍스트를 담은 longtext | `type_replaced` |
| json, jsonb | json |  |
| timestamp | datetime(p) |  |
| timestamp with time zone | UTC 기준 datetime(p) | `moments_as_utc` |
| time | time(p) |  |
| infinity, -infinity, BC dates and years past 9999 | NULL | `date_out_of_range` |
| NaN and Infinity in numeric, real and double precision | NULL | `invalid_value_null` |
| NOT NULL columns with values that become NULL | NOT NULL 제거 | `not_null_relaxed` |
| enum types | 같은 레이블의 enum(...) |  |
| uuid, inet, cidr | uuid는 char(36), inet과 cidr은 varchar(43) |  |
| bytea | blob, mediumblob 또는 longblob, 키에서는 varbinary(3072) |  |
| bit(n) | 64까지는 bit(n), 그 이상은 텍스트 |  |
| citext and nondeterministic collations | 정확한 비교 | `case_insensitive_collation` |
| serial, identity | AUTO_INCREMENT, 가장 큰 id 다음부터 이어짐 |  |
| a second serial or identity column in a table | 일반 정수 | `counter_dropped` |
| sequences not owned by a column | 만들지 않음 | `sequence_not_converted` |
| generated columns | 원본처럼 STORED인 생성 열 |  |
| generated columns with functions MySQL lacks | 일반 열 | `generated_not_translated` |
| defaults with functions MySQL lacks, and defaults from a sequence | 기본값 없음 | `default_not_translated` |
| CHECK constraints | 변환해서 CREATE TABLE 안에 인라인으로 |  |
| CHECK constraints with functions MySQL lacks | 만들지 않음 | `check_skipped` |
| CHECK ... NOT VALID | 만들지 않음 | `check_not_valid` |
| gin, gist, brin and hash indexes, partial and expression indexes | 만들지 않음 | `index_skipped` |
| foreign keys | 외래 키, FOREIGN_KEY_CHECKS=0으로 불러옴 |  |
| foreign keys to tables the dump doesn't create | 만들지 않음 | `foreign_key_skipped` |
| partitioned tables | 모든 파티션의 행을 담은 하나의 테이블 | `partitions_dropped` |
| schemas | 하나의 데이터베이스, 테이블 이름 앞에 스키마 이름 | `schemas_merged` |
| views, functions, procedures, triggers, rules, policies, extensions and types | 보고서에 나열 | `not_converted_objects` |
| dumps without CREATE TABLE (--data-only) | 값으로 판단한 타입 | `no_schema` |
| expressions in INSERT values | NULL | `expression_value` |
| types IntoSQL doesn't know | longtext | `unknown_type` |
| text that isn't valid in its encoding | 잘못된 바이트를 대체 문자로 | `invalid_utf8_replaced` |
| text decoded twice (Ã±) | 그대로 복사 | `mojibake_suspected` |

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

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

```shell
mysql --default-character-set=utf8mb4 mydb < postgresql.mysql.sql
```

외래 키는 덤프에 선언된 대로 만들고, 행을 불러오는 동안 FOREIGN_KEY_CHECKS=0을 써요. 그래서 존재하지 않는 행을 가리키는 행이 있어도 불러오기가 멈추지 않아요.

큰 덤프는 서버와 같은 컴퓨터에서 클라이언트를 실행하고, 한 행이 아주 크면 max_allowed_packet을 늘리세요.

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

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

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

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

## 변환되지 않는 것

뷰, 구체화된 뷰, 함수, 프로시저, 트리거, 규칙, 행 보안 정책, 확장, 타입은 PostgreSQL의 자체 언어로 작성돼요. 보고서에 이름으로 나열되고 몰래 빠지는 일은 없으므로, MySQL에 맞게 다시 작성할 수 있어요.

## PostgreSQL에서 MySQL로 변환에 관한 질문

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

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

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

변환기는 덤프 전체를 메모리에 올리지 않아요. 파일을 범위별로 두 번 읽고, 읽는 대로 스크립트를 써요. 수 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 열은 AUTO_INCREMENT가 되고 가장 큰 id 다음부터 이어져요. MySQL은(는) 테이블마다 한 열만 번호를 매기므로 다른 열은 카운터 없이 값을 유지하고, 보고서에 그렇게 나와요.

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

배열은 JSON 배열, boolean은 tinyint(1), enum은 같은 레이블의 ENUM, money는 decimal이 돼요. 범위, 기하 타입, hstore, 복합 타입은 PostgreSQL의 텍스트를 유지하고, 보고서에 어떤 열인지 나와요.

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

데이터베이스마다 자체 언어로 작성하므로 변환하지 않고 보고서에 이름으로 나열해요.

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

MySQL 5.7 이상이에요. 모든 테스트 덤프를 5.7과 9에서 불러오며, 문제가 생기면 첫 오류에서 멈춰요.

## PostgreSQL에서

- [PostgreSQL에서 PostgreSQL로](https://intosql.com/ko/postgresql-to-postgresql)
- [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)

## MySQL로

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

## 가이드와 모든 조합

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