DATOR


B&R 1. Clean(Cold) Backup 및 복구 DBMS B&R



 아카이브 로그 모드일 경우는 온라인 리두 로그 파일이 로그 스위칭이 일어 나더라도 로그내용을 아카이브 로그 파일로 백업 하기 때문에 최종백업본으로 부터 이어져오는 아카이브 로그파일이 있다면 문제 없이 복구가 가능하다.
 반면 노 아카이브 로그 모드 일 경우 장애 시점으로 부터 온라인 리두 로그 파일에 모든 트랜젝션 정보가 로그되어 있다는 보장을 받을 수 없다.
 노 아카이브로그에서의 가장 큰 문제점은 백업본의 SCN 싱크가 모두 맞도록 유지 해야 한 다는 것이다.
 그렇기 때문에 노 아카이브 모드에서의 백업은 데이터베이스를 Shutdown 시킨 이 후 풀 백업으로 진행 하여야 한다.
 때문에 트랜젝션이 빈번히 발생하는 OLTP시스템에서 노 아카이브 로그 모드로 DBMS를 운영한다는 것은 상당히 위험한 운영이다.
 반면 특별한 사용자(업무상으로 필요한)에 의해 데이터가 일괄적으로 입력되고, 입력되는 데이터를 직접 관리 하는 시스템이라면 아카이브 로그를 관리해야 하는 부수적인 비용을 줄 일 수 있으므로 유용할 수 있다. (하지만 오라클 DBMS를 사용하는 환경에서 이런 운영 환경은 흔치 않다. 대부분 아카이브 로그 모드 사용을 권장한다.)

 이번 장에서는 노 아카이브 로그 모드에서의 백업 및 복구에 대해 알아보도록 한다.

1. 데이터 파일 및 컨트롤 파일 백업
 먼저 모든 데이터 파일 및 컨트롤 파일 생성 스크립트를 만들기 위해 아래의 SQL을 실행한다.
 

-- oracle 계정의 host로 접속
mkdir -p /mnt/orclbackup/noarch
-- sqlplus 에 sys 계정 접속
sqlplus / as sysdba
set pagesize 999
set linesize 200

select     'conn / as sysdba'  AS "command" from dual
      union all
select     'set echo on'                    from dual
      union all
select     'shutdown immediate '            from dual
      union all
select 'host cp '||name||' /u02/bkg/cls/.'  from v$datafile
      union all
select 'host cp '||name||' /u02/bkg/cls/.'  from v$controlfile
      union all
select     'startup' from dual
      union all
select     'exit' from dual ;

command
---------------------------------------------------------------------------------------------conn / as sysdba
set echo on
shutdown immediate
host cp /u01/app/oracle/oradata/orcl/system01.dbf /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/undotbs01.dbf /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/sysaux01.dbf /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/users01.dbf /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/example01.dbf /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/control01.ctl /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/control02.ctl /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/control03.ctl /u02/bkg/cls/.
startup
exit

 위와 같이 조회하면 모든 데이터파일과 컨트롤 파일을 복사하는 스크립트를 만들 수 있다.

 조회된 결과를 복사 하여 아래와 같이 .sql파일로 생성한다.
mkdir -p /u02/bkg
vi /u02/bkg/backup_orclc.sql

conn / as sysdba
set echo on
shutdown immediate
host cp /u01/app/oracle/oradata/orcl/system01.dbf /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/undotbs01.dbf /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/sysaux01.dbf /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/users01.dbf /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/example01.dbf /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/control01.ctl /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/control02.ctl /u02/bkg/cls/.
host cp /u01/app/oracle/oradata/orcl/control03.ctl /u02/bkg/cls/.
startup
exit

 생성된 SQL파일을 아래와 같이 실행 시킨다.

-- 백업을 받을 디렉토리 생성
mkdir -p /u02/bkg/cls/
-- 백업 SQL문 실행
sqlplus /nolog  @/u02/bkg/backup_orclc.sql

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Feb 7 03:24:19 2012

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

Connected.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> host cp /u01/app/oracle/oradata/orcl/system01.dbf /u02/bkg/cls/.

SQL> host cp /u01/app/oracle/oradata/orcl/undotbs01.dbf /u02/bkg/cls/.

