Postgresql -> Postgresql migrations

0. 환경
- Postgresql 9.6
- Django 1.11
- AWS RDS
- ubuntu 16.04

1. 상황
- AWS RDS + postgresql의 데이터만 개인서버 + postgresql로 이전해야 함
- 개인 서버에 테이블은 이미 만들어져 있음

2. 데이터 이전

2-1) [시도 1] 전체 pg_dump (logical dump)
(개인서버에서)

2-1-1) sql로 데이터 복사 붙여넣기
--file=FILEPATH --column-inserts --data-only --host=HOST --port=5432 --username=USERNMAE

psql DATABASENAME < FILEPATH

=> foreign key constraint 때문에 insert가 안되는 문제 발생

2-1-2) foreign key constraint를 무시할 수 있는가?
SET session_replication_role = 'replica';
로 trigger를 끌 수 있다 하여 시도하였으나 실패

[시도 2] 전체 pg_basebackup (physical dump)
RDS 서버에서 replication 권한이 있는 사용자를 생성할 수 없었고 보안 문제로 실패
(참조 : https://idchowto.com/?p=44332https://severalnines.com/blog/become-postgresql-dba-logical-physical-postgresql-backups)


[시도 3] 테이블별 pg_dump (O)
어쩔 수 없이 테이블 별로 dump 후 최대한 foreign key를 참조하지 않는 순서대로 insert했다.

3. Django migration 문제 
데이터 이전 후 migration 순서가 꼬였는지 새로운 makemigrations할 수 없는 문제 발생.

3-1) manage.py migrate --fake APPNAME zero
- 이전 migrations을 실제 sql을 수행하지 않고(--fake) 적용하지 않은 상태(zero)로 돌린다.
- 이 과정에서 migrations is applied before its dependency 문제가 발생 -> 문제가 된 app의 migration 파일을 __init__.py만 남기고 제거했다.

3-2) manage.py showmigrations (| more)
- migration 상태를 확인한다.
- 모든 app(auth 등 제외)의 migrations이 체크 해제된 걸 확인한다

3-3) APPNAME/migrations/ 의 파일을 제거

3-4) manage.py migrate --fake-initial
- DB에 이미 테이블이 존재하면 테이블을 만들지 않고 넘어간다.

이 후 원래 하려던 migration을 적용하면 정상적으로 된다.
(참조 : https://wikidocs.net/9926https://docs.djangoproject.com/en/2.2/ref/django-admin/#cmdoption-migrate-fake-initial)



이 블로그의 인기 게시물

Postgresql에서 5432 port가 열려있냐는 문제(Ubuntu 기준)

vue에서 v-html에 포함된 class의 css가 적용되지 않는 경우

Linux screen 명령어 정리