IT기술/Oracle

12 백업 파일이나 아카이브 로그에 문제 있을 때 복구하기 (Clone DB 와 Export/Import 사용)

dobbby 2013. 12. 30. 18:48
반응형

12.1 데이터 파일끼리 SCN 다르고 아카이브 로그없는 상황 복구하기

이 장애는 데이터 파일 백업을 잘못 수행해서 백업된 데이터 파일끼리 SCN 정보가 다르고 아카이브 로그조차도 없는 최악의 상황일 경우에 발생한 것입니다.

당연히 이런 장애는 없어야 하고, 또 여기서 언급하는 방법으로 100% 복구되는 것도 아님을 밝혀 둡니다.


노아카이브 모드로 변경

SQL> startup mount ;

SQL> alter database noarchivelog ;

SQL> alter database open ;


노아카이브 모드로 변경된 것을 확인

SQL> archive log list ;

SQL> select name from v$datafile ;

SQL> !


$ mkdir /data/backup/temp

Begin backup 없이 그냥 copy 로 백업, SCN 정보가 다를 것이다.

$ cp /app/oracle/oradata/testdb/system01.dbf /data/backup/temp

$ cp /app/oracle/oradata/testdb/sysaux01.dbf /data/backup/temp

$ cp /app/oracle/oradata/testdb/undotbs01.dbf /data/backup/temp

$ cp /app/oracle/oradata/testdb/users01.dbf /data/backup/temp

$ cp /app/oracle/oradata/testdb/example01.dbf /data/backup/temp

$ exit


SQL> conn scott/tiger

SQL> create table test02 (no number) tablespace example ;

SQL> insert into test02 values (1) ;

SQL> insert into test02 values (2) ;

SQL> commit ;


SQL> conn / as sysdba

SQL> select name from v$datafile ;


SQL> ! rm -fr /app/oracle/oradata/testdb/example01.dbf


SQL> shutdown abort ;

SQL> startup ;


ORA-01157: cannot identify/lock data file 5 - see DBWR trace file

ORA-01110: data file 5: '/app/oracle/oradata/testdb/example01.dbf'


복구 시작

STEP1 Testdb3 용 파라미터 파일 생성

$ cd /app/oracle/product/11g/dbs/

$ cp inittestdb.ora inittestdb3.ora


$ vi inittestdb3.ora

db_name=testdb3 

*.controlfiles=("/data/backup/temp/control01.ctl",

                "/data/backup/temp/control02.ctl",

                "/data/backup/temp/control03.ctl")


STEP2 Control file 재생성
$ vi re.sql
STARTUP NOMOUNT
CREATE CONTROLFILE SET DATABASE "TESTDB3" RESETLOGS ARCHIVELOG
        MAXLOGFILES 16
        MAXLOGMEMBERS 3
        MAXDATAFILES 100
        MAXINSTANCES 8
        MAXLOGHISTORY 292
LOGFILE
        GROUP 1 '/data/backup/temp/redo01.log' size 5m,
        GROUP 2 '/data/backup/temp/redo02.log' size 5m,
        GROUP 3 '/data/backup/temp/redo03.log' size 5m
DATAFILE
        '/data/backup/temp/system01.dbf',
        '/data/backup/temp/sysaux01.dbf',
        '/data/backup/temp/undotbs01.dbf',
        '/data/backup/temp/users01.dbf',
        '/data/backup/temp/example01.dbf'
CHARACTER SET KO16KSC5601
;

$ export ORACLE_SID=testdb3
$ sqlplus / as sysdba ;

SQL> @/app/oracle/re.sql

SQL> recover database using backup controlfile ;
auto

아카이브 파일이 없어서 복구가 안되고 에러남

STEP3 파라미터 파일에 히든 파라미터 적용하기
$ vi $ORACLE_HOME/dbs/inittestdb3.ora

_offline_rollback_segments=(_SYSSMU1$, _SYSSMU2$, _SYSSMU3$, _SYSSMU4$, _SYSSMU5$
_SYSSMU6$, _SYSSMU7$, _SYSSMU8$, _SYSSMU9$, _SYSSMU10$)
위의 파라미터는 10g 까지만 입력한다.

_corrupted_rollback_segments=true
_allow_resetlogs_corruption=true
:wq!

$ exit
변경한 파라미터를 적용하기 위해 종료하고 다시 시작
SQL> shutdown abort ;
SQL> startup mount ;

SQL> alter session set events '10015 trace name adjust_scn level 1' ;
SQL> recover database until cancel using backup controlfile ;
cancel

SQL> alter database open resetlogs ;

이렇게 open 된 후에는 파라미터 파일에 입력한 3개의 파라미터를 지워야 합니다.
만약 startup 이 안된다면 alter session set events '10015 trace name adjust_scn level 1' 에서 숫자를 2, 3으로 계속 증가시켜서 시도하면 됩니다.
단, 이 방법은 최악의 상황에서 해야 한다는 것을 꼭 기억하고 이렇게 복구한 후에는 반드시 전체 데이터베이스를 export 로 백업 받아야 합니다.


