Flashback Data Archive (11g New Feature)
 




Row level Flashback 과 Table level Flashback 중 DML장애 처리 - undo data 활용
 → 다른 누군가가 undo segment 를 재활용 해버리면 해당 Flashback 기능을 사용할수 없다.
 
11g 부터 Online redo log를 Archive 하듯이
   undo segment에 있는 commit된 내용을 특정 테이블 스페이스에 Archive 하여 영구적으로 저장하는 기능 제공
 
백그라운드 프로세스 새로 만들어짐 : FBDA
 - undo segment의 내용을 비정기적으로 특정 테이블 스페이스에 저장하는 백그라운드 프로세스



 
※ 특징 (기능이 활성화 되었을때..)

1. FBDA가 undo segment를 모두 기록하기 전에는 해당 undo segment 재활용되지 않음
2. 최대 10개까지의 FBDA 백그라운드 프로세스 동시에 작업 - 대량의 DML 시 병목현상 방지
3. FBDA 프로세스는 sleep 하고 있다가 특정 시간이 되면 자동으로 활성화 되어 undo segment의 내용을 저장함
   undo의 양이 많을 경우 자주 내려쓰게 되며 기본값은 5분.
4. 해당 데이터는 자동 파티셔닝 되어 저장. 관리자라도 그 내용을 변경할수 없다.
5. Retention time 을 설정하여 데이터를 관리. Retention time 이 지난 데이터는 자동으로 삭제
6. Inset 되는 데이터는 이 기능 사용 안함


 
 
 
○ Flashback Database Archive 활성화 하기
   - history table : undo data를 저장할 곳
 
(1) Flashback history table 을 저장할 테이블 스페이스 생성
 
SQL> create tablespace ts_fda01 datafile '/app/oracle/oradata/testdb/ts_fda01.dbf' size 5M;
SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;
ts_fda01생성된것 확인
 
 
 
(2) Flashback data archive 를 관리할 관리자 계정 생성
 
SQL> create user fbadmin identified by fbpwd
    2   default tablespace ts_fda01;
 
 
 
(3) 관리자 계정에 권한 할당
 
SQL> grant resource, connect to fbadmin;
SQL> grant flashback arcive administer to fbadmin;
 

※ 참고
flashback arcive administer 권한 (11g 새로 생성된 권한)
① Flashback Data Archive 를 관리하기 위한 특별한 시스템권한
② Flashback History Table 을 생성하고 관리할수 있음
③ 테이블 스페이스를 추가하거나 삭제할수 있음
④ Flashback history table Retention time 을 관리할수 있음


 
 
 
 
(4) 관리자 계정으로 로그인 후 flashback history table 생성
 
SQL> conn fbadmin/fbpwd;
SQL> create flashback archive fda01 tablespace ts_fda01
     2  retention 30 day;
 

※ 참고
retention 30 day 옵션
 : history table 에 저장되는 undo data의 보존기한을 의미
 : 30일이 지나면 보관되어 있는 undo data를 자동으로 삭제한다는 의미


 
 



 
○ 현재 만들어져 있는 Flashback history table 조회
 
set line 200
col owner_name for a10
col flashback_archive_name for a10
col retention_in_days for 999
col status for a10
SQL> select owner_name, flashback_archive_name, reention_in_days, status from dba_flashback_archive;
 
 
▶ 이렇게 Flashback Data Archive 를 활성화 시킨후 해당 기능을 사용하려면
★ 사용 원하는 테이블을 생성 할때나, 생성된 테이블에 Flashback Data Archive 를 설정
 



 
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 실습1 시작
실습 1. Flashback data archive 사용 안하고 복구 시도
 - scott사용자로 잘못된 DML(update) 수행 = 다른 섹션에서 로그인해서 현재 잘못된 update 수행한 트랜잭션이 사용중인 undo segment 확인
 - scott사용자로 잘못된 update 를 commit
 - 다른 사용자(userb)로 로그인해서 대량의 DML(insert)발생시켜서 위의 사용중인 undo segment 덮어씀
 - 다른 터미널에서 sys로 로그인해서 undo segment 사용내역 조회해 보고 scott 사용자가 사용했던 undo segment 아직 사용중이면
   다른 사용자(userb)로 더 많은 데이터 입력
 - scott 사용자가 사용했던 undo segment 다 사용함 확인했으면 scott 사용자로 flashback table 시도
 
SCOTT> flashback table test01 to timestamp (systimestamp - interval '5' minute);
에러
ORA-00604: error ocurred at recursive SQL level 1
ORA-12801: error signaled in parallel query server P000
ORA-01555: snapshot too old: rollback segment number 11 with name "_SYSSMU11_13010314820$" too smal
 
 - scott 의 undo segment 를 userb가 덮어써서 scott 사용자의 데이터 flashback 할수 없게 됨
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 실습1 끝
 
 
 
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 실습2 시작
실습 2.  Flashback data archive 사용하고 복구 시도
 : FBDA 기능 사용하게 설정 후 동일한 내용의 실습으로 복구되는것 확인
 : 현재 로그인한 사용자명 프롬프트에 나오게 하기> set sqlprompt "_USER> ";
 
 