SQL> host cp /u01/app/oracle/oradata/orcl/sysaux01.dbf /u02/bkg/cls/.

SQL> host cp /u01/app/oracle/oradata/orcl/users01.dbf /u02/bkg/cls/.

SQL> host cp /u01/app/oracle/oradata/orcl/example01.dbf /u02/bkg/cls/.

SQL> host cp /u01/app/oracle/oradata/orcl/control01.ctl /u02/bkg/cls/.

SQL> host cp /u01/app/oracle/oradata/orcl/control02.ctl /u02/bkg/cls/.

SQL> host cp /u01/app/oracle/oradata/orcl/control03.ctl /u02/bkg/cls/.

SQL> startup
ORACLE instance started.

Total System Global Area  608174080 bytes
Fixed Size                  1220820 bytes
Variable Size             180358956 bytes
Database Buffers          419430400 bytes
Redo Buffers                7163904 bytes
Database mounted.
Database opened.
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

파일이 잘 복사 되었는 지 확인 해 본다.
 ls -l /u02/bkg/cls/
-rw-r-----  1 oracle oinstall   7061504  2월  7 03:25 control01.ctl
-rw-r-----  1 oracle oinstall   7061504  2월  7 03:25 control02.ctl
-rw-r-----  1 oracle oinstall   7061504  2월  7 03:25 control03.ctl
-rw-r-----  1 oracle oinstall 104865792  2월  7 03:25 example01.dbf
-rw-r-----  1 oracle oinstall 262152192  2월  7 03:25 sysaux01.dbf
-rw-r-----  1 oracle oinstall 503324672  2월  7 03:25 system01.dbf
-rw-r-----  1 oracle oinstall  36708352  2월  7 03:25 undotbs01.dbf
-rw-r-----  1 oracle oinstall   5251072  2월  7 03:25 users01.dbf
 위의 작업에 대한 프로세서는 이렇다.
1. sys 계정으로 접속
2. 데이터베이스 shutdown
3. host 명령을 통해 모든 데이터 파일 및 컨트롤 파일을 백업 폴더로 복사
4. 데이터베이스 startup
5. script 종료
 위의 프로세스와 같이 노 아카이브 모드에서의 백업은 항상 shutdown 이 후 모든 백업이 완료 되면 startup을 해줘야 하기 때문에 절차 상의 불편함도 있고, 서비스를 중지해야 한다는 치명적인 불편함이 있다.

2. 장애 발생 및 복구
 백업 본이 있으니 장애 상황 발생 및 복구 상황에 대해 알아보도록 한다.
 먼저 아래와 같이 온라인 리두 로그 파일과 체크 포인트를 수차례 강제 스위칭 시킨다.
sqlplus / as sysdba

alter system switch logfile ;
alter system checkpoint ;
alter system switch logfile ;
alter system checkpoint ;
alter system switch logfile ;
alter system checkpoint ;
alter system switch logfile ;
alter system checkpoint ;
alter system switch logfile ;
alter system checkpoint ;
alter system switch logfile ;
alter system checkpoint ;
alter system switch logfile ;
alter system checkpoint ;
alter system switch logfile ;
alter system checkpoint ;
 최종 백업본 이후 수차례 온라인 리두 파일이 스위칭되었기 때문에 복구를 할 수 있는 온라인 리두 로그 파일은 남아 있지 않다.

 그리고 아래와 같이 데이터 파일을 삭제한다.
host rm -f /u01/app/oracle/oradata/orcl/example01.dbf
host ls -l /u01/app/oracle/oradata/orcl/example01.dbf
ls: /u-1/app/oracle/oradata/orcl/example01.dbf: 그런 파일이나 디렉토리가 없음
 그리고 sys 계정으로 접속하여 데이터베이스를 shutdown 후 기동한다.
shutdown immediate

ORA-01116: error in opening database file 5
ORA-01110: data file 5: '/u01/app/oracle/oradata/orcl/example01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
 정상적으로 shutdown immediate로 셧다운을 시도하자 위와 같은 에러가 발생하였다.
 shutdown immediate는 셧다운 하기 전에 데이터베이스의 데이터파일, 컨트롤파일, 온라인 리두 로그 파일의 싱크 정보를 맞추고 셧다운 되어야 하는 데, example01.dbf 데이터 파일을 찾을 수 없기 때문에 에러가 발생하는 것 이다.
 이럴 경우 당황하지 말고 아래와 같이 셧다운을 다시 시도한다.
