Netbackup 연동 RMAN 복원 테스트

현업에서는 서버를 관리하는데 있어서 대부분 백업 솔루션이 들업갑니다.


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


백업 솔루션은 Netbackup만 있는 것은 아니고 많은 회사들이 출시한 다양한 제품이 있지만, 국내에서 가장 많이 사용하는 백업 솔루션은 Netbackup 입니다. 백업 솔루션은 Acronis 같은 제품도 있고, 다양하게 있습니다.


Netbackup 같은 백업 솔루션은 단순 DB 백업 뿐 아니라 서버 자체를 백업 한다거나 다른 어플리케이션 백업도 가능합니다.

그렇기 때문에 Netbackup 엔지니어들은 Netbackup 설치나 OS 복구 정도는 할 수 있습니다. 


하지만, 오라클은 DB를 Netbackup을 이용해서 백업 할 줄 알아도, DB를 복구 하는 방법을 모르는 경우가 대부분 입니다. Netbackup을 다루는 회사마다 복구 메뉴얼이 있고, 메뉴얼 대로 복구 하는 경우가 많지만, 왜 그렇게 복구를 해야 하는지?, 복구하다 막혔을때 어떻게 해야 하는지 모르는 경우가 많아 DB 엔지니어나 DBA의 도움을 필요로 합니다. Netbackup 엔지니어들은 오라클을 집중적으로 공부한 경우가 많지 않기 때문이죠.


백업 계약이라는 것은 백업만 해주는게 아니고 장애시 복구가 포함 되는 것인데 백업 엔지니어가 DBA가 없으면 복구를 못하는 경운가 많다는 것이죠. 개인적으로 봤을때는 말이 안되는 상황이라고 봅니다. 업체측에서 restore 까지만 계약 되어 있다고 하는 경우도 있는데, 일반적으로 백업 복구는 recovery 후 시스템 정상화까지가 복구입니다. 


DBA와 백업 엔지니어가 협력해야 하는게 맞고, 서로서로 좋은게 좋은것이지만, 기본적으로 혼자 복구 할 줄 알아야 한다고 생각합니다. 어떤 회사는 들어가보면 DB는 있는데 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 경로가 맞는지 확인해줍니다.


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

$ mkdir -p /archive

# chown oracle.oinstall /archive


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


$ 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;
}


그 후에

RMAN> recover database;

RMAN> alter database open resetlogs; 

하면 완료가 됩니다.


티스토리 툴바