NetBackup 연동시 RMAN을 통한 복구 시나리오

 

NetBackup 연동시 RMAN을 통한 복구 시나리오

 

현업에서는 서버를 관리하는데 있어서 대부분 백업 솔루션이 들업갑니다. 중소규모의 회사나 서버가 몇대 없는 회사의 경우, RMAN 스크립트를 만들어서 crontab 이나 작업스케줄러에 등록하여 백업을 받기도 하지만, 대규모의 기업이나 많은 수의 서버를 가진 업체의 경우 Netbackup 같은 백업 솔루션이 들어갑니다.

백업 솔루션은 Netbackup뿐만 아니라 Acronis 같은 제품도 있고 많고 다양한 회사들이 출시한 여러 제품들이 있지만, 국내에서 가장 많이 사용하는 백업 솔루션은 Netbackup 입니다. Netbackup 같은 백업 솔루션은 단순 DB 백업 뿐 아니라 서버 자체를 백업 한다거나 다른 어플리케이션 백업도 가능합니다. 그렇기 때문에 Netbackup 엔지니어들은 Netbackup 설치나 OS 복구 정도는 할 수 있습니다. 하지만, 오라클은 DB를 Netbackup을 이용해서 백업 할 줄 알아도, DB를 복구 하는 방법을 모르는 경우가 대부분 입니다.

Netbackup을 다루는 회사마다 복구 메뉴얼이 있고, 메뉴얼 대로 복구 하는 경우가 많지만, 오라클 DB 복구를 하는데 있어서 왜 그렇게 복구를 해야 하는지?, 복구하다 에러메시지가 발생 했을 때 어떻게 해야 하는지 모르는 경우가 많아 DB 엔지니어나 DBA의 도움을 필요로 합니다. Netbackup 엔지니어들중에 오라클을 집중적으로 공부한 경우가 많지 않기 때문입니다.

대부분의 오라클 백업 계약이 restore까지만이고, recovery부분은 DBA 혹은 DB엔지니어들이 진행합니다. 전체적인 넷백업을 통한 복구 과정을 기술해보았습니다.

 

시나리오

RAC 2노드 (ASM) -> Single DB (ASM Standalone)

  • RAC는 라이센스도 비싸고, 장비 세팅이나 준비사항이 많습니다. 그렇기 때문에 DR서버를 구축하거나 복구를 위한 테스트 서버를 RAC로 구축하는것은 낭비입니다.
  • 오라클 DB의 버전은 동일하게 맞춥니다. 원본이 11.2.0.4 라면 복구도 11.2.0.4
  • 파일 시스템은 일반 파일시스템이나 Raw Device 이어도 상관 없지만, 복구 과정 중에 Rename 작업이 필요하며, ASM의 경우는 Rename 작업이 필요가 없습니다.
  • Netbackup에서 원본 서버의 RMAN 백업과 Archive 파일을 백업 받습니다.
  • 복구 서버에도 Netbackup 에이전트를 설치하고, RMAN의 저장 경로를 Netbackup으로 인식 시켜줍니다.

 

1. pfile 설정

  • pfile을 Netbackup에 있는 RMAN 백업에서 내려 받아도 상관 없지만, 그냥 원본에서 spfile을 pfile로 백업해서 드래그로 긁어 오는게 편합니다.

원본서버

 SQL> create pfile='init<SID>.ora' from spfile;

$ORACLE_HOME/dbs 밑에 가면 init<SID>.ora 파일이 생성 되어 있는데, 복구서버의 동일한 디렉토리에 복사해 주거나, vi로 만들어서 안의 내용을 복사해서 붙여 넣습니다.

