행위

"오라클 flashback"의 두 판 사이의 차이

DB CAFE

(새 문서: == FlashBack == == 개요 == {{:FLASHBACK DATABASE LEVEL}} {{:FLASHBACK TABLE LEVEL}} {{:Flashback row level|FLASHBACK ROW LEVEL}})
 
(개요)
(같은 사용자의 중간 판 하나는 보이지 않습니다)
1번째 줄: 1번째 줄:
 
== FlashBack ==
 
== FlashBack ==
 
== 개요 ==
 
== 개요 ==
 +
* 오라클 레퍼런스 참조 (https://www.oracle.com/database/technologies/flashback/)
 +
 +
# 오라클 플래시백 사용 기능
 +
## 논리적 플래시백 기능
 +
## 플래시백 데이터베이스
 +
#
 
{{:FLASHBACK DATABASE LEVEL}}
 
{{:FLASHBACK DATABASE LEVEL}}
 
{{:FLASHBACK TABLE LEVEL}}
 
{{:FLASHBACK TABLE LEVEL}}
 
{{:Flashback row level|FLASHBACK ROW LEVEL}}
 
{{:Flashback row level|FLASHBACK ROW LEVEL}}

2024년 5월 14일 (화) 08:30 판

thumb_up 추천메뉴 바로가기


1 FlashBack[편집]

2 개요[편집]

  1. 오라클 플래시백 사용 기능
    1. 논리적 플래시백 기능
    2. 플래시백 데이터베이스

3 FLASHBACK DATABASE LEVEL[편집]

  1. 전통적인 백업 방법은 파일을 restore 하고 redo와 Archive File을 이용하여 복구
  2. Database Level Flashback 은 restore 과정을 생략하고 Flashback log 를 이용하여 복구 하는 것이 차이점

3.1 전통적인 복구 VS DATABASE FLASHBACK[편집]

REDO,ARCHIVE파일 복구 DATABASE FLASHBACK 복구
Redo, archive만 사용하는 불완전 복구 Database flashback(어느정도 redo도 사용)
복구 시 백업파일을 복원해야한다. 복원 불필요
복구 후 재차 복구 불가능(resetlog때문에) 복구 후 재차 복구 가능
Redo, archive파일사용 Flashback log파일사용
Database archivelog 모드만 가능 Archivelog mode 이고 flashback database mode

3.1.1 주의사항[편집]

  1. flashback log 는 Database snapshot 수준으로 남기므로 많은 용량을 필요로 한다.
  2. system Tablespace 내의 Table은 Flashback 으로 복구 불가능
  3. Control file 을 재생성시 Flashback Database 설정 초기화

3.2 DATABASE FLASHBACK 전제조건[편집]

  1. flashback log 설정 활성화
  2. archive log mode
  3. Flashback Database Mode 설정 활성화


3.3 DB 환경 설정[편집]

  1. Database Level 의 Flashback 을 사용하려면 아래와 같은 설정을 선행 해야 한다.
-- db_flashback_retention_target 분 설정 
SQL> alter system set db_flashback_retention_target=30 scope=spfile;

-- 종료 (pfile 을 사용한다면 종료후 pfile 에 db_flashback_retention_target 을 설정한다.)
SQL>SHUTDOWN  IMMEDIATE;

-- MOUNT 상태로 시작 
SQL> startup mount;

-- archive log 시작
SQL> alter database archivelog;

-- flashback on
SQL> alter database flashback on;

-- database open
SQL> alter database open;

-- flashback 상태 조회
select flashback_on from v$database;

FLASHBACK_ON
------------------
YES

https://t1.daumcdn.net/cfile/tistory/1977D1394FA32D6C2B

3.4 시나리오[편집]

  1. 테이블 생성
  2. 데이터 입력
  3. 테이블 truncate
  4. 복구



-- 1.테이블 생성 
SQL>  create table t ( no number,name varchar2(10)) tablespace example;
Table created.

-- 2. 데이터 입력
SQL> begin
    for i in 1..1000 loop
       insert into t values ( i , dbms_random.string('A', 9));
    end loop;
    commit;
    end;
    /

-- 3. Table Truncate
SQL> truncate table t;
Table truncated.

-- 4. 복구 

-- sys 계정 로그인 (database shutdown 하기 위해)
SQL> conn / as sysdba

-- database shutdown  
SQL> shutdown immediate;

-- 마운트 상태에서 복구 
SQL> startup mount;

-- 시간은 알아서..
SQL>flashback database to timestamp (systimestamp - interval '10' minute);

Flashback complete.

-- database 를 open 한다.
SQL> alter database open resetlogs;

4 Table Level Flashback[편집]

  1. 다른 테이블에 영향을 주지 않고 대상이 되는 테이블만 복구하는 기술이다.
  2. Table Level Flashback 은 두가지 방법으로 나눌 수 있다.
    1. - SCN 기반 Flashback
      - 시간 기반 Flashback

4.1 복구 불가 테이블[편집]

  • 복구 대상 테이블이 Alter 명령어로 변경되면 변경전으로 Flashback을 사용하지 못한다


4.2 SCN 기반 Flashback[편집]

  1. 이벤트가 발생하기 전의 SCN 을 이용한 Flashback 기능을 사용하는 방법.
  2. 이 방법은 이벤트를 발생시키기 전에 미리 SCN을 기록해 두거나 , 변경 이력 조회 방법등으로 알아낸SCN 을 이용하여 Table Level 의 Flashback 방법
  3. 전제 조건
    1. Flashback을 사용하는 테이블은 row movement 가 활성화되어 있어야 한다.

4.2.1 복구실습[편집]

--  map 은 복구 대상 테이블 명 
SQL> flashback table map to scn '604359' -- 테이블 레벨에서 SCN 604359 으로 Flashback 을 시도. 
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled

SQL> ALTER table map enable row movement;
Table altered.

SQL> flashback table map to scn '604359';
Flashback complete.
  • 설명
  1. 테이블 레벨에서 SCN 604359 으로 Flashback 을 시도한다.
    1. - 이 값은 앞선 포스팅에서( 4. 변경 이력 조회 ) 조회된 값이다.
    2. - 삭제전에 현재 SCN 조회를 하여 기록해 놨던 SCN 으로 사용해도 된다.
  2. 테이블에 row movement 가 설정되어 있지 않아서 메시지가 표시된다.
  3. 테이블에 row movement 를 활성화한다.
  4. flashback 을 재시도 한다.


4.2.2 현재 scn 조회[편집]

select current_scn from v$database;

CURRENT_SCN
-----------
     611387
--


4.3 시간 기반 Flashback[편집]

  1. SCN 과 마찬가지로 undo 를 사용하며 시간을 기반으로 Flashback 기능 사용.

4.3.1 복구실습[편집]

-- 1.대상 테이블 조회
SQL> select * from map;

KEY                  NAME
-------------------- --------------------
동물                 강아지
바다                 배
하늘                 비행기


--  2. 테이블 삭제 
SQL> delete from map;
3 rows deleted.

-- 3. 복구

SQL> flashback table map to timestamp(systimestamp - interval '2' minute);
Flashback complete.


4.4 관련 에러[편집]

4.4.1 ORA-01466: unable to read data - table definition has changed[편집]

시간을 너무 뒤로 돌려서 해당 테이블이 존재하지 않은 시간대를 선택했거나, alter 명령어로 테이블을 수정시 수정 전 시간으로 Flashback 을 시도하면 위와같은 에러 발생

4.4.2 UNDO Data가 없을때[편집]

ORA-00604 : error occurred at recusive SQL... ORA-12801 error signaled in parallel... ORA-01555 : snapshot too old : rollback segment number ...


4.5 Recycle Bin[편집]

  1. 윈도우의 휴지통같은 기능
  2. 테이블을 drop 할때 purge 옵션을 주지 않으면 완전히 삭제되지 않고 복구가 가능한 상태로 바뀌게 되는데. 삭제되어 복구가 가능한 테이블들은 조회 할 수 있으며 복구 할 수 있다.
  3. 주의사항
    1. - 테이블이 삭제되면 다른영역으로 이동하는것이 아니라 상태만 변경.
      그래서 테이블스페이스에 공간이 부족하게되면 우선적으로 recycle bin 이 차지하고 있는 영역을 사용하게 되는데 그러면 recycle bin 을 이용하여 복구가 불가능하다.
      - 인덱스가 존재하는 테이블을 삭제하고 flashback 을 사용하여 복구하면 인덱스도 같이 복구 된다.
      하지만 인덱스 명이 BIN$. 으로 시작하므로 이름을 변경시켜 주던지 아니면 삭제하고 다시 생성한다.

4.5.1 인덱스 조회[편집]

select table_name, column_name,index_name
  from user_ind_columns
 where table_name='&tableName' -- map 테이블 인덱스 조회 

--  map  테이블 삭제
SQL> drop table map;
Table dropped.

-- 테이블 존재하는지 확인 
SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
DEPT                           TABLE
EMP                            TABLE
BONUS                          TABLE
SALGRADE                       TABLE
BIN$vL0lpMaYHDDgQAB/AQA0Tw==$0 TABLE
SYS_TEMP_FBT                   TABLE

-- 휴지통 확인 
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
MAP              BIN$vM4c+mQ5ZZ/gQAB/AQBU0Q==$0 TABLE        2012-04-04:06:37:26
  • select * from tab; 명령을 통한 조회에서는 이름만 표시되고 있으며 show recyclebin 명령은 원본 명과 recycle 명 타입 삭제된 시간 등을 알 수 있다.

4.6 테이블 복구[편집]

4.6.1 drop 한 테이블 명으로 복구[편집]

flashback table map to before drop;

4.6.2 recycle bin name 으로 복구[편집]

flashback table "BIN$vM4c+mQ5ZZ/gQAB/AQBU0Q==$0" to before drop;

-- ORA-38312: original name is used by an existing object 이미 존재하는 경우 새이름으로 복구
flashback table "BIN$vM4c+mQ5ZZ/gQAB/AQBU0Q==$0" to before drop rename to map2;

5 Row Level FlashBack[편집]

5.1 개요[편집]

android # 테이블에 전체적인 영향을 주지 않고 특정 row 만 복구가 가능하다

  1. UNDO 를 이용한다.
  2. commit 된 데이터만 복구한다.
  3. 용도별로 Flashback Version Query, Falshback Transaction Query 으로 나눌 수 있다.
    • Flashback Version Query
    - 과거의 변경 이력을 조회한다.
    • Falshback Transaction Query
    - 변경 작업을 취소하며, 궁극적으로 복구를 목적으로 한다.


5.1.1 주의사항[편집]

  1. Row Level Flashback 은 Undo Data를 사용하므로 해당 rollback Segment 가 다른 트렌젝션 작업으로 덮어 써지는 경우에는 사용할 수 없다.
  2. 트렌젝션이 자주 일어나는 시스템이거나, 많은 시간이 흘러버린다면 Row Level Flashback 사용이 불가능하며, 이 때는 clone Database 를 이용하여 시간기반으로 데이터를 복구해야 한다.

5.2 실습 시나리오[편집]

1. 테이블 생성 2. 데이터 입력 3. 데이터 변경 4. 변경 이력 조회 5. 복구

5.2.1 테이블 생성[편집]

create table map (key varchar2(20), name varchar2(20)) tablespace example;
  • key 와 name 으로 이루어진 간단한 테이블을 생성한다.

5.2.2 데이터 입력[편집]

SQL> insert into map values ('동물', '강아지');
SQL> insert into map values ('바다','배');
SQL> insert into map values ('하늘','비행기');
SQL> commit;

5.2.3 데이터 변경[편집]

SQL> update map set name='배' where key='하늘';
SQL> update map set name='비행기' where key='바다';
SQL> commit;

5.2.4 변경 이력 조회[편집]

  1. 이력조회를 위해 Flashback Version Query 수행.
select versions_startscn st_scn
     , versions_endscn endscn
     , versions_xid txid
     , versions_operation opt
     , &targetColumn
  from &tableName versions between scn minvalue and maxvalue
where &whereColumn = &value
  • 변수 설명
targetColumn : 변경이 일어난 컬럼 명 tableName : 변경이 일어난 테이블 명
whereColumn : 변경이 일어난 컬럼을 찾기위해 조건에 들어갈 컬럼
value : 조건 컬럼의 값

5.2.5 변경 이력 확인[편집]

Enter value for targetcolumn: name
old   6: ,       &targetColumn
new   6: ,       name
Enter value for tablename: map
old   8:         &tableName versions between scn minvalue and maxvalue
new   8:         map versions between scn minvalue and maxvalue
Enter value for wherecolumn: key
Enter value for value: '하늘'
old   9: where &whereColumn = &value
new   9: where key = '하늘'

    ST_SCN     ENDSCN TXID             O NAME
---------- ---------- ---------------- - --------------------
    604368            08002A004A010000 U 배
    604359     604368 0700290028010000 I 비행기

--------------- 분석 ---------------
위의 결과값을 보면 처음에 '비행기'라는 값을 Insert 했고 '배'로 Update 한 것을 알 수 있다.
발생 시점을 시간으로 보고 싶다면 아래와 같이 scn_to_timestamp(scn) 함수를 사용하면 된다.
SQL>select to_char(scn_to_timestamp(604368), 'YYYY-MM-DD:HH24:MI:SS')  -- 위 결과에서 나온  SCN 으로 시간 조회 
      from dual;

TO_CHAR(SCN_TO_TIME
-------------------
2012-04-03:23:16:10

5.2.6 복구[편집]

select undo_sql
  from flashback_transaction_query
 where table_name='&tableName'
   AND commit_scn between &st_scn and &end_scn
 order by start_timestamp desc

--
Enter value for tablename: MAP
old   6:        table_name='&tableName'
new   6:        table_name='MAP'
Enter value for st_scn: 604359
Enter value for end_scn: 604368
old   7: AND    commit_scn between &st_scn and &end_scn
new   7: AND    commit_scn between 604359 and 604368
        flashback_transaction_query
        *
ERROR at line 4:

ORA-01031: insufficient privileges
5.2.6.1 권한 오류 발생시 권한부여[편집]
  1. 현재 유저에게 flashback_transction_query 에 대해 권한이 없다.
  2. sys 사용자로 접속하여 " select any transaction " 권한을 부여 한다.
grant select any transaction to scott;

5.2.7 재시도[편집]

select undo_sql
  from flashback_transaction_query
 where table_name='&tableName'
   AND commit_scn between &st_scn and &end_scn
 order by start_timestamp desc

-------------------------------------------------------
update "SCOTT"."MAP" set "NAME" = '배' where ROWID = 'AAAM40AAFAAAAQkAAB';
update "SCOTT"."MAP" set "NAME" = '비행기' where ROWID = 'AAAM40AAFAAAAQkAAC';
delete from "SCOTT"."MAP" where ROWID = 'AAAM40AAFAAAAQkAAB';
delete from "SCOTT"."MAP" where ROWID = 'AAAM40AAFAAAAQkAAC';
delete from "SCOTT"."MAP" where ROWID = 'AAAM40AAFAAAAQkAAA';