Archive log mode 장애복구
 : Noarchive log mode와 다르게 하나가 장애나면 하나만 가지고 온다.
   컨트롤파일의 SCN과 데이터파일 SCN의 차이점은 Archive file에서 찾아오면 되기 때문이다.
 



 
① 완전복구 : 고장난 데이터를 오늘 시점까지 완전히 복구
② 불완전복구 : 특별한 경우까지만 (일부러 과거의 시점까지만 복구) 복구
                Ex) 중요한 테이블이 지워졌는데 살려주세요. 어제 점심때 지움.

 
 
 
① 완전복구 - 1. offline (O)
                 - 2. offline (X)
                 - 3. 백업file (X)




○ 완전복구 - 1. offline (O)
 : offline 되는 일반 tablespace 장애 복구 하기
 
1. DB archive log mode 로 시작
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter database open;
 
2. 백업
SQL> !vi dd.sql;
set line 200
col tablespace_name for a10
col file_name for a50
select tablespace_name, bytes/1024/1024 MB, file_name
from dba_data_files;
:wq!
 
SQL> @dd
SQL> alter tablespace test begin backup;
SQL> !cp /home/oracle/oradata/testdb/test01.dbf /data/backup/open/
SQL> alter tablespace test end backup;
 
 
3. 장애발생
 
SQL> !rm /home/oracle/oradata/testdb/test01.dbf
SQL> !ls /home/oracle/oradata/testdb/test01.dbf
없음
 
SQL> create table abc (no number) tablespace test;
SQL> insert into abc values (1);
SQL> insert into abc values (2);
SQL> commit;
SQL> select * from abc;
 
SQL> alter tablespace test offline;
SQL> alter tablespace test online;
에러
 
4. 백업파일로 복구
SQL> !cp /data/backup/open/test01.dbf /home/oracle/oradata/testdb/
SQL> recover tablespace test;
SQL> alter tablespace test online;
성공
SQL> select * from abc;
 
정리 : DATAFILE에는 abc라는 테이블이 없었다. redo log에 테이블 만들고 1,2데이터 넣었다는 내용이 남아있었다.
       이 내용이 백업 DATAFILE에 복구 됨. offline되는 TABLESPACE라서 복구 후 online 시켜줌.
 
 
 

○ 완전복구 - 2. offline (X)
 : offline 안되는 system tablespace나 undo tablespace 가 장애가 발생했을때 복구하기
 : system tablespace 백업 후 진행하기
 
1. 테이블 생성
SQL> select status from v$instance;
OPEN상태
 
SQL> create table test1 (no number) tablespace system;
SQL> insert into test1 values (1);
SQL> commit
 
SQL> @dd
 
2. 장애발생
SQL> !rm -fr /home/oracle/oradata/testdb/system01.dbf
SQL> alter tablespace system offline;
시스템 테이블스페이스라서 offline 안된다.
 
3. 백업파일복원
SQL> shutdown immediate;
SQL> !cp /data/backup/close/system01.dbf /home/oracle/oradata/testdb/
SQL> startup
 
SQL> recover database;
SQL> alter database open;
SQL> select * from test1;
 
 
 

○ 완전복구 - 3. 백업file (X)
 : 백업파일이 없는 경우 복구하기
 
 
1. 장애 상황 발생
SQL> create tablespace haksa
  2  datafile '/data/temp/haksa01.dbf' size 5M;
 
SQL> select tablespace_name,bytes/1024/1024/ MB, file_name
  2  from dba_data_files;
 
HAKSA   5    /data/temp/haksa01.dbf   추가됨
 
SQL> !rm -fr /data/temp/haksa01.dbf
SQL> !ls /data/temp/haksa01.dbf
삭제완료확인
 
2. 파일 삭제 된 상태에서 데이터 입력 작업 수행
 
SQL> create table student (no number, name varchar2(20)) tablespace haksa;
 
