데이터 베이스를 개발, 또는 운영 중에 백업은 중요한 작업중에 하나이다. 본 절에서는 postgres 데이터베이스를 통으로 바이너리 레벨로 dump하고 이를 그대로 restore하는 명령을 살펴본다.
pg_dump 명령어 옵션
PS C:\Program Files\PostgreSQL\13\bin> .\pg_dump.exe --help
pg_dump 프로그램은 데이터베이스를 텍스트 파일 또는 기타
다른 형태의 파일로 덤프합니다.
사용법:
pg_dump [옵션]... [DB이름]
일반 옵션들:
-f, --file=파일이름 출력 파일 또는 디렉터리 이름
-F, --format=c|d|t|p 출력 파일 형식(사용자 지정, 디렉터리, tar,
일반 텍스트(초기값))
-j, --jobs=개수 덤프 작업을 병렬 처리 함
-v, --verbose 작업 내역을 자세히 봄
-V, --version 버전 정보를 보여주고 마침
-Z, --compress=0-9 출력 자료 압축 수위
--lock-wait-timeout=초 테이블 잠금 시 지정한 초만큼 기다린 후 실패
--no-sync fsync 작업 생략
-?, --help 이 도움말을 보여주고 마침
출력 내용을 다루는 옵션들:
-a, --data-only 스키마 빼고 자료만 덤프
-b, --blobs Large Object들도 함께 덤프함
-B, --no-blobs Large Object들을 제외하고 덤프함
-c, --clean 다시 만들기 전에 데이터베이스 개체 지우기(삭제)
-C, --create 데이터베이스 만드는 명령구문도 포함시킴
-E, --encoding=인코딩 지정한 인코딩으로 자료를 덤프 함
-n, --schema=PATTERN 지정한 SCHEMA들 자료만 덤프
-N, --exclude-schema=PATTERN 지정한 SCHEMA들만 빼고 모두 덤프
-O, --no-owner 일반 텍스트 형식에서
개체 소유권 복원 건너뛰기
-s, --schema-only 자료구조(스키마)만 덤프
-S, --superuser=NAME 일반 텍스트 형식에서 사용할 슈퍼유저 사용자 이름
-t, --table=PATTERN 지정한 이름의 테이블들만 덤프
-T, --exclude-table=PATTERN 지정한 테이블들만 빼고 덤프
-x, --no-privileges 접근 권한 (grant/revoke) 정보는 덤프 안 함
--binary-upgrade 업그레이드 유틸리티 전용
--column-inserts 칼럼 이름과 함께 INSERT 명령으로 자료 덤프
--disable-dollar-quoting $ 인용 구문 사용안함, SQL 표준 따옴표 사용
--disable-triggers 자료만 복원할 때 트리거 사용을 안함
--enable-row-security 로우 보안 활성화 (현재 작업자가 접근할 수
있는 자료만 덤프 함)
--exclude-table-data=PATTERN 해당 테이블 자료는 덤프 안함
--extra-float-digits=NUM 기본 extra_float_digits 값 바꿈
--if-exists 객체 삭제 시 IF EXISTS 구문 사용
--include-foreign-data=패턴
지정한 패턴과 일치하는 외부 서버의 외부
테이블 자료를 포함
--inserts COPY 대신 INSERT 명령으로 자료 덤프
--load-via-partition-root 상위 테이블을 통해 하위 테이블을 로드함
--no-comments 코멘트는 덤프 안함
--no-publications 발행 정보는 덤프하지 않음
--no-security-labels 보안 라벨 할당을 덤프 하지 않음
--no-subscriptions 구독 정보는 덤프하지 않음
--no-synchronized-snapshots 병렬 작업에서 스냅샷 일관성을 맞추지 않음
--no-tablespaces 테이블스페이스 할당을 덤프하지 않음
--no-unlogged-table-data 언로그드 테이블 자료는 덤프하지 않음
--on-conflict-do-nothing INSERT 구문에 ON CONFLICT DO NOTHING 옵션 추가
--quote-all-identifiers 예약어가 아니여도 모든 식별자는 따옴표를 씀
--rows-per-insert=NROWS 한 INSERT 명령으로 입력할 로우 수; --inserts
옵션을 사용한 것으로 가정 함
--section=SECTION 해당 섹션(pre-data, data, post-data)만 덤프
--serializable-deferrable 자료 정합성을 보장하기 위해 덤프 작업을
직렬화 가능한 트랜잭션으로 처리 함
--snapshot=SNAPSHOT 지정한 스냅샷을 덤프 함
--strict-names 테이블이나 스키마를 지정했을 때 그 패턴에 맞는
객체가 적어도 하나 이상 있어야 함
--use-set-session-authorization
SET SESSION AUTHORIZATION 명령을 ALTER OWNER 명령
대신 사용하여 소유권 설정
연결 옵션들:
-d, --dbname=DBNAME 덤프할 데이터베이스
-h, --host=HOSTNAME 접속할 데이터베이스 서버 또는 소켓 디렉터리
-p, --port=PORT 데이터베이스 서버의 포트 번호
-U, --username=NAME 연결할 데이터베이스 사용자
-w, --no-password 암호 프롬프트 표시 안 함
-W, --password 암호 입력 프롬프트 보임(자동으로 처리함)
--role=ROLENAME 덤프 전에 SET ROLE 수행
데이터베이스 이름을 지정하지 않았다면, PGDATABASE 환경변수값을
사용합니다.
문제점 보고 주소 <pgsql-bugs@lists.postgresql.org>
PostgreSQL 홈페이지: <https://www.postgresql.org/>
PS C:\Program Files\PostgreSQL\13\bin>
pg_dump 수행 예제
덤프를 수행하기전 덤프 대상 데이터베이스 모습이다. 여러 프로시저와 테이블이 존재함을 볼 수 있다.
덤프를 수행한다. --format은 덤프 바이너리의 포맷을 지정하는 옵션으로 아래예제에서 t(tar)로 지정했다. 명령줄을 실행하면 DB 암호 입력을 요청한다. 암호 입력 후 엔터를 치면 스키마, 시퀀스, 프로시저 등 모두 통째로 덤프하는 모습을 볼 수 있다.
PS C:\Program Files\PostgreSQL\13\bin> .\pg_dump.exe --host "127.0.0.1" --username "sdp_user"
--dbname="sdp" --format=t --file="d:\backup.tar" --verbose
암호:
pg_dump: 마지막 내장 OID는 16383
pg_dump: 확장 기능 읽는 중
pg_dump: 확장 멤버를 식별 중
pg_dump: 스키마들을 읽는 중
pg_dump: 사용자 정의 테이블들을 읽는 중
pg_dump: 사용자 정의 함수들 읽는 중
pg_dump: 사용자 정의 자료형을 읽는 중
pg_dump: 프로시쥬얼 언어를 읽는 중
pg_dump: 사용자 정의 집계 함수를 읽는 중
pg_dump: 사용자 정의 연산자를 읽는 중
pg_dump: 사용자 정의 접근 방법을 읽는 중
pg_dump: 사용자 정의 연산자 클래스를 읽는 중
pg_dump: 사용자 정의 연산자 부류들 읽는 중
pg_dump: 사용자 정의 텍스트 검색 파서를 읽는 중
pg_dump: 사용자 정의 텍스트 검색 템플릿을 읽는 중
pg_dump: 사용자 정의 텍스트 검색 사전을 읽는 중
pg_dump: 사용자 정의 텍스트 검색 구성을 읽는 중
pg_dump: 사용자 정의 외부 데이터 래퍼를 읽는 중
pg_dump: 사용자 정의 외부 서버를 읽는 중
pg_dump: 기본 접근 권한 읽는 중
pg_dump: 사용자 정의 글자 정렬(collation) 읽는 중
pg_dump: 사용자 정의 인코딩 변환규칙을 읽는 중
pg_dump: 형변환자(type cast)들을 읽는 중
pg_dump: 변환자(transform) 읽는 중
pg_dump: 테이블 상속 정보를 읽는 중
pg_dump: 이벤트 트리거들을 읽는 중
pg_dump: 확장 테이블을 찾는 중
pg_dump: 상속 관계를 조사중
pg_dump: 재미난 테이블들(interesting tables)을 위해 열 정보를 읽는 중
pg_dump: "public.adhrncprdct" 테이블의 칼럼과 자료형을 찾는 중
... (중략)
pg_dump: FK CONSTRAINT "public.device_info FK_relm_info_TO_device_info" 만드는 중
pg_dump: FK CONSTRAINT "public.device_schedule_version FK_schedule_version_TO_device_schedule_version" 만드는 중
pg_dump: FK CONSTRAINT "public.schedule_cntn FK_schedule_version_TO_schedule_cntn" 만드는 중
pg_dump: FK CONSTRAINT "public.bbscatemap FK_sdscatecode_TO_bbscatemap" 만드는 중
pg_dump: FK CONSTRAINT "public.call_info FK_store_info_TO_call_info" 만드는 중
--- (중략)
PS C:\Program Files\PostgreSQL\13\bin>
아래 복원테스트를 확인하기 위해 데이터 베이스 전체를 지운 모습이다.
pg_restore 명령어 옵션
PS C:\Program Files\PostgreSQL\13\bin> .\pg_restore.exe --help
pg_restore 프로그램은 pg_dump로 만들어진 자료파일로 PostgreSQL 데이터베이스에
그 자료를 일괄 입력합니다.
사용법:
pg_restore [옵션]... [파일]
일반 옵션들:
-d, --dbname=NAME 접속할 데이터베이스 이름
-f, --file=FILENAME 출력 파일 이름 (표준 출력: -)
-F, --format=c|d|t 백업 파일 형식 (지정하지 않으면 자동분석)
-l, --list 자료의 요약된 목차를 보여줌
-v, --verbose 자세한 정보 보여줌
-V, --version 버전 정보를 보여주고 마침
-?, --help 이 도움말을 보여주고 마침
리스토어 처리를 위한 옵션들:
-a, --data-only 스키마는 빼고 자료만 입력함
-c, --clean 다시 만들기 전에 데이터베이스 개체 지우기(삭제)
-C, --create 작업 대상 데이터베이스를 만듦
-e, --exit-on-error 오류가 생기면 끝냄, 기본은 계속 진행함
-I, --index=NAME 지정한 인덱스 만듦
-j, --jobs=NUM 여러 병렬 작업을 사용하여 복원
-L, --use-list=FILENAME 출력을 선택하고 해당 순서를 지정하기 위해
이 파일의 목차 사용
-n, --schema=NAME 해당 스키마의 개체들만 복원함
-N, --exclude-schema=NAME 해당 스키마의 개체들은 복원 안함
-O, --no-owner 개체 소유권 복원 건너뛰기
-P, --function=NAME(args) 지정한 함수 만듦
-s, --schema-only 자료구조(스키마)만 만듦
-S, --superuser=NAME 트리거를 사용하지 않기 위해 사용할 슈퍼유저
사용자 이름
-t, --table=NAME 복원할 객체 이름 (테이블, 뷰, 기타)
-T, --trigger=NAME 지정한 트리거 만듦
-x, --no-privileges 접근 권한(grant/revoke) 지정 안함
-1, --single-transaction 하나의 트랜잭션 작업으로 복원함
--disable-triggers 자료만 복원할 때 트리거 사용을 안함
--enable-row-security 로우 보안 활성화
--if-exists 객체 삭제 시 IF EXISTS 구문 사용
--no-comments 코멘트는 복원하지 않음
--no-data-for-failed-tables 만들 수 없는 테이블에 대해서는 자료를 덤프하지 않음
--no-publications 발행 정보는 복원 안함
--no-security-labels 보안 라벨을 복원하지 않음
--no-subscriptions 구독 정보는 복원 안함
--no-tablespaces 테이블스페이스 할당을 복원하지 않음
--section=SECTION 지정한 섹션만 복원함
섹션 종류: pre-data, data, post-data
--strict-names 테이블이나 스키마를 지정했을 때 그 패턴에 맞는
객체가 적어도 하나 이상 있어야 함
--use-set-session-authorization
SET SESSION AUTHORIZATION 명령을 ALTER OWNER 명령
대신 사용하여 소유권 설정
연결 옵션들:
-h, --host=HOSTNAME 접속할 데이터베이스 서버 또는 소켓 디렉터리
-p, --port=PORT 데이터베이스 서버의 포트 번호
-U, --username=NAME 연결할 데이터베이스 사용자
-w, --no-password 암호 프롬프트 표시 안 함
-W, --password 암호 입력 프롬프트 보임(자동으로 처리함)
--role=ROLENAME 복원 전에 SET ROLE 수행
-I, -n, -N, -P, -t, -T, --section 옵션은 그 대상이 되는 객체를 복수로 지정하기
위해서 여러번 사용할 수 있습니다.
사용할 입력 파일을 지정하지 않았다면, 표준 입력(stdin)을 사용합니다.
문제점 보고 주소 <pgsql-bugs@lists.postgresql.org>
PostgreSQL 홈페이지: <https://www.postgresql.org/>
PS C:\Program Files\PostgreSQL\13\bin>
pg_restore 수행 예제
pg_restore명령을 수행한다. restore때는 --file 옵션을 줄 필요 없이 마지막에 파일명만 입력하면 된다. dump시와 동일하게 암호 입력을 하고 엔터를 수행하면 복원이 수행된다.
PS C:\Program Files\PostgreSQL\13\bin> .\pg_restore.exe --host "127.0.0.1" --username "sdp_user"
--dbname="sdp" --format=t "d:\backup.tar"
암호:
PS C:\Program Files\PostgreSQL\13\bin>
빈 데이터 베이스 상태에서 복원 후 확인해보면 고스란히 전체 덤프 내용이 로딩되어 있음을 볼 수 있다.
-- The End --
'Database > Postgresql' 카테고리의 다른 글
[Postgresql] Sql 쿼리 수행 시간 늘리기 (0) | 2022.09.25 |
---|---|
[Postgresql] max_connection 늘리기, 현재 connection 확인 (windows) (0) | 2022.08.17 |
[Postgresql] RETURNING 활용 예제 (0) | 2022.05.09 |
[Postgresql] Upsert 구현 (insert ~ on conflict) (0) | 2022.05.08 |
[Postgresql] auto increment, sequence 처리방법 (0) | 2022.04.28 |