Innovating today, leading tomorrow

OpenSQL_Technical Guide
[OpenSQL] pg_dump

[OpenSQL] pg_dump

pg_dump의 개요

pg_dump란?

pg_dump is a utility for backing up a PostgreSQL database. It makes consistent backups even if the database is being used concurrently. pg_dump does not block other users accessing the database (readers or writers).
– PostgreSQL 공식 문서 –

pg_dump는 PostgreSQL 백업하기 위한 유틸리티입니다. pg_dump단일 데이터베이스만 덤프합니다. 전체 클러스터를 백업하거나 클러스터의 모든 데이터베이스에 있는 Global Object(ex: role, tablespace)를 백업하려면 **pg_dumpall **을 사용해야 합니다.

pg_dump는 다음 두 가지 형식으로 덤프 할 수 있습니다.

  • 스크립트 형식
    • 데이터베이스를 백업 당시의 상태로 재구성하는데 필요한 SQL문이 포함된 일반 텍스트 파일 입니다.
    • 스크립트 형식의 덤프 파일을 이용해 복원하려면 psql 을 이용해야 합니다.
  • 아카이브 형식
    • 아카이브 형식의 덤프 파일을 이용해 복원하려면 pg_restore 을 이용해야 합니다.
    • 가장 flexible한 포맷은 “사용자 정의” 포맷(-Fc)과 “디렉토리” 포맷(-Fd)입니다.
    • 디렉토리 포맷은 유일하게 병렬 덤프를 지원하는 포맷입니다.

pg_dump 문법

pg_dump[ connection-option…] [ option…] [ dbname]

pg_ctl 옵션

