Computer >> 컴퓨터 >  >> 프로그래밍 >> 데이터베이스

Vertica 데이터베이스 백업 및 복원 완벽 가이드

데이터 손상이나 실수로 인한 삭제 등 예기치 못한 상황에서도 소중한 데이터를 안전하게 복구하려면, 데이터베이스 백업을 정기적인 유지보수 활동으로 습관화하는 것이 필수입니다. 이 글에서는 Vertica® 데이터베이스의 백업과 복원 방법을 체계적으로 살펴봅니다.

소개

Vertica는 대용량 데이터 처리를 위해 설계된 컬럼 기반(columnar) 스토리지 방식의 분석 데이터베이스 관리 시스템입니다. 기존에는 막대한 리소스가 필요했던 분석 워크로드에서도 뛰어난 쿼리 성능을 발휘하는 것이 특징입니다.

Vertica가 제공하는 주요 이점은 다음과 같습니다.

  • 기존 관계형 데이터베이스 관리 시스템(RDBMS) 대비 향상된 쿼리 성능
  • 높은 가용성(High Availability) 보장
  • 범용 엔터프라이즈 서버 기반의 페타바이트급 확장성

특히 Vertica의 백업 및 복구 메커니즘은 유지보수 작업이나 재해 복구 상황에서 발생하는 다운타임을 크게 줄여줍니다.

데이터베이스 백업 및 복원 방법

Vertica에서는 서비스 중단 없이 수행하는 핫 백업(hot backup), 복원 지점의 개수 제한 없이 생성 가능한 증분 백업, 그리고 데이터베이스 전체 또는 일부(스키마, 테이블 등)에 대한 백업까지 유연하게 구성할 수 있습니다. 지원되는 백업 수준은 다음과 같습니다.

  • 전체(Full) 수준: Vertica 데이터베이스 전체를 백업하고 복원할 수 있는 수준입니다.
  • 증분(Incremental) 수준: 이후 수행하는 백업으로, 신규 생성되었거나 변경된 데이터만 포함합니다.
  • 객체(Object-level) 수준: 복원이 필요한 특정 객체만을 대상으로 하는 백업입니다.

Vertica는 전체 백업으로부터 특정 객체(예: 스키마, 테이블)만 선택적으로 복원할 수 있는 세밀한 단위의 유연성도 함께 제공합니다.

스냅샷(Snapshots)

데이터베이스 스냅샷은 특정 시점의 모든 객체와 데이터를 일관된 상태 그대로 저장한 이미지입니다. 필요에 따라 데이터베이스 객체 중 일부만 선택하여 객체 수준 스냅샷을 만들 수 있으며, 이 경우 스냅샷 생성 시점의 해당 객체 데이터와 의존성 그래프에 연결된 관련 객체들도 함께 포함됩니다. 스냅샷 이름은 snap, objectsnap1, fullsnap처럼 원하는 형태로 자유롭게 지정할 수 있습니다.

백업 위치(Backup Location)

백업 위치란 백업 호스트 상에서 스냅샷과 관련 아카이브를 저장하는 디렉터리를 의미합니다. 스냅샷 간에는 호환성이 유지되므로, 전체 데이터베이스 스냅샷으로 복원한 이후에도 동일한 백업 위치에 있는 어떤 객체 스냅샷이든 활용할 수 있습니다. 또한 같은 백업 위치 내의 모든 스냅샷은 하드 링크(hard link)를 통해 데이터 파일을 공유합니다.

하드 링크 백업(Hard-link Backups)

Vertica는 로컬 클러스터 인프라 내에서 저비용·고효율의 백업 복사본(하드 링크 로컬 백업)을 생성할 수 있습니다. 사용자 데이터를 외부 백업 환경으로 복사하지 않기 때문에 이러한 백업은 더욱 빠르게 조회·복구할 수 있습니다. Vertica는 카탈로그 데이터만 복사하고, 파일 시스템 차원에서 Linux® 기반 하드 링크를 생성하는 방식으로 동작합니다.

Vertica 데이터베이스 백업 및 복원 완벽 가이드

