OS 명령으로 DATAFILE을 삭제한 경우:ORA-1157,1110
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 내의 정보를 이용하여 모든 데이타 화일을
오픈한다.
SQLDBA> CONNECT INTERNAL;
Connected.
SQLDBA> 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할 수 없다. 따라서 다음과 같은
데이타 화일 오픈에 관련된 에러가 발생된다 :
SQLDBA> 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과 관련된 명령은 다음과 같다.
SQLDBA를 COMMAND LINE MODE로 기동시킨다.
$ sqldba lmode=y
SQLDBA> CONNECT INTERNAL;
SQLDBA> STARTUP MOUNT;
ORACLE instance started.
Database mounted.
SQLDBA> ALTER DATABASE DATAFILE '/user1/oracle7/dbs/user2.dbf'
OFFLINE DROP;
Statement processed.
SQLDBA> ALTER DATABASE OPEN;
Statement processed.
SQLDBA> DROP TABLESPACE tablespace_name INCLUDING CONTENTS;
Statement
(이와 같이 offline drop된 datafile을 포함하는 tablespace는
drop하여야 한다.
이 tablespace에 다른 datafile도 포함되어 있다면
export를 받아낸 후 tablespace를 drop하고 재생성 후
import하도록 한다.)
정상적으로 DATABASE가 오픈된 후 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
* 위의 글은 Oracle Korea Customer Support Technical Bulletins에서 인용했습니다.
|