Database초보우낙

5. non system data file을 삭제하고 복구 본문

백업과 복구/완전복구

5. non system data file을 삭제하고 복구

오운학 2024. 4. 10. 22:40

data file 종류 2가지

 

1. system data file : 오라클 system 운영하기 위해서 반드시 필요한 파일들

ex ) system01.dbf , sysaux01.dbf , undotbs1.dbf

파일들이 손상이 되면 db 운영이 안되고 강제로 shutdown 된다

복구할 db open 상태에서 복구할 없고 mount 상태에서 복구해야한다

 

2. non system data file : 일반 사용자가 데이터가 저장된 data file

 

ex) users01.dbf , example01.dbf, ts01.dbf

 

파일들이 손상되면 db 내려가지는 않는데 해당테이블을 select 없다

db open시키고 복구할 있다.

mount open 상태 복구할 있다.

 

 

 

 

 

 

실습

#0. 아카이브 모드인지 확인

archive log list

 

#1. ts02 테이블 스페이스를 생성

create tablespace ts02 datafile '/u01/app/oracle/oradata/Ouh/ts02.dbf' size 10m;

 

#2. ts02 테이블 스페이스의 data file hot backup받는다

alter tablespace TS02 begin backup;

select * from v$backup;

cp /u01/app/oracle/oradata/Ouh/ts02.dbf /home/oracle/hotbackup/ts02.dbf

alter tablespace ts02 end backup;

select * from v$backup;

 

#3. ts02테이블 스페이스에 emp05라는 테이블을 scott유저에서 생성

create table emp05
tablespace ts02
as
select * from emp;

 

#4. rog swich 수동으로 3 일으킨다(db 운영시키기 위해(시간이 지났다고 인식하게 하기 위하여 ) )

로그스위치(log switch) -> LGWR 현재 쓰고 있는 리두로그 파일말고 다음번 리두로그 파일을 쓰도록 하는것

 

alter system switch logfile;
save logsw.sql --- 스크립트로 저장하기

 

 

#5. ts02.dbf파일을 os에서 rm으로 지운다

rm  /u01/app/oracle/oradata/Ouh/ts02.dbf

오라클은 ts02.dbf 지워진지 모른다 (장애발생 ,media failure )

data file 없으니깐 emp05 select 안될것이고 db 내렸다 올리면 안올라오는 현상이 일어난다.

 

 

ts02.dbf 지웠지만 아직 메모리에 emp05 올라와있기 때문에 조회가능

 

 

ed flush.sql
alter system flush buffer_cache;
alter system flush shared_pool;

 

 

#6. db shutdown abort 내리고 startup으로 올리기

 

shutdown abort

startup

 

※ 복구하는 방법 !  

1. 손상된 data file 번호를 확인합니다.  ==> data file 7

2. 손상된 data file 이름도 확인합니다.  ==>  '/u01/app/oracle/oradata/Ouh/ts02.dbf'

 

 

#7. mount상태에서 db 안올라가는걸 확인

 

#8. 백업받는 ts02.dbf파일을 복원

cp ts02.dbf  /u01/app/oracle/oradata/Ouh/ts02.dbf

 

#9. 복원한 ts02.dbf파일에 아카이브 로그 파일을 적용해서 복구

 

지금 복원한 백업 파일은 2시간전 파일입니다. 

그래서 최신 파일로 만들어줘야합니다.

최신 파일로 만들어주기 위해서 복원 파일에 아카이브 로그 파일을 적용해서복구를 하겠습니다.

 

recover datafile 7;

 

  메세지 나오는것은 아카이브 로그파일 적용할거냐고 물어보는것입니다.

 그냥 엔터 치면 됩니다.

Media recovery complete.  <----  복구가 완료된것입니다.

 

 

 

#10. db open시킨다

alter database open;

#11. emp05테이블이 조회되는지 확인

select count(*) from emp05;


 

문제1. ts03 테이블 스페이스를 사이즈 5m으로 생성

