Side Project

MySQL에서 Supabase로 마이그레이션하기

Yepchani 2024. 3. 30. 07:39

들어가며

사이드 프로젝트에서 DB 플랫폼으로 PlanetScale을 사용하고 있었는데요. 이번에 무료 플랜이 사라진다고 하여 대안인 Supabase로 마이그레이션 하게 되었습니다.

 

왜 Supabase인가

 

Supabase | The Open Source Firebase Alternative

Build production-grade applications with a Postgres database, Authentication, instant APIs, Realtime, Functions, Storage and Vector embeddings. Start for free.

supabase.com

 

Supabase is an open source Firebase alternative.
Start your project with a Postgres database, Authentication, instant APIs, Edge Functions, Realtime subscriptions, Storage, and Vector embeddings.

 

PlanetScale의 대안 중 하나로 Supabase가 꼽히는데요. PostgreSQL 기반이기도 하고, 유연성이 높다고 하여 한번 사용해보고 싶어졌습니다.

 

Supabase에서는 여러 플랜을 제공하고 있는데, 무료 플랜만 이용해도 간단한 프로젝트를 진행하기 충분한 정도라고 생각했습니다.

 

주의할 점은 무료 플랜의 경우 1주간 작업이 없을 시 DB가 비활성화되며, 최대 두 개의 프로젝트에 사용가능하다는 점입니다.

 

 

데이터베이스 백업

먼저 사용 중이던 DB 플랫폼에서 백업을 생성합니다. PlanetScale의 경우 기본적으로 daily backup이 진행되지만 임의로 백업을 생성할 수도 있습니다.

 

마이그레이션 하기

Supabase로 마이그레이션 하는 방법은 크게 두 가지가 있습니다.

  1. Google Colab의 Supabase migration tool
  2. pgloader

1번 방법은 Google Colab에 pgloader를 이용한 마이그레이션 코드를 짜놓아서 손쉽게 진행할 수 있습니다.

https://colab.research.google.com/github/mansueli/Supa-Migrate/blob/main/Amazon_RDS_to_Supabase.ipynb

 

Colab을 이용하는 경우 다음과 같이 진행합니다.

  1. Source DB 엔진 선택
  2. 환경 변수 설정
    HOST, USER, SOURCE_DB, PASSWORD, SUPABASE_URL, SUPABASE_PASSWORD
  3. 마이그레이션

Step 1. Source DB 엔진 선택

 

사용하시는 Source DB 엔진에 맞춰서 지정하고 실행합니다.

 

 

 

Step 2. 환경 변수 설정

 

각 환경 변수를 설정하고 실행합니다.

 

 

Source DB에서 필요한 환경 변수는 다음과 같습니다.

  1. 호스트
  2. 유저 이름
  3. DB 이름
  4. DB 비밀번호
  5. 포트 번호

 

Supabase에서 필요한 환경 변수는 다음과 같습니다.

  1. DB URL
  2. DB 비밀번호

 

PlanetScale의 경우, 환경 변수는 다음과 같이 확인할 수 있습니다.

 

1. 대시보드에서 Connect 버튼을 누릅니다.

 

PlanetScale Docs

 

2. Connect with 옵션 중 General을 선택합니다.

 

PlanetScale Docs

 

Supabase의 경우, 환경 변수는 다음과 같이 확인할 수 있습니다.

  1. Project settings
  2. Configuration - Database
  3. Connection string - URI

 

 

Step 3. 마이그레이션

 

1, 2번 단계를 마친 후 마이그레이션 코드를 실행하면 되는데요.

저는 코드 실행 도중 아래와 같은 에러를 만났습니다.

 

ERROR mysql: Failed to connect to mysql at "aws.connect.psdb.cloud" (port 3306) as user "lxn2cs648ferim45978d": MySQL Error [1105]: "unknown error: Code: UNAVAILABLE
server does not allow insecure connections, client must use SSL/TLS

 

서버가 안전하지 않은 연결을 허용하지 않으니, 클라이언트는 SSL/TLS를 사용해야 한다고 합니다.

 

일반적으로 URI는 다음과 같은 형태를 띠고 있는데요.

"mysql://사용자명:비밀번호@호스트명:포트번호/데이터베이스명?옵션"

옵션 부분에 보안 설정을 넣어주면 됩니다.

 

여기서 중요한 점은 pgloader에서 사용되는 옵션인 "useSSL"을 사용해주어야 합니다.

기존에 쓰이는 다른 옵션 설정은 적용이 안 되는데요. e.g. "sslaccept=strict"

올바르지 않은 옵션을 설정할 경우, 아래 에러를 만나실 수 있습니다.

FATAL Failed to parse [YOUR_URI] as a source URI.
LOG You might need to use --type.

 

DB 이름 뒤에 "?useSSL=true"를 추가해 주시면 됩니다.

 

성공적으로 작업이 완료되면 아래와 같은 로그가 나옵니다.

 

 

Supabase 대시보드 -> Database -> Tables로 들어가 보면 이전에 사용하던 DB 이름으로 새 스키마가 생성되어 있습니다.

 

 

짝짝짝

 

마치며

이렇게 MySQL에서 Supabase로의 마이그레이션을 성공적으로 마쳤습니다!

첫 마이그레이션이라 아는 게 없어서 이런저런 고생을 했지만, 그래도 방법이 간단해서 생각보다 큰 어려움은 없었던 거 같네요 :D

 

여러분은 저보다 쉽게 마이그레이션에 성공하시길 바라요..!

 

References

https://supabase.com/docs/guides/resources/migrating-to-supabase/mysql

https://planetscale.com/docs/tutorials/connect-mysql-gui

https://pgloader.readthedocs.io/en/latest/ref/mysql.html