옵션설명
dbname덤프 할 데이터베이스의 이름을 지정합니다.
-a –data-only스키마가 아닌 데이터만 덤프합니다. 테이블 데이터, blob 및 시퀀스 값이 덤프됩니다.
-b –blobs덤프에서 blob 오브젝트를 포함합니다.
-B –no-blobs덤프에서 blob 오브젝트를 제외합니다.
-c –clean데이터베이스 개체를 만들기 위한 명령을 출력하기 전에 데이터베이스 개체를 정리(삭제)하는 명령을 출력합니다.
-C –create데이터베이스 자체를 생성하고 생성된 데이터베이스에 다시 연결하는 명령으로 출력을 시작합니다.
-e pattern –extension=pattern지정한 패턴과 일치하는 extension만 덤프합니다.
-E encoding –encoding=encoding지정된 character set으로 덤프를 작성합니다. 기본적으로 데이터베이스 인코딩으로 생성됩니다.
-f file –file=file지정된 파일로 출력을 보냅니다. 파일 기반 출력 형식의 경우 이 매개변수를 생략할 수 있으며 이 경우 표준 출력이 사용됩니다.
-F format –format=format출력 형식을 선택합니다. 사용 가능한 포맷은 다음과 같습니다. – p/plain : 일반 텍스트 SQL 스크립트 파일 ( default) – c/custom : pg_restore 에 입력하기에 적합한 사용자 지정 형식 아카이브 – d/directory : pg_restore 에 입력하기에 적합한 디렉토리 형식 아카이브 – t/tar : pg_restore 에 입력하기에 적합한 tar 형식 아카이브
-j njobs –jobs=njobs테이블을 동시에 njobs만큼 덤프하여 덤프를 병렬로 실행합니다.
-n pattern –schema=pattern지정한 패턴과 일치하는 스키마만 덤프합니다.
-N pattern –exclude-schema=pattern지정한 패턴과 일치하는 스키마를 덤프하지 않습니다.
-O –no-owner원래 데이터베이스와 일치하도록 오브젝트의 소유권을 설정하는 명령을 출력하지 않습니다.
-R –no-reconnect이 옵션은 더 이상 사용되지 않지만 이전 버전과의 호환성을 위해 여전히 허용됩니다.
-s –schema-only데이터가 아닌 오브젝트 정의(스키마)만 덤프합니다. 이 옵션은 –data-only 옵션과 반대입니다.
-S username –superuser=username트리거를 비활성화할 때 사용할 수퍼유저 사용자 이름을 지정합니다.
-t pattern –table=pattern지정한 이름과 이름이 일치하는 테이블만 덤프합니다.
-T pattern –exclude-table=pattern지정한 패턴과 일치하는 테이블을 덤프하지 않습니다.
-v –verbose상세 모드를 지정합니다. 이렇게 하면 pg_dump가 자세한 개체 설명과 시작/중지 시간을 덤프 파일에 출력하고 메시지를 표준 오류로 진행합니다.
-V –versionpg_dump 버전을 출력하고 종료합니다.
-x –no-privileges –no-acl접근 권한 덤프를 하지 않습니다. (grant/revoke 커맨드)
-Z 0..9 –compress=0..9사용할 압축 레벨을 지정합니다. 0 은 압축이 없음을 의미합니다.
–binary-upgrade이 옵션은 upgrade유틸리티에서 사용합니다. 다른 용도로 사용하는 것은 권장되거나 지원되지 않습니다.
–column-inserts –attribute-inserts데이터를 INSERT 명령으로 덤프합니다. 이렇게 하면 복원 속도가 매우 느려집니다.
–disable-dollar-quoting함수 본문에 대해 $ 인용을 사용하지 않도록 설정하고, SQL 표준 문자열 구문을 사용하여 인용하도록 합니다.
–disable-triggers이 옵션은 데이터 전용 덤프를 생성하는 경우에만 사용할 수 있습니다. 데이터가 복원되는 동안 대상 테이블에서 트리거를 일시적으로 비활성화하는 명령을 포함합니다.
–enable-row-security이 옵션은 row security가 있는 테이블의 내용을 덤프할 때만 사용할 수 있습니다. 기본적으로 pg_dump는 테이블에서 모든 데이터가 덤프되도록 row_security를 off로 설정합니다. 사용자에게 row security을 무시할 수 있는 권한이 없는 경우 오류가 발생합니다
–exclude-table-data=pattern패턴과 일치하는 테이블의 데이터를 덤프하지 않습니다.
–extra-float-digits=ndigits부동 소수점 데이터를 덤프할 때 사용 가능한 최대 정밀도 대신 지정된 extra_float_digits 값을 사용합니다. 백업 목적으로 만든 덤프에는 이 옵션을 사용하면 안 됩니다.
–if-exists데이터베이스 객체를 cleaning할 때는 조건부 명령(즉, IF EXISTS 절 추가)을 사용합니다.
–include-foreign-data=foreignserverforeign server 패턴과 일치하는 foreign server가 있는 foreign table의 데이터를 덤프합니다. 여러 –include-foreign-data switch를 작성하여 여러 개의 외부 서버를 선택할 수 있습니다.
–inserts데이터를 COPY가 아닌 INSERT 명령으로 덤프합니다. 이렇게 하면 복원 속도가 매우 느려집니다.
–load-via-partition-root테이블 파티션에 대한 데이터를 덤프할 때는 COPY 또는 INSERT 문이 파티션 자체가 아닌 테이블 파티션을 포함하는 파티션 계층의 root를 대상으로 지정합니다. 따라서 데이터가 로드될 때 각 행에 대해 적절한 파티션이 다시 결정됩니다.
–lock-wait-timeout=timeout덤프 시작 시, shared 테이블 lock을 얻기 위해 영원히 기다리지 않습니다.
–no-comments –no-publications –no-security-labels –no-subscriptions –no-sync –no-table-access-method –no-tablespaces –no-toast-compression –no-unlogged-table-data–no-comments : 덤프 코멘트를 덤프하지 않습니다. –no-publications : publication 을 덤프하지 않습니다. –no-security-labels : security label을 덤프하지 않습니다. –no-subscriptions : subscription을 덤프하지 않습니다. –no-sync : 기본적으로 pg_dump는 모든 파일이 디스크에 안전하게 기록될 때까지 기다립니다. 이 옵션을 사용하면 pg_dump가 대기하지 않고 반환되므로 더 빠르지만 이후 운영 체제 충돌로 인해 덤프가 손상될 수 있습니다. –no-table-access-method : 테이블 접근 방법을 선택하는 명령어를 출력하지 않습니다. –no-tablespaces : SELECT TABLESPACE 구문은 출력하지 않습니다. –no-toast-compression : TOAST 압축을 설정하는 구문은 출력하지 않습니다. –no-unlogged-table-data : unlogged 테이블과 시퀀스의 내용을 덤프하지 않습니다.
–on-conflict-do-nothing충돌 시 아무런 추가 출력을 하지 않습니다.
–quote-all-identifiers모든 식별자를 강제로 따옴표로 묶습니다. PostgreSQL major 버전이 pg_dump버전과 다른 서버에서 데이터베이스를 덤프하거나 출력을 major 버전이 다른 서버로 로드하려는 경우 이 옵션을 사용하는 것이 좋습니다.
–rows-per-insert=nrows데이터를 COPY가 아닌 INSERT 명령으로 덤프합니다. 그리고 INSERT명령 당 최대 행 수를 지정합니다.
–section=sectionname지정한 섹션만 덤프합니다. 사용 가능한 섹션 이름은 다음과 같습니다. – pre-data – data – post-data 여러 섹션을 지정할 수 있으며 기본값은 모든 섹션을 덤프하는 것입니다.
–serializable-deferrable사용된 스냅샷이 이후 데이터베이스 상태와 일치하는지 확인하려면 덤프에 대해 직렬화 가능한 트랜잭션을 사용합니다.
–snapshot=snapshotname데이터베이스 덤프를 만들 때 지정된 스냅샷을 사용합니다. logical replication slot 또는 동시 세션과 동기화해야 할 때 유용합니다.
–strict-names각 지정한 extension(-e/–extension), schema(-n/–schema), table(-t/–table)이 덤프 할 데이터베이스에서 하나 이상의 확장/스키마/테이블과 일치해야 합니다. 일치하는 항목을 찾을 수 없는 경우 pg_dump에서 오류가 발생합니다.
–use-set-session-authorization오브젝트의 소유권을 확인하려면 ALTER OWNER 명령 대신 SQL 표준 SET SESSION AUTHERITION 명령을 출력합니다. 이렇게 하면 덤프의 표준 호환성이 높아지지만 제대로 복원되지 않을 수 있습니다.
-? –helppg_dump 커맨드에 대한 도움말을 표시 하고 종료합니다.
-d dbname –dbname=dbname연결할 데이터베이스의 이름을 지정합니다.
-h host –host=host서버가 실행 중인 시스템의 호스트 이름을 지정합니다.
-p port –port=port서버가 연결을 수신하는 TCP 포트 또는 로컬 Unix 도메인 소켓 파일 확장자를 지정합니다. 
-U username –username=username연결할 사용자 이름입니다.
-w –no-password암호 프롬포트를 표시하지 않습니다.
-W –password데이터베이스에 연결하기 전에 pg_dump가 암호를 묻도록 합니다.
–role=rolename덤프를 만드는데 사용할 role을 지정합니다.

