2012. 7. 11. 17:37
No. 10088

OS 명령으로 DATAFILE을 삭제한 경우 : ORA-1157, ORA-1110
======================================================

[주의] 다음의 경우는 system tablespace에 대해서 적용되지 않는다.

  DATABASE RECOVERY에 앞서 ORACLE INSTANCE(즉, ORACLE RDBMS)의 STARTUP
  단계를 우선 살펴보기로 하자.
  첫번째 단계로 INSTANCE를 START시키며, 여기서는 initORACLE_SID.ora
  화일의 파라미터를 참조하여 SGA(SYSTEM GLOBAL AREA)를 할당하고
  백그라운드 프로세스를 START 시킨다.
  두번째 단계로 DATABASE의 MOUNT이며 파라미터 화일에 명시된 CONTROL
  FILE을 오픈한다. CONTROL FILE로부터 DATABASE NAME과 REDO LOG FILE의
  이름을 읽는다.  
  세번째 단계로 CONTROL FILE 내의 정보를 이용하여 모든 데이타 화일을
  오픈한다.

  SVRMGR> CONNECT INTERNAL;
  Connected.
  SVRMGR> STARTUP;
  ORACLE instance started.
  Database mounted.
  Database opened.
  Total System Global Area    1913196 bytes
  Fixed Size      27764 bytes
  Variable Size    1787128 bytes
  Database Buffers      65536 bytes
  Redo Buffers      32768 bytes

  RDBMS의 STARTUP 시 문제의 데이타 화일이 CONTROL FILE 정보에서는 존재하지만,
  실제로 O/S 상에서는 존재하지 않으므로 DATABASE OPEN 단계에서 삭제된 데이타
  화일을 OPEN할 수 없다. 따라서 다음과 같은 데이타 화일 오픈에 관련된 에러가
  발생된다 :

  SVRMGR> STARTUP;
          ORACLE instance started
          Database mounted
          ORA-01157 : cannot identify data file 11 - file not found
          ORA-01110 : data file 11 : '/user1/oracle7/dbs/user2.dbf'
          Attempting to dismount database .... Database dismounted
          Attempting to shutdown instance .... ORACLE instance shut down

DATABASE OPEN 단계에서 CONTROL FILE에서는 ORA-1157 에러에서 나타난
11번 데이타 화일이 존재하는 것으로 인식하지만, 실제로 O/S 상의 데이타
화일 (ORA-1110 에러에 명시된 '/user1/oracle7/dbs/user2.dbf' 화일)이
삭제된 상태이다.

이러한 경우에는 DATABASE STARTUP 시 STARTUP MOUNT 단계까지 실행한 후,
문제의 데이타 화일을 OFFLINE시킨 다음 데이타베이스를 오픈한다.
단, 데이타베이스 오픈이 정상적으로 수행되면 문제가 발생한 데이타 화일을
포함하고 있는 TABLESPACE를  DROP하지 않을 경우에는 DATABASE STARTUP 시
항상 데이타 화일의 오픈 단계에서 에러가 발생된다.
따라서, 문제의 데이타 화일의 OFFLINE과 TABLESPACE의 DROP 전에 반드시 해당
TABLESPACE를 사용하고 있는 USER의 데이타 백업을 수행해야 한다.

데이타 화일의 OFFLINE과 관련된 명령은 다음과 같다.
먼저 SVRMGR을 Line Mode로 기동시킨다.

     $ svrmgrl
      SVRMGR> CONNECT INTERNAL;
      SVRMGR> STARTUP MOUNT;
              ORACLE instance started.
              Database mounted.

      SVRMGR> ALTER DATABASE DATAFILE '/user1/oracle7/dbs/user2.dbf'  
              OFFLINE DROP;
              Statement processed.

      SVRMGR> ALTER DATABASE OPEN;
              Statement processed.

      SVRMGR> DROP TABLESPACE tablespace_name INCLUDING CONTENTS;
              Statement processed.

(이와 같이 offline drop된 datafile을 포함하는 tablespace는 drop하여야 한다.
이 tablespace에 다른 datafile도 포함되어 있다면 export를 받아낸 후
tablespace를 drop하고 재생성 후 import하도록 한다.)

  정상적으로 DATABASE가 Open된 후 CONTROL FILE로부터의 데이타베이스
  정보를 갖는 DATA DICTIONARY TABLE인 V$DATAFILE(SYS USER에서 액세스
  가능)의 내용과 데이타베이스 화일에 관한 정보를 가지고 있는 DATA
  DICTIONARY VIEW인 DBA_DATA_FILES(SYSTEM USER)을 조회하면 아래와 같은
  내용을 확인할 수 있다 :

  (1) SQL> SELECT * FROM V$DATAFILE ;
      FILE#   STATUS     NAME
      -----  --------  -------------------------------------------  
          9   ONLINE     /user1/oracle7/dbs/tools.dbf
         10   ONLINE     /user1/oracle7/dbs/user1.dbf  
         11   RECOVER    /user1/oracle7/dbs/user2.dbf

  (2) SQL> SELECT * FROM DBA_DATA_FILES ;
      FILE_NAME                     FILE_ID TABLESPACE_NAME  STATUS
      -----------------------------------------------------------------
      /user1/oracle7/dbs/tools.dbf  9       TOOLS            AVAILABLE
      /user1/oracle7/dbs/user1.dbf  10      TEST             AVAILABLE
      /user1/oracle7/dbs/user2.dbf  11      TEST             AVAILABLE

 

Posted by 몰라욧