본문 바로가기
엑셈 경쟁력/DB 인사이드

DB 인사이드 | PostgreSQL Setup - Version & Utility

by EXEM 2022. 8. 25.

※ 목차 ※
PostgreSQL 버전 정책
        1. PostgreSQL 릴리즈 정책
        2. PostgreSQL 릴리즈 현황
        3. PostgreSQL 버전 표기
PostgreSQL 업그레이드
        1. PostgreSQL Minor 업그레이드
        2. PostgreSQL Major 업그레이드
PostgreSQL 응용프로그램
        1. pg_dump
        2. pg_dumpall
        3. pg_restore
        4. pg_upgrade
        5. initdb
        6. pg_upgradecluster
        7. pg_dropcluster
        8. pg_lsclusters
        9. pg_ctlcluster

 

PostgreSQL 버전 정책

 

1. PostgreSQL 릴리즈 정책 목차

PostgreSQL은 매년 한 번씩 Major버전을 릴리즈합니다. Major버전 릴리즈는 일반적으로 새로운 기능이 포함되며, 시스템 테이블과 Data 파일의 내부 형식(내부 스토리지 구성, 디스크 포맷)의 변경이 있을 수 있습니다. 이로 인해 서로 다른 Major버전 간에는 내부 아키텍처 변경으로 인해 호환되지 않습니다.(정확히 호환성을 유지하지 않으며, 보장하지 않습니다.) 예를 들어 WAL File을 PostgreSQL 9.6까지는 pg_xlog 디렉토리에 저장했지만, PostgreSQL 10부터는 pg_wal 디렉토리에 저장합니다.

Minor버전 릴리즈는 자주 발생하는 버그, 보안 문제 및 Data 손상 문제만 수정된 내용을 제공합니다. 따라서, 내부 아키텍처 변경은 없으며, 동일 Major 버전에서 Minor 버전 간의 호환성은 유지됩니다. 새로 릴리즈 된 Major버전에 대해서는 최초 릴리즈 후 5년간 Minor버전 릴리즈를 지원합니다. 5년이 지난 후에는 end-of-life(EOL)로 더 이상 지원을 하지 않습니다.

 

 

2. PostgreSQL 릴리즈 현황 목차

본 문서를 작성한 일자 기준으로 PostgreSQL 9.6은 EOL 상태이며, PostgreSQL 10은 EOL 대상입니다. PostgreSQL 11부터는 32Bit를 지원하지 않습니다. (작성일자 : 2022-08-24)

Major Ver Current Minor Ver Support First Release Final Release 비고
9.6 9.6.24 NO (EOL) 2016-09-29 2021-11-11  
10 10.22 YES 2017-10-05 2022-11-10  
11 11.17 YES 2018-10-18 2023-11-09 32Bit 미지원
12 12.12 YES 2019-10-03 2024-11-14 32Bit 미지원
13 13.8 YES 2020-09-24 2025-11-13 32Bit 미지원
14 14.5 YES 2021-09-30 2026-11-12 32Bit 미지원
15     2022-3분기 중    

 

 

3. PostgreSQL 버전 표기 목차

PostgreSQL 10부터 버전 표기 방식이 변경되었습니다.

  • PostgreSQL 9.6 이하
    PostgreSQL 9.6 이하에서는 9.6.24와 같이 점(.)을 기준으로 세 자리로 표기합니다. 앞에 두 자릿수는 Major버전을 의미하고, 세 번째 자릿수는 Minor버전을 의미합니다.
    -  Major버전 : 9.6
    -  Minor버전 : 24
  • PostgreSQL 10 이상
    PostgreSQL 10버전부터는 10.21과 같이 점(.)을 기준으로 버전을 두 자리로 표기합니다. 첫 번째 자릿수는 Major버전을 의미하고, 두 번째 자릿수는 Minor버전을 의미합니다.
    -  Major버전 : 10
    -  Minor버전 : 21

 

PostgreSQL Upgrade Overview

PostgreSQL의 신규 기능들을 사용하기 위해서 또는 EOL 등의 이유로 PostgreSQL 업그레이드를 고려할 수 있습니다. PostgreSQL은 기본적으로 pg_dump, pg_restore, pg_upgrade 명령어 등을 통해 버전 업그레이드를 수행할 수 있지만, 업그레이드 작업 이외에도 Configuration 설정과 VACUUM과 같은 부가적인 작업이 필요할 수 있습니다.
사용하고자 하는 PostgreSQL의 버전에 따라 Minor버전 업그레이드를 하는 경우와 Major버전 업그레이드를 하는 경우가 있습니다. 본 문서에서는 PostgreSQL 업그레이드에 대한 간략한 설명만 하며, 자세한 업그레이드 방법 및 과정은 별도로 다룹니다.

 

1. PostgreSQL Minor 업그레이드 목차

Minor버전 업그레이드의 경우 Major버전이 동일하여 내부 아키텍처 변화가 없기 때문에 새로운 Minor버전을 설치한 후 기존에 사용 중이던 Data 파일(PGDATA) 경로를 사용하여 PostgreSQL Server를 구동하면 됩니다.

 

2. PostgreSQL Major 업그레이드 목차

Major버전 업그레이드의 경우 시스템 테이블과 Data 파일의 내부 아키텍처의 변화에 따라 Major버전 간의 호환성을 유지하지 않습니다. 따라서 Major버전 업그레이드는 Database Dump/Restore 또는 pg_upgrade 명령어를 통한 업그레이드를 수행해야 합니다. 이러한 작업은 Minor버전 업그레이드보다 더 많은 서비스 중지 시간이나 작업 시간이 필요할 수 있습니다.

 

