행위

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

DB CAFE

(새 문서: == FlashBack == == 개요 == {{:FLASHBACK DATABASE LEVEL}} {{:FLASHBACK TABLE LEVEL}} {{:Flashback row level|FLASHBACK ROW LEVEL}})
 
(개요)
 
(같은 사용자의 중간 판 3개는 보이지 않습니다)
1번째 줄: 1번째 줄:
 
== FlashBack ==
 
== FlashBack ==
 
== 개요 ==
 
== 개요 ==
 +
=== FLASHBACK 사용 조건 ===
 +
==== SHOW PARAMETER UNDO ====
 +
<source lang=sql>
 +
NAME            TYPE    VALUE
 +
--------------- ------- --------
 +
undo_management string  AUTO
 +
undo_retention  integer 900
 +
undo_tablespace string  UNDOTBS1
 +
</source>
 +
 +
===== UNDO_MANAGEMENT =====
 +
* 테이타베이스의 Undo 모드를 자동 모드로 사용 할지 수동 모드를 사용할지 여부
 +
** AUTO 설정 시 데이터베이스는 자동 Undo 관리 모드로 설정됨
 +
 +
===== UNDO_RETENTION =====
 +
* 일관성 읽기를 위해 제공되는 Undo 데이터 보관기간 결정
 +
* ALTER SYSTEM 명령을 사용하여 동적으로 수정 가능
 +
* 기본값은 900초, Undo 데이타를 15분 동안 보관
 +
* flashback query는 undo_retention 범위 안에서 유효
 +
 +
===== UNDO_TABLESPACE =====
 +
* 최소한 하나의 UNDO 테이블 스페이스 필요
 +
* ALTER SYSYTEM 명령 으로 동적으로 변경
 +
 +
==== V$VERSION ====
 +
* oracle enterprise 버전만 가능
 +
<source lang=sql>
 +
ORA-00439: feature not enabled: Flashback Table 에러 발생
 +
</source>
 +
 +
 +