rac2.__db_cache_size=1526726656
rac1.__db_cache_size=1459617792
rac2.__java_pool_size=16777216
rac1.__java_pool_size=16777216
rac2.__large_pool_size=33554432
rac1.__large_pool_size=33554432
rac1.__oracle_base='/app/oracle'#ORACLE_BASE set from environment
rac2.__oracle_base='/app/oracle'#ORACLE_BASE set from environment
rac2.__pga_aggregate_target=1258291200
rac1.__pga_aggregate_target=1342177280
rac2.__sga_target=2097152000
rac1.__sga_target=2013265920
rac2.__shared_io_pool_size=0
rac1.__shared_io_pool_size=0
rac2.__shared_pool_size=486539264
rac1.__shared_pool_size=469762048
rac2.__streams_pool_size=0
rac1.__streams_pool_size=0
*.audit_file_dest='/app/oracle/admin/rac/adump'
*.audit_trail='db'
*.cluster_database=true
*.compatible='11.2.0.4.0'
*.control_files='+DATA/rac/controlfile/current.260.923661671','+RECO/rac/controlfile/current.256.923661671'
*.db_block_size=8192
*.db_create_file_dest='+DATA'
*.db_domain=''
*.db_name='rac'
*.db_recovery_file_dest='+RECO'
*.db_recovery_file_dest_size=7423918080
*.diagnostic_dest='/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=racXDB)'
rac1.instance_number=1
rac2.instance_number=2
*.log_archive_dest_1='LOCATION=/archive'
*.log_archive_format='arch_rac_%t_%s_%r.arc'
*.memory_target=3348103168
*.open_cursors=300
*.processes=350
*.remote_listener='rac-cluster-scan:1521'
*.remote_login_passwordfile='exclusive'
*.sessions=390
rac2.thread=2
rac1.thread=1
rac2.undo_tablespace='UNDOTBS2'
rac1.undo_tablespace='UNDOTBS1'

파라미터 파일을 수정해야 합니다.

rac 관련되 부분을 삭제 혹은 주석 처리하고, cluster_database는 ture에서 false로 변경해 줍니다.

수정 후

rac.__db_cache_size=1459617792
rac.__java_pool_size=16777216
rac.__large_pool_size=33554432
rac.__oracle_base='/app/oracle'#ORACLE_BASE set from environment
rac.__pga_aggregate_target=1342177280
rac.__sga_target=2013265920
rac.__shared_io_pool_size=0
rac.__shared_pool_size=469762048
rac.__streams_pool_size=0
*.audit_file_dest='/app/oracle/admin/rac/adump'
*.audit_trail='db'
*.cluster_database=false
*.compatible='11.2.0.4.0'
*.control_files='+DATA/rac/controlfile/current.260.923661671'
*.db_block_size=8192
*.db_create_file_dest='+DATA'
*.db_domain=''
*.db_name='rac'
*.db_recovery_file_dest='+DATA'
*.db_recovery_file_dest_size=7423918080
*.diagnostic_dest='/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=racXDB)'
rac.instance_number=1
#rac2.instance_number=2
*.log_archive_dest_1='LOCATION=/archive'
*.log_archive_format='arch_rac_%t_%s_%r.arc'
*.memory_target=3348103168
*.open_cursors=300
*.processes=350
#*.remote_listener='rac-cluster-scan:1521'
*.remote_login_passwordfile='exclusive'
*.sessions=390
#rac2.thread=2
rac.thread=1
#rac2.undo_tablespace='UNDOTBS2'
rac.undo_tablespace='UNDOTBS1'

수정하고 diag 경로를 생성하고, archive 경로가 맞는지 확인해줍니다.

oracle$ mkdir -p /app/oracle/admin/rac/adump

oracle$ mkdir -p /archive

root# chown oracle.oinstall /archive

수정이 완료 되면 DB가 nomount 상태까지 올라갑니다.

oracle$ sqlplus / as sysdba

SQL> startup nomount;

그러면 DB쪽은 Restore 준비가 끝난 상태입니다.

 

2. Netbackup 에서 Controlfile 내려 받기

  •  DB가 nomount 상태가 되면 Netbackup 에이전트 설치 및 Netbackup RMAN 연동이 가능합니다. (Netbackup 엔지니어 작업)
  •  Netbackup과 RMAN이 연결되면, RMAN에서 list backup 명령시 백업 파일들이 나옵니다.
RMAN>  RUN { 
ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE'; 
SEND 'NB_ORA_SERV=<넷백업 서버명>, NB_ORA_CLIENT=<복구서버 클라이언트 명>'; 
RESTORE CONTROLFILE FROM 'ctrl_dracDB_udnrljheg_s439_p1_t928630224'; 
RELEASE CHANNEL ch00; 
}

빨간색으로 된 부분은 콘트롤 파일의 백업인데, 백업마다 이름이 다르고, 서버마다 다르니 맞는 걸 찾아서 복원하면 됩니다.

콘트롤 파일이 복원디면 DB mount가 가능해집니다.

RMAN> alter database mount;

 

3. Restore

  • controlfile이 복원되면 restore가 가능해집니다.
  • ASM의 경우 datafile의 끝에 랜덤 숫자로 고유번호가 붙는데, 원본 DB와 복구DB의 번호가 다릅니다.
  • Restore 시 바뀐 번호로 자동 적용됩니다.

restore 명령을 실행 해봅니다.

