프론트에서 운영서버 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 환경변수값을
사용합니다.
이걸 참고하면 좋을 것같다.
네트워크 지식이 없어서
버거에게 무식한 질문을 많이했다 ..
'Back-end Skill > DataBase' 카테고리의 다른 글
[queryDsl] fetchFirst() NullPointerException 에러 (0) | 2023.03.31 |
---|---|
[queryDsl] Q-type Class 는 도대체 왜 만드는건가? (0) | 2022.10.24 |
[queryDsl] queryDsl에서 데이터 insert하는 방법 (0) | 2022.10.24 |
JPA 사용할 때 주의해야할 점 2편_관계매핑의 정의와 mappedBy 이해하기 (0) | 2022.10.06 |
Python pandas을 통해 DB 마이그레이션하는 방법 (1) | 2022.10.05 |