* 오라클 레퍼런스 참조 (https://www.oracle.com/database/technologies/flashback/)
 +
 +
=== 오라클 플래시백 기능 ===
 +
==== 논리적 플래시백 기능 ====
 +
# 오라클 데이터베이스의 논리적 수준의 플래시백 기능은 RMAN에 의존하지 않으며 RMAN이 백업 전략의 일부인지 여부에 관계없이 사용할 수 있음
 +
# 오라클의 대부분의 플래시백 기능은 논리적 수준에서 작동하여 데이터베이스 객체를 보고 조작할 수 있음
 +
#: 오라클 flashback drop 을 제외하고, 논리적 플래시백 기능은 각 데이터베이스 업데이트의 효과와 업데이트에서 덮어쓴 값에 대한 기록인 undo data 에 의존함
 +
 +
* Oracle Flashback Query
 +
# 타겟시간(복구할 시간대 구간)을 지정하고 데이터베이스에 대한 쿼리를 실행하여 목표 시간에 나타나는 결과를 볼 수 있음
 +
# 테이블 업데이트와 같은 원치 않는 변경사항을 이전 상태로 복구하려면  타겟시간(복구할 시간대 구간) 을 선택하고 쿼리를 실행하여 변경 전 행의 내용을 검색할 수 있음
 +
 +
 +
* Oracle Flashback Version Query
 +
# 지정한 time interval(시간 간격) 으로 하나 이상의 테이블에 존재했던 모든 행의 모든 버전을 볼 수 있음
 +
# 또한 버전을 만든 거래의 시작 및 종료 시간, 작업 및 트랜잭션 ID를 포함하여 다른 버전의 행에 대한 메타데이터를 검색할 수 있음
 +
 +
* Oracle Flashback Transaction Query
 +
# 단일 transaction 또는 특정 기간 동안의 모든 transaction으로 인한 변경 사항을 볼 수 있음
 +
 +
* Oracle Flashback Transaction
 +
# transaction을 원상복구 할수 있음
 +
# 오라클 데이터베이스는 트랜잭션 간의 종속성을 결정하고 원하지 않았던 변경을 되돌리는 compensating transaction(보상 트랜잭션) 을 만듦.
 +
 +
* Oracle Flashback Table
 +
# 데이터베이스의 일부를 오프라인으로 전환하지 않고도 테이블이나 테이블 세트를 지정된 시점으로 복구할 수 있음
 +
# 대부분의 경우, 플래시백 테이블은 더 복잡한 시점 복구 작업을 수행할 필요가 없다.
 +
# 플래시백 테이블은 현재 인덱스, 트리거 및 제약 조건과 같은 관련 속성을 자동으로 유지하면서 테이블을 복원하며, 이러한 방식으로 데이터베이스별 속성을 찾고 복원하는 것을 피할 수 있음. "Rewinding a Table with Flashback Table"는 이 기능을 사용하는 방법을 설명합니다.
 +
 +
You can recover a table or set of tables to a specified point in time earlier without taking any part of the database offline. In many cases, Flashback Table eliminates the need to perform more complicated point-in-time recovery operations. Flashback Table restores tables while automatically maintaining associated attributes such as current indexes, triggers, and constraints, and in this way enabling you to avoid finding and restoring database-specific properties. "Rewinding a Table with Flashback Table" explains how to use this feature.
 +
 +
* Oracle Flashback Drop
 +
 +
You can reverse the effects of a DROP TABLE statement. "Rewinding a DROP TABLE Operation with Flashback Drop" explains how to use this feature.
 +
 +
==== 플래시백 데이터베이스 ====
 +
#
 +
 
{{: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년 6월 25일 (화) 18:45 기준 최신판

thumb_up 추천메뉴 바로가기


1 FlashBack[편집]

2 개요[편집]

2.1 FLASHBACK 사용 조건[편집]

2.1.1 SHOW PARAMETER UNDO[편집]

NAME            TYPE    VALUE
--------------- ------- --------
undo_management string  AUTO
undo_retention  integer 900
undo_tablespace string  UNDOTBS1
2.1.1.1 UNDO_MANAGEMENT[편집]
  • 테이타베이스의 Undo 모드를 자동 모드로 사용 할지 수동 모드를 사용할지 여부
    • AUTO 설정 시 데이터베이스는 자동 Undo 관리 모드로 설정됨
2.1.1.2 UNDO_RETENTION[편집]
  • 일관성 읽기를 위해 제공되는 Undo 데이터 보관기간 결정
  • ALTER SYSTEM 명령을 사용하여 동적으로 수정 가능
  • 기본값은 900초, Undo 데이타를 15분 동안 보관
  • flashback query는 undo_retention 범위 안에서 유효
2.1.1.3 UNDO_TABLESPACE[편집]
  • 최소한 하나의 UNDO 테이블 스페이스 필요
  • ALTER SYSYTEM 명령 으로 동적으로 변경

2.1.2 V$VERSION[편집]

  • oracle enterprise 버전만 가능
ORA-00439: feature not enabled: Flashback Table 에러 발생


2.2 오라클 플래시백 기능[편집]

2.2.1 논리적 플래시백 기능[편집]

  1. 오라클 데이터베이스의 논리적 수준의 플래시백 기능은 RMAN에 의존하지 않으며 RMAN이 백업 전략의 일부인지 여부에 관계없이 사용할 수 있음
  2. 오라클의 대부분의 플래시백 기능은 논리적 수준에서 작동하여 데이터베이스 객체를 보고 조작할 수 있음
    오라클 flashback drop 을 제외하고, 논리적 플래시백 기능은 각 데이터베이스 업데이트의 효과와 업데이트에서 덮어쓴 값에 대한 기록인 undo data 에 의존함
  • Oracle Flashback Query
  1. 타겟시간(복구할 시간대 구간)을 지정하고 데이터베이스에 대한 쿼리를 실행하여 목표 시간에 나타나는 결과를 볼 수 있음
  2. 테이블 업데이트와 같은 원치 않는 변경사항을 이전 상태로 복구하려면 타겟시간(복구할 시간대 구간) 을 선택하고 쿼리를 실행하여 변경 전 행의 내용을 검색할 수 있음


  • Oracle Flashback Version Query
  1. 지정한 time interval(시간 간격) 으로 하나 이상의 테이블에 존재했던 모든 행의 모든 버전을 볼 수 있음
  2. 또한 버전을 만든 거래의 시작 및 종료 시간, 작업 및 트랜잭션 ID를 포함하여 다른 버전의 행에 대한 메타데이터를 검색할 수 있음
  • Oracle Flashback Transaction Query
  1. 단일 transaction 또는 특정 기간 동안의 모든 transaction으로 인한 변경 사항을 볼 수 있음
  • Oracle Flashback Transaction
  1. transaction을 원상복구 할수 있음
  2. 오라클 데이터베이스는 트랜잭션 간의 종속성을 결정하고 원하지 않았던 변경을 되돌리는 compensating transaction(보상 트랜잭션) 을 만듦.
  • Oracle Flashback Table
  1. 데이터베이스의 일부를 오프라인으로 전환하지 않고도 테이블이나 테이블 세트를 지정된 시점으로 복구할 수 있음
  2. 대부분의 경우, 플래시백 테이블은 더 복잡한 시점 복구 작업을 수행할 필요가 없다.
  3. 플래시백 테이블은 현재 인덱스, 트리거 및 제약 조건과 같은 관련 속성을 자동으로 유지하면서 테이블을 복원하며, 이러한 방식으로 데이터베이스별 속성을 찾고 복원하는 것을 피할 수 있음. "Rewinding a Table with Flashback Table"는 이 기능을 사용하는 방법을 설명합니다.

You can recover a table or set of tables to a specified point in time earlier without taking any part of the database offline. In many cases, Flashback Table eliminates the need to perform more complicated point-in-time recovery operations. Flashback Table restores tables while automatically maintaining associated attributes such as current indexes, triggers, and constraints, and in this way enabling you to avoid finding and restoring database-specific properties. "Rewinding a Table with Flashback Table" explains how to use this feature.

  • Oracle Flashback Drop

You can reverse the effects of a DROP TABLE statement. "Rewinding a DROP TABLE Operation with Flashback Drop" explains how to use this feature.

2.2.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';