SQL> insert into student values (1,'AAAA');
SQL> insert into student values (2,'BBBB');
SQL> commit;
SQL> select * from student;
내용조회 됨
 : 이유 - 인스턴스에 있는 상태임(아직 DATAFILE에 내려 쓰지않은 상태)
 
3. 장애 발생 확인
SQL> alter tablespace haksa offline;
SQL> alter tablespace haksa online;
에러 - DATAFILE이 없으므로..
 
4. 복구
 
SQL> alter database create datafile '/data/temp/haksa01.dbf'  ← 컨트롤 파일에 있는 경로
  2  as '/home/oracle/oradata/testb/haksa_01.dbf';  ← 신규로 생성하고자 하는 경로와 이름
 
SQL> recover tablespace haksa online;
 
SQL> select * from student;
 
 
 
 

○ 완전복구 - 종합
 : 백업파일 있음(DATAFILE, redo log file, archive log file)
 : 모든 DATAFILE 삭제됨. 하드 추가가 바로 안되어 임시 경로에 복원해야함.
   (원래 : /home/oracle/oradata/testdb/  ,  임시 : /data/temp/)
 : /home/oracle/oradata/testdb/test01.dbf 는 백업파일 없음.
 
1. 상황확인 후 파일 모두 삭제
SQL> select tablespace_name, bytes/1024/1024 MB, file_name
  2  from dba_data_files;
 
