반응형
/******************************************************************************************************
-- Title : [ORA11g] 오라클 데이터 파일 손상 복구
-- Reference : stylegoths.blogspot.kr
-- Key word : oracle datafile data file recovery 
******************************************************************************************************/

Data File Recovery (데이터 파일 복구)


데이터 파일 복구가 필요한 상황은 다음과 같다.

1. Temporary Tablespace의 데이터 파일이 손상된 경우


2. 일반 Tablespace의 데이터 파일이 손상된 경우

3. System Tablespace의 데이터 파일이 손상된 경우

4. 백업되지 않은 데이터 파일이 손상된 경우

5. 데이터파일을 다른 위치로 복구하는 경우


복구를 하기 위해서는 Whole Database Backup이 선행되어야 한다.



1. Temporary Tablespace의 데이터 파일이 손상된 경우

임시 테이블스페이스의 데이터 파일을 삭제하여 손상된 상황을 만들기로 한다.
 
우선 임시 테이블스페이스의 데이터 파일 위치를 확인한다.
 
SELECT name FROM v$tempfile;
 
NAME
----------------------------------------------------------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/temp01.dbf
 
 
위 경로에 있는 데이터파일을 삭제하도록 한다.
 
rm /u01/app/oracle/oradata/orcl/temp01.dbf
 
 
임시 테이블스페이스는 데이터가 많은 테이블을 정렬할 때 사용하므로 이와 같은 상황을
 
만들어 주도록 한다.
 
SELECT * FROM all_objects
WHERE ROWNUM<10
ORDER BY 1, 2, 3, 4, 5;
 
ORA-01116: error in opening database file 201
ORA-01110: data file 201: '/u01/app/oracle/oradata/orcl/temp01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
 
 
데이터 파일 손상으로 인한 오류가 발생하였다.
 
이와 같은 상황에서는 새로운 데이터 파일을 생성하고, 기존 임시 테이블스페이스의
 
데이터 파일은 삭제하여 해결이 가능하다.
 
ALTER TABLESPACE temp
ADD TEMPFILE '$ORACLE_BASE/oradata/orcl/temp02.dbf'
SIZE 100M;
 
Tablespace altered.
 
ALTER TABLESPACE temp
DROP TEMPFILE '$ORACLE_BASE/oradata/orcl/temp01.dbf';
 
Tablespace altered.
 
 
이제 다시 위 쿼리문을 실행하면 정상적으로 결과를 리턴한다.
 
또한 새로운 데이터 파일을 추가하지 않더라도 데이터베이스를 재시작하면 오라클 DBMS가
 
알아서 손상된 temp01.dbf 파일을 재생성하여 문제를 해결한다.
 
 

2. 일반 Tablespace의 데이터 파일이 손상된 경우

이번엔 일반 테이블스페이스의 데이터 파일을 삭제하여 손상된 상황을 만든다.
 
우선 현재 데이터 파일을 확인한다.
 
SELECT file#, status, name FROM v$datafile;
FILE# STATUS NAME
1 SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf
2 ONLINE /u01/app/oracle/oradata/orcl/undotbs01.dbf
3 ONLINE /u01/app/oracle/oradata/orcl/sysaux01.dbf
4 ONLINE /u01/app/oracle/oradata/orcl/users01.dbf
5 ONLINE /u01/app/oracle/oradata/orcl/php01.dbf

 
users01.dbf 데이터 파일을 삭제한다.
 
rm /u01/app/oracle/oradata/orcl/users01.dbf
 
 
정상적으로 데이터베이스를 종료하려고 하면 손상된 데이터 파일을 열 수 없다는
 
오류가 발생한다.
 
shutdown immediate;
 
 
ORA-01116: error in opening database file 4
ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/users01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

 
손상된 데이터 파일로 인해 정상적인 종료를 수행할 수 없으므로 강제로 종료하도록 한다.
 
shutdown abort
 
ORACLE instance shut down.
 
 
데이터베이스를 기동하게 되면 손상된 데이터 파일로 인해 시작도 안되는 상황이다.
 
startup
 
 
ORACLE instance started.

Total System Global Area  285212672 bytes

Fixed Size    1218968 bytes
Variable Size  104859240 bytes
Database Buffers  171966464 bytes
Redo Buffers    7168000 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/users01.dbf'


 
오류가 발생하고 있는 user01.dbf 데이터 파일을 비활성화 시킨다.
 
alter database datafile 4 offline;
 
