Back to posts

pg_dump text 덤프와 복원

pg_dump plain 덤프를 sed로 수정하고 psql로 복구하는 방법.


pg_dump plain

pg_dump로 plain 덤프 파일을 만들면 직접 편집해야 할 때가 있다. 용량이 너무 큰 경우엔 일반 편집기가 버겁다. 이럴 땐 sed로 수정하는 게 편하다. 복구는 pg_restore가 아니라 psql을 써야 한다.

plain 덤프

pg_dump에서 포맷 옵션으로 plain을 쓰면 된다.

/opt/homebrew/opt/libpq/bin/pg_dump \
-h localhost \
-U {user_name} \
-d {db_name} \
-t public.{table_name} \
-F plain \
-f /Users/bonjugi/test-dump1.sql

sed 사용법

sed 's/dashboard/dashboard_v2/g' origin_dump.sql > edited_dump.sql

sed는 스트림 에디터다. 파일을 통째로 로드하지 않고 스트리밍 방식으로 수정한다. 자세한 사용법은 아래를 참고.

텍스트 치환은 되도록 구체적으로 작성하는 게 좋다. dashboard처럼 짧은 단어는 사이드 이펙트가 크다. public.dashboard나 create table dashboard처럼 컨텍스트를 포함해 치환하자.

;로 여러 치환을 묶을 수 있다.

sed 's/public.dashboard/public.dashboard_v2/g; s/create table dashboard/create table dashboard_v2/g' origin_dump.sql > edited_dump.sql

잘 수정됐는지 확인할 땐 head를 쓰면 된다.

head -n 300 temp.sql

psql로 복구

텍스트 포맷 덤프는 pg_restore가 안 된다. psql로 복구해야 한다.

psql -h {your.host} -U {user_name} -d {db_name} -f edited_dump.sql

custom 포맷 덤프와 pg_restore

덤프는 -F custom인 것 말고는 동일하다.

/opt/homebrew/opt/libpq/bin/pg_dump \
-h localhost \
-U {user_name} \
-d {db_name} \
-t public.{table_name} \
-F custom \
-f /Users/bonjugi/test-dump1.sql

복구는 psql이 아니라 pg_restore로 한다. plain보다 덤프/복구가 빠르다. 다만 덤프 파일이 바이너리라 테이블명을 직접 수정하기는 어렵다. sed로 된다고는 하는데 해보진 못했다.