반응형

Flashback

1. 논리적 오류를 복구 할 수 있다. (물리적 오류는 복구 불가)

2. Row Level / Table Level / Database Level 로 나뉜다.

3. 별도의 백업 파일 복원이 없기 때문에 전통적 복구에 비해 아주 빠르다.

4. 휴지통(recyclebin) / Undo data / Flashback log 등의 기술을 사용한다.

5. restore 없이 복구하므로 빠름. (물리적인 오류 복구는 restore[dbf+archive file])

 

Row Level Flashback

- Flashback Query : 특정 시점의 변경 내역만 알 수 있는 쿼리

- Flashback Version Query : 해당 데이터의 과거 변경이력을 전부 찾아주는 쿼리

- Flashback Transaction Query : 변경 사항을 취소시켜 이전 값으로 돌려주는 쿼리

반드시 supplemental_loggingmin level 이상으로 설정해야 함

supplemental_loggingmin level 이상으로 설정하면 UndoRedo log, archive log 사용량 증가(상세히 기록)

Row Level Flashback

- 특정 테이블의 특정 Row Flashback 해주는 기능

- commit된 데이터만 복구 가능

- Undo data의 정보를 이용하여 복구

- Undo segment가 재사용된 경우 ORA-01555 snapshot too old 에러 발생

- 한 두건은 Row level을 쓰지만 많은 데이터 복구는 테이블 단위로 함

 

----------------------------------row level-------------------------------------

-- 실습 test table data 만들기

create table flashback_test1

( name varchar2(10),

addr varchar2(10),

tel varchar2(10)

);

 

insert into flashback_test1 values('홍은혜','용산','111');

insert into flashback_test1 values('김예진','제천','222');

insert into flashback_test1 values('양순정','부산','333');

 

commit;

 

select * from flashback_test1;

 

update flashback_test1 set name = '홍길동' where tel = '111';

commit;

update flashback_test1 set name = '김범수' where tel = '333';

commit;

 

select * from flashback_test1;

 

-- 변경 이력을 찾는 Flashback Version Query 수행

select versions_startscn st_scn,

versions_endscn endscn,

versions_xid txid,

versions_operation opt,

name

from flashback_test1 versions between scn minvalue and maxvalue

where tel = '111';

 

 

 

 

 

-- 동시에 여러 번의 수정이 일어났을 경우 변경 history 찾는 방법

update flashback_test1 set name = '전준민' where tel = '111';

commit;

 

update flashback_test1 set name = '홍민택' where tel = '111';

commit;

 

-- 변경 이력을 찾는 Flashback Version Query 수행

select versions_startscn st_scn,

versions_endscn endscn,

versions_xid txid,

versions_operation opt,

name

from flashback_test1 versions between scn minvalue and maxvalue

where tel = '111';

alter session set nls_date_format='YYYY/MM/DD HH24:MI:SS';

-- 변경된 DATA별로 변경 시점 조회

select scn_to_timestamp(4260670) from dual;

 

-- 변경 전 data로 직접 UPDATE(row level flashback)

update flashback_test1 set name = '홍길동' where tel = '111';

commit;

 

-- 변경 이력을 찾아 복구하는 Flashback Transaction Query 수행

select undo_sql

from flashback_transaction_query

where table_name = 'FLASHBACK_TEST1'

and commit_scn between 4260443 and 4268760

order by start_timestamp desc;

=================> supplemental_logging min을 안해서 안나옴

-- min level supplemental logging 조회 및 변경

select supplemental_log_data_min from v$database;

alter database add supplemental log data; --> MINYES로 변경

select supplemental_log_data_min from v$database;

-- 데이터 변경

update flashback_test1 set name = '조우성' where tel = '111';

commit;

update flashback_test1 set name = '조규현' where tel = '111';

commit;

update flashback_test1 set name = '김일주' where tel = '111';

commit;

-- 변경 이력을 찾아 복구하는 Flashback Transaction Query 수행

select undo_sql

from flashback_transaction_query

where table_name = 'FLASHBACK_TEST1'

and commit_scn between 4268746 and 4278716

order by start_timestamp desc;