pg_dump 사용 예시

형식 별 덤프

  • 스크립트 형식으로 덤프

[opensql@localhost:dump]$ pg_dump test > db.sql

  • 아카이브 형식으로 덤프

# 사용자 정의 형식
[opensql@localhost:dump]$ pg_dump -Fc test > db.dump

# 디렉토리 형식
[opensql@localhost:dump]$ pg_dump -Fd test -f dumpdir

# 디렉토리 형식을 5개의 job으로 병렬 덤프
[opensql@localhost:dump]$ pg_dump -Fd test -j 5 -f dumpdir

대상 별 덤프

  • 테이블

# 단일 테이블 덤프
[opensql@localhost:dump]$ pg_dump -t mytab test> db.sql

# 지정한 테이블 제외하고 해당 이름으로 시작하는 모든 테이블 덤프
[opensql@localhost:dump]$ pg_dump -t ‘detroit.emp*’ -T detroit.employee_log test> db.sql

# 해당 이름으로 시작하는 테이블을 제외한 모든 데이터베이스의 오브젝트를 덤프
[opensql@localhost:dump]$ pg_dump -T ‘ts_*’ test> db.sql

  • 스키마

# 지정한 스키마를 제외하고 해당 이름으로 끝나는 모든 스키마 덤프
[opensql@localhost:dump]$ pg_dump -n ‘east*gsm’ -n ‘west*gsm’ -N ‘*test*’ test> db.sql

복원

  • 스크립트 형식의 덤프 파일 복원

[opensql@localhost:dump]$ psql -d test -f db.sql

  • 아카이브 형식의 덤프 파일 복원

# 새로 생성된 데이터베이스에 로드
[opensql@localhost:dump]$ pg_restore -d newtest db.dump