이미지 출처: https://www.vertica.com/wp-content/uploads/2016/04/sidestep1.png

이러한 백업들은 동일한 스토리지 블록 집합을 공유하며, 각 백업은 자신의 시점(point-in-time) 복사본 정보만 추적합니다. 따라서 동일한 내용이 여러 곳에 중복 저장되지 않아 스토리지 공간을 효율적으로 사용할 수 있습니다.

백업 및 복원 프로세스 흐름

Vertica의 백업과 복원 절차는 다음 단계로 구성됩니다.

  1. 전체, 증분, 객체 수준 백업 중 사용할 스냅샷 유형을 선택합니다.
  2. Vertica 백업 및 복구 도구(vbr)를 사용해 구성 파일을 생성합니다.
  3. 백업 파일을 저장할 백업 위치를 초기화합니다.
  4. 생성한 구성 파일을 이용해 백업을 수행합니다.
  5. 백업 위치에서 백업 결과물을 검증합니다.
  6. 동일하거나 다른 Vertica 클러스터에서 전체 데이터베이스 또는 데이터베이스 객체를 복원합니다.
Vertica 데이터베이스 백업 및 복원 완벽 가이드

이미지 출처: https://www.vertica.com/kb/Copy-and-Restore-Data-from-a-Vertica-Cluster-to-a-Backup/Content/BestPractices/Copy-and-Restore-Data-from-a-Vertica-Cluster-to-a-Backup.htm

구성 파일 생성하기

vbr.py 유틸리티는 전체, 증분, 객체 수준 스냅샷의 백업 및 복원에 필요한 정보를 담은 구성 파일을 생성합니다. 구성 파일이 없으면 데이터베이스나 객체를 백업·복원할 수 없으며, 기본 제공되는 파일도 존재하지 않으므로 반드시 직접 생성해야 합니다.

필요한 만큼 여러 개의 백업 구성 파일을 만들 수 있습니다. 예를 들어 전체 백업용과 증분 백업용, 특정 객체나 스키마 전용, 특정 백업 위치 전용 파일 등을 용도별로 나누어 운영할 수 있습니다.

전체 백업 구성 파일

다음 절차에 따라 전체 데이터베이스 백업용 구성 파일을 생성합니다.

$ vbr.py --setupconfig
Snapshot name (backup_snapshot): full_bkp_snap
Backup vertica configurations? (n) [y/n]: y
Number of restore points (1):
Specify objects (no default):
Vertica user name (dbadmin): dbadmin
Save password to avoid runtime prompt? (n) [y/n]: n
Node v_testdb_node0001
Backup host name (no default): v_testdb_node0001
Backup directory (no default): /vert_backup/backup
Node v_testdb_node0002
Backup host name (no default): v_testdb_node0002
Backup directory (no default): /vert_backup/backup
Node v_testdb_node0003
Backup host name (no default): v_testdb_node0003
Backup directory (no default): /vert_backup/backup
Config file name (full_bkp_snap.ini): /vert_backup/backup_conf/full_bkp_snap.ini
Change advanced settings? (n) [y/n]: n
Saved vbr configuration to /vert_backup/backup_conf/full_bkp_snap.ini.
객체별 백업 구성 파일