shutdown abort

ORACLE instance shut down.
 shutdown abort는 싱크 정보를 맞추지 않고 강제로 셧다운을 시키는 명령이다. 정상적인 상태일 경우 발생 된 트랜젝션의 대한 온라인 리두 로그 파일 정보와 데이터 파일의 정보에 대한 싱크가 맞지 않게 됨으로 스타트 업 시에 SMON에 의해 복구 작업이 수행되게 되므로 권장하지 않지만, 위와 같이 데이터 파일이 유실 되었을 경우 강제로 셧다운을 시킬 수 있다.

 이제 데이터파일과 컨트롤 파일들을 백업 디렉토리에 있던 모든 데이터파일 및 컨트롤 파일로 덮어 쓰기 한다.
host cp /u02/bkg/cls/*.dbf $ORACLE_BASE/oradata/orcl/
host cp /u02/bkg/cls/*.ctl $ORACLE_BASE/oradata/orcl/
 복사가 완료되었으면 mount 단계에서 복구를 진행한다.

 recover database until cancel using backup controlfile ;

ORA-00279: change 563092 generated at 02/07/2012 03:24:31 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/flash_recovery_area/ORCL/archivelog/2012_02_07/o1_mf_1_6_%u_.arcORA-00280: change 563092 for thread 1 is in sequence #6


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
-- 위와 같은 메세지가 뜨면서 커서가 깜빡일 때 아래와 같이 CANCEL 입력
CANCEL
Media recovery cancelled.

 백업본을 이용해 복구를 완료 하였다. 이제 데이터베이스를 오픈 상태로 상태 변경을 시도해 보도록한다.
alter database open;

alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
 데이터베이스 오픈을 시도하였지만 오픈을 할 수 없다.
 메세지를 잘 살펴보면 RESETLOGS or NORESETLOGS 옵션을 사용하여 데이터베이스를 오픈하라고 하고 있다.

 현 상태로 데이터베이스 오픈을 할 수 없는 이유는 데이터파일 및 컨트롤파일의 싱크 시점의 백업 시점은 동일하지만, 이후 데이터베이스가 운영되면서 온라인 리두 로그 파일의 SCN이 백업 이후 많은 변경을 가졌기 때문이다.
 때문에 그냥 오픈 할 수 없고, 온라인 리두 로그 파일을 리셋하여 초기화 시키며 백업 본의 데이터파일 및 컨트롤 파일과 싱크를 맞춰줘야 한다.
alter database open resetlogs ;

Database altered.
 이제 복구가 완료되고 데이터베이스가 복구 되었다.
 현재 로그 정보를 보면 다음과 같다. 

 select group#, sequence#, status from v$log ;

    GROUP#  SEQUENCE# STATUS
---------- ---------- ------------------------------------------------
         1          0 UNUSED
         2          1 CURRENT
         3          0 UNUSED

 SEQUENCE가 초기화 되어 현재 사용중인 2번 GROUP의 SEQUENCE로 1이 부여 되었고, 나머지 그룹은 UNUSED상태에 아직 시퀀스가 부여 되지 않았다.

 지금까지 노 아카이브 모드에서의 데이터베이스 복구를 살펴 보았다.
 예제에서는 특별한 데이터 입력은 없었지만, 만약 운영환경이라면 위와 같이 하나의 데이터파일의 장애로 인해 모든 데이터파일을 백업 시점으로 롤백하는 것은 그 동안의 업무발생으로 인한 데이터를 유실하는 결과를 가져올 수 있을 것 이다.
 때문에 OLTP환경에서는 절대적으로 아카이브 로그 모드로 운영하는 것을 권장하며, 노 아카이브 모드는 롤백 되더라도 모든 데이터를 사용자가 입력할 수 있는 환경에서 제한적으로 사용되어야 한다는 것 을 명심하고 운영해야 할 것 이다.
Tag :

Leave Comments