티스토리 뷰

DB

[pgloader] mariadb to postgres migration

Mr.Ban 2024. 4. 26. 14:53

mariadb → postgresmigration 할 일이 생겼다.

migration에 필요한 패키지는 pgloader 이다. pgloader를 설치하여 migration을 진행한다.

pgloader 공식 문서를 보면 linux apt 로 설치하라는 안내가 있어서 windows에서 실행하기 위해

docker image를 활용하여 진행하였다.

✔️ linux 사용자라면 apt-get 으로 설치해서 진행하면 된다!

✔️ 아래에서 진행되는 내용은 docker 를 통해서 진행되지만 pgloader 명령어 부분만 참조하여 동일하게 진행하면 된다!

✔️ mysql도 동일하게 진행하면 된다.

docker image 활용 예제

dimitri/pgloader 도커 이미지를 활용하여 진행한다.

CLI

pgloader 명령어에 인자를 넘겨줘서 수행한다.

# --with 절: 테이블, 컬럼등의 이름에 대소문자 구분을 위해 추가하였다.
# <format>://<userId>:<userPw>@<ip>:<port>/<DB>
docker run --rm -it dimitri/pgloader:latest \
 pgloader --with "quote identifiers" \
 mysql://rootId:rootPwd@10.3.192.242:3306/SCS \
 pgsql://postgresId:rootPwd@10.3.92.91:5432/postgres

생각보다 간단하다. 두개의 DB connection 정보와 옵션정보를 통해서 migration하면 된다.

다양한 옵션도 있으니 공식문서에서 확인하길 바란다.

CLI 관련 인자 정보: https://pgloader.readthedocs.io/en/latest/pgloader.html

⚠️ ‘\’ (multiline command) 가 정상 동작하지 않으면 한 줄로 작성하길 바란다. (git bash에서 동작하지 않음…)

✔️ mariadb도 mysql format을 사용한다.

With load file

load file을 통해서 pgloader 를 실행할 수 있다.

load file을 활용하면 다양한 정보들을 명시적으로 설정하여 관리할 수 있다.

기본 temlplate 정보

https://pgloader.readthedocs.io/en/latest/ref/mssql.html#using-advanced-options-and-a-load-command-file

mig.load

LOAD database
     FROM mysql://root:rootPwd!@10.3.192.2:3306/SCS
     INTO postgresql://postgres:postgres1!@10.3.92.3:5432/postgres 

 WITH quote identifiers, include drop, create tables, no truncate,
      create indexes, reset sequences, foreign keys

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

 CAST type longtext to jsonb

 ALTER SCHEMA 'SCS' RENAME TO 'DMS';

내가 추가로 설정한 부분은 WITH 절에 quote identifiers , CAST type longtext to jsonb, ALTER SCHEMA ~

부분이다. 테이블, 컬럼등의 이름 대소문자 구분, type 변경, Schema 명 변경을 위해 사용하였다.

상세 옵션 정보

https://pgloader.readthedocs.io/en/latest/ref/mysql.html#mysql-database-migration-options-with

이제 해당 파일로 pgloader를 실행하자.

# powershell을 이용하여 volume 바인딩을 하여 mig.load를 참조하게끔 하였음
# -v: volume, -w: working directory
docker run -v $pwd/:/data -w /data --rm -it dimitri/pgloader:latest \
pgloader mig.load

출력 결과

여담

docker 컨테이너로 진행할 때 실수해서 해멨던게 있는데, DB IP로 localhost를 적은 것이다.

docker run --rm -it dimitri/pgloader:latest \
 pgloader --with "quote identifiers" \ 
 mysql://rootId:rootPwd@10.3.192.242:3306/SCS \ 
 pgsql://postgresId:rootPwd@localhost:5432/postgres

그런데 왠걸 에러가 나는 것이다. 내 컴퓨터 5432 포트에 분명히 설치되어있는데 말이다...

그런데 생각해보니 도커 컨테이너 내부에서 실행되는 명령어라는 점을 간과 했다. 즉 저  localhost는

컨테이너 ip 주소이다. 😲

참 바보 같은 짓으로 다른게 잘못 됬나 하면서 30분을 날렸는데, 다른 분들은 안그랬으면 좋겠다 😂

'DB' 카테고리의 다른 글

[DB] PK 컬럼 ID Vs Seqeunce  (0) 2024.07.13
댓글