create tablespace ts03 datafile '/u01/app/oracle/oradata/Ouh/ts03.dbf' size 5m;

 

문제2. ts03테이블 스페이스를 hot backup

alter tablespace TS03 begin backup;

select * from v$backup;

cp /u01/app/oracle/oradata/Ouh/ts03.dbf /home/oracle/hotbackup/ts03.dbf

alter tablespace ts03 end backup;

select * from v$backup;

 

문제3 ts03테이블 스페이스에 dept테이블과 똑같은 테이블을 dept03으로 생성

create table dept03
tablespace ts03
as
select * from dept

 

 

문제4. 로그스위치를 3 일으키고 ts03.dbf os에서 삭제

 

 

logsw.sql			--로그 스위치를 발생

cd /u01/app/oracle/oradata/Ouh -- 폴더로 이동

rm ts03.dbf --ts03.dbf를 삭제

 

 

문제5. 위의 장애상황을 해결(복원)

@flush.sql

data file 8: '/u01/app/oracle/oradata/Ouh/ts03.dbf' 파일이 없어서 서버를 올릴 없다

--문제2에서 백업받은 ts03을 카피해서 가져온다

cp ts03.dbf  /u01/app/oracle/oradata/Ouh/ts03.dbf

recover datafile 8   --(DB접속시 에러내용)

 

alter database open; --DB를 다시 올려준다

select count(*) from dept03;  --dept03테이블이 제대로 조회되는지 확인

 

 

 

 

문제6. ts02.dbf파일을 다시 삭제하고 복구하는데 db 올리고 복구하세요

#0. ts02 테이블 스페이스에 emp022 테이블을 생성

create table emp022
tablespace ts02
as
select * from emp;

#1. ts02테이블 스페이스를 hot backup합니다(sys에서 진행)

alter tablespace ts02 begin backup;

cp /u01/app/oracle/oradata/Ouh/ts02.dbf /home/oracle/hotbackup/ts02b.dbf

alter tablespace ts02 end backup;

select * from v$backup;

(전부 NOT ACTIVE 여야 한다)

 

 

 

#2. 로그 스위치를 3 발생

@logsw
@logsw
@logsw

 

#3. 체크포인트를 일으킨다

alter system checkpoint;

 

메모리내용을 디스크로 내려서 싱크를 맞춘다

 

#4. os에서 ts02.dbf 삭제

rm /u01/app/oracle/oradata/Ouh/ts02.dbf

 

 

#5. emp022 테이블을 조회 (에러발생한다)

select count(*) from emp022;

-- data file 7: '/u01/app/oracle/oradata/Ouh/ts02.dbf'

 

alert log file을 열어봐야한다
(항상 다른 창에 tail -f로 실시간으로 log file을 모니터링해야한다)

/u01/app/oracle/diag/rdbms/ouh/Ouh/trace
vi alert*
대문자G입력하면 맨 아래로 내려간다

 

                           에러원인 확인

 

#6. (복구작업) ts02 테이블 스페이스를 offline

alter tablespace ts02 offline immediate;

 

immediate 안쓰면 해당 테이블 스페이스에 대해 checkpoint 일으키고 offline시킨다

메모리에 있는 내용을 data file 반영을 하는게 체크포인트인데 지금 data file 삭제되었으니깐 내려쓸 수가 없다.

그래서 immediate 쓰면 체크포인트없이 offline시키겠다는 이다

 

 

select tablespace_name, status from dba_tablespaces;

 

--TS02가 offline된것을 확인

 

#7. 백업받은 ts02.dbf 파일을 복원

cp /home/oracle/hotbackup/ts02b.dbf /u01/app/oracle/oradata/Ouh/ts02b.dbf

 

#8. ts02 테이블 스페이스를 복구

recover tablespace ts02;

 

 

#9. ts02테이블 스페이스를 online 시킨다

alter tablespace ts02 online;

select tablespace_name, status from dba_tablespaces;

 

#10. emp022 테이블을 select

select count(*) from emp022