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로 데이터 복사 붙여넣기
- Postgresql 9.6
- Django 1.11
- AWS RDS
- ubuntu 16.04
1. 상황
- AWS RDS + postgresql의 데이터만 개인서버 + postgresql로 이전해야 함
- 개인 서버에 테이블은 이미 만들어져 있음
2. 데이터 이전
2-1) [시도 1] 전체 pg_dump (logical dump)
(개인서버에서)
--file=FILEPATH --column-inserts --data-only --host=HOST --port=5432 --username=USERNMAE
[시도 2] 전체 pg_basebackup (physical dump)
RDS 서버에서 replication 권한이 있는 사용자를 생성할 수 없었고 보안 문제로 실패
(참조 : https://idchowto.com/?p=44332, https://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/9926, https://docs.djangoproject.com/en/2.2/ref/django-admin/#cmdoption-migrate-fake-initial)
psql DATABASENAME < FILEPATH
=> foreign key constraint 때문에 insert가 안되는 문제 발생
2-1-2) foreign key constraint를 무시할 수 있는가?
SET session_replication_role = 'replica';
로 trigger를 끌 수 있다 하여 시도하였으나 실패
(참조: https://stackoverflow.com/questions/38112379/disable-postgresql-foreign-key-checks-for-migrations)
[시도 2] 전체 pg_basebackup (physical dump)
RDS 서버에서 replication 권한이 있는 사용자를 생성할 수 없었고 보안 문제로 실패
(참조 : https://idchowto.com/?p=44332, https://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/9926, https://docs.djangoproject.com/en/2.2/ref/django-admin/#cmdoption-migrate-fake-initial)