RMAN> RUN { 
ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE'; 
SEND 'NB_ORA_SERV=<넷백업 서버명>, NB_ORA_CLIENT=<복구서버 클라이언트 명>'; 
RESTORE DATABASE;                                   
RELEASE CHANNEL ch00; 
}

그러면 진행 상황이 나오며, restore가 진행됩니다.

Starting restore at 23-OCT-16
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to +DATA/rac/datafile/system.256.923661571
channel ORA_DISK_1: restoring datafile 00002 to +DATA/rac/datafile/sysaux.257.923661571
channel ORA_DISK_1: restoring datafile 00003 to +DATA/rac/datafile/undotbs1.258.923661573
channel ORA_DISK_1: restoring datafile 00004 to +DATA/rac/datafile/users.259.923661573
channel ORA_DISK_1: restoring datafile 00005 to +DATA/rac/datafile/example.264.923661707
channel ORA_DISK_1: restoring datafile 00006 to +DATA/rac/datafile/undotbs2.265.923661973
channel ORA_DISK_1: restoring datafile 00007 to +DATA/rac/datafile/test01.269.924548909
channel ORA_DISK_1: reading from backup piece /work/rman/0qrijlsp_1_1_20161017.bkp
channel ORA_DISK_1: piece handle=/work/rman/0qrijlsp_1_1_20161017.bkp tag=TAG20161017T161729
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:18:05
Finished restore at 23-OCT-16
RMAN>

 

4. Recovery

  • recover database 명령을 날려보면 필요한 archive log 파일 리스트가 나옵니다.
RMAN> recover database;
Starting recover at 23-OCT-16
using channel ORA_DISK_1

starting media recovery

channel ORA_DISK_1: starting archived log restore to default destination
channel ORA_DISK_1: restoring archived log
archived log thread=2 sequence=473
channel ORA_DISK_1: restoring archived log
archived log thread=1 sequence=239
channel ORA_DISK_1: reading from backup piece /work/rman/0srijm73_1_1_20161017.bkp
channel ORA_DISK_1: ORA-19870: error while restoring backup piece /work/rman/0srijm73_1_1_20161017.bkp
ORA-19504: failed to create file "/archive/arch_rac_2_473_923661675.arc"
ORA-27040: file create error, unable to create file
Linux-x86_64 Error: 13: Permission denied
Additional information: 1

failover to previous backup
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 10/23/2016 17:28:31
RMAN-20506: no backup of archived log found
RMAN-06053: unable to perform media recovery because of missing log
RMAN-06025: no backup of archived log for thread 1 with sequence 239 and starting SCN of 4539696 found to restore 
RMAN-06025: no backup of archived log for thread 2 with sequence 473 and starting SCN of 4539693 found to restore 
RMAN-06025: no backup of archived log for thread 1 with sequence 238 and starting SCN of 4539695 found to restore 
RMAN-06025: no backup of archived log for thread 2 with sequence 472 and starting SCN of 4539692 found to restore 
RMAN-06025: no backup of archived log for thread 1 with sequence 237 and starting SCN of 4539694 found to restore 
RMAN-06025: no backup of archived log for thread 2 with sequence 471 and starting SCN of 4539691 found to restore
thread 1은 1번 노드, thread 2는 2번 노드의 아카이브 파일입니다. 빨간색으로 된 부분에서 sequence 넘버를 잘 보면 맨 위에가 최신이고, 아래쪽이 오래된 시퀀스 넘버입니다. 해당 시퀀스 번호를 가진 아카이브 로그가 필요하다는 뜻 입니다. 그러면 Netbackup에서 아카이브 로그를 복구 합니다.
RUN {
ALLOCATE CHANNEL ch00 TYPE 'SBT_TAPE';
SEND 'NB_ORA_SERV=<넷백업 서버명>, NB_ORA_CLIENT=<복구서버 클라이언트 명>';
RESTORE ARCHIVELOG FROM SEQUENCE 237 UNTIL SEQUENCE 239 THREAD 1;
RESTORE ARCHIVELOG FROM SEQUENCE 471 UNTIL SEQUENCE 473 THREAD 2;
RELEASE CHANNEL ch00;
}
그 후에 recover 명령을 통해 복구를 완료합니다.
RMAN> recover database;
RMAN> alter database open resetlogs;
소셜 미디어로 공유하기

You may also like...

1 Response

  1. Asheeholic 댓글:

    정말 잘 읽었습니다. 덕분에 공부가 많이 되었습니다! 감사합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.

 

새 블로그로 이사갑니다.

 

rastalion.dev

 

도메인 변경했어요. 현재 지속적으로 개선 중입니다.

 

This will close in 10 seconds