No Archive Mode
에서 Data File이 삭제되는 논리적 장애가 발생했을 때 복구하는 방법은 무엇인지 알아보겠습니다. 결론적으로 말씀드리면 Online Redo Log File에 해당 SCN 정보가 없을 경우 완벽하게 복구하는 방법은 없습니다. 아래를 살펴보겠습니다.
현재 DB를 No Archive Mode
로 변경합니다.
SQL> shutdown immediate;
SQL> startup mount;
SQL> archive log list;
SQL> alter database noarchivelog;
SQL> archive log list;
SQL> alter database open;
신규 테이블 스페이스 test를 생성하고 백업을 받습니다.
SQL> create tablespace test
2 datafile '/ORA19/app/oracle/oradata/ORACLE19/test01.dbf' size 5M;
SQL> select tablespace_name, bytes/1024/1024 MB, file_name
2 from dba_data_files;
SQL> shutdown immediate;
SQL> !mkdir -p /data/backup/close
SQL> !cp -av /ORA19/app/oracle/oradata/ORACLE19/test01.dbf /data/backup/close/
SQL> startup;
장애를 발생시킵니다.
SQL> !rm -rf /ORA19/app/oracle/oradata/ORACLE19/test01.dbf
SQL> shutdown abort;
SQL> startup;
백업해둔 Data File을 기존 경로에 다시 복사해서 recover합니다.
SQL> !cp /data/backup/close/test01.dbf /ORA19/app/oracle/oradata/ORACLE19/test01.dbf
SQL> recover database;
SQL> alter database open;
이 과정에서 recover가 되는 이유는 online redo log file에 해당 내용이 남아있기 때문입니다. 그렇다면 log switch가 여러 번 발생해 해당 내용이 덮어씌워져 있는 상태라면 어떻게 될까요...?
SQL> !rm -rf /ORA19/app/oracle/oradata/ORACLE19/test01.dbf
SQL> alter system swtich logfile;
SQL> /
SQL> /
여기까지 실행하면 DB가 강제로 abort되면서 꺼집니다. 마찬가지로 Data File을 원래 경로에 복사한 후 다시 되살리려고 하면 아래와 같은 에러가 발생합니다.
SQL> !cp /data/backup/close/test01.dbf /ORA19/app/oracle/oradata/ORACLE19/test01.dbf
SQL> startup;
SQL> !cp /data/backup/close/test01.dbf /ORA19/app/oracle/oradata/ORACLE19/test01.dbf
SQL> recover database;
ORA-00279: change 580595 generated at 01/01/2023 16:55:01 needed for thread 1
ORA-00289: suggestion :
/ORA19/app/oracle/fast_recovery_area/ORACLE19/archivelog/2023_01_01/o1_mf_1_7_%u
_.arc
ORA-00280: change 580595 for thread 1 is in sequence #7
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: cannot open archived log
'/ORA19/app/oracle/fast_recovery_area/ORACLE19/archivelog/2023_01_01/o1_mf_1_7_%
u_.arc'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 7
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 6 needs media recovery
ORA-01110: data file 6: '/ORA19/app/oracle/oradata/ORACLE19/test01.dbf'
이렇게 된 이유는 DB가 Open되기 위해선 모든 Data File, Control File, Redo Log File의 Checkpoint SCN 정보가 같아야 하는데, test01.dbf
파일의 SCN이 다르기 때문입니다. 하지만 현재 No Archive Mode
이므로 부족한 SCN 만큼 SCN을 따라잡을 정보가 없는 상태입니다.
이럴 경우 완벽히 복구하진 못하고, 2가지 방법이 있습니다.
첫 번째 방법은 모든 파일을 이전의 SCN으로 되돌리는 방법입니다. 예를 들어 SCN 100 -> 108
로 하려 했는데 실패했다면 모든 파일의 SCN을 108 -> 100
으로 되돌리는 것입니다. 문제는 8개의 SCN 정보는 모두 소실된다는 것입니다.
두 번째 방법은 test01.dbf
파일만 포기하는 방법이 있습니다. test01.dbf
안의 데이터는 모두 소실되겠지만 나머지 데이터들은 살릴 수 있습니다.
SQL> alter database datafile '/ORA19/app/oracle/oradata/ORACLE19/test01.dbf' offline drop;
SQL> alter database open;
SQL> select status from v$instance;
참고