PostgreSQL 응용프로그램

PostgreSQL 설치 시 PostgreSQL Server 이 외에 여러 응용프로그램이 같이 설치됩니다. OS 종류 및 Major 버전에 따라 응용프로그램의 종류가 다릅니다. 아래는 CentOS / PostgreSQL 14에 대한 응용프로그램의 종류입니다.

$ pwd
/usr/pgsql-14/bin

$ ls
clusterdb   initdb             pg_controldata  pg_receivewal  pg_test_timing   postgres                    reindexdb
createdb    pg_archivecleanup  pg_ctl          pg_resetwal    pg_upgrade       postgresql-14-check-db-dir  vacuumdb
createuser  pg_basebackup      pg_dump         pg_restore     pg_verifybackup  postgresql-14-setup
dropdb      pg_checksums       pg_dumpall      pg_rewind      pg_waldump       postmaster
dropuser    pg_config          pg_isready      pg_test_fsync  pgbench          psql
더보기

PostgreSQL 응용프로그램 설명

Utility 설명
clusterdb Database의 테이블을 Re-Clustering
createdb Database 생성
createuser 사용자(Role) 생성
dropdb Database 제거
dropuser 사용자(Role) 제거
initdb Database Cluster 생성
pg_archivecleanup WAL Archive 파일 정리
pg_basebackup Cluster의 기본 Backup
pg_checksums Database Cluster에서 Data 체크섬 활성화, 비활성화 또는 확인
pg_config PostgreSQL 버전에 대한 정보 검색
pg_controldata Database Cluster의 제어 정보 표시
pg_ctl PostgreSQL Server 제어(초기화, 시작, 중지 등)
pg_dump Database Backup
pg_dumpall Database Cluster Backup
pg_isready PostgreSQL Server 연결 상태 확인
pg_receivewal Cluster에서 WAL을 스트리밍하는데 사용
pg_resetwal WAL 및 Cluster의 기타 제어 정보를 재설정
pg_restore pg_dump에 의해 생성된 Archive File에서 Database Restore
pg_rewind Data Directory를 다른 Data Directory와 동기
pg_test_fsync 시스템에서 가장 빠른 wal_sync_method를 제공
pg_test_timing 타이밍 오버헤드 측정
pg_upgrade PostgreSQL Server 업그레이드 (Major 버전)
pg_verifybackup pg_basebackup을 사용한 기본Backup에 대한 무결성 확인
pg_waldump WAL을 사람이 읽을 수 있는 형태로 표시
pgbench 벤치마크 테스트
postgres PostgreSQL Database Server
postmaster postgres의 별칭(더 이상 사용되지 않음)
psql Command-Line Terminal
reindexdb Database Index Re-Indexing
vacuumdb Database vacuum
📢 본 문서에서는 위에 나열된 응용프로그램 종류 중 Backup, Restore, Upgrade에 대한 응용프로그램의 설명 및 사용법을 다룹니다. (pg_dump, pg_dumpall, pg_restore, pg_upgrade, initdb)

 

 

1. pg_dump 목차

pg_dump는 Database Backup을 위한 것으로, PostgreSQL Database를 스크립트 파일 또는 Archive 파일로 추출합니다. pg_dump는 하나의 Database에 대해서만 Backup을 수행하며, 여러 Database로 구성된 Cluster Backup은 pg_dumpall을 사용해야 합니다.
스크립트로 추출된 파일은 Database를 재구성할 수 있는 SQL 명령이 포함된 일반 텍스트 파일입니다.(Plain-Text Format) 이 파일을 psql을 통해 다른 버전의 PostgreSQL에 Restore 할 수 있습니다. 또한, 옵션을 통해서 다른 DBMS로 Restore 가능한 파일을 생성할 수 있습니다.
Archive File은 다른 DBMS로의 Restore는 불가능하지만, pg_restore를 통해서 다른 PostgreSQL Database로 빠르게 Restore 할 수 있는 Backup Format입니다.

pg_dump Format 형식

Format 출력 특징
Plain-Text 스크립트파일 SQL 명령문 형태로 출력. 다른 DBMS로 이식가능
Custom Archive File 기본적으로 압축지원
Directory Archive File 기본적으로 압축지원. Parallel Backup 가능
Tar Archive File tar 형식으로 Backup 파일 생성
📢 스크립트 파일 : SQL 명령이 포함된 일반 텍스트 파일로 사람이 해석, 변경 가능
Archive 파일 : 일종의 바이너리 형태의 파일로 사람이 해석, 변경 불가능

 

pg_dump 특징

  • Role, Tablespace에 대한 Backup 불가능
  • 증분 Backup 불가능
  • 스크립트 파일은 psql, Archive File은 pg_restore에 의해 Restore 가능
  • Backup 파일에 대한 압축 지원(Custom, Directory Format)
  • Parallel Backup 지원(Direcotry Format)

Syntax Example

더보기
$ pg_dump --help
pg_dump 응용프로그램은 Database를 Text File(Plain-Text) 또는 기타 다른 Format의 파일로 Dump합니다.

사용법:
  pg_dump [OPTION]... [DBNAME]

일반 옵션:
  -f, --file=FILENAME               출력 파일이나 디렉토리명
  -F, --format=c|d|t|p              출력 파일 형식(custom, directory, tar, plain text(default))
  -j, --jobs=NUM                    Dump 작업 시 병렬처리 개수
  -v, --verbose                     상세 정보 표시
  -V, --version                     pg_dump 버전 정보
  -Z, --compress=0-9                압축 형식에 대한 압축 수준(0~9)
  --lock-wait-timeout=TIMEOUT       테이블 Lock에 대한 지정한 대기시간(초) 경과 후 실패
  --no-sync                         변경 내용이 디스크에 안전하게 기록되기를 기다리지 않음(즉, fsync 작업생략)
  -?, --help                        도움말