Database altered.
 
 
비활성화 시킨 후 현재 데이터베이스를 open으로 기동한다.
 
alter database open;
 
Database altered.
 
 
v$datafile을 조회하여 현재 데이터 파일들의 상태를 확인한다.
 
SELECT file#, status, name FROM v$datafile;
FILE# STATUS NAME
1 SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf
2 ONLINE /u01/app/oracle/oradata/orcl/undotbs01.dbf
3 ONLINE /u01/app/oracle/oradata/orcl/sysaux01.dbf
4 RECOVER /u01/app/oracle/oradata/orcl/users01.dbf
5 ONLINE /u01/app/oracle/oradata/orcl/php01.dbf
 
 
현재 4번 데이터 파일이 RECOVER 상태인 것이 확인되었다.
 
Whole Database Backup으로 사전에 백업해둔 데이터 파일을 이용하여 복구하도록 한다.
 
cp $ORACLE_BASE/oradata/orcl_offline_backup/users01.dbf $ORACLE_BASE/oradata/orcl/
 
recover datafile 4;
 
 
ORA-00279: change 1275096 generated at 01/28/2013 19:47:50 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2013_01_28/o1_mf_1_3_%u_.arc
ORA-00280: change 1275096 for thread 1 is in sequence #3

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

auto
Log applied.
Media recovery complete.
 
 


 
데이터파일의 상태를 다시 확인하도록 한다.
 
SELECT file#, status, name FROM v$datafile;
FILE# STATUS NAME
1 SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf
2 ONLINE /u01/app/oracle/oradata/orcl/undotbs01.dbf
3 ONLINE /u01/app/oracle/oradata/orcl/sysaux01.dbf
4 OFFLINE /u01/app/oracle/oradata/orcl/users01.dbf
5 ONLINE /u01/app/oracle/oradata/orcl/php01.dbf
 
 
복구 이후 4번 데이터 파일의 상태가 OFFLINE로 수정된 것이 확인된다.
 
이제 복구된 데이터 파일을 활성화 시켜준다.
 
alter database datafile 4 online;
 
Database altered.
 
SELECT file#, status, name FROM v$datafile;
FILE# STATUS NAME
1 SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf
2 ONLINE /u01/app/oracle/oradata/orcl/undotbs01.dbf
3 ONLINE /u01/app/oracle/oradata/orcl/sysaux01.dbf
4 ONLINE /u01/app/oracle/oradata/orcl/users01.dbf
5 ONLINE /u01/app/oracle/oradata/orcl/php01.dbf
 
손상됐던 데이터 파일이 정상적으로 복구되었다.
 
 

3. System Tablespace의 데이터 파일이 손상된 경우

 
시스템 테이블스페이스의 데이터 파일이 손상된 상황을 연출하도록 한다.
 
SELECT file#, status, name FROM v$datafile;
FILE# STATUS NAME
1 SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf
2 ONLINE /u01/app/oracle/oradata/orcl/undotbs01.dbf
3 ONLINE /u01/app/oracle/oradata/orcl/sysaux01.dbf
4 ONLINE /u01/app/oracle/oradata/orcl/users01.dbf
5 ONLINE /u01/app/oracle/oradata/orcl/php01.dbf
 
rm /u01/app/oracle/oradata/orcl/system01.dbf
 
 
데이터베이스를 재기동한다.
 
startup
 
ORACLE instance started.

 

Total System Global Area  285212672 bytes
Fixed Size    1218968 bytes
Variable Size  104859240 bytes
Database Buffers  171966464 bytes
Redo Buffers    7168000 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see DBWR trace file
ORA-01110: data file 1: '/u01/app/oracle/oradata/orcl/system01.dbf'
 
 
시스템 테이블스페이스의 system01.dbf 데이터 파일이 손상되었기에 기동되지 않는다.
 
이전과 동일하게 손상된 데이터 파일을 비활성화 시킨 후 open으로 기동하도록 한다.
 
alter database datafile 1 offline;
 
Database altered.
 
alter database open;
 
ERROR at line 1:
ORA-01147: SYSTEM tablespace file 1 is offline
ORA-01110: data file 1: '/u01/app/oracle/oradata/orcl/system01.dbf'
 
 
손상된 데이터 파일을 비활성화 시켰지만 open으로 기동되지 않는 상황이다.
 
