3.8. 연속 보관을 통해 PostgreSQL 데이터 백업
PostgreSQL은 데이터베이스의 데이터 파일의 모든 변경 사항을 클러스터의 데이터 디렉터리의 pg_wal/
하위 디렉터리에서 사용할 수 있는 쓰기 로그(WAL) 파일로 기록합니다. 이 로그는 주로 충돌 복구를 위한 것입니다. 충돌 후 마지막 체크포인트 이후 만든 로그 항목을 사용하여 데이터베이스를 일관성으로 복원할 수 있습니다.
온라인 백업이라고도 하는 연속 보관 방법은 WAL 파일을 실행 중인 서버 또는 파일 시스템 수준 백업에서 수행되는 기본 백업의 형태로 데이터베이스 클러스터 복사본과 결합합니다.
데이터베이스 복구가 필요한 경우 데이터베이스 클러스터 복사본에서 데이터베이스를 복원한 다음 백업된 WAL 파일에서 로그를 재생하여 시스템을 현재 상태로 전환할 수 있습니다.
연속 보관 방법을 사용하면 최소 마지막 기본 백업의 시작 시간으로 확장되는 모든 보관된 WAL 파일의 연속 시퀀스를 유지해야 합니다. 따라서 기본 백업의 이상적인 빈도는 다음에 따라 다릅니다.
- 보관된 WAL 파일에 사용할 수 있는 스토리지 볼륨입니다.
- 복구가 필요한 경우 가능한 최대 데이터 복구 기간입니다. 마지막 백업 이후 오랜 기간이 있는 경우 시스템은 더 많은 WAL 세그먼트를 재생하므로 복구에 더 많은 시간이 걸립니다.
pg_dump
및 pg_dumpall
SQL 덤프를 연속 보관 백업 솔루션의 일부로 사용할 수 없습니다. SQL 덤프는 논리 백업을 생성하고 WAL 재생에서 사용할 수 있는 충분한 정보를 포함하지 않습니다.
3.8.1. 연속 보관의 이점 및 단점 링크 복사링크가 클립보드에 복사되었습니다!
연속 보관은 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 이점이 있습니다.
- 연속 백업 방법을 사용하면 로그 재생을 통해 백업의 내부 불일치가 수정되므로 완전히 일관성이 없는 기본 백업을 사용할 수 있습니다. 따라서 실행 중인 PostgreSQL 서버에서 기본 백업을 수행할 수 있습니다.
-
파일 시스템 스냅샷이 필요하지 않습니다.
tar
또는 유사한 아카이브 유틸리티로 충분합니다. - 로그 재생에 대한 WAL 파일의 순서가 무기한 길 수 있기 때문에 WAL 파일을 계속 보관하여 연속 백업을 수행할 수 있습니다. 이는 대규모 데이터베이스에 특히 중요합니다.
- 연속 백업은 지정 시간 복구를 지원합니다. WAL 항목을 끝에 재생할 필요는 없습니다. 재생은 언제든지 중지할 수 있으며 기본 백업이 수행된 이후 언제든지 데이터베이스를 해당 상태로 복원할 수 있습니다.
- 동일한 기본 백업 파일로 로드된 다른 머신에서 일련의 WAL 파일을 지속적으로 사용할 수 있는 경우 언제든지 데이터베이스 복사본이 거의 최신인 다른 시스템을 복원할 수 있습니다.
연속 보관에는 다른 PostgreSQL 백업 방법과 비교하여 다음과 같은 단점이 있습니다.
- 연속 백업 방법은 하위 집합이 아닌 전체 데이터베이스 클러스터의 복원만 지원합니다.
- 연속 백업에는 광범위한 아카이브 스토리지가 필요합니다.
3.8.2. WAL 아카이브 설정 링크 복사링크가 클립보드에 복사되었습니다!
실행 중인 PostgreSQL 서버는 쓰기 전 로그(WAL) 레코드를 생성합니다. 서버는 이 시퀀스를 WAL 세그먼트 파일로 물리적으로 나눕니다. 이 파일은 WAL 시퀀스에서 해당 위치를 반영하는 숫자 이름이 지정됩니다. WAL 보관이 없으면 세그먼트 파일이 재사용되고 더 높은 세그먼트 번호로 이름이 변경됩니다.
WAL 데이터를 저장할 때 각 세그먼트 파일의 내용이 캡처되고 세그먼트 파일을 재사용하기 전에 새 위치에 저장됩니다. NFS 마운트 디렉토리(예: 다른 머신, 보관 드라이브 또는 CD)와 같은 콘텐츠를 저장할 수 있는 여러 옵션이 있습니다.
WAL 레코드에는 구성 파일에 대한 변경 사항이 포함되어 있지 않습니다.
WAL 보관을 활성화하려면 다음 절차를 사용하십시오.
프로세스
/var/lib/pgsql/data/postgresql.conf
파일에서 다음을 수행합니다.-
wal_level
구성 매개 변수를replica
이상으로 설정합니다. -
archive_mode
매개변수를 의로
설정합니다. archive_command
구성 매개변수에서 shell 명령을 지정합니다.cp
명령, 다른 명령 또는 쉘 스크립트를 사용할 수 있습니다.예를 들면 다음과 같습니다.
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 여기서
%p
매개변수는 아카이브할 파일의 상대 경로로 교체되고%f
매개변수는 파일 이름으로 교체됩니다.이 명령은 아카이브 가능한 WAL 세그먼트를
/mnt/server/archivedir/
디렉터리에 복사합니다.%p
및%f
매개변수를 교체한 후 실행된 명령은 다음과 같습니다.test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065
test ! -f /mnt/server/archivedir/00000001000000A900000065 && cp pg_wal/00000001000000A900000065 /mnt/server/archivedir/00000001000000A900000065
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 보관된 각 새 파일에 대해 유사한 명령이 생성됩니다.
참고archive 명령은 완료된 WAL 세그먼트에서만 실행됩니다. WAL 트래픽을 거의 생성하는 서버는 트랜잭션 완료와 아카이브 스토리지에 안전한 기록 사이에 상당한 지연이 발생할 수 있습니다. 보관되지 않은 오래된 데이터를 저장할 수 있는 방법을 제한하려면 다음을 수행할 수 있습니다.
-
archive_timeout
매개변수를 설정하여 지정된 빈도로 서버가 새 WAL 세그먼트 파일로 전환하도록 합니다. -
pg_switch_wal
매개 변수를 사용하여 세그먼트 스위치가 완료된 직후 트랜잭션이 보관되도록 강제 적용합니다.
-
-
postgresql
서비스를 다시 시작하여 변경 사항을 활성화합니다.systemctl restart postgresql.service
# systemctl restart postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - archive 명령을 테스트하고 기존 파일을 덮어쓰지 않고 실패하는 경우 0이 아닌 종료 상태를 반환하는지 확인합니다.
- 데이터를 보호하려면 세그먼트 파일이 그룹 또는 세계 읽기 액세스 권한이 없는 디렉터리에 보관되어야 합니다.
3.8.3. 기본 백업 만들기 링크 복사링크가 클립보드에 복사되었습니다!
여러 가지 방법으로 기본 백업을 생성할 수 있습니다. 기본 백업을 수행하는 가장 간단한 방법은 실행 중인 PostgreSQL 서버에서 pg_basebackup
유틸리티를 사용하는 것입니다.
기본 백업 프로세스는 WAL 아카이브 영역에 저장되는 백업 기록 파일을 생성하고 기본 백업에 필요한 첫 번째 WAL 세그먼트 파일 뒤에 이름이 지정됩니다.
백업 기록 파일은 시작 및 종료 시간이 포함된 작은 텍스트 파일이며 백업의 WAL 세그먼트입니다. 레이블 문자열을 사용하여 연결된 덤프 파일을 식별하는 경우 백업 기록 파일을 사용하여 복원할 덤프 파일을 결정할 수 있습니다.
데이터를 복구할 수 있도록 여러 백업 세트를 유지하는 것이 좋습니다.
사전 요구 사항
-
postgres
슈퍼유저, 데이터베이스 관리자 권한이 있는 사용자 또는REPLICATION
권한이 있는 다른 사용자로 명령을 실행해야 합니다. - 기본 백업 중 및 이후에 생성된 모든 WAL 세그먼트 파일을 보관해야 합니다.
프로세스
pg_basebackup
유틸리티를 사용하여 기본 백업을 수행합니다.개별 파일로 기본 백업을 생성하려면 다음을 수행합니다.
pg_basebackup -D <backup_directory> -Fp
$ pg_basebackup -D <backup_directory> -Fp
Copy to Clipboard Copied! Toggle word wrap Toggle overflow backup_directory 를 선택한 백업 위치로 바꿉니다.
tablespaces를 사용하고 서버와 동일한 호스트에서 기본 백업을 수행하는 경우
--tablespace-mapping
옵션도 사용해야 합니다. 그렇지 않으면 백업을 동일한 위치에 작성하려고 할 때 백업이 실패합니다.기본 백업을
tar
아카이브(tar
및 압축 형식)로 만들려면 다음을 수행합니다.pg_basebackup -D <backup_directory> -Ft -z
$ pg_basebackup -D <backup_directory> -Ft -z
Copy to Clipboard Copied! Toggle word wrap Toggle overflow backup_directory 를 선택한 백업 위치로 바꿉니다.
이러한 데이터를 복원하려면 올바른 위치에 파일을 수동으로 추출해야 합니다.
연결할 데이터베이스 서버 pg_basebackup 을 지정하려면 다음 명령줄 옵션을 사용합니다.
호스트를 정의하는
-h
옵션입니다.기본 호스트는 로컬 호스트 또는
PGHOST
환경 변수에 의해 지정된 호스트입니다.포트를 정의하는
-p
옵션입니다.기본 포트는
PGPORT
환경 변수 또는 컴파일된 상태로 표시됩니다.
- 기본 백업 프로세스가 완료되면 백업 기록 파일에 지정된 백업 중에 사용되는 데이터베이스 클러스터 및 WAL 세그먼트 파일의 복사본을 안전하게 보관합니다.
- 기본 백업보다 오래되고 복원에 더 이상 필요하지 않기 때문에 기본 백업에 사용되는 WAL 세그먼트 파일보다 숫자적으로 낮은 WAL 세그먼트를 삭제합니다.
3.8.4. 연속 아카이브 백업을 사용하여 데이터베이스 복원 링크 복사링크가 클립보드에 복사되었습니다!
연속 백업을 사용하여 데이터베이스를 복원하려면 다음 절차를 사용하십시오.
프로세스
서버를 중지합니다.
systemctl stop postgresql.service
# systemctl stop postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 필요한 데이터를 임시 위치에 복사합니다.
전체 클러스터 데이터 디렉터리 및 모든 테이블 공간을 복사하는 것이 좋습니다. 이를 위해서는 시스템에 기존 데이터베이스의 두 복사본을 저장할 수 있는 충분한 여유 공간이 필요합니다.
공간이 충분하지 않은 경우 시스템이 중단되기 전에 보관되지 않은 로그를 포함할 수 있는 클러스터의
pg_wal
디렉터리의 내용을 저장합니다.- 클러스터 데이터 디렉터리 및 사용 중인 테이블 공간의 루트 디렉터리 아래에 있는 기존 파일 및 하위 디렉터리를 모두 제거합니다.
기본 백업에서 데이터베이스 파일을 복원합니다.
다음을 확인하십시오.
-
파일이 올바른 소유권(
root
가 아닌 데이터베이스 시스템 사용자)으로 복원됩니다. - 파일이 올바른 권한으로 복원됩니다.
-
pg_tblspc/
하위 디렉터리의 심볼릭 링크가 올바르게 복원됩니다.
-
파일이 올바른 소유권(
pg_wal/
하위 디렉터리에 있는 모든 파일을 제거합니다.이러한 파일은 기본 백업에서 생성되었으므로 사용되지 않습니다.
pg_wal/
을 보관하지 않은 경우 적절한 권한으로 다시 생성합니다.-
2단계에서 저장한 모든 보관되지 않은 WAL 세그먼트 파일을
pg_wal/
로 복사합니다. 클러스터 데이터 디렉터리에
recovery.conf
복구 명령 파일을 생성하고restore_command
구성 매개 변수에 shell 명령을 지정합니다.cp
명령, 다른 명령 또는 쉘 스크립트를 사용할 수 있습니다. 예를 들면 다음과 같습니다.restore_command = 'cp /mnt/server/archivedir/%f "%p"'
restore_command = 'cp /mnt/server/archivedir/%f "%p"'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 서버를 시작합니다.
systemctl start postgresql.service
# systemctl start postgresql.service
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 서버는 복구 모드로 전환되고 필요한 아카이브된 WAL 파일을 읽습니다.
외부 오류로 인해 복구가 종료되면 서버를 다시 시작할 수 있으며 복구를 계속합니다. 복구 프로세스가 완료되면 서버는
recovery.conf
의 이름을recovery.done
로 바꿉니다. 이렇게 하면 일반적인 데이터베이스 작업을 시작한 후 서버가 실수로 복구 모드로 다시 입력되지 않습니다.데이터베이스 내용을 확인하여 데이터베이스가 필요한 상태로 복구되었는지 확인합니다.
데이터베이스가 required 상태로 복구되지 않은 경우 1 단계로 돌아갑니다. 데이터베이스가 필수 상태로 복구된 경우
pg_hba.conf
파일에서 클라이언트 인증 구성을 복원하여 사용자가 연결할 수 있도록 합니다.