출력 내용을 다루는 옵션:
  -a, --data-only                   Data만 Dump(스키마는 Dump하지 않음)
  -b, --blobs                       Large Object를 포함하여 Dump
  -B, --no-blobs                    Large Object를 제외하고 Dump
  -c, --clean                       재생성하기 전에 Database Object 삭제(Drop)
  -C, --create                      Database 생성문을 포함하여 Dump
  -e, --extension=PATTERN           지정한 Extension만 Dump
  -E, --encoding=ENCODING           지정한 인코딩으로 Data Dump
  -n, --schema=PATTERN              지정한 스키마만 Dump
  -N, --exclude-schema=PATTERN      지정한 스키마만 제외하고 Dump
  -O, --no-owner                    Plain-text 형식에서 Object 소유권 Restore을 건너뜀
  -s, --schema-only                 Schema만 Dump(Data는 Dump하지 않음)
  -S, --superuser=NAME              Plain-text 형식에서 사용할 superuser 이름
  -t, --table=PATTERN               지정한 테이블만 Dump
  -T, --exclude-table=PATTERN       지정한 테이블만 제외하고 Dump
  -x, --no-privileges               권한은 Dump하지 않음(grant/revoke)
  --binary-upgrade                  업그레이드 유틸리티 전용
  --column-inserts                  Data를 컬럼명과 함께 Insert문으로 Dump
  --disable-dollar-quoting          $ 인용을 사용하지 않고, SQL 표준 따옴표("") 사용
  --disable-triggers                Data만 Restore하는 경우 트리거를 사용하지 않음
  --enable-row-security             Row 보안 설정(사용자가 접근할 수 있는 콘텐츠만 Dump)
  --exclude-table-data=PATTERN      지정된 테이블의 Data는 Dump하지 않음
  --extra-float-digits=NUM          extra_float_digits 값을 지정한 값으로 변경
  --if-exists                       Object를 삭제(Drop) 할때 IF EXISTS 사용
  --include-foreign-data=PATTERN    지정한 패턴과 일치하는 외부 Server의 외부테이블 Data를 포함
  --inserts                         COPY가 아닌 INSERT문으로 Data Dump
  --load-via-partition-root         root 테이블을 통해 파티션 Load
  --no-comments                     Comment는 Dump하지 않음
  --no-publications                 Publications은 Dump하지 않음
  --no-security-labels              security label assignments은 Dump하지 않음
  --no-subscriptions                subscriptions은 Dump하지 않음
  --no-synchronized-snapshots       병렬작업 시 synchronized snapshots은 사용하지 않음
  --no-tablespaces                  테이블스페이스 할당은 Dump하지 않음
  --no-toast-compression            TOAST 압축을 하지 않고 Dump
  --no-unlogged-table-data          기록되지 않은 테이블 Data는 Dump하지 않음
  --on-conflict-do-nothing          INSERT문에 ON CONFLICT DO NOTHING 추가
  --quote-all-identifiers           키워드가 아니어도 모든 식별자를 따옴표로 묶음
  --rows-per-insert=NROWS           INSERT 당 Row 수(--inserts를 의미)
  --section=SECTION                 지정된 섹션만 Dump(섹션 : pre-data, data, or post-data)
  --serializable-deferrable         자료 정합성을 보장하기 위해 Dump 작업을 직렬화 가능한 트랜잭션으로 처리
  --snapshot=SNAPSHOT               지정한 스냅샷을 Dump
  --strict-names                    테이블 또는 스키마에는 각각 하나 이상의 엔티티와 일치하는 패턴이 포함되어야 함
  --use-set-session-authorization   소유권 설정 시 ALTER OWNER 대신 SET SESSION AUTHORIZATION 명령 사용

연결 옵션:
  -d, --dbname=DBNAME               Dump 할 Database 명
  -h, --host=HOSTNAME               Database Server host 또는 소켓 디렉토리
  -p, --port=PORT                   Database Server Port 번호
  -U, --username=NAME               연결할 Database 사용자
  -w, --no-password                 암호 입력 프롬프트 표시하지 않음
  -W, --password                    암호 입력 프롬프트 표시(자동으로처리)
  --role=ROLENAME                   Dump전에 SET ROLE 수행

Database 명이 제공되지 않으면, PGDATABASE 환경 변수 값이 사용됩니다.

Database Backup(-d옵션)

## Database : exem
## Backup File : exem.backup
pg_dump -f exem.backup -d exem

 

특정 Schema만 Backup(-n옵션)

## Database : postgres
## Schema : exem (only)
## Backup File : schema.backup
pg_dump -f exem.backup -d postgres -n exem

 

특정 Schema를 제외하고 Backup(-N옵션)

## Database : postgres
## Exclude Schema : exem
## Bacakup File : schema.backup
pg_dump -f schema.backup -d postgres -N exem

 

특정 Table만 Backup(-t옵션)

## Database : postgres
## Include Schema : exem
## Include Table : tab01
## Backup File : table.backup
pg_dump -f table.backup -d postgres -n exem -t tab01

 

Custom Format Backup(-Fc옵션)

## Database : exem
## Dump Format : Custom Format
## Backup File : custom.backup
pg_dump -f custom.backup -Fc -d exem

 

