4.5. PostgreSQL 데이터 백업
PostgreSQL 데이터를 백업하려면 다음 방법 중 하나를 사용합니다.
- SQL dump
- SQL 덤프로 백업 을 참조하십시오.
- 파일 시스템 수준 백업
- 파일 시스템 수준 백업을 참조하십시오.
- 연속 보관
- 연속 보관을 참조하십시오.
4.5.1. SQL 덤프를 사용하여 PostgreSQL 데이터 백업
SQL 덤프 방법은 SQL 명령으로 덤프 파일을 생성하는 방법을 기반으로 합니다. 덤프가 데이터베이스 서버에 다시 업로드되면 덤프 시와 동일한 상태로 데이터베이스를 다시 생성합니다.
SQL 덤프는 다음 PostgreSQL 클라이언트 애플리케이션에서 확인합니다.
- pg_dump 는 역할 또는 테이블 공간에 대한 클러스터 전체 정보 없이 단일 데이터베이스를 덤프합니다.
- pg_dumpall 은 지정된 클러스터의 각 데이터베이스를 덤프하고 역할 및 테이블 공간 정의와 같은 클러스터 전체 데이터를 유지합니다.
기본적으로 pg_dump
및 pg_dumpall
명령은 결과를 표준 출력에 씁니다. 덤프를 파일에 저장하려면 출력을 SQL 파일로 리디렉션합니다. 결과 SQL 파일은 병렬 처리를 허용하는 텍스트 형식 또는 다른 형식으로 되어 있고 개체 복원을 보다 자세히 제어할 수 있습니다.
데이터베이스에 액세스할 수 있는 모든 원격 호스트에서 SQL 덤프를 수행할 수 있습니다.
4.5.1.1. SQL 덤프의 장점 및 단점
SQL 덤프에는 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 이점이 있습니다.
- SQL 덤프는 서버 버전별이 아닌 유일한 PostgreSQL 백업 방법입니다. pg_dump 유틸리티의 출력은 파일 시스템 수준 백업 또는 연속 아카이브에서는 사용할 수 없는 최신 버전의 PostgreSQL 로 다시 로드할 수 있습니다.
- SQL 덤프는 32비트에서 64비트 서버로 이동하는 등 데이터베이스를 다른 시스템 아키텍처로 전송할 때 작동하는 유일한 방법입니다.
- SQL 덤프는 내부적으로 일관된 덤프를 제공합니다. 덤프는 pg_dump 가 실행을 시작한 시점에 데이터베이스의 스냅샷을 나타냅니다.
- pg_dump 유틸리티는 실행 시 데이터베이스의 다른 작업을 차단하지 않습니다.
SQL 덤프의 단점은 파일 시스템 수준 백업에 비해 더 많은 시간이 필요하다는 것입니다.
4.5.1.2. pg_dump를 사용하여 SQL 덤프 수행
클러스터 전체 정보 없이 단일 데이터베이스를 덤프하려면 pg_dump 유틸리티를 사용합니다.
사전 요구 사항
-
덤프하려는 모든 테이블에 대한 읽기 액세스 권한이 있어야 합니다. 전체 데이터베이스를 덤프하려면
postgres
superuser 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.
절차
클러스터 전체 정보가 없는 데이터베이스를 덤프합니다.
$ pg_dump dbname > dumpfile
연결할 데이터베이스 서버 pg_dump 를 지정하려면 다음 명령줄 옵션을 사용합니다.
호스트를 정의하는
-h
옵션.기본 호스트는 로컬 호스트이거나 PPP
HOST
환경 변수에 의해 지정된 항목입니다.포트를 정의하는
-p
옵션.기본 포트는 PPP
PORT
환경 변수 또는 컴파일된 기본값에 의해 표시됩니다.
4.5.1.3. pg_dumpall을 사용하여 SQL 덤프 수행
지정된 데이터베이스 클러스터에서 각 데이터베이스를 덤프하고 클러스터 전체 데이터를 보존하려면 pg_dumpall 유틸리티를 사용합니다.
사전 요구 사항
-
postgres
수퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.
절차
데이터베이스 클러스터의 모든 데이터베이스를 덤프하고 클러스터 전체 데이터를 보존합니다.
$ pg_dumpall > dumpfile
연결할 데이터베이스 서버 pg_dumpall 을 지정하려면 다음 명령줄 옵션을 사용합니다.
호스트를 정의하는
-h
옵션.기본 호스트는 로컬 호스트이거나 PPP
HOST
환경 변수에 의해 지정된 항목입니다.포트를 정의하는
-p
옵션.기본 포트는 PPP
PORT
환경 변수 또는 컴파일된 기본값에 의해 표시됩니다.기본 데이터베이스를 정의하는
-l
옵션.이 옵션을 사용하면 초기화 중에 자동으로 생성된
postgres
데이터베이스와 다른 기본 데이터베이스를 선택할 수 있습니다.
4.5.1.4. pg_dump를 사용하여 덤프된 데이터베이스 복원
pg_dump 유틸리티를 사용하여 덤프한 SQL 덤프에서 데이터베이스를 복원하려면 아래 단계를 수행하십시오.
사전 요구 사항
-
postgres
수퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.
절차
새 데이터베이스를 생성합니다.
$ createdb dbname
- 덤프된 데이터베이스의 오브젝트에 대한 권한을 소유하고 있거나 권한이 부여된 모든 사용자에게 이미 있는지 확인합니다. 이러한 사용자가 없는 경우 복원에서 원래 소유권 및 권한을 가진 오브젝트를 다시 생성할 수 없습니다.
psql 유틸리티를 실행하여 pg_dump 유틸리티에서 생성한 텍스트 파일 덤프를 복원합니다.
$ psql dbname < dumpfile
여기에서
dumpfile
은pg_dump
명령의 출력입니다. 텍스트가 아닌 파일 덤프를 복원하려면 대신pg_restore
유틸리티를 사용합니다.$ pg_restore non-plain-text-file
4.5.1.5. pg_dumpall을 사용하여 덤프된 데이터베이스 복원
pg_dumpall 유틸리티를 사용하여 덤프한 데이터베이스 클러스터에서 데이터를 복원하려면 아래 단계를 따르십시오.
사전 요구 사항
-
postgres
수퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.
절차
- 덤프된 데이터베이스의 개체에 대한 권한을 소유하고 있거나 권한이 부여된 모든 사용자가 이미 있는지 확인합니다. 이러한 사용자가 없는 경우 복원에서 원래 소유권 및 권한을 가진 오브젝트를 다시 생성할 수 없습니다.
psql 유틸리티를 실행하여 pg_dumpall 유틸리티로 생성된 텍스트 파일 덤프를 복원합니다.
$ psql < dumpfile
여기에서
dumpfile
은pg_dumpall
명령의 출력입니다.
4.5.1.6. 다른 서버에서 데이터베이스의 SQL 덤프 수행
pg_dump 및 psql 은 파이프로 쓰고 읽을 수 있기 때문에 한 서버에서 다른 서버로 직접 데이터베이스를 덤프할 수 있습니다.
절차
한 서버에서 다른 서버로 데이터베이스를 덤프하려면 다음을 실행합니다.
$ pg_dump -h host1 dbname | psql -h host2 dbname
4.5.1.7. 복원 중 SQL 오류 처리
기본적으로 SQL 오류가 발생하는 경우 psql 이 계속 실행되므로 데이터베이스가 부분적으로만 복원됩니다.
기본 동작을 변경하려면 덤프를 복원할 때 다음 방법 중 하나를 사용합니다.
사전 요구 사항
-
postgres
수퍼유저 또는 데이터베이스 관리자 권한이 있는 사용자로 명령을 실행해야 합니다.
절차
ON_ERROR_STOP
변수를 설정하여 SQL 오류가 발생하는 경우 psql 종료 상태로 3을 종료합니다.$ psql --set ON_ERROR_STOP=on dbname < dumpfile
복원이 완전히 완료되거나 취소되도록 전체 덤프가 단일 트랜잭션으로 복원되도록 지정합니다.
psql
유틸리티를 사용하여 텍스트 파일 덤프를 복원하는 경우:$ psql -1
pg_restore
유틸리티를 사용하여 텍스트가 아닌 파일 덤프를 복원하는 경우:$ pg_restore -e
이 방법을 사용할 때 사소한 오류도 여러 시간 동안 이미 실행된 복원 작업을 취소할 수 있습니다.
4.5.1.8. 추가 리소스
4.5.2. 파일 시스템 수준 백업을 사용하여 PostgreSQL 데이터 백업
파일 시스템 수준 백업을 생성하려면 PostgreSQL 데이터베이스 파일을 다른 위치에 복사합니다. 예를 들어 다음 방법을 사용할 수 있습니다.
- tar 유틸리티를 사용하여 아카이브 파일을 만듭니다.
- rsync 유틸리티를 사용하여 파일을 다른 위치에 복사합니다.
- 데이터 디렉터리의 일관된 스냅샷을 생성합니다.
4.5.2.1. 파일 시스템 백업의 이점 및 제한 사항
파일 시스템 수준 백업은 다른 PostgreSQL 백업 방법에 비해 다음과 같은 이점이 있습니다.
- 일반적으로 백업하는 파일 시스템 수준은 SQL 덤프보다 빠릅니다.
파일 시스템 수준 백업에는 다른 PostgreSQL 백업 방법에 비해 다음과 같은 제한 사항이 있습니다.
- 이 백업 방법은 RHEL 8에서 RHEL 9로 업그레이드하고 업그레이드된 시스템으로 데이터를 마이그레이션하려는 경우 적합하지 않습니다. 파일 시스템 수준 백업은 아키텍처 및 RHEL 주요 버전에 따라 다릅니다. 업그레이드에 성공적이지 않지만 RHEL 9 시스템의 데이터를 복원할 수 없는 경우 RHEL 8 시스템의 데이터를 복원할 수 있습니다.
- 데이터를 백업하고 복원하기 전에 데이터베이스 서버를 종료해야 합니다.
- 특정 개별 파일 또는 테이블을 백업하고 복원하는 것은 불가능합니다. 파일 시스템을 백업하는 것은 전체 데이터베이스 클러스터를 완전히 백업하고 복원하는 경우에만 작동합니다.
4.5.2.2. 파일 시스템 백업 수행
파일 시스템 수준 백업을 수행하려면 다음 절차를 사용하십시오.
절차
데이터베이스 클러스터의 위치를 선택하고 이 클러스터를 초기화합니다.
# postgresql-setup --initdb
postgresql 서비스를 중지합니다.
# systemctl stop postgresql.service
모든 방법을 사용하여 파일 시스템 백업을 생성합니다(예:
tar
아카이브).$ tar -cf backup.tar /var/lib/pgsql/data
postgresql 서비스를 시작합니다.
# systemctl start postgresql.service
추가 리소스
4.5.3. 연속 아카이빙을 통한 PostgreSQL 데이터 백업
4.5.3.1. 지속적인 아카이브 소개
PostgreSQL 은 데이터베이스의 데이터 파일의 모든 변경 사항을 클러스터 데이터 디렉터리의 pg_wal/
하위 디렉터리에서 사용할 수 있는 쓰기 전 로그(WAL) 파일에 기록합니다. 이 로그는 주로 크래시 복구용으로 사용됩니다. 충돌이 발생한 후 마지막 checkpoint 이후 발생한 로그 항목을 일관성으로 복원하는 데 사용할 수 있습니다.
온라인 백업이라고도 하는 지속적인 아카이브 방법은 실행 중인 서버 또는 파일 시스템 수준 백업에서 수행되는 기본 백업 형태의 데이터베이스 클러스터 사본과 WAL 파일을 결합합니다.
데이터베이스 복구가 필요한 경우 데이터베이스 클러스터 복사본에서 데이터베이스를 복원한 다음 백업된 WAL 파일의 로그를 재생하여 시스템을 현재 상태로 가져올 수 있습니다.
지속적인 아카이브 방법을 사용하면 최소한 마지막 기본 백업 시작 시간으로 확장되는 모든 아카이브 WAL 파일의 연속 시퀀스를 유지해야 합니다. 따라서 기본 백업의 이상적인 빈도는 다음과 같이 달라집니다.
- 아카이브된 WAL 파일에 사용 가능한 스토리지 볼륨입니다.
- 복구가 필요한 상황에서 가능한 최대 데이터 복구 기간입니다. 마지막 백업 이후 기간이 긴 경우 시스템에서 더 많은 WAL 세그먼트를 재생하고 복구에 시간이 더 걸립니다.
지속적인 아카이브 백업 솔루션의 일부로 pg_dump 및 pg_dumpall SQL 덤프를 사용할 수 없습니다. SQL 덤프는 논리적 백업을 생성하고 WAL 재생에서 사용할 수 있는 충분한 정보를 포함하지 않습니다.
연속 보관 방법을 사용하여 데이터베이스 백업 및 복원을 수행하려면 다음 지침을 따르십시오.
데이터를 복원하려면 연속 보관을 사용하여 데이터베이스 복원 의 지침을 따릅니다.
4.5.3.2. 지속적인 아카이빙의 장점과 단점
연속 아카이브는 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 이점이 있습니다.
- 연속 백업 방법을 사용하면 백업의 내부 불일치가 로그 재생에 의해 수정되므로 완전히 일치하지 않는 기본 백업을 사용할 수 있습니다. 따라서 실행 중인 PostgreSQL 서버에서 기본 백업을 수행할 수 있습니다.
-
파일 시스템 스냅샷이 필요하지 않습니다.
tar
또는 유사한 아카이브 유틸리티로 충분합니다. - 연속 백업은 로그 재생에 대한 WAL 파일의 시퀀스가 무기한 길어질 수 있기 때문에 WAL 파일을 계속 보관하여 달성할 수 있습니다. 이는 대규모 데이터베이스에 특히 유용합니다.
- 연속 백업은 특정 시점 복구를 지원합니다. WAL 항목을 끝까지 재생하지 않아도 됩니다. 언제든지 재생을 중지할 수 있으며 기본 백업 이후 언제든지 데이터베이스를 해당 상태로 복원할 수 있습니다.
- 일련의 WAL 파일을 동일한 기본 백업 파일과 함께 로드한 다른 시스템에서 지속적으로 사용할 수 있는 경우 언제든지 거의 최신 데이터베이스 복사본으로 다른 시스템을 복원할 수 있습니다.
연속 아카이브에는 다른 PostgreSQL 백업 방법에 비해 다음과 같은 단점이 있습니다.
- 연속 백업 방법은 하위 집합이 아닌 전체 데이터베이스 클러스터의 복원만 지원합니다.
- 연속 백업에는 광범위한 보관 스토리지가 필요합니다.
4.5.3.3. WAL 아카이브 설정
실행 중인 PostgreSQL 서버는 일련의 WAL(Write ahead log) 레코드를 생성합니다. 서버는 이 시퀀스를 WAL 세그먼트 파일로 분할하며, WAL 시퀀스에서 해당 위치를 반영하는 숫자 이름이 지정됩니다. WAL 아카이브가 없으면 세그먼트 파일이 재사용되고 더 높은 세그먼트 번호로 이름이 변경됩니다.
WAL 데이터를 보관하면 세그먼트 파일을 재사용하기 전에 각 세그먼트 파일의 내용을 새 위치에 캡처하여 저장합니다. 다른 시스템의 NFS 마운트된 디렉토리, 테이프 드라이브 또는 CD와 같은 콘텐츠를 저장할 수 있는 여러 옵션이 있습니다.
WAL 레코드에는 구성 파일에 대한 변경 사항이 포함되지 않습니다.
WAL 아카이브를 활성화하려면 다음 절차를 사용합니다.
절차
/var/lib/pgsql/data/postgresql.conf
파일에서 다음을 수행합니다.-
the
wal_level
구성 매개 변수를replica
이상으로 설정합니다. -
archive_mode
매개 변수를on
으로 설정합니다. -
archive_command
구성 매개 변수에 shell 명령을 지정합니다.cp
명령, 다른 명령 또는 쉘 스크립트를 사용할 수 있습니다.
-
the
postgresql
서비스를 다시 시작하여 변경 사항을 활성화합니다.# systemctl restart postgresql.service
- archive 명령을 테스트하고 기존 파일을 덮어쓰지 않고 실패하는 경우 0이 아닌 종료 상태를 반환하는지 확인합니다.
- 데이터를 보호하려면 세그먼트 파일이 그룹 또는 세계 읽기 액세스 권한이 없는 디렉터리에 보관되었는지 확인합니다.
archive 명령은 완료된 WAL 세그먼트에서만 실행됩니다. 작은 WAL 트래픽을 생성하는 서버는 트랜잭션 완료와 아카이브 스토리지의 안전한 기록 사이에 상당한 지연이 발생할 수 있습니다. 아카이브되지 않은 데이터가 얼마나 오래된지 제한하려면 다음을 수행할 수 있습니다.
-
지정된 빈도로 서버가 새 WAL 세그먼트 파일로 전환되도록
archive_timeout
매개 변수를 설정합니다. -
pg_switch_wal
매개 변수를 사용하여 세그먼트 스위치를 강제 적용하여 트랜잭션이 완료된 후 즉시 보관되도록 합니다.
예 4.5. WAL 세그먼트를 보관하기 위한 쉘 명령
이 예에서는 archive_command
구성 매개 변수에 설정할 수 있는 간단한 쉘 명령을 보여줍니다.
다음 명령은 완료된 세그먼트 파일을 필요한 위치로 복사합니다.
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
여기서 %p
매개 변수는 아카이브할 파일의 상대 경로로 바뀌고 %f
매개 변수는 파일 이름으로 교체됩니다.
이 명령은 보관 가능한 WAL 세그먼트를 /mnt/server/archivedir/
디렉터리에 복사합니다. %p 및 %
f
매개변수를 교체한 후 실행된 명령은 다음과 같습니다.
test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065
아카이브된 각 새 파일에 대해 유사한 명령이 생성됩니다.
추가 리소스
4.5.3.4. 기본 백업 만들기
몇 가지 방법으로 기본 백업을 만들 수 있습니다. 기본 백업을 수행하는 가장 간단한 방법은 실행 중인 PostgreSQL 서버에서 pg_basebackup 유틸리티를 사용하는 것입니다.
기본 백업 프로세스는 WAL 아카이브 영역에 저장된 백업 기록 파일을 만들고 기본 백업에 필요한 첫 번째 WAL 세그먼트 파일 다음에 이름이 지정됩니다.
백업 기록 파일은 시작 및 끝 시간과 백업의 WAL 세그먼트를 포함하는 작은 텍스트 파일입니다. 레이블 문자열을 사용하여 연결된 덤프 파일을 식별한 경우 백업 기록 파일을 사용하여 복원할 덤프 파일을 확인할 수 있습니다.
데이터를 복구할 수 있도록 몇 가지 백업 세트를 확실하게 유지하는 것이 좋습니다.
기본 백업을 수행하려면 다음 절차를 사용합니다.
사전 요구 사항
-
postgres
수퍼유저, 데이터베이스 관리자 권한이 있는 사용자 또는 최소REPLICATION
권한이 있는 다른 사용자로 명령을 실행해야 합니다. - 기본 백업 중 및 이후에 생성된 모든 WAL 세그먼트 파일을 보관해야 합니다.
절차
pg_basebackup
유틸리티를 사용하여 기본 백업을 수행합니다.개별 파일(일반 형식)으로 기본 백업을 생성하려면 다음을 수행합니다.
$ pg_basebackup -D backup_directory -Fp
backup_directory 를 선택한 백업 위치로 바꿉니다.
테이블 공간을 사용하고 서버와 동일한 호스트에서 기본 백업을 수행하는 경우
--tablespace-mapping
옵션도 사용해야 합니다. 그렇지 않으면 백업을 동일한 위치에 쓰기를 시도할 때 백업이 실패합니다.tar 아카이브( tar
및 압축된 형식)로 기본 백업을 생성하려면 다음을 수행합니다.
$ pg_basebackup -D backup_directory -Ft -z
backup_directory 를 선택한 백업 위치로 바꿉니다.
이러한 데이터를 복원하려면 올바른 위치에 있는 파일을 수동으로 추출해야 합니다.
- 기본 백업 프로세스가 완료되면 백업 기록 파일에 지정된 데이터베이스 클러스터의 복사본과 백업 중에 사용되는 WAL 세그먼트 파일을 안전하게 보관합니다.
- WAL 세그먼트는 기본 백업보다 오래되어 더 이상 복원이 필요하지 않기 때문에 기본 백업에 사용되는 WAL 세그먼트보다 숫자적으로 낮은 값을 삭제합니다.
연결할 데이터베이스 서버 pg_basebackup 을 지정하려면 다음 명령줄 옵션을 사용합니다.
호스트를 정의하는
-h
옵션.기본 호스트는 DASD
HOST
환경 변수에서 지정한 로컬 호스트 또는 호스트입니다.포트를 정의하는
-p
옵션.기본 포트는 PPP
PORT
환경 변수 또는 컴파일된 기본값에 의해 표시됩니다.
4.5.3.5. 연속 아카이브 백업을 사용하여 데이터베이스 복원
연속 백업을 사용하여 데이터베이스를 복원하려면 다음 절차를 따릅니다.
절차
서버를 중지합니다.
# systemctl stop postgresql.service
필요한 데이터를 임시 위치에 복사합니다.
전체 클러스터 데이터 디렉터리 및 모든 테이블 공간을 복사하는 것이 좋습니다. 이를 위해서는 기존 데이터베이스의 두 사본을 저장할 수 있는 충분한 여유 공간이 필요합니다.
공간이 충분하지 않은 경우 시스템이 중단되기 전에 보관되지 않은 로그가 포함될 수 있는 클러스터의
pg_wal
디렉터리 콘텐츠를 저장합니다.- 클러스터 데이터 디렉토리 아래에 있는 기존 파일과 하위 디렉토리를 사용하고 있는 테이블 공간의 루트 디렉토리 아래에 모두 제거합니다.
기본 백업에서 데이터베이스 파일을 복원합니다.
다음을 확인하십시오.
-
파일이 올바른 소유권(root이 아닌 데이터베이스 시스템 사용자)을 사용하여 복원됩니다
.
- 올바른 권한으로 파일이 복원됩니다.
-
pg_tblspc/
하위 디렉터리의 심볼릭 링크가 올바르게 복원됩니다.
-
파일이 올바른 소유권(root이 아닌 데이터베이스 시스템 사용자)을 사용하여 복원됩니다
pg_wal/
하위 디렉터리에 있는 파일을 모두 제거합니다.이러한 파일은 기본 백업에서 발생하므로 더 이상 사용되지 않습니다.
pg_wal/
을 보관하지 않은 경우 적절한 권한으로 다시 만듭니다.-
2단계에 저장된 아카이브되지 않은 WAL 세그먼트 파일을
pg_wal/
에 복사합니다. 클러스터 데이터 디렉터리에
recovery.conf
복구 명령 파일을 만들고restore_command
구성 매개 변수에 shell 명령을 지정합니다.cp
명령, 다른 명령 또는 쉘 스크립트를 사용할 수 있습니다. 예를 들면 다음과 같습니다.restore_command = 'cp /mnt/server/archivedir/%f "%p"'
서버를 시작합니다.
# systemctl start postgresql.service
서버는 복구 모드로 전환하고 필요한 아카이브된 WAL 파일을 읽습니다.
외부 오류로 인해 복구가 종료되면 서버를 다시 시작할 수 있으며 복구가 계속됩니다. 복구 프로세스가 완료되면 서버의 recovery
.conf의 이름이 recovery.
done으로 변경됩니다.
이렇게 하면 서버가 정상적인 데이터베이스 작업을 시작한 후 실수로 복구 모드로 전환되지 않습니다.데이터베이스 내용을 확인하여 데이터베이스가 필수 상태로 복구되었는지 확인합니다.
데이터베이스가 필수 상태로 복구되지 않은 경우 1단계로 돌아갑니다. 데이터베이스가 필수 상태로 복구된 경우 사용자가
pg_hba.conf
파일에서 클라이언트 인증 구성을 복원하여 연결하도록 허용합니다.
연속 백업을 사용하여 복원하는 방법에 대한 자세한 내용은 PostgreSQL 문서를 참조하십시오.