PostgreSQL 데이터 마이그레이션 간단하게 하기

이재훈·5일 전

실무 중 간단하게 서버 구축 중 다른 테스트 서버의 DB 데이터를 마이그레이션 하는 과정을 담았다.

기존 서버에는 docker 컨테이너로 PostgreSQL이 실행중이고, 새로 구축할 서버에는 직접 설치를 하였다.

1. 데이터 dump

먼저 db dump 파일을 만들었다. sql 파일을 만들어도 되지만, dump 파일을 사용하면 아무래도 복원 속도가 빠르고, 병렬 처리가 가능하다. 테스트 서버 경우 데이터가 많지 않지만 먼저 익숙한 db dump를 떴다.

docker exec -t {container_id} pg_dump -U {id} -Fc {database_name} > dump.dump

-Fc 옵션은 Format을 custom으로 지정하는 옵션이다. 즉, 일반 텍스트가 아닌 PostgreSQL이 이해하는 바이너리 형식으로 저장을 한다.

2. dump 파일 적용

dump 파일을 만든 후에 새로 구축한 서버에 적용을 해보았다.

pg_restore -U {id} -d {database_name} --no-owner --no-privileges dump.dump

원본 소유자 정보 무시, GRANT/REVOKE 무시 옵션을 주고 적용을 하였다.

3. 그리고 에러

Segmentation fault (core dumped)

결과로 해당 에러가 나왔다. 해당 에러는 새로 만든 서버의 pg_restore 버전과 pg_dump를 사용한 서버의 버전 불일치 문제가 발생했기 때문에 이런 에러가 나온다.

역시나 16버전과 18버전의 차이로 에러가 나는 것이었다. 해결하는 방법은 여러가지가 있지만, 가장 빠르고, 간단하게 처리를 하였다.

4. 덤프 새로 뜨기 .sql

sql 파일로 만들어서 직접 적용하기로 하였다. sql을 직접 사용하는 것이기 때문에 버전 호환성이 높기 때문에 문제 없이 작동할 것이라고 생각했다.

docker exec -t {container_id} pg_dump -U postgres -Fp {database_name} > dump.sql

-Fp Format을 plan (plain SQL, 일반 텍스트), 즉 사람이 읽을 수 있는 SQL 스크립트로 덤프를 했다.

vi로 sql 파일을 열어보면 안에 읽을 수 있는 DDL 등이 있다.

5. 새로운 서버에 적용

리눅스 유저명을 먼저 변경한다. (postgresql의 유저명으로 변경한다.)

sudo -i -u {username}

이제 적용을 해준다.

psql -d {database_name} < /home/dump/dump.sql

로그가 쭈욱 뜨면서 작업이 되는 것을 확인할 수 있다. 이렇게 간단하게 데이터 마이그레이션을 마무리 했다.

버전이 다르면 sql 덤프만 사용해야 할까?

아니다.

/usr/lib/postgresql/16/pg_restore -U {id} -d {database_name} --no-owner --no-privileges dump.dump

postgreSQL에서는 다른 버전의 라이브러리도 제공하고 있다. 이렇게 하는 방법도 있다 :)

profile
부족함을 인정하고 노력하자

0개의 댓글