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
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")
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 될 것입니다.
그러나 반드시 기억하어야 할 것은 이런 사태가 생기지 않도록 반드시 사전에 백업해야 하며,
응급 복구 한 후도 반드시 백업을 수행하여야 합니다.