특정 객체를 대상으로 하는 구성 파일은 다음 순서로 생성합니다.

  1. 먼저 데이터베이스 내 객체 목록을 확인하고 백업 대상을 선정합니다. 아래 예시의 Vertica 데이터베이스에는 다음과 같은 테이블이 존재합니다.

              List of tables
      Schema | Name  | Kind  |  Owner  | Comment
     --------+-------+-------+---------+---------
      public | tab1  | table | dbadmin |
      public | tab2  | table | dbadmin |
      public | tab3  | table | dbadmin |
      (3 rows)
    
  2. 다음 명령을 실행하여 public.tab1 테이블 백업용 구성 파일을 생성합니다.

     $ vbr.py --setupconfig
     Snapshot name (backup_snapshot): tab1_bkp_snap
     Backup vertica configurations? (n) [y/n]: n
     Number of restore points (1):
     Specify objects (no default): public.tab1
     Vertica user name (dbadmin): dbadmin
     Save password to avoid runtime prompt? (n) [y/n]: n
     Node v_testdb_node0001
     Backup host name (no default): v_testdb_node0001
     Backup directory (no default): /vert_backup/backup
     Node v_testdb_node0002
     Backup host name (no default): v_testdb_node0002
     Backup directory (no default): /vert_backup/backup
     Node v_testdb_node0003
     Backup host name (no default): v_testdb_node0003
     Backup directory (no default): /vert_backup/backup
     Config file name (tab1_bkp_snap.ini): /vert_backup/backup_conf/tab1_bkp_snap.ini
     Change advanced settings? (n) [y/n]: n
     Saved vbr configuration to /vert_backup/backup_conf/tab1_bkp_snap.ini.
    
  3. 다음 명령으로 생성된 백업 구성 파일 목록을 확인합니다.

     $ cd /vert_backup/backup_conf/
     $ ls -la
     total 20
     drwxr-xr-x. 2 dbadmin dbadmin 4096 Jan 20 14:21 .
     -rw-rw-r--. 1 dbadmin dbadmin  488 Jan 20 14:21 tab1_bkp_snap.ini
     -rw-rw-r--. 1 dbadmin dbadmin  475 Jan 20 14:04 full_bkp_snap.ini
    

백업 위치 초기화

소스 클러스터에서 전체 백업과 객체 수준 백업을 위한 백업 위치를 초기화하려면 다음 init 명령을 실행합니다.

$ /opt/vertica/bin/vbr.py -t init --config-file full_bkp_snap.ini
$ /opt/vertica/bin/vbr.py -t init --config-file tab1_bkp_snap.ini

백업 수행

이제 전체 데이터베이스 백업 또는 객체 수준 백업을 수행할 수 있습니다.

전체 데이터베이스 백업

앞서 생성한 full_bkp_snap.ini 구성 파일을 사용해 전체 데이터베이스 백업을 진행합니다.

$ vbr.py --task backup --config-file full_bkp_snap.ini
Please input vertica password:
pparing...
Found Database port:  5433
Copying...
348900 out of 348900, 100%
All child processes terminated successfully.
Committing changes on all backup sites...
backup done!
단일 객체 백업

tab1_bkp_snap.ini 구성 파일을 사용하면 객체 수준 백업을 수행할 수 있습니다.

$ vbr.py --task backup --config-file tab1_bkp_snap.ini
Please input vertica password:
pparing...
Found Database port:  5433
Copying...
78920 out of 78920, 100%
All child processes terminated successfully.
Committing changes on all backup sites...
backup done!

백업 위치 검증

다음 명령을 실행하여 백업이 정상적으로 저장되었는지 확인합니다.

$ cd vert_backup/
$ ls -la
total 16
drwxr-xr-x.  4 dbadmin dbadmin 4096 Jan 20 13:40 .
dr-xr-xr-x. 28 root    root    4096 Jan 20 13:53 ..
drwxr-xr-x.  5 dbadmin dbadmin 4096 Jan 20 15:22 backup
drwxr-xr-x.  2 dbadmin dbadmin 4096 Jan 20 15:29 backup_conf
$ cd backup/
$ ll
total 12
drwxrwxr-x. 8 dbadmin dbadmin 4096 Jan 20 15:29 v_testdb_node0001
drwxrwxr-x. 8 dbadmin dbadmin 4096 Jan 20 15:29 v_testdb_node0002
drwxrwxr-x. 8 dbadmin dbadmin 4096 Jan 20 15:29 v_testdb_node0003
$ cd v_testdb_node0001/
$ ll
total 12
drwx------. 3 dbadmin dbadmin 4096 Jan 20 15:29 tab1_bkp_snap
drwx------. 3 dbadmin dbadmin 4096 Jan 20 15:22 full_bkp_snap

백업 복원

복원 역시 전체 데이터베이스 단위 또는 객체 수준으로 수행할 수 있습니다.

전체 데이터베이스 백업에서 복원

참고: 전체 백업을 복원하려면 데이터베이스가 반드시 중지된 상태여야 합니다.

