본문 바로가기

DB/Tibero

[Tibero] DATAFILE 유실 시 대처 방법(NOARCHIVELOG)

1. 개 요

NOARCHIVELOG MODE에서 사용자의 실수로 인한 DATAFILE 유실 시 대처방법에 대해 정리 한 내용입니다. NOARCHIVELOG MODE에서 DATAFILE의 복구는 불가능하며 해당 DATAFILE에 쓰여진 DATA역시 복구가 불가능하지만 CF와 DD를 수정하여 유실된 DATAFILE을 제외하고 NORMAL MODE 로 기동할 수 있습니다. NORMAL MODE로 기동은 성공하지만 유실된 DATAFILE에 있는 데이 터에 접근할 경우 에러가 발생하므로 유실된 DATAFILE이 속해있던 TABLESPACE를 재구축해야 합니다.

 

2. 복구 시나리오

1.테스트 환경 구축

2.DATAFILE 삭제(FILE# = 8)

3.복구시도

4.CF에서 해당파일 제외 후 재생성

5.tip 파일 수정 후 mount 기동(_CF_DD_CHECK=N)

6.복구 및 DB open

7._DD_TS 수정 후 재기동(_CF_DD_CHECK=N 제거)

8.테스트 테이블 데이터 조회

 

1-1.테스트 환경 구축(복구 가능한 데이터)

create tablespace test99 datafile '/home/tibero/tibero_data/tibero1/data/test01.dtf' size 10m autoextend off;

create user test identified by test default tablespace test99;

grant dba to test;

create table test.t1 (c1 number primary key);


declare
begin
for i in 1..100000 loop
insert into test.t1 values(i);
end loop;
end;
/

commit;


select count (*) from test.t1;

1-2.테스트 환경 구축(복구 불가능한 데이터)

alter tablespace test99 add datafile '/home/tibero/tibero_data/tibero1/data/test02.dtf' size 10m autoextend off;

alter tablespace test99 add datafile '/home/tibero/tibero_data/tibero1/data/test03.dtf' size 10m autoextend off;

alter tablespace test99 add datafile '/home/tibero/tibero_data/tibero1/data/test04.dtf' size 10m autoextend off;


create table test.t2 (c1 number primary key);

create table test.t3 (c1 number primary key);



declare
begin
for i in 1..100000 loop
insert into test.t2 values(i);
end loop;
end;
/

declare
begin
for i in 1..100000 loop
insert into test.t3 values(i);
end loop;
end;
/

commit;

select count (*) from test.t2;

select count (*) from test.t3;

1-3 구축 환경 확인

select FILE#,NAME from v$datafile;

select OWNER,SEGMENT_NAME,FILE_ID from dba_extents where owner='TEST' order by
FILE_ID;

2.DATAFILE 삭제(FILE# = 8)

rm /home/tibero/tibero_data/tibero1/data/test04.dtf

tbdown immediate

tbboot

3.복구시도

select * from v$recover_file;

alter database recover automatic;

4.CF에서 해당파일 제외 후 재생성

alter database backup controlfile to trace as '/home/tibero/tibero_data/tibero1/control/control_back.sql' reuse noresetlogs;

tbdown immediate

tbboot nomount

cd /home/tibero/tibero_data/tibero1/control

vi control_back.sql

존재하지 않는 데이터파일 수정

SQL> @control_back.sql

5.tip 파일 수정 후 mount 기동(_CF_DD_CHECK=N)

vi /tibero_engine/tibero6/config/tibero1.tip

 

tbdown immediate

tbboot mount

6.복구 및 DB open

alter database recover automatic;

tbdown immediate

tbboot

tbsql sys/tibero

7,_DD_FILE 수정 후 재기동(_CF_DD_CHECK=N 제거)

delete from _dd_file where file_id = 10;
vi /tibero_engine/tibero6/config/tibero1.tip

tbdown immediate

tbboot

8.테스트 테이블 데이터 조회

select count(*) from test.t1;

select count(*) from test.t2;

select count(*) from test.t3;

3. 재구축 방법

 

시나리오의 테스트 테이블 데이터 조회를 통하여 10번 DATAFILE의 EXTENT를 사용하던 T2,T3 테이블에 대해서는 복구가 불가능하며 10번 DATAFILE을 사용하지 않은 T1테이블에 대해서만 tbexport/tbimport를 사용하여 재구축을 진행할 수 있습니다.

 

1. t3 테이블 export(실패)

tbexport username=sys password=tibero sid=tibero1 port=1521 file=t3.dat log=t3.log table=test.t3

2. t1 테이블 export(성공)

tbexport username=sys password=tibero sid=tibero1 port=1521 file=t1.dat log=t1.log table=test.t1

3.TABLESPACE 재생성(재생성 전 백업을 권고드립니다.)

drop tablespace test99 including contents and datafiles;

create tablespace test99 datafile '/home/tibero/tibero_data/tibero1/data/test01.dtf' size 100m autoextend off;

4.데이터 import

tbimport username=sys password=tibero sid=tibero1 port=1521 file=t1.dat log=t1_imp.log table=test.t1

5.검증

select count(*) from test.t1;