1. 현재 undo 상태 확인
SYS> show parameter undo;
 
 
2. 현재 flashback data archive 상태 확인
set line 200
col owner_name for a10
col flashback_archive_name for a10
col retention_in_days for 999
col status for a10
SQL> select owner_name, flashback_archive_name, reention_in_days, status from dba_flashback_archive;
FBADMIN  FDA01  30 으로 설정되어있음
 
 
3. scott 사용자로 test3 테이블을 생성하여 FDA를 FDA01을 사용하도록 설정
SYS> conn scott/tiger
 
SCOTT> create table test3 (no number,name varchar2(10)) flashback archive fda01;
ORA-55620: No privilege to use Flashback Archive
권한에러
 
SCOTT> conn / as sysdba;
SYS> grant flashback archive on fda01 to scott;
SYS> conn scott/tiger
SCOTT> create table test3 (no number, name varchar2(10)) flashback archive fda01;
SCOTT> insert into test3 values (1,'AAA');
SCOTT> insert into test3 values (2,'BBB');
SCOTT> insert into test3 values (3,'CCC');
SCOTT> commit;
SCOTT> select * from test3;
 
 
4. update 장애 발생 시킴
SCOTT> update test3 set name='DDD';
잘못된 업데이트
 
SCOT> select * from test3;
전부 DDD
 
** 다른 창에서 sys로 로그인 하여 scott 사용자의 undo segment 사용을 확인
SYS> @roll
SCOTT> commit;
 
 
5. userb 계정으로 test04 생성 후 undo segment 를 덮어쓰게 만듦
USERB> create table test04 (no number, name varchar2(10));
USERB> begin
   2   for i in 1..1000 loop
   3   insert into test04 values (i,'No name~!');
   4   end loop;
   5   end;
   6   /
 

** 다른 창에서 sys로 로그인 하여 uesrb가 사용중인 undo segmet 를 조회
SYS> @roll
아직 scott 사용자가 ㅅ용했던 세그먼트를 재활용해서 사용중
userb로 더 많은 DML 날리기
 
USERB> /
 
USERB> /
 
USERB> select count(*) from test04;
4000건
 
 
6. scott 계정에서 flashback table 명령어로 test3 테이블 복구
SCOTT> alter table test3 enabel row movement;
SCOTT> flashback table test3 to timestamp (systimestamp - interval '5' minute);
SCOTT> select * from test3;
그대로 DDD
 
SCOTT> flashback table test3 to timestamp (systimestamp - interval '10' minute);
에러
ORA-01466: unable to read bata - table definition has changed
 
SCOTT> flashback table test3 to timestamp (systimestamp - interval '7' minute);
SCOTT> selct * from test3;
복구완료
 
▶ undo segment 가 덮어 씌여 졌지만 복구 완료됨
    flashback data archive 기능을 사용하기 때문에 해당 부분이 archive 되어 있다.
 
 
 
7. FDA를 사용하는 테이블 삭제하기
 : flashback data archive 때문에 해당 테이블은 정상적으로 지워지지 않는다.
 
SCOTT> drop table test3;
에러
ORA-55610: Invalid DDL statement on history-tracked table
 
 
SCOTT> alter table test3 no flashback archive;
SCOTT> drop table test3;
 
 
 
8. flash back history table 조회하기
col table_name for a10
col flashback_archive_name for a10
col archive_table_name for a20
col staus for a10
SYS> select * from dba_flashback_archive_table;
 
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 104 ~ 109 끝
 
 
※ Flashback 명령어의 주의사항
 - flashback 기능이 아주 획기적이고 강력한 복구 도구인 것은 사실이지만, 복구 불가한 경우도 많기 때문에 꼭 전통적인 방법들과 병행해서 데이터를 안전하게 지켜내야 한다.
 

★ Flashback 명령어를 사용할수 없는 경우
1) 물리적인 장애 - 파일(data file, redo log file, control file) 이 삭제된 경우
2) system tablespace 에 있던 테이블이 삭제되면 flashback table to before drop 안됨
3) control file 을 재 생성하면 flashback database 명령어 사용할 수 없음
4) tablespace 가 drop 되면 flashback 명령어로 복구 안됨
5) Data file 이 shrunk 되면 flashback database 명령어로 복구 안됨
6) Alter table 로 테이블 구조가 변경되면 version query 로 복구 안됨
7) system tables 과 통계정보는 flashback 명령어로 복구 안됨
8) purge 된 테이블은 flashback 명령어로 복구 안됨
9) 테이블과 별도로 삭제된 인덱스는 복구 안됨
10) Mview 복구 안됨


Posted by 딩구르
,