SQL> !rm -fr /home/oracle/oradata/testdb/*.dbf
 
SQL> !ls /home/oracle/oradata/testdb/*.dbf
 
SQL> shutdown abort;
강제종료 된상황 연출
 
 
 
2. /data/temp 디렉토리로 백업 되어있던 data file 복원
SQL> startup
마운트까지 올라옴
 
SQL> !mkdir /data/temp
 
SQL> !cp /data/backup/close/*.dbf /data/temp/
 
3. DATAFILE 경로 변경 후 복구
 
SQL> select name from v$datafile;
 
/home/oracle/oradata/testdb/ 밑에 있는것으로 되어있음.
 
SQL> alter database rename file '/home/oracle/oradata/testdb/system01.dbf'
  2  to '/data/temp/system01.dbf';
 
SQL> alter database rename file '/home/oracle/oradata/testdb/undotbs01.dbf'
  2  to '/data/temp/undotbs01.dbf';
 
SQL> alter database rename file '/home/oracle/oradata/testdb/sysaux01.dbf'
  2  to '/data/temp/sysaux01.dbf';
 
SQL> alter database rename file '/home/oracle/oradata/testdb/users01.dbf'
  2  to '/data/temp/users01.dbf';
 
SQL> alter database rename file '/home/oracle/oradata/testdb/example01.dbf'
  2  to '/data/temp/example01.dbf';
 
 
SQL> alter database create datafile '/home/oracle/oradata/testdb/test01.dbf'
  2  as '/data/temp/test01.dbf';
 
SQL> select name fromv$datafile;
SQL> recover database;
SQL> alter database open;
 
SQL> select * from test1;
복구완료
 




○ 완전복구 - 종합2
문제
 
<백업파일>
ts_a : ts_a01.dbf
ts_b : ts_b01.dbf
ts_c : ts_c01.dbf
system : system01.dbf
sysaux : sysaux01.dbf
undotbs1 : undotbs01.dbf
users : user01.dbf
example : example01.dbf
 
백업 데이터파일, 사용중이던 리두, 컨트롤파일을 사용하여
임시경로 (/data/temp/) 에
ts_a, system, sysaux, undotbs1 만 복원하여 DB open 하세요.
 
 
장애 : 기존에 쓰던 데이터파일들이 전부 지워졌다. 백업파일에 있는 데이터파일을 가지고 오는건데
       ts_a, system, sysaux, undotbs1 만 가지고 오고, 나머지는 로그에서 새로 생성하기...
 
의미 :
데이터파일이 100개가 있는데, 내가 살리고 싶은 데이터는 ts_a에 있었기 때문에,
필요한것 과 시스템 필수 (system,sysaux, undotbs1)만 가지고 온다.
 
 
 

1. 테이블 스페이스만들기
2. 전체 닫힌백업
3. 기존경로 *.dbf지우고 DB강제종료
4. 임시경로(/data/temp/) 에 ts_a,system,sysaux,undotbs1 복사
5. DATAFILE경로 변경 & 복구
ⓐ복사한것들 (Hint> alter database rename file '원~~래~~' to '새~~로~~';)
ts_a01.dbf       system01.dbf        sysaux01.dbf       undotbs01.dbf
 
ⓑ살릴것들 (Hint> alter database create datafile '원~~래~~' as '새~~로~~';)
ts_b01.dbf       ts_c01.dbf
 
ⓒ나머지 포기하기 (Hint> alter database datafile '~~~' offline drop;)
users01.dbf     example01.dbf
 
※ 문제의도 : 필요한 데이터 있는 ts_a 만 살리고 나머지 포기 = ⓑ 도 포기해야함
                   로그파일에서 파일 신규로 만들어 살리는 연습 하려면 = ⓑ 하기
 
6. RECOVER
 
7. 복구 확인
 
 


 
1.
SQL> create tablespace ts_a
  2  datafile '/home/oracle/oradata/testdb/ts_a01.dbf' size 5M;
 
SQL> create tablespace ts_b
  2  datafile '/home/oracle/oradata/testdb/ts_b01.dbf' size 5M;
 
SQL> create tablespace ts_c
  2  datafile '/home/oracle/oradata/testdb/ts_c01.dbf' size 5M;
 
 
2.
SQL> shutdown immediate;
SQL> !cp -av /home/oracle/oradata/testdb/*.dbf /data/backup/close/
SQL> startup
 
 
3.
SQL> !rm /home/oracle/oradata/testdb/*.dbf
SQL> shutdown abort;
 
 
4.
$ cp /data/backup/close/ts_a01.dbf /data/temp/ts_a01.dbf
$ cp /data/backup/close/system01.dbf /data/temp/system01.dbf
$ cp /data/backup/close/sysaux01.dbf /data/temp/sysaux01.dbf
$ cp /data/backup/close/undotbs01.dbf /data/temp/undotbs01.dbf
 
5.
ⓐ 백업에서 복사해온 데이터파일 경로 바꿔주기
SQL> alter database rename file '/home/oracle/oradata/testdb/system01.dbf'
  2  to '/data/temp/system01.dbf';
 
SQL> alter database rename file '/home/oracle/oradata/testdb/sysaux01.dbf'
  2  to '/data/temp/sysaux01.dbf';
 
SQL> alter database rename file '/home/oracle/oradata/testdb/undotbs01.dbf'
  2  to '/data/temp/undotbs01.dbf';
 
 
ⓒ 사용 안하는 데이터파일들 포기하기
SQL> alter database datafile '/home/oracle/oradata/testdb/users01.dbf' offline drop;
SQL> alter database datafile '/home/oracle/oradata/testdb/example01.dbf' offline drop;
 
→ ts_b01.dbf, ts_c01.dbf 파일도포기하려면  위의 방법으로 처리
 
 
ⓑ 연습 겸 신규로 생성해서 복구하기 (redo log와 archive log에서 작업 가지고 와서 파일 생성됨)
SQL> alter database create datafile '/home/oracle/oradata/testdb/ts_b01.dbf'
  2   as '/data/temp/ts_b01.dbf';
 
SQL> alter database create datafile '/home/oracle/oradata/testdb/ts_c01.dbf'
  2   as '/data/temp/ts_c01.dbf';
 
 
6.
SQL> select name from v$datafile;
SQL> recover database;
SQL> alter database open;
 
7.
SQL> select tablespace_name, bytes, file_name from dba_data_files;
 
Posted by 딩구르
,