SELECT file#, status, name FROM v$datafile;
FILE# STATUS NAME
1 SYSOFF /u01/app/oracle/oradata/orcl/system01.dbf
2 ONLINE /u01/app/oracle/oradata/orcl/undotbs01.dbf
3 ONLINE /u01/app/oracle/oradata/orcl/sysaux01.dbf
4 ONLINE /u01/app/oracle/oradata/orcl/users01.dbf
5 ONLINE /u01/app/oracle/oradata/orcl/php01.dbf
 
 
현재 1번 데이터 파일이 SYSOFF 상태인 것이 확인된다.

open으로 기동하지 못하였지만 Whole Database Backup으로 사전 백업된 데이터 파일로


복구하도록 한다.


cp $ORACLE_BASE/oradata/orcl_offline_backup/system01.dbf $ORACLE_BASE/oradata/orcl/
 
recover datafile 1;
 
ORA-00279: change 1275096 generated at 01/28/2013 19:47:50 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2013_01_28/o1_mf_1_3_%u_.arc
ORA-00280: change 1275096 for thread 1 is in sequence #3
 
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
Log applied.
Media recovery complete
 
 
복구 후 손상되었던 1번 데이터 파일을 활성화 시켜준다.
 
alter database datafile 1 online;
 
Database altered.
 
 
데이터베이스를 open으로 기동한다.
 
alter database open;
 
Database altered.
 
SELECT file#, status, name FROM v$datafile;
FILE# STATUS NAME
1 SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf
2 ONLINE /u01/app/oracle/oradata/orcl/undotbs01.dbf
3 ONLINE /u01/app/oracle/oradata/orcl/sysaux01.dbf
4 ONLINE /u01/app/oracle/oradata/orcl/users01.dbf
5 ONLINE /u01/app/oracle/oradata/orcl/php01.dbf
 
 
시스템 테이블스페이스의 데이터 파일도 정상으로 복구되었다.
 
실제 위와 같은 상황으로 시스템 테이블스페이스의 데이터 파일 복구 시에는
 
데이터 파일 비활성화, 활성화 작업은 수행할 필요없다.
 
 

4. 백업되지 않은 데이터 파일이 손상된 경우

백업되지 않은 데이터 파일이 손상된 상황을 연출하기 위해 새로운 테이블스페이스를
 
생성하도록 한다.
 
CREATE TABLESPACE nonbackup
DATAFILE '$ORACLE_BASE/oradata/orcl/nonbackup01.dbf'
SIZE 10m;
 
Tablespace created.
 
 
SELECT file#, status, name FROM v$datafile;
FILE# STATUS NAME
1 SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf
2 ONLINE /u01/app/oracle/oradata/orcl/undotbs01.dbf
3 ONLINE /u01/app/oracle/oradata/orcl/sysaux01.dbf
4 ONLINE /u01/app/oracle/oradata/orcl/users01.dbf
5 ONLINE /u01/app/oracle/oradata/orcl/php01.dbf
6 ONLINE /u01/app/oracle/oradata/orcl/nonbackup01.dbf
 
 
생성한 데이터 파일을 기록하기 위해 로그스위치를 발생시킨다.
 
alter system switch logfile;

System altered.

alter system switch logfile;
 
System altered.
 
alter system switch logfile;
 
System altered.

...(데이터 파일 수만큼 반복)...


생성한 테이블스페이스의 데이터 파일을 삭제하여 손상된 상황을 만든다.
 
rm $ORACLE_BASE/oradata/orcl/nonbackup01.dbf
 

데이터베이스를 기동하면 손상된 데이터 파일로 인해 오류가 발생한다.

startup


ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size    1218968 bytes
Variable Size   71304808 bytes
Database Buffers  205520896 bytes
Redo Buffers    7168000 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 6 - see DBWR trace file
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/nonbackup01.dbf'
 
 


문제는 nonbackup01.dbf 데이터 파일은 Whole Database Backup 이후에 생성하였기에

백업본이 존재하지 않는다. 우선은 데이터베이스를 open으로 기동하여야 하기에

손상된 데이터 파일을 비활성화 시켜준다.

alter database datafile 6 offline;

Database altered.

alter database open;

Database altered.

SELECT file#, status, name FROM v$datafile;
FILE# STATUS NAME
1 SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf
2 ONLINE /u01/app/oracle/oradata/orcl/undotbs01.dbf
3 ONLINE /u01/app/oracle/oradata/orcl/sysaux01.dbf
4 ONLINE /u01/app/oracle/oradata/orcl/users01.dbf
5 ONLINE /u01/app/oracle/oradata/orcl/php01.dbf
6 OFFLINE /u01/app/oracle/oradata/orcl/nonbackup01.dbf