Directory Format, Parallel Backup (-Fd, -j옵션)

## Database : exem
## Parallel Degree : 4
## Dump Format : Directory Format
## Backup Directory Path : /home/postgres/backupdir
pg_dump -f dir.backup -Fd -j 4 -d exem

 

 

2. pg_dumpall 목차

pg_dumpall은 PostgreSQL의 전체 Database Cluster에 대한 Backup을 수행합니다. pg_dumpall은 전체 Database의 테이블을 읽기 때문에 pg_dumpall 수행 시 superuser로 접속해야 합니다. pg_dumpall 수행으로 생성된 스크립트 파일은 psql로 수행할 수 있는 Plain-Text Format의 SQL 명령문으로 만들어지며 Restore 시 Role, Database 생성 등을 위해 superuser로 수행해야 합니다.

 

pg_dumpall 특징

  • Role, Tablespace에 대한 Backup 가능
  • psql에 의해서만 Restore 가능
  • Backup 파일에 대한 압축 지원하지 않음
  • 모든 Database를 차례로 단일 스크립트 파일로 생성하므로, Parallel Backup과 Parallel Restore를 할 수 없음

Syntax Example

더보기
$ pg_dumpall --help
pg_dumpall 프로그램은 PostgreSQL Database Cluster를 SQL 스크립트 파일로 추출하는 프로그램입니다.

사용법:
  pg_dumpall [OPTION]...

일반 옵션:
  -f, --file=FILENAME               출력 파일명
  -v, --verbose                     상세 정보 표시
  -V, --version                     pg_dumpall 버전 정보
  --lock-wait-timeout=TIMEOUT       테이블 Lock에 대한 지정한 대기시간(초) 경과 후 실패
  -?, --help                        도움말

출력 내용을 다루는 옵션:
  -a, --data-only                   Data만 Dump(스키마는 Dump하지 않음)
  -c, --clean                       재생성하기 전에 Database 삭제(Drop)
  -E, --encoding=ENCODING           지정한 인코딩으로 Data Dump
  -g, --globals-only                Global Object만 Dump(Database는 Dump하지 않음)
  -O, --no-owner                    Object 소유권 Restore을 건너뛰기
  -r, --roles-only                  ROLE만 Dump(Database, 테이블스페이스 Dump하지 않음)
  -s, --schema-only                 Schema만 Dump(Data는 Dump하지 않음)
  -S, --superuser=NAME              Dump에서 사용할 superuser 이름
  -t, --tablespaces-only            테이블스페이스만 Dump(Database, ROLE은 Dump하지 않음)
  -x, --no-privileges               권한은 Dump하지 않음(grant/revoke)
  --binary-upgrade                  업그레이드 유틸리티 전용
  --column-inserts                  Data를 컬럼명과 함께 Insert문으로 Dump
  --disable-dollar-quoting          $ 인용을 사용하지 않고, SQL 표준 따옴표("") 사용
  --disable-triggers                Data만 Restore하는 동안 트리거를 사용하지 않음
  --exclude-database=PATTERN        지정된 Database 제외
  --extra-float-digits=NUM          extra_float_digits 기본 설정 무시
  --if-exists                       Object를 삭제(Drop) 할때 IF EXISTS 사용
  --inserts                         COPY가 아닌 INSERT문으로 Data Dump
  --load-via-partition-root         root 테이블을 통해 파티션 Load
  --no-comments                     Comment는 Dump하지 않음
  --no-publications                 Publications은 Dump하지 않음
  --no-role-passwords               ROLE의 암호는 Dump하지 않음
  --no-security-labels              security label assignments은 Dump하지 않음
  --no-subscriptions                subscriptions은 Dump하지 않음
  --no-sync                         변경 내용이 디스크에 안전하게 기록되기를 기다리지 않음(즉, fsync 작업생략)
  --no-tablespaces                  테이블스페이스 할당은 Dump하지 않음
  --no-toast-compression            TOAST 압축을 하지 않고 Dump
  --no-unlogged-table-data          기록되지 않은 테이블 Data는 Dump하지 않음
  --on-conflict-do-nothing          INSERT문에 ON CONFLICT DO NOTHING 추가
  --quote-all-identifiers           키워드가 아니어도 모든 식별자를 따옴표로 묶음
  --rows-per-insert=NROWS           INSERT 당 Row 수(--inserts를 의미)
  --use-set-session-authorization   소유권 설정 시 ALTER OWNER 대신 SET SESSION AUTHORIZATION 명령 사용

연결 옵션:
  -d, --dbname=CONNSTR              Server에 연결하는 데 사용되는 매개변수
  -h, --host=HOSTNAME               Database Server host(IP) 또는 소켓 디렉토리
  -l, --database=DBNAME             연결할 Database 이름
  -p, --port=PORT                   Database Server Port 번호
  -U, --username=NAME               연결할 Database 사용자
  -w, --no-password                 암호 입력 프롬프트 표시하지 않음
  -W, --password                    암호 입력 프롬프트 표시(자동으로처리)
  --role=ROLENAME                   Dump전에 SET ROLE 수행

-f/--file을 사용하지 않으면, SQL 스크립트가 표준 출력으로 기록됩니다.

Database Cluster Backup

## Backup File : dumpall.sql
pg_dumpall -f dumpall.sql

 

테이블스페이스만 Backup(-t옵션)

## Backup File : only_tbs.sql
pg_dumpall -f only_tbs.sql -t

 

 

3. pg_restore 목차

