Back-end Skill/DataBase

[PostgreSQL] 운영서버DB를 개발서버로 pg_dump 하는법

Sophie소피 2023. 3. 13. 19:11

프론트에서 운영서버 DB를 개발서버에 맞춰달라는 요청이 들어왔다. 

운영서버와 최대한 비슷한 환경으로 작업하면 

개발서버로 코드 작업을 할 때도 QA할 때도 에러사항을 더 찾기 편해지기 때문이다. 

적어도 잘못된 데이터로 햇갈리는 일들은 없을 거 같다. 

 

참고로 필자의 회사는 postgres를 사용하고 있다. 

 

1. dump를 원하는 데이터베이스에서 sql확장자로 백업파일을 경로를 지정하여 백업파일을 생성한다.  

pg_dump [dump하고싶은 db명] -U [postgres 유저이름] -h 접속 host주소 -F p -b -v -f /백업파일/경로/

EX) pg_dump prod_database -U usernameSophie -.rds.amazonaws.com -F p -b -v -f /home/ubuntu/dump_files/dev_db_backup.sql

 

그러나 이런 오류메세지를 내뱉는데 

pg_dump: saving search_path = 
pg_dump: error: could not open output file "/home/ubuntu/dump_files/shopping_db_backup.sql": No such file or directory

디렉토리가 명령을 실행 중인 시스템에 존재하지 않는다라는 오류이다.

 

디렉토리가 없는 경우 해당 디렉토리를 만든 다음

명령을 **pg_dump**다시 실행해야 한다.

다음 명령을 사용하여 디렉터리를 만들 수 있다.

 

root@ip-:/home/ubuntu# mkdir dump_files

디렉토리가 존재하지 않는 경우 생성하고

디렉토리가 이미 존재하는 경우 아무 작업도 수행하지 않는다.

디렉터리를 생성한 후 **pg_dump**백업 파일에 대한

올바른 경로를 사용하여 명령을 다시 실행할 수 있다.

 

다시 pg_dump 를 시도한다.

지정한 경로와 지정한 sql 확장자로 백업파일이 생성되었다. 

 

 

 

2. psql 명령어를 통해 백업된 파일을 원하는 데이터베이스에 복원한다. 

주의 DB 덮여쓰기는 안된다. 연관관계 때문에 에러가 발생한다. 

방법1. psql로 postgres 접속하여 옮기고 싶었던 데이터베이스의 기존 내용을 날리고 복원을 한다. 

방법2. 새로운 데이터베이스를 만들고 개발서버에 새로운 데이터베이스를 재연결한다. 

방법3. 개발서버의 기존 데이터베이스의 이름을 바꾸고 기존데이터베이스의 이름으로 새로운 데이터베이스를 생성한다. 

 

필자는 참고로 방법2를 택했다. 

 

psql -h atabasep-northeast-2.rds.amazonaws.com -U[운영서버rds 주소] [postgres 유저이름] -W [옮기고싶은 데이터베이스 이름]< /백업파일/경로

EX) psql -h -.rds.amazonaws.com -U usernameSophie -W backup_database < /home/ubuntu/dump_files/dev_db_backup.sql

 

옮겨진걸 확인할 수 있다. 

 

$ pg_dump --help
pg_dump 프로그램은 데이터베이스를 텍스트 파일 또는 기타
다른 형태의 파일로 덤프합니다.

사용법:
  pg_dump [옵션]... [DB이름]

일반 옵션들:
  -f, --file=FILENAME         출력 파일 이름
  -F, --format=c|t|p          출력 파일 형식(사용자 지정, tar, 일반 텍스트)
  -v, --verbose               세부 정보 표시 모드
  -Z, --compress=0-9          압축되는 형식의 압축 수준
  --lock-wait-timeout=TIMEOUT 테이블 잠금에 대한 TIMEOUT을 기다린 후 실패

  --help                      이 도움말을 표시하고 종료
  --version                   버전 정보를 출력하고 종료

출력 내용을 다루는 옵션들:
  -a, --data-only             스키마 빼고 자료만 덤프
  -b, --blobs                 Large Object들도 함께 덤프함
  -c, --clean                 다시 만들기 전에 데이터베이스 개체 지우기(삭제)
  -C, --create                데이터베이스 만드는 명령구문도 포함시킴
  -E, --encoding=인코딩       지정한 인코딩으로 자료를 덤프 함
  -n, --schema=SCHEMA         지정한 SCHEMA들 자료만 덤프
  -N, --exclude-schema=SCHEMA 지정한 SCHEMA들만 빼고 모두 덤프
  -o, --oids                  OID 포함해서 덤프
  -O, --no-owner              일반 텍스트 형식에서
                              개체 소유권 복원 건너뛰기
  -s, --schema-only           자료구조(스키마)만 덤프
  -S, --superuser=NAME        일반 텍스트 형식에서 사용할 superuser 사용자 이름
  -t, --table=TABLE           지정한 이름의 테이블들만 덤프
  -T, --exclude-table=TABLE   지정한 테이블들만 빼고 덤프
  -x, --no-privileges         액세스 권한 (grant/revoke) 정보는 덤프 안 함
  --binary-upgrade            업그레이드 유틸리티 전용
  --inserts                   COPY가 아니라 INSERT 명령으로 데이터 덤프
  --column-inserts            열 이름과 함께 INSERT 명령으로 데이터 덤프
  --disable-dollar-quoting    $ 인용 구문 사용안함 , SQL 표준 따옴표 사용
  --disable-triggers          자료만 복원할 때 트리거 사용을 안함
  --no-tablespaces            테이블스페이스 할당을 덤프하지 않음
  --role=ROLENAME             덤프 전에 SET ROLE 수행
  --use-set-session-authorization
                              SET SESSION AUTHORIZATION 명령을 ALTER OWNER 명령
                              대신 사용하여 소유권 설정

연결 옵션들:
  -h, --host=HOSTNAME      접속할 데이터베이스 서버 또는 소켓 디렉터리
  -p, --port=PORT          데이터베이스 서버의 포트 번호
  -U, --username=NAME      연결할 데이터베이스 사용자
  -w, --no-password        암호 프롬프트 표시 안 함
  -W, --password           암호 입력 프롬프트 보임(자동으로 처리함)

데이터베이스 이름을 지정하지 않았다면, PGDATABASE 환경변수값을
사용합니다.

이걸 참고하면 좋을 것같다. 

 

네트워크 지식이 없어서 

버거에게 무식한 질문을 많이했다 ..