손상된 nonbackup01.dbf 데이터 파일을 새로 생성해 준다.

alter database create datafile '$ORACLE_BASE/oradata/orcl/nonbackup01.dbf';

Database altered.


복구를 수행한다.

recover datafile 6;


ORA-00279: change 1346906 generated at 01/29/2013 10:32:38 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2013_01_29/o1_mf_1_15_%u_.arc
ORA-00280: change 1346906 for thread 1 is in sequence #15

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
Log applied.
Media recovery complete.


비활성화된 데이터 파일을 활성화 시킨다.

alter database datafile 6 online;

Database altered.

SELECT file#, status, name FROM v$datafile;
FILE# STATUS NAME
1 SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf
2 ONLINE /u01/app/oracle/oradata/orcl/undotbs01.dbf
3 ONLINE /u01/app/oracle/oradata/orcl/sysaux01.dbf
4 ONLINE /u01/app/oracle/oradata/orcl/users01.dbf
5 ONLINE /u01/app/oracle/oradata/orcl/php01.dbf
6 ONLINE /u01/app/oracle/oradata/orcl/nonbackup01.dbf


손상됐던 nonbackup01.dbf 데이터 파일이 복구되었다.


5. 데이터 파일을 다른 위치로 복구하는 경우

기존 디스크의 손상으로 인하여 데이터 파일도 손상된 경우가 발생할 수 있다.

이런 상황에서는 기존 디스크로의 복구는 불가능하기에 다른 위치에 데이터 파일을

복구하여야 한다.

우선 기존 데이터파일을 손상시켜 문제를 발생시킨다.

rm $ORACLE_BASE/oradata/orcl/users01.dbf


데이터베이스를 기동하면 손상된 데이터 파일로 인해 기동이 안되는 상황이다.

startup


ORACLE instance started.

Total System Global Area  285212672 bytes
Fixed Size    1218968 bytes
Variable Size   71304808 bytes
Database Buffers  205520896 bytes
Redo Buffers    7168000 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 4 - see DBWR trace file
ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/users01.dbf'


손상된 데이터 파일을 비활성화 시켜준 후 open으로 기동한다.


alter database datafile 4 offline;
 
Database altered.
 
alter database open;
 
Database altered.


기존 디스크가 손상되었다는 가정하에 데이터 파일을 복구하는 것이기에

우선 데이터 파일을 복구할 위치를 만들고 백업된 데이터를 이 위치로 옮긴다.

mkdir $ORACLE_BASE/oradata/orcl/disk1

cp $ORACLE_BASE/oradata/orcl_offline_backup/users01.dbf $ORACLE_BASE/oradata/orcl/disk1/
 
ls -l $ORACLE_BASE/oradata/orcl/disk1


-rwxr-xr-x. 1 oracle dba 5251072 2013-01-29 11:15 users01.dbf
 

rename 명령어를 이용하여 기존 데이터 파일의 위치를 수정한다.

ALTER DATABASE
RENAME FILE '$ORACLE_BASE/oradata/orcl/users01.dbf' TO
                           '$ORACLE_BASE/oradata/orcl/disk1/users01.dbf';

Database altered.


손상된 데이터 파일의 복구를 진행한다.

recover datafile 4;


ORA-00279: change 1275096 generated at 01/28/2013 19:47:50 needed for thread 1
ORA-00289: suggestion : /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2013_01_29/o1_mf_1_3_%u_.arc
ORA-00280: change 1275096 for thread 1 is in sequence #3
 
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
Log applied.
Media recovery complete.
 

복구 후 비활성화된 데이터 파일을 활성화 시켜준다.

alter database datafile 4 online;

Database altered.

SELECT file#, status, name FROM v$datafile;
FILE# STATUS NAME
1 SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf
2 ONLINE /u01/app/oracle/oradata/orcl/undotbs01.dbf
3 ONLINE /u01/app/oracle/oradata/orcl/sysaux01.dbf
4 ONLINE /u01/app/oracle/oradata/orcl/disk1/users01.dbf
5 ONLINE /u01/app/oracle/oradata/orcl/php01.dbf

새로운 위치로 손상됐던 데이터 파일이 복구되었다.
 
 

 

 

반응형

+ Recent posts