=================> logging 이후 변경된 데이터만 조회됨 (dml 쿼리)

update "SYSTEM"."FLASHBACK_TEST1" set "NAME" = '조우성' where ROWID = 'AAASTtAABAAAeI5AAA';

update "SYSTEM"."FLASHBACK_TEST1" set "NAME" = '조규현' where ROWID = 'AAASTtAABAAAeI5AAA';

update "SYSTEM"."FLASHBACK_TEST1" set "NAME" = '홍민택' where ROWID = 'AAASTtAABAAAeI5AAA';

Table Level Flashback

- 특정 테이블 전체 내용을 장애 발생 전 상태로 flashback하는 방법

- Row level과는 달리 테이블 전체의 내용이 변경된다.

- 복구 방법

DML 에러에 대한 복구(undo data 이용)

특정 테이블이 Drop 되었을 때 사용하는 방법 (recyclebin 이용)

 

-----------------------Table Level Flashback------------------

select * from flashback_test1;

 

select systimestamp from dual; -- 2015/12/15 22:40:10 +09:00

 

delete from flashback_test1;

select * from flashback_test1;

 

commit;

 

-- 복구 방법 1 ( 확인하고 select insert 하거나 임시 테이블 만들어서 제공 )

create table flashback_test1_imsi

as

select *

from flashback_test1

as of timestamp to_timestamp('20151215 2240','yyyymmdd hh24mi');

 

-- 복구 방법 2 --기존데이터가 뭐든 간에 바로 복구(=데이터유실)(그래서 잘 안씀)

1) flashback table flashback_test1

to timestamp(systimestamp - interval '30' minute);

--ERROR at line 1:

--ORA-08189 : cannot flashback the table because row movement is not enabled

--flashback table 사용 시 row movement enable설정해야 가능

--바로 복구를 원할 경우, 시간이 명확하고 중간 트랜잭션이 없을 경우 더욱 빠름

 

alter table flashback_test1 enable row movement;

 

2) flashback table flashback_test1

to timestamp(to_timestamp('20151215 2240','yyyymmdd hh24mi'));

 

select * from flashback_test1;

 

--시간을 너무 이전 시점으로 설정할 경우 에러 발생

flashback table flashback_test1

to timestamp(systimestamp - interval '0' second);

--ERROR at line 1:

--ORA-01466: unable to read data - table definition has changed

 

 

-------------drop 테이블 recyclebin에서 복구(purge로 날리면 recyclebin으로 저장 안되므로 복구 불가)------------------------

--삭제하고 누군가 동일 테이블을 만들어 동일 테이블이 있을 때 복구가 안됨

select * from scott.emp;

drop table scott.emp;

 

select *

from dba_recyclebin

where original_name like 'EMP%';

flashback table scott."BIN$JvGK2YFr+9LgUAB/AQAMsg==$0" to before drop;

--drop된 테이블이 여러 개 일수도 있어서 original_name사용안함 scott.emp(object_name 사용 권고)

 

select * from scott.emp;

 

 

--동일한 이름의 table이 있는 경우

create table scott.dept2

as select * from scott.dept

where 1=2;

 

drop table scott.DEPT;

 

alter table scott.dept2 rename to dept;

 

select * from scott.dept;

 

select * from dba_recyclebin

where original_name like 'DEPT%';

 

--이미 동일 테이블명이 존재해서 ORA-38312 : original name is used by an existing object

flashback table scott."BIN$JvzOjsrODFjgUAB/AQAP2Q==$0"

to before drop;

 

 

 

--rename 옵션 이용하여 복구

flashback table SCOTT."BIN$JvzOjsrODFjgUAB/AQAP2Q==$0"

to before drop rename to dept_imsi;

 

select * from scott.dept_imsi;

 

insert into scott.dept

select * from scott.dept_imsi;

 

commit;

 

select * from dba_tables

where table_name like '%DEPT%';

Database Level Flashback

- 전통적인 복구 방식 : 장애 발생 시 백업된 데이터 파일을 복원해서 Redo logArchive log를 적용시켜 복구

- Flashback database 복구 방식 : 장애가 발생한 데이터 파일에 Flashback log로 복구