전체 데이터베이스 복원 절차는 다음과 같습니다.

  1. 데이터베이스의 모든 객체를 삭제한 후, 최근 생성한 백업으로 복원할 준비를 합니다.

     cluster=> dt
                    List of tables
      Schema | Name  | Kind  |  Owner  | Comment
     --------+-------+-------+---------+---------
      public | tab1  | table | dbadmin |
      public | tab2  | table | dbadmin |
      public | tab3  | table | dbadmin |
     (3 rows)
    
     cluster=> drop table tab1,tab2,tab3;
     DROP TABLE
     cluster=> dt
     No relations found.
    
  2. 데이터베이스가 중지된 상태에서 전체 백업을 사용해 복원을 진행합니다.

     $ vbr.py --task restore --config-file full_bkp_snap.ini
     Please input vertica password:
     Preparing...
     Found Database port:  5433
     Copying...
     248556 out of 248556, 100%
     All child processes terminated successfully.
     restore done!
    
  3. 데이터베이스를 시작한 후 객체 복원이 성공했는지 확인합니다. 다음 예시는 복원이 정상적으로 완료된 모습입니다.

     cluster=> dt
                    List of tables
      Schema | Name  | Kind  |  Owner  | Comment
     --------+-------+-------+---------+---------
      public | tab1  | table | dbadmin |
      public | tab2  | table | dbadmin |
      public | tab3  | table | dbadmin |
     (3 rows)
    
객체 수준 백업에서 복원

참고: 객체 수준 복원을 수행하려면 데이터베이스가 실행 중인 상태여야 합니다.

객체를 복원하려면 사전에 생성해 둔 객체 수준 백업이 필요합니다. 다음 코드는 복원을 위해 tab1 테이블을 삭제하는 과정을 보여줍니다.

cluster=> drop table tab1;
DROP TABLE
cluster=> dt
         List of tables
Schema | Name  | Kind  |  Owner  | Comment
-------+-------+-------+---------+---------
public | tab2  | table | dbadmin |
public | tab3  | table | dbadmin |
(2 rows)

객체 수준 백업에서 특정 객체를 복원하는 절차는 다음과 같습니다.

  1. 객체를 복원합니다.

     $ vbr.py --task restore --config-file tab1_bkp_snap.ini
     Please input vertica password:xxxxxxxx
     Preparing...
     Found Database port:  5433
     Copying...
      out of , 100%
     All child processes terminated successfully.
     Copying...
     2970 out of 2970, 100%
     All child processes terminated successfully.
     restore done!
    
  2. 객체 복원이 성공했는지 확인합니다. 다음 예시는 객체 수준 백업으로부터 public.tab1이 성공적으로 복원된 모습입니다.

     $ vsql
     Password:xxxxxxx
    
     dbadmin=> dt
            List of tables
      Schema | Name  | Kind  |  Owner  | Comment
     --------+-------+-------+---------+---------
      public | tab1  | table | dbadmin |
      public | tab2  | table | dbadmin |
      public | tab3  | table | dbadmin |
     (3 rows)
    
     dbadmin=> d tab1 ;
                                 List of Fields by Tables
      Schema | Table | Column |     Type     | Size | Default | Not Null | Primary Key | Foreign Key
     --------+-------+--------+--------------+------+---------+----------+-------------+-------------
      public | tab1  | col1   | numeric(3,)  |    8 |         | f        | f           |
    

결론

이 글에서는 Vertica 데이터베이스 백업 및 복구 프로세스의 핵심 원리를 살펴보았습니다. 아울러 전체, 증분, 객체 수준 등 다양한 단위에서 Vertica 데이터베이스를 백업하고 복원하는 구체적인 절차도 함께 안내했습니다. 이 내용을 바탕으로 여러분의 환경에 맞는 체계적인 백업 전략을 수립해 보시기 바랍니다.

데이터베이스에 대해 더 알고 싶다면 관련 자료를 참고하세요. www.rackspace.com에 방문하여 Sales Chat을 클릭하면 상담을 시작할 수 있습니다.

의견이나 궁금한 점이 있다면 피드백 탭을 통해 남겨주세요.