pg_restore는 pg_dump가 생성한 Dump File에서 PostgreSQL Database를 Restore 할 수 있는 응용프로그램입니다. Dump를 수행한 시점의 Database 상태로 재구성하는데 필요한 명령을 수행합니다. Custom Format, Directory Format, Tar Format으로 생성된 Dump File에 대해서 pg_restore를 사용할 수 있습니다.

 

Syntax Example

더보기
$ pg_restore --help
pg_restore 프로그램은 pg_dump로 만들어진 Dump File로 PostgreSQL Database에 그 자료를 일괄 입력합니다.

사용법:
  pg_restore [OPTION]... [FILE]

일반 옵션:
  -d, --dbname=NAME                연결 Database 명
  -f, --file=FILENAME              출력 파일명(- for stdout)
  -F, --format=c|d|t               Backup 파일 형식(지정하지 않으면 자동분석)
  -l, --list                       아카이브(Dump)의 요약된 TOC 출력
  -v, --verbose                    상세 정보 표시
  -V, --version                    pg_restore 버전 정보
  -?, --help                       도움말

Restore 처리를 위한 옵션:
  -a, --data-only                  Data만 Restore(Schema는 Restore하지 않음)
  -c, --clean                      재생성하기 전에 Database Object 삭제(Drop)
  -C, --create                     Database 생성
  -e, --exit-on-error              오류 발생 시 종료(Default : Continue)
  -I, --index=NAME                 지정한 인덱스 Restore
  -j, --jobs=NUM                   Restore 시 병렬처리 수
  -L, --use-list=FILENAME          파일의 목차를 사용하여 순서대로 Restore
  -n, --schema=NAME                지정한 Schema의 Object만 Restore
  -N, --exclude-schema=NAME        지정한 Schema의 Object을 제외하고 Restore
  -O, --no-owner                   Object 소유권 Restore을 건너뜀
  -P, --function=NAME(args)        지정한 Function Restore
  -s, --schema-only                Schema만 Restore(Data는 Restore하지 않음)
  -S, --superuser=NAME             trigger 비활성화에 사용할 superuser 이름
  -t, --table=NAME                 지정한 relation Restore(테이블, 뷰 등)
  -T, --trigger=NAME               지정한 trigger Restore
  -x, --no-privileges              권한은 Restore하지 않음(grant/revoke)
  -1, --single-transaction         단일 트랙잭션으로 Restore
  --disable-triggers               Data만 Restore하는 동안 트리거를 사용하지 않음
  --enable-row-security            Row 보안 설정
  --if-exists                      Object를 삭제(Drop) 할때 IF EXISTS 사용
  --no-comments                    Comment는 Restore하지 않음
  --no-data-for-failed-tables      생성불가한 테이블의 Data는 Restore하지 않음
  --no-publications                Publication Restore하지 않음
  --no-security-labels             security labels Restore하지 않음
  --no-subscriptions               subscriptions Restore하지 않음
  --no-tablespaces                 tablespace assignments Restore하지 않음
  --section=SECTION                지정한 section만 Restore(pre-data, data, or post-data)
  --strict-names                   테이블 또는 스키마에는 각각 하나 이상의 엔티티와 일치하는 패턴이 포함되어야 함
  --use-set-session-authorization  소유권 설정 시 ALTER OWNER 대신 SET SESSION AUTHORIZATION 명령 사용

연결 옵션:
  -h, --host=HOSTNAME              Database Server host(IP) 또는 소켓 디렉토리
  -p, --port=PORT                  Database Server Port 번호
  -U, --username=NAME              연결할 Database 사용자
  -w, --no-password                암호 입력 프롬프트 표시하지 않음
  -W, --password                   암호 입력 프롬프트 표시(자동으로처리)
  --role=ROLENAME                  Restore전에 SET ROLE 수행

-I, -n, -N, -P, -t, -T 및 --section 옵션을 결합하고 여러 번 지정하여 여러 개체를 선택할 수 있습니다.

입력 파일 이름이 제공되지 않으면 표준 입력이 사용됩니다.

특정 Database 존재하지 않는 상태에서 Restore

## Backup방법 : pg_dump -f exem.backup -Fc -d exem
## PostgreSQL 접속 Role : postgres
## Restore 대상 Dump 파일 : exem.backup
## Restore 대상 Database : exem
pg_restore -U postgres -d postgres -C -Fc exem.backup

## Restore Flow
# 1. Superuser인 postgres Role로 postgres Database 접속 (-U, -d 옵션)
# 2. exem Database 생성 (-C 옵션)
# 3. exem Database 접속
# 4. Data Restore (-Fc 옵션)

 

특정 Database 존재하는 상태에서 Restore

## Backup방법 : pg_dump -f exem.backup -Fc -d exem
## Restore 대상 Database : exem
## Restore 대상 Dump 파일 : exem.backup
pg_restore -d exem -Fc exem.backup

 

Directory Format, Parallel Restore (-Fd, -j옵션)

## Restore Database : exem
## Restore Degree : 4
## Restore 대상 Dump Directory : /home/postgres/backupdir
pg_restore -f /home/postgres/backupdir -Fd -j 4 -d exem

 

 

4. pg_upgrade 목차

pg_upgrade 응용프로그램을 통해 PostgreSQL Major버전 업그레이드를 할 수 있습니다. Major버전 업그레이드 시에만 사용되며, Minor버전 업그레이드 시에는 필요하지 않습니다.

 