- 물리적인 백업 파일을 복원할 필요가 없으므로 빠른 복구 가능

- Redo logArchive log를 사용하기도 함

 

Flashback database 복구 방식

 

 

Database Level Flashback 사용 준비

- db_recovery_file_dest 설정 필요

: flashback log 쌓이는 장소

- db_recovery_file_dest_size 설정 필요

: flashback log 쌓이는 최대 size(default : 4G)

* 해당 공간이 full이면 DB Hang

- db_flashback_retention_target 분 단위 설정 필요(default : 1440/24시간)

* 2일 전으로는 못 돌림, size도 키워야 함

- archive log mode

- flashback database mode

 

----------------------------------------

-- 아카이브 모드 확인

SQL> archive log list;

 

-- flashback 모드 확인

select flashback_on from v$database;

 

-- 관련 파라미터 확인

select *

from v$parameter

where name in ('db_recovery_file_dest', -- flashback log 위치

'db_recovery_file_dest_size', -- flashback log 위치 크기

'db_flashback_retention_target', -- (설정시간까지만)

'log_archive_dest_1' ,-- 아카이브 로그 위치

'log_archive_format');

-- 아카이브 모드 변경

SQL> startup mount;

SQL> alter database archivelog; <-> alter database noarchivelog;

SQL> archive log list;

SQL> alter database flashback on; <-> alter database flashback off;

SQL> alter database open;

 

-- flashback log 확인

SQL> alter system switch logfile; -- 물리적으로 로그 발생 확인

 

select * from v$flash_recovery_area_usage;

 

-- 아카이브 위치 변경

alter system set log_archive_dest_1='location=/oracle11/arch';

--flashback logarchive log 위치를 분리 --> full 차는 거 예방

--------------------------------------recyclebin---------------------------

purge recyclebin; -- 리사이클빈 지우기

purge dba_recyclebin; -- sys 계정에서 수행

 

select * from recyclebin;

select * from dba_recyclebin;

 

drop table PCT_TEST2; -- scott 계정 수행

drop table job_test02; -- system 계정 수행

--********system tablespace의 테이블을 drop 하면 recyclebin에 들어가지 않음*******

 

purge table scott."";

purge table scott.SAL_HISTORY;

 

--recyclebin 끄기

alter session set recyclebin=off; -- 세션 별

 

create table honghong3

(a number)

tablespace users;

 

drop table honghong3;

 

select * from dba_recyclebin;

 

--system tablespacetabledrop해도 recyclebin에 가지 않음

--------------------------------------------------------------------------

select * from flashback_test1;

 

select systimestamp from dual;--2015/12/16 21:22:28 +09:00

 

truncate table flashback_test1;

 

--set1)

alter session set nls_date_format='YYYY/MM/DD HH24:MI:SS';

flashaback table FLASHBACK_TEST1

to timestamp('2015/12/16 21:21:00');

 

--set2)

flashback table flashback_test1

to timestamp(to_timestamp('2015/12/16 21:21:00','YYYY/MM/DD HH24:MI:SS'));

--ORA-01466 : unable to read data - table definition has changed

--DDL발생(truncate) 구조적 변경 됐으므로 위에 에러 발생

 

select * from scott.flashback_test1;

 

--flashback database 복구

--mount 단계에서 수행, DBA권한 필요

SQL > shutdown immediate;

SQL > startup mount;

 

SQL> flashback database to timestamp (to_timestamp('2015/12/16 21:21:00','YYYY/MM/DD HH24:MI:SS'));

 

SQL > alter database open;

--ERROR at line 1:

--ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

--과거로 돌렸기 때문에 SCN이 맞지 않아서 에러가 남

SQL > alter database open resetlogs; --> scn 정보를 최상으로 맞춤

 

select * from flashback_test1;

 

'Study Note > Database' 카테고리의 다른 글

SQL 기본 [ SELECT ]  (0) 2016.02.03
DataPump  (0) 2016.02.02
DBMS JOB & Scheduler  (0) 2016.02.02
User 관리하기  (0) 2016.02.02
Oracle Block  (0) 2016.02.02

+ Recent posts