12.2 Incarnation number 다른 백업 파일 사용하여 복구하기
이번에는 백업 수행 후 Resetlogs 로 Database 가 Open 되어 사용하다가 장애가 발생하여 백업 파일로 복구를 시도했으나
Incarnation 에러가 발생하면서 복구가 안되는 경우에 어떻게 대처하는지 살펴보겠습니다.

STEP1 현재 데이터 파일 전체를 Begin backup 수행
SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files ;

SQL> alter tablespace example begin backup ;
SQL> !cp /app/oracle/oradata/testdb/example01.dbf /data/backup/open/
SQL> alter tablespace example end backup ;

SQL> alter tablespace users begin backup ;
SQL> !cp /app/oracle/oradata/testdb/users01.dbf /data/backup/open/
SQL> alter tablespace users end backup ;

SQL> alter tablespace sysaux begin backup ;
SQL> !cp /app/oracle/oradata/testdb/sysaux01.dbf /data/backup/open/
SQL> alter tablespace sysaux end backup ;

SQL> alter tablespace undotbs1 begin backup ;
SQL> !cp /app/oracle/oradata/testdb/undotbs01.dbf /data/backup/open/
SQL> alter tablespace undotbs1 end backup ;

SQL> alter tablespace system begin backup ;
SQL> !cp /app/oracle/oradata/testdb/system01.dbf /data/backup/open/
SQL> alter tablespace system end backup ;

SQL> alter system checkpoint ;

STEP2 DB 종료 후 Incarnation 번호를 바꾸기 위해 Resetlogs 로 오픈

SQL> shutdown immdiate ;

SQL> startup mount ;


SQL> recover database until cancel ;

SQL> alter database open resetlogs ;

SQL> archive log list ;


STEP3 데이터 파일을 삭제하여 장애 발생시킴

SQL> create table scott.test100 (no number) tablespace users ;

SQL> insert into scott.test100 values (1) ;

SQL> commit ;

SQL> select * from scott.test100 ;


SQL> !rm -fr /app/oracle/oradata/testdb/users01.dbf

SQL> alter tablespace users offline ;

SQL> alter tablespace users online ;

에러


SQL> select * from scott.test100; 

에러


STEP4 백업 파일을 복원하여 복구

SQL> !cp /data/backup/open/users01.dbf /app/oracle/oradata/testdb/users01.dbf

SQL> recover tablespace users ;

auto


SQL> alter tablespace users online ;

SQL> select * from scott.test100 ;

복구 완료됨


위에서 살펴본 바와 같이 resetlogs 옵션으로 DB 를 open 해도 이상 없이 복구됨을 알 수 있습니다.



12.3 전체 데이터 파일 삭제 후 Incarnation 번호 다른 파일 사용하여 복구하기 (백업 데이터 파일과 현재 control file 의 Incarnation 번호가 다른 경우)


STEP1 Incarnation number 를 다르게 하기 위해 resetlogs 로 open

SQL> shutdown immediate ;

SQL> startup mount ;


resetlogs 옵션을 쓰기 위해 일부러 recovery 수행

SQL> recover database until cancel ;

SQL> alter database open resetlogs ;

SQL> archive log list ;


SQL> shutdown immediate ;

SQL> startup mount ;


SQL> recover database until cancel ;

SQL> alter database open resetlogs ;

SQL> @dd


SQL> !rm -fr /app/oracle/oradata/testdb/*.dbf

SQL> shutdown abort ;


STEP2 백업 데이터 파일 복원 후 복구

SQL> startup 

에러


SQL> !cp /data/backup/open/*.dbf /app/oracle/oradata/testdb/

SQL> alter database open ;

에러


SQL> recover database ;

auto


STEP3 DB Open 후 데이터 확인

SQL> alter database open ;

SQL> select * from scott.test100 ;


만약 위와 같은 경우에 복구되지 않는다면 백업된 Data file 과 Contorol file 간의 checkpoint 정보가 달라서이니 

앞에서 배운대로 Control file 을 재생성해서 Open 할 때 Resetlogs 옵션으로 Open 하면 됩니다.


또한 만약 백업 데이터 파일이 Begin Backup 이거나 Archive log 가 중간이 없다면

Redo log file 복구에서 배웠던 hidden parameter (_allow_resetlogs_corruption=true) 를 적용시킨 후

Open 할 때 Resetlogs 옵션을 적용시키면 Open 될 것입니다.


그러나 반드시 기억하어야 할 것은 이런 사태가 생기지 않도록 반드시 사전에 백업해야 하며,

응급 복구 한 후도 반드시 백업을 수행하여야 합니다.



반응형