pg_upgrade 특징

  • pg_upgrade 내부적으로 pg_dump와 pg_restore 수행. 따라서 pg_upgrade 수행을 위해서는 충분한 디스크 공간 필요
  • Database 크기가 크다면, 업그레이드 많은 소요시간 필요
  • Link 옵션 사용 시 Data 파일(PGDATA) 구조를 업그레이드 Major버전에 맞춰 변경함으로 디스크 공간 및 소요시간 단축 가능(단, 업그레이드 중 오류 발생 시 원상복구 불가)

Syntax Example

더보기
$ pg_upgrade --help
pg_upgrade는 Major 버전이 다른 PostgreSQL Cluster를 업그레이드 합니다.

사용법:
  pg_upgrade [OPTION]...

옵션:
  -b, --old-bindir=BINDIR       구 버전 Cluster 실행 디렉토리(bin Directory)
  -B, --new-bindir=BINDIR       신 버전 Cluster 실행 디렉토리(bin Directory) (기본값: pg_upgrade가 있는 디렉토리)
  -c, --check                   Data 변경은 하지 않고, Cluster만 체크
  -d, --old-datadir=DATADIR     구 버전 Cluster Data 디렉토리(data Directory)
  -D, --new-datadir=DATADIR     신 버전 Cluster Data 디렉토리(data Directory)
  -j, --jobs=NUM                동시 작업할 프로세스 또는 스레드 수
  -k, --link                    새 Cluster로 복사 대신 하드링크 사용.
  -o, --old-options=OPTIONS     구 버전 Cluster에 전달되는 옵션
  -O, --new-options=OPTIONS     신 버전 Cluster에 전달되는 옵션
  -p, --old-port=PORT           구 버전 Cluster Port 번호(default 50432)
  -P, --new-port=PORT           신 버전 Cluster Port 번호(default 50432)
  -r, --retain                  성공적으로 완료된 후에도 SQL 및 Log 파일 유지
  -s, --socketdir=DIR           사용할 소켓 디렉토리(기본값: 현재 디렉토리)
  -U, --username=NAME           Cluster superuser (default "root")
  -v, --verbose                 상세 정보 표시
  -V, --version                 pg_upgrade 버전 정보
  --clone                       새 Cluster 구축을 복사 대신 clone으로 사용
  -?, --help                    도움말

pg_upgrade를 수행하기 전에 확인:
  새 Database Cluster 생성 (신 버전의 initdb 사용)
  구 버전 Cluster postmaster 서비스 종료
  신 버전 Cluster postmaster 서비스 종료

pg_upgrade를 수행 할때 다음 정보를 제공해야 함:
  구 버전 Cluster Data 디렉토리 (-d DATADIR)
  신 버전 Cluster Data 디렉토리 (-D DATADIR)
  구 버전 Cluster bin 디렉토리 (-b BINDIR)
  신 버전 Cluster bin 디렉토리 (-B BINDIR)

사용예시:
  pg_upgrade -d oldCluster/data -D newCluster/data -b oldCluster/bin -B newCluster/bin
or
  $ export PGDATAOLD=oldCluster/data
  $ export PGDATANEW=newCluster/data
  $ export PGBINOLD=oldCluster/bin
  $ export PGBINNEW=newCluster/bin
  $ pg_upgrade

기본 사용법

## Syntax : pg_upgrade -b {oldbindir} -B {newbindir} -d {olddatadir} -D {newdatadir} [options]
pg_upgrade -b /usr/lib/postgresql/9.6/bin/ \
           -B /usr/lib/postgresql/13/bin/ \
           -d /var/lib/postgresql/9.6/main \
           -D /var/lib/postgresql/13/main

 

업그레이드 사전점검, Cluster만 체크(-c옵션)

pg_upgrade -b /usr/lib/postgresql/9.6/bin/ -B /usr/lib/postgresql/13/bin/ \
           -d /var/lib/postgresql/9.6/main -D /var/lib/postgresql/13/main \
           -c
더보기
[postgres@centos ~]$ /usr/pgsql-12/bin/pg_upgrade -c \
-b /usr/pgsql-9.6/bin \
-B /usr/pgsql-12/bin \
-d /var/lib/pgsql/9.6/data \
-D /var/lib/pgsql/12/data

Performing Consistency Checks
-----------------------------
Checking cluster versions                                   ok
Checking database user is the install user                  ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for system-defined composite types in user tables  ok
Checking for reg* data types in user tables                 ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for tables WITH OIDS                               ok
Checking for invalid "sql_identifier" user columns          ok
Checking for invalid "unknown" user columns                 ok
Checking for hash indexes                                   ok
Checking for presence of required libraries                 ok
Checking database user is the install user                  ok
Checking for prepared transactions                          ok
Checking for new cluster tablespace directories             ok

*Clusters are compatible*
 

업그레이드 시 Port 변경하여 수행(-p, -P옵션)

pg_upgrade -b /usr/lib/postgresql/9.6/bin/ -B /usr/lib/postgresql/13/bin/ \
           -d /var/lib/postgresql/9.6/main -D /var/lib/postgresql/13/main \
           -p 5432 -P 5433

 

업그레이드 시 Data Directory를 Link로 사용(-k옵션)

pg_upgrade -b /usr/lib/postgresql/9.6/bin/ -B /usr/lib/postgresql/13/bin/ \
           -d /var/lib/postgresql/9.6/main -D /var/lib/postgresql/13/main \
           -k

 

 

5. initdb 목차

initdb는 PostgreSQL Database Cluster를 생성하는 응용프로그램입니다. initdb 수행 시 Data가 저장될 Directory, 공유 Catalog 테이블 및 postgres Database이 생성됩니다. 또한, Database Cluster의 기본 Locale 및 Character Set Encoding을 초기화하며, 또 다른 새로운 Database의 기본값으로 사용할 template1 Database에 대한 설정을 합니다. initdb 응용프로그램은 PostgreSQL Server 프로세스를 소유한 사용자(postgres)로만 실행이 가능합니다. root로는 실행되지 않습니다.

 

