DevOps

[MySQL] MySQL DB를 PostgreSQL DB로 마이그레이션 하는 방법

이곳느 2024. 6. 14. 14:47
반응형

업무를 하다보면 DB 데이터 및 스키마를 마이그레이션 해야하는 일이 생긴다.

비용 절감이나 여러가지 이유에서 이러한 상황이 발생하는데, 이때 마이그레이션 자동화 도구를 통해 간편하게 마이그레이션을 할 수 있다.

 

자동화 도구에는 대표적으로 여러가지가 있다

  • pgloader (이것을 사용할 예정)
  • mysql2pgsql
  • mysql2psql

ChatGPT피셜로 가장 유명한 pgloader를 이용해서 마이그레이션을 진행해 보겠다.

먼저 pgloader를 설치해야 한다

참고로 설치기기는 Mac M1 Pro 기준이다.

 

$ brew install pgloader

 

정말 간단한데 여기서 겪었던 시행착오들을 좀 설명하려고 한다.

원래 내가 생각한 플로우는

 

  1. `mysqldump` 명령어를 통해 mysql 스키마 덤프
  2. pgloader를 이용하여 dump 파일을 세팅해둔 postgreSQL로 마이그레이션

이였는데, pgloader가 dump 파일을 읽기 위해서는 과정이 쓸데없이(?) 복잡했다.

그래서 그냥 덤프파일을 버리고 pgloader가 직접 mysql 서버에 접근하여 postgreSQL로 마이그레이션 하는 방법으로 바꾸었다.

 

pgloader mysql://{MYSQL 유저}:{MYSQL 패스워드}@{MYSQL 호스트}:{포트}/{MYSQL 데이터베이스} postgresql://{PostgreSQL 유저}:{PostgreSQL 패스워드}@{PostgreSQL 호스트}:{PostgreSQL 포트}/{PostgreSQL 데이터베이스}

 

그럼 결과들을 보여주며 마이그레이션이 완료된다.

 

조금 더 세부적인 설정을 원한다면 pgloader 설정파일들로 세세하게 세팅을 만질수도 있다.

LOAD DATABASE
     FROM mysql://mysql_user:mysql_password@localhost/source_db
     INTO postgresql://postgres:비밀번호@localhost/target_db

 WITH include drop, create tables, create indexes, reset sequences, foreign keys

 SET maintenance_work_mem to '128MB',
     work_mem to '12MB',
     search_path to 'public'

 CAST type datetime to timestamptz drop default drop not null using zero-dates-to-null,
      type date drop not null drop default using zero-dates-to-null

 BEFORE LOAD DO
  $$ create schema if not exists public; $$,

 AFTER LOAD DO
  $$ grant all on schema public to postgres; $$,
  $$ analyze; $$.

지금은 기술검증 단계이기 때문에 세부적인 설정이 필요없어서 단순 마이그레이션만 진행한 상태이다.

데이터를 통째로 마이그레이션 하는 부분이기 때문에 오래걸릴 수 있다. 하지만 스키마만 마이그레이션 한다거나 특정 조건이 있다면

속도를 더 빠르게 할 수 있다.

반응형