본문 바로가기
DBMS

[PostgreSQL 이중화] #2. PostgreSQL 14.5 백업과 복구(pg_dumpall & psql)

by 이미존재 2022. 11. 4.
반응형

■ PostgreSQL pg_dumpall과 psql을 이용한 백업과 복구

▶ PostgreSQL HA 구성에 앞서 이번 포스팅에서는 데이터의 백업과 이를 이용한 복구 작업에 대해 간단히 알아보려고 합니다. 간단한 사용법 위주이고 깊이 들어가지는 않겠습니다.


1. PostgreSQL에서 사용 가능한 백업 방법


 1) SQL 덤프
  : pg_dump, pg_dumpall과 같은 명령어를 통해 백업하고 pg_restore, psql와 같은 명령어를 통해 복구합니다.
  : 부분 및 전체 데이터 백업이 가능합니다.
  : 서버가 기동 되고 있는 상태에서만 사용 가능하며 증분 데이터 반영은 불가능합니다.
 2) 아카이빙 
  : pg_basebackup 명령어와 wal 폴더 내용을 백업 및 복구합니다.
  : 증분 데이터 반영이 가능합니다.
  : 부분 데이터가 아닌 전체데이터가 복구 가능합니다.
 3) 파일 시스템 이용
  : tar 명령을 통해 백업 및 복구합니다.
  : 손쉬운 백업이 가능합니다.
  : 중분 데이터 반영은 불가능하고 아키텍처 영향을 받습니다.


2. SQL 덤프 방법 중에 pg_dumpall 백업과 psql 복구

 - 아카이빙 방법을 이중화 구성시 사용과 연관있으며 파일 시스템 이용은 제약을 받는 부분이 있어 SQL 덤프 방법을 이용해 보도록 하겠습니다.
 - role 또는 tablespace 까지 백업 가능한 pg_dumpall 명령과 psql 복구를 진행해 보도록 하겠습니다.
 - 테스트를 위하여 2대의 DB서버가 필요하며 복구할 DB 서버에는 테이블에 데이터가 없어야 합니다.
  : 테이블에 데이터가 있으면 already exists 오류가 발생하는 경우가 있음
 - pg_dumpall 명령은 데이터베이스에 대한 텍스트 형태의 덤프 파일을 만듭니다.
 - psql 명령어로 복구하며, 복구할 데이터베이스는 새로운 서버에 미리 생성할 필요는 없습니다.


3. 테스트용 데이터 생성

 - 테스트 백업을 위해 database 생성과 table 생성 및 간단한 데이터를 넣어 줍니다.

 1)데이터베이스 생성

postgres=# CREATE DATABASE berasix_test owner berasix;
postgres=# \c berasix_test;


 2) 테이블 생성 및 데이터 Insert

create table beratest (
b_data1 char(16) primary key,
data1    char(16),
data2    integer
);
INSERT INTO beratest VALUES('testdata','berasix',2022);

 

4. pg_dumpall 

 - postgres 계정을 사용합니다. 백업 데이터가 많아질 수 있으니 여유가 있는 장소에 백업하세요
 - 백업은 
 1) pg_dumpall 명령으로 백업을 수행합니다.(DBMS가 기동 상태에서 수행합니다.)

 postgres@berasix:/data/postgres14-data/pgdump$ pg_dumpall > pg_dumpall_20221.backup

 

 2) 복구 명령
  - DB서버 장애시 기존 운영 중이던 서버에 DB를 재설치 후 복구하거나 다른 서버에 백업된 파일로 복구하여 데이터를 백업 시점으로 맞추는 방법입니다.
  - 복구 대상 서버에 장애시점 데이터베이스가 없음을 확인합니다.(berasix_test 데이터베이스가 없음)

  - psql 명령으로 복구를 수행합니다. (DBMS가 기동 상태에서 수행 합니다.)

postgres@berasix-2:/data/postgres14-data/restore$ psql -f pg_dumpall_20221.backup

  : 신규서버에 데이터가 복구되었음을 확인할 수 있습니다.

  : berasix_test 데이터베이스의 beratest 테이블상에 데이터가 복구되었습니다.


  - psql 복구 진행 시 그림과 같이 에러가 발생할 수 있는데 신규 DB에 role과 database 데이터가 존재해서 발생합니다. role과 database를 삭제 후 다시 복구하시면 됩니다.

※ pg_dumpall  옵션들은 https://www.postgresql.org/docs/current/app-pg-dumpall.html 에서 확인 가능합니다.

728x90

댓글