Syntax Example

더보기
$ initdb --help
initdb PostgreSQL Database cluster를 초기화 하는 프로그램.

사용법:
  initdb [OPTION]... [DATADIR]

옵션:
  -A, --auth=METHO              로컬 연결의 기본 인증 방법
      --auth-host=METHOD        local TCP/IP 연결에 대한 기본 인증 방법
      --auth-local=METHOD       local-socket 연결에 대한 기본 인증 방법
 [-D, --pgdata=]DATADIR         새 Database Cluster를 만들 Directory
  -E, --encoding=ENCODING       새 Database의 기본 인코딩
  -g, --allow-group-access      Data Directory를 그룹이 읽고 접근할 수 있게 함
  -k, --data-checksums          자료 페이지 체크섬 사용
      --locale=LOCALE           새 Database의 기본 Locale 설정
      --lc-collate=, --lc-ctype=, --lc-messages=LOCALE
      --lc-monetary=, --lc-numeric=, --lc-time=LOCALE
                                새 Database의 각 범주에 기본 Locale 설정(환경에서 가져온 기본 값)
      --no-locale               --locale=C와 같음
      --pwfile=FILE             파일에서 새 superuser의 암호 읽기
  -T, --text-search-config=CFG  기본 텍스트 검색 구성
  -U, --username=NAME           Database superuser 이름
  -W, --pwprompt                새 superuser 암호를 입력 받음
  -X, --waldir=WALDIR           트랜잭션 로그 Directory 위치
      --wal-segsize=SIZE        WAL 파일 크기, MB단위

일반적으로 사용되지 않는 옵션:
  -d, --debug                   디버깅에 필요한 정보들도 함게 출력
      --discard-caches          set debug_discard_caches=1
  -L DIRECTORY                  입력파일들이 있는 Directory
  -n, --no-clean                오류가 발생되었을 경우 그래도 둠
  -N, --no-sync                 작업 완료 뒤 디스크 동기화 작업을 하지 않음
      --no-instructions         do not print instructions for next steps
  -s, --show                    내부 설정값들을 보여줌
  -S, --sync-only               Data Directory만 동기화

Other options:
  -V, --version                 initdb 버전 정보
  -?, --help                    도움말

Data Directory를 지정하지 않으면, PGDATA 환경 변수값을 사용합니다.

기본 사용법

## [postgres] PostgreSQL Data Directory : /PostgreSQL_Data
/usr/lib/pgsql-14/bin/initdb -D /PostgreSQL_Data
더보기
[postgres@centos ~]$ /usr/pgsql-14/bin/initdb -D /PostgreSQL_Data
이 Data베이스 시스템에서 만들어지는 파일들은 "postgres" 소유입니다.
또한 이 사용자는 Server 프로세스의 소유자입니다.

Data베이스 클러스터는 "en_US.UTF-8" Locale로 초기화됩니다.
따라서, 기본 Data베이스 인코딩은 "UTF8"로 설정되었습니다.
기본 텍스트 검색 구성은 "english"로 설정됩니다.

Data 페이지 체크섬이 비활성화 되었습니다.

기존 디렉토리 /PostgreSQL_Data에 대한 권한 수정 중 ... ok
하위 디렉토리 생성 중 ... ok
동적 공유 메모리 구현 선택 중 ... posix
기본 max_connections 선택 중 ... 100
기본 shared_buffers 선택 중 ... 128MB
기본 시간대 선택 ... Asia/Seoul
Configuration file 생성 중 ... ok
부트스트랩 스크립트 실행 중 ... ok
부트스트랩 후 초기화 수행 중 ... ok
디스크에 Data 동기화 중 ... ok

initdb: 경고: Local 연결에 대해 "trust" 인증 활성화
다음 번에 initdb 실행할 때 pg_hba.conf를 수정하거나 -A, 
--auth-local 또는 --auth-host 옵션을 사용하여 변경할 수 있습니다.

성공. 이제 다음을 사용하여 Data베이스 Server를 시작할 수 있습니다.

    /usr/pgsql-14/bin/pg_ctl -D /PostgreSQL_Data -l logfile start

 

Local, Encoding 옵션 지정

## [postgres] Locale=C, Encoding=UTF-8 지정
/usr/lib/pgsql-14/bin/initdb -D /PostgreSQL_Data --no-locale -E UTF-8

 

 

6. pg_upgradecluster 목차

pg_upgradecluster는 이전 버전의 PostgreSQL Database Cluster를 새로운 버전으로 업그레이드할 수 있는 응용프로그램입니다. Debian계열(Ubuntu 등)에서 제공되는 방법으로 pg_dumpall, pg_upgrade 보다 쉽게 업그레이드가 가능합니다.

 

pg_upgradecluster 특징

  • newdatadir 파라미터로 새로운 버전의 Cluster의 Data Directory를 지정할 수 있습니다. (Default : /var/lib/postgresql/{VERSION}/{CLUSTER_NAME})
  • 이전 버전의 Configuration File이 새로운 버전 Cluster에 복사됩니다. 따라서 새로운 버전의 Cluster는 기존에 사용 중이던 Port를 사용하게 되며, 이전 버전의 Cluster는 다른 Port를 사용하도록 구성됩니다.
  • 업그레이드 후에는 관리자가 수동으로 이전 버전의 PostgreSQL Cluster를 제거해야 합니다.(pg_dropcluster 이용)
  • 별도의 Tablepsace를 사용하고 있는 Database Cluster는 pg_upgradcluster 응용프로그램을 사용할 수 없습니다. pg_dump나 pg_dumpall과 같은 응용프로그램을 통해 업그레이드를 해야 합니다.