# 동일한 데이터베이스로 로드하며, 해당 데이터베이스의 현재 내용을 삭제
[opensql@localhost:dump]$ pg_restore -d postgres –clean –create db.dump

서버 재시작

  • fsync를 비활성화하고 5433포트를 사용하여 서버 재시작

[opensql@localhost:~]$ pg_ctl -o “-F -p 5433” -D /opensql/pg/14/data restart
pg_ctl: PID file “/opensql/pg/14/data/postmaster.pid” does not exist
Is server running?
trying to start server anyway
waiting for server to start….2023-01-13 23:05:18.568 KST [110396] LOG: redirecting log output to logging collector process
2023-01-13 23:05:18.568 KST [110396] HINT: Future log output will appear in directory “/opensql/pg/14/log/pg_log”.
done
server started

서버 상태 표시

  • 서버의 상태 출력

[opensql@localhost:~]$ pg_ctl status
pg_ctl: server is running (PID: 110396)
/usr/pgsql-14/bin/postgres “-F” “-p” “5433”

주의할 점

  1. pg_dump에 의해 생성된 덤프 파일에는 쿼리 플랜을 정하는데 옵티마이저에서 사용하는 통계가 포함되어 있지 않습니다. 따라서 최적의 성능을 보장하려면 덤프파일에서 복원한 후, ANALYZE를 실행하는 것이 좋습니다.
  2. pg_dump는 PostgreSQL의 새로운 버전으로 데이터를 옮기는 데에 주로 사용하기 때문에 pg_dump는 또한 자신의 버전보다 오래된 PostgreSQL 서버로부터 덤프 할 수 있습니다. 그러나 pg_dump는 자신의 major 버전보다 더 높은 PostgreSQL 서버로부터 덤프할 수 없습니다. 만약 시도할 경우, 잘못된 dump를 만들까봐 시도조차 거부합니다.
  3. logical replication의 subscription을 덤프 할 때 pg_dump는 connect=false옵션을 사용하는 CREATE SUBSCRIPTION 명령을 생성하므로, subscription을 복원하면 remote connection이 생성되지 않습니다. 사용자가 subscription을 다시 직접 활성화해야 합니다.

pg_dump 환경변수

다음 환경변수들과 같이 pg_dump를 사용할 수 있습니다.

환경변수설명
PGDATABASE
PGHOST
PGOPTIONS
PGPORT
PGUSER기본 연결 매개변수
PG_COLOR표시되는 메세지에서 색상을 사용할지 여부를 지정합니다. 사용 가능한 값은 다음과 같습니다.
– always
– auto
– never

대부분의 다른 PostgreSQL의 유틸리티와 마찬가지로 libpq에서 지원하는 환경변수를 사용합니다. libpq에서 지원하는 환경변수에 대한 내용은 여기 를 참고해주세요!!

사용 방법

export PGHOME=/opensql/pg #opensql engine directory
export PGDATA=/opensql/pg/$PGVERSION/data #opensql database clsuter directory
export PGHOST=/var/run/opensql #opensql socket directory
export PGUSER=postgres #opensql Basic DB User Name
export PGPASSFILE=’/opensql/.pgpass’ #opensql pgpass file

지금까지 ‘PostgreSQL pg_dump’에 관해 알아보았습니다

‘PostgreSQL pg_dumpall’을 바로 이어서 확인해보세요!

광고성 정보 수신

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다.
내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보
  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
 

개인정보 수집 및 이용

개인정보 수집, 활용 목적 및 기간

(주)티맥스티베로의 개인정보 수집 및 이용 목적은 다음과 같습니다. 내용을 자세히 읽어보신 후 동의 여부를 결정해 주시기 바랍니다.

  • 수집 목적: 티맥스티베로 뉴스레터 발송 및 고객 관리
  • 수집 항목: 성함, 회사명, 회사 이메일, 연락처, 부서명, 직급, 산업, 담당업무, 관계사 여부, 방문 경로
  • 보유 및 이용 기간: 동의 철회 시까지

※ 위 개인정보 수집 및 이용에 대한 동의를 거부할 권리가 있습니다.
※ 필수 수집 항목에 대한 동의를 거부하는 경우 뉴스레터 구독이 제한될 수 있습니다.

개인정보의 처리 위탁 정보

  • 업체명: 스티비 주식회사
  • 위탁 업무 목적 및 범위: 광고가 포함된 뉴스레터 발송 및 수신자 관리
  •