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_logging을 min level 이상으로 설정해야 함
supplemental_logging을 min level 이상으로 설정하면 Undo와 Redo 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; --> MIN을 YES로 변경
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 log와 Archive log를 적용시켜 복구
- Flashback database 복구 방식 : 장애가 발생한 데이터 파일에 Flashback log로 복구
- 물리적인 백업 파일을 복원할 필요가 없으므로 빠른 복구 가능
- Redo log와 Archive log를 사용하기도 함
●Flashback database 복구 방식
- 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 log와 archive 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 tablespace의 table은 drop해도 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 |