Syntax Example

더보기
$ man pg_upgradecluster
pg_upgradecluster - 기존 PostgreSQL Cluster를 새 Major 버전으로 업그레이드

사용법:
  pg_upgradecluster [-v newversion] oldversion name [newdatadir] ...

옵션:
  -v newversion                  업그레이드 버전 (Default : 서버에 설치되어 있는 PostgreSQL 버전 중 최신버전)
      --logfile filel               
      --locale=LOCALE            업그레이드 된 Database Cluster의 기본 Locale 설정. 지정되지 않으면 이전버전 Cluster의 Locale로 지정
                                 PostgreSQL 11이상으로 업그레이드할 때는 개별 Database의 인코딩 전환을 허용하지 않음.(지정불가)
      --lc-collate=LOCALE, --lc-ctype=LOCALE, --lc-messages=LOCALE
      --lc-monetary=LOCALE, --lc-numeric=LOCALE, --lc-time=LOCALE
                                 새 Database의 각 범주에 기본 Locale 설정(환경에서 가져온 기본 값)
  -m, --method=METHOD            업그레이드 방법을 지정.(dump|upgrade|link|clone) (Default : dump)
                                 dump : pg_dump와 pg_restore 사용
                                 upgrade : pg_upgrade 사용
                                 link : -m upgrade --link의 약어
                                 clone : -m upgrade --clone의 약어
  -k, --link                     새 Cluster로 복사 대신 하드링크 사용하도록 pg_upgrade에 전달
      --clone                    새 cluster로 복사하는 대신 효율적인 파일 복제(reflink)를 사용하도록 pg_upgrade에 전달
  -j, --jobs                     동시 작업할 프로세스 또는 스레드 수를 pg_upgrade에 전달
      --keep-port                이전 Cluster는 새로운 Port로 새 Cluster는 기존의 Port로 설정되는 것을 비활성화
      --rename=NEW-CLUSTER-NAME  업그레이드된 Cluster명 변경
      --old-bindir=DIRECTORY     기존 버전 Cluster 실행 디렉토리를 pg_upgrade에 전달
      --maintenace-db=DATABASE   유지관리 쿼리를 위해 연결할 Database.(Default : template1)
      --[no-]start               업그레이드 후 새 Cluster 시작 여부
pg_upgradecluster [-v newversion] {old-cluster-version} {old-cluster-name} [newdatadir]

pg_upgradecluster -v 12 9.6 main
pg_upgradecluster -v 12 9.6 main /home/postgres/PostgreSQL12_Data

 

 

7. pg_dropcluster 목차

pg_dropcluster는 PostgreSQL Cluster의 모든 파일(Data Directory, Log File, Configuration File)을 삭제하는 응용프로그램입니다. Debian계열(Ubuntu 등)에서 제공됩니다.

운영 중인 PostgreSQL Server의 Cluster는 삭제되지 않습니다. 이를 무시하고 Cluster를 삭제하고자 할 경우 --stop옵션을 통해 Cluster가 삭제되기 전에 PostgreSQL Server를 강제 종료할 수 있습니다.

 

Syntax Example

pg_dropcluster [--stop] {cluster-version} {cluster-name}

pg_dropcluster --stop 9.6 main

 

 

8. pg_lsclusters 목차

pg_lsclusters는 PostgreSQL의 모든 Cluster 정보를 확인할 수 있는 응용프로그램입니다.

 

Syntax Example

더보기
$ man pg_lsclusters
pg_lsclusters - 모든 PostgreSQL Cluster에 대한 정보 출력

사용법:
  pg_lsclusters [options] [cluster-version [cluster-name]]

옵션:
  -h, --no-header          Header Line 출력하지 않음
  -j, --json               JSON 형태로 출력(Debian package: libjson-perl 필요)
  -s, --start-conf         status 컬럼에 start.conf 내용을 포함하여 출력
      --help               도움말
pg_lsclusters [options] [cluster-version [cluster-name]]

pg_lsclusters
pg_lsclusters -j 12 main

 

 

9. pg_ctlcluster 목차

pg_ctlcluster는 PostgreSQL 동작(start/stop/restart/reload)를 관리합니다.

 

Syntax Example

더보기
$ man pg_ctlcluster
pg_ctlcluster - PostgreSQL Cluster 동작 관리

사용법:
  pg_ctlcluster [options] [cluster-version [cluster-name]] {action}

옵션:
  -f, --force           
  -m, --mode=MODE                Shutdown 모드. (Default : fast) [smart | fast | immediate]    
      --foreground               pg_ctl을 통해 데몬화하지 않고 foreground에서 postgres를 시작
      --stdlog                   --foreground가 사용 중일 때 stderr을 /var/log/postgresql의 표준 로그파일로 사용.
      --skip-systemctl-redirect 
      --bindir=DIRECTORY         pg_ctl 경로(Default : /usr/lib/postgresql/{VERSION}/bin)
  -o, --options=OPTIONS          지정된 옵션을 postgres 프로세스에 전달

Action:
  start | stop | restart | reload | status | promote
pg_ctlcluster [options] [cluster-version [cluster-name]] {action}

pg_lsclusters
pg_lsclusters -j 12 main

 


 

 

 

기획 및 글 | 기술기획팀

 

 

 

 

댓글0