Simulation is ...

Virtual = Real

Flight Sim 자세히보기

ㆍ Oracle

Oracle FlashBack

FlightSim 2023. 7. 5. 10:37
320x100

FlashBack

오라클 DB 데이터를 매우 빠른 속도로 복구하는 기술이다. 사용자 실수로 인한 데이터 오류, 테이블 삭제, 또는 데이터베이스 전체에 대해 문제가 발생했을 때 매우 빠른 속도로 복구할 수 있다.

FlashBack이 필요한 이유

예를 들어 쇼핑몰을 운영하는 회사에서 인플레이션으로 인해 사장님이 전체 상품에 대해 5% 인상을 이대리에게 요청한다. 이대리는 상품 테이블을 update 명령어로 5% 인상해야 하는데 실수로 50% 인상을 해버렸다.

FlashBack을 사용안하던 과거에는 실수로 상품 table을 삭제했을 때는 EXP/IMP, DATAPUMP, RMAN이 있는데 EXP/IMP, DATAPUMP는 원하는 시점으로 복구하기가 어렵고 RMAN은 가능하지만 데이터 크기가 크면 복구하는데 오래 걸릴 수 있다. 이럴 때 FlashBack table 기능을 이용하면 간단하게 복구할 수 있다.

FRA(Fast Recovery Area)

빠르게 복구할 수 있는 공간을 의미하고 백업 데이터 파일들을 통합 관리하는 기능을 제공한다.

테이블, 데이터 삭제 복구

1. find 명령어로 spfile위치를 확인한다.

find $ORACLE_HOME -name spfile*

2. spfile 백업

cp spfileSTR.ora spfileSTR.ora_20221231

3. UNDO RETENTION 파라미터 변경

-- 1Day = 86400sec
show parameter undo_retention
alter system set undo_retention=86400 scope=spfile;

4. DB 종료, 재시작

-- DB 종료
SHUTDOWN IMMEDIATE
-- DB 시작
STARTUP

5. Test 테이블, 데이터 생성 후 삭제

-- 테이블 생성
CREATE TABLE STR.FRA_TEST
(
  FRA_NO  VARCHAR2(20)
);
-- 데이터 1건 입력
INSERT INTO STR.FRA_TEST VALUES(TO_CHAR(SYSDATE,'YYYYMMDD HH24MISS'));
COMMIT;
-- 데이터 확인
SELECT * FROM STR.FRA_TEST;
-- 테이블 삭제
DROP TABLE STR.FRA_TEST;

6. FLASHBACK을 이용한 테이블 복구

FLASHBACK TABLE username.table_name TO BEFORE DROP;

테이블은 남아있고 데이터만 삭제 복구

1. Test 테이블, 데이터 생성 후 삭제

-- 테이블 생성
CREATE TABLE STR.FRA_TEST
(
  FRA_NO  VARCHAR2(20)
);
-- 데이터 5건 입력
INSERT INTO STR.FRA_TEST VALUES('1');
INSERT INTO STR.FRA_TEST VALUES('2');
INSERT INTO STR.FRA_TEST VALUES('3');
INSERT INTO STR.FRA_TEST VALUES('4');
INSERT INTO STR.FRA_TEST VALUES('5');
COMMIT;
-- INSERT 완료 시간 확인
-- 데이터 복구 할떄는 +10초 정도 여유를 두고 복구를 진행한다. 
SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') AS "COMMIT_TIME" FROM DUAL;
-- 데이터 전체 삭제
DELETE FROM STR.FRA_TEST;
COMMIT;

2. 데이터 복구

-- 데이터 전체 복구
-- (INSERT 완료 시간 확인) 쿼리에 COMMIT_TIME을 확인한다. 
-- 데이터 복구 할떄는 +10초 정도 여유를 두고 복구를 진행한다. (2022/12/19 10:00:00)
INSERT INTO STR.FRA_TEST
SELECT * FROM STR.FRA_TEST
AS OF TIMESTAMP TO_TIMESTAMP('2022/12/19 10:00:00','YYYY/MM/DD HH24:MI:SS');
COMMIT;

부분 데이터 삭제 복구

1. Test 데이터 삭제

-- 부분 데이터 삭제
-- FRA_NO   3   데이터 삭제
DELETE FROM STR.FRA_TEST
WHERE FRA_NO = '3';
COMMIT;

2. 부분 데이터 복구(원본 테이블은 두고 복제 테이블을 만든다.)

-- CTAS를 이용한 FRA_TEST_20221219_1000 테이블 생성 및 데이터 복구
-- (INSERT 완료 시간 확인) 쿼리에 COMMIT_TIME을 확인한다. 
-- 데이터 복구 할떄는 +10초 정도 여유를 두고 복구를 진행한다. (2022/12/19 10:00:00)
CREATE TABLE STR.FRA_TEST_20221219_1000
AS
SELECT * FROM STR.FRA_TEST
AS OF TIMESTAMP TO_TIMESTAMP('2022/12/19 10:00:00','YYYY/MM/DD HH24:MI:SS');

-- 데이터 1건 복구 확인
SELECT * FROM * STR.FRA_TEST;

-- 테이블 삭제
DROP TABLE STR.FRA_TEST_20221219_1000 PURGE;
DROP TABLE STR.FRA_TEST PURGE;

3. 복제 테이블에서 원본 테이블과 빠진 데이터를 확인해서 Insert

-- 데이터 1건 복구 SQL
INSERT INTO STR.FRA_TEST
SELECT FRA_NO
FROM STR.FRA_TEST_20221219_1000
WHERE FRA_NO NOT IN (
	SELECT FRA_NO FROM STR.FRA_TEST);
COMMIT;     

데이터베이스 전체 복구

1. 아카이브 & FRA 디렉터리 생성, root 실행

mkdir /FRA
chown oracle.dba /FRA

ls -ld /FRA

2. FRA 파라미터 변경

-- 1Day = 1440min defualt
show parameter DB_FLASHBACK_RETENTION_TARGET

ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G scope=spfile; -- 용량 설정
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/FRA' scope=spfile; -- 디렉터리 설정

3. DB 종료 후 Mount 상태로 올려야한다.

SHUTDOWN IMMEDIATE
STARTUP MOUNT

4. 아카이브 로그 모드, Flashback 모드로 변경 후 DB Open

ALTER DATABASE ARCHIVELOG;
-- 아카이브 로그 확인
ARCHIVE LOG LIST; 
-- Flashback 모드 변경
ALTER DATABASE FLASHBACK ON;
-- Flashback 모드 확인
SELECT FLASHBACK_ON FROM V$DATABASE;
-- DB OPEN
ALTER DATABASE OPEN;

FRA를 사용하려면 아카이브 로그모드와 FlashBack on이 되어있어야 한다.

5. 아카이브 & Flashback 상태 확인

SELECT NAME, LOG_MODE, FLASHBACK_ON FROM V$DATABASE;

FlashBack이 실행되어 있으면 리눅스에서 RVWR 프로세스가 실행 중이다.

-- Linux 실행 RVWR(Recovery Writer) 프로세스 확인
ps -efl | grep [r]vwr

6. 시작 시간 확인

SELECT
TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') AS "START_TIME" ,
TIMESTAMP_TO_SCN(SYSDATE) AS "SCN"
FROM DUAL;

7. DB mount 상태로 이동 mount 상태에서 복구해야 한다.

STARTUP MOUNT

8. DB 전체 Flashback으로 원하는 시간으로 복구 후 DB를 RESETLOGS로 Open 한다.

-- (시작 시간 확인) 쿼리에 START_TIME을 확인한다. (2022/12/19 10:00:00)
FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2022/12/19 10:00:00','YYYY/MM/DD HH24:MI:SS');
-- DB OPEN
ALTER DATABASE OPEN RESETLOGS;

FRA 관리 방법

1. FRA 디렉터리에 어떤 파일들이 있는지 확인, FRA 디렉터리 사용량 확인할 수 있다.

--  sqlplus / as sysdba 접속
sqlplus / as sysdba
SET LINES 180
COL NAME FOR A20
-- FRA 디렉터리에 어떤 파일들이 있는지 확인, FRA 디렉터리 사용량 확인할 수 있다.
SELECT 
    FILE_TYPE, 
    PERCENT_SPACE_USED, 
    PERCENT_SPACE_RECLAIMABLE, NUMBER_OF_FILES 
FROM V$FLASH_RECOVERY_AREA_USAGE;

SELECT 
    NAME, 
    ROUND(SPACE_LIMIT/1024/1024/1024)   AS "SPACE(GB)",
    ROUND(SPACE_USED/1024/1024/1024,2)  AS "USED(GB)"
FROM V$RECOVERY_FILE_DEST;

백업 파일 삭제

1. Recovery Manager에 접속 후 백업 파일 삭제

-- rman에서 로그 확인 및 백업 파일 삭제
rman target /

REPORT OBSOLETE;
LIST ARCHIVELOG ALL;

CROSSCHECK BACKUP;
CROSSCHECK ARCHIVELOG ALL;

DELETE EXPIRED BACKUP;
DELETE EXPIRED ARCHIVELOG ALL;
DELETE FORCE OBSOLETE;

FRA 원상 복구

1. 파라미터 원복

ALTER SYSTEM RESET UNDO_RETENTION;
ALTER SYSTEM RESET DB_RECOVERY_FILE_DEST_SIZE;
ALTER SYSTEM RESET DB_RECOVERY_FILE_DEST;

2. DB 종료 후 Mount 상태로 Open

-- DB 종료
SHUTDOWN IMMEDIATE
-- DB 시작(Mount 상태)
STARTUP MOUNT

3. Flashback, 아카이브 로그 OFF 후 DB Open

-- Flashback 기능 OFF
ALTER DATABASE FLASHBACK OFF;
-- 아카이브 로그 OFF
ALTER DATABASE NOARCHIVELOG;
-- DB OPEN
ALTER DATABASE OPEN;

4. DB 상태 확인

-- DB 상태 확인
SELECT NAME, LOG_MODE, FLASHBACK_ON FROM V$DATABASE;

5. FRA 디렉터리 삭제

-- root 접속
cd /
rm -rf /FRA

참고

https://www.youtube.com/watch?v=CqqNRKaVwqg 

 
1. Flashback 개요
  가. 개요 : 사용자의 논리적인 장애(DDL, DML)를 빠르게 복구해내는 방법, undo segment 사용
  나. 종류
    - Row Level Flashback : 특정 row만 과거시점으로 되돌리는 기능, commit된 데이터만 flashback 할 수 있음
    - Table Level Flashback : 특정 table만 과거시점으로 되될리는 기능
    - Database Level Falshback : 데이터베이스 전체를 특정 시점으로 되돌리는 기능, 불완전 복구와 유사한 기능

 

2. Flashback을 사용하기 위한 요구조건

  자동 언두 관리 시스템을 사용해야 합니다. (UNDO_MANAGEMENT 파라미터를 AUTO로 설정)
    - UNDO_MANAGEMENT = AUTO

  이전의 어느 시점까지의 언두(UNDO)정보를 보유하여 Flashback Query를 수행할것인지 UNDO_RETENTION 파라미터를 설정해야 합니다.
    - ALTER SYSTEM SET UNDO_RETENTION=1800

  일반사용자가 Flashback 기능을 이용하기 위해서 DBMS_FLASHBACK 패키지에 대한 EXECUTE권한이 있어야 합니다.

3. Flashback 사용하기

  Flashback의 사용 방법은 과거시점의 특정 시간으로 사용하는 방법과 SCN(System Change Number)을 사용하는 방법이 있습니다.

  과거시점의 시간 사용DBMS_FLASHBACK.ENABLE_AT_TIME(query_time IN TIMESTAMP);

  SCN 사용 : DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(query_scn IN NUMBER);

  과거시점의 시간을 지정하여 Flashback 기능을 사용 할 경우 오라클은 내부적으로 이를 SCN으로 전환하여 처리 합니다. 

  시간 정보를 SCN으로 Mapping하는 시간이 필요한데 통상 5분 주기로 이루어 집니다. 

  따라서, 시간으로 지정할때는 현재보다 5분이상 차이가 나는 과거시점을 지정해야 합니다.

  또한 Flashback 기능은 무한대로 이전의 데이터를 조회할 수 있는 기능이 아니고, 

  관리자가 UNDO_RETENTION 파라미터를 통해서 정해준 시간(초) 동안의 데이터를 조회할 수 있습니다. 

  디폴트 UNDO_RETENTION 시간은 10800(3시간) 입니다.

  그리고 Flashback data를 참고하는 경우엔 DML, DDL등의 작업을 직접 수행 할 수 없습니다.

4. Flashback 사용을 위한 환경설정

 

 
C:\> SQLPLUS /NOLOG
 
 
-- SYSDBA 권한으로 접속
SQL> CONN / AS SYSDBA
 
 
-- UNDO MANAGEMENT MODE 확인
SQL> SHOW PARAMETER UNDO;
NAME                        TYPE        VALUE
--------------------------- ----------- ---------
undo_management             string       AUTO
undo_retention              integer      10800
undo_suppress_errors        boolean      FALSE
undo_tablespace             string       UNDOTBS1
 
   
-- undo_management가 MANUAL로 되어있을경우 아래와 같이 변경하고 
-- UNDO 테이블스페이스를 생성하고 지정합니다..
SQL> ALTER SYSTEM SET UNDO_MANAGEMENT = AUTO
     SCOPE=SPFILE;
 
 
-- UNDO 테이블 스페이스 생성
SQL> CREATE UNDO TABLESPACE UNDOTBS2
     DATAFILE 'D:\oracle\oradata\oracle\UNDOTBS2.dbf' 
     SIZE 1000M;
 
 
-- UNDO 테이블 스페이스 지정
SQL> ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS2
 
 
-- UNDO_RETENTION 시간을 변경하시면 
-- 실제 적용을 위해 5분정도 기다려야 합니다.
SQL> ALTER SYSTEM SET UNDO_RETENTION=1800
 
 
-- scott유저에게 DBMS_FLASHBACK EXEUCTE 권한 부여 
SQL> GRANT EXECUTE ON DBMS_FLASHBACK TO SCOTT;  
    
 

 

[예제] 


1. Row Level Flashback 예제

1
2
3
4
5
6
7
8
9
10
select versions_startscn startscn, verstions_endscn endscn,
versions_xid, versions_operation operation, 컬럼명
from 테이블명 versions between scn minvalue and maxvalue
where 조건내용;
 
select undo_sql
from flashback_transaction_query
where talbe_name='테이블이름'
and commit_scn between 시작scn and 종료scn
order by start_timestamp desc;

    

    update 수행 오류 복구하기

 

    1)  update 수행

    2)  flashback 이력 조회

         TXID = 7co4de.....  opt = U 에 해당정보에 대한 데이터는 갱신된 결과이다.

         - ENDSCN 에 해당되는 row의 데이터가 이전 데이터이다.

         - 원복은 해당 table에 대한 unique key 값을 조건으로 하여 이전 데이터 형태로 갱신한다.  

 


    



2. Table Level Flashback 예제
  가. scn 번호로 flashback

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
conn / as sysdba
 
grant dba to scott;
 
conn scott/tiger
 
create table test01 (no number);
 
insert into test01 values (1);
 
commit;
 
insert into test01 values (2);
 
commit;
 
insert into test01 values (3);
 
commit;
 
select * from test01;
 
-- 현재 scn 메모
select current_scn from v$database;
 
-- 잘못된 업데이트 문장 수행
update test01 set no=10;
 
commit;
 
select * from test01;
 
-- 앞서 scn 메모한 곳으로 flashback
flashback table test01 to scn 'scn번호';
 
alter table test01 enable row movement;
 
flashback table test01 to scn 'scn번호';
 
select * from test01;



  나. timestamp로 flashback

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
conn scott/tiger
 
create table test02 (no number(3));
 
insert into test02 values (1);
 
commit;
 
insert into test02 values (2);
 
commit;
 
insert into test02 values (3);
 
commit;
 
select * from test02;
 
-- 잘못된 업데이트 문장 수행
update test02 set no=10;
 
commit;
 
select * from test02;
 
-- 5분전으로 flashback
flashback table test02 to timestamp (systimestamp - interval '5' minute);
 
alter table test02 enable row movement;
 
-- 테이블이 생성되기 이전시점이라서 오류발생
flashback table test02 to timestamp (systimestamp - interval '5' minute);
                *
ERROR at line 1:
ORA-01466: unable to read data - table definition has changed
 
-- 1분전으로 flashback
flashback table test02 to timestamp (systimestamp - interval '1' minute);
 
-- 원하는 데이터가 아님
select * from test02;
 
        NO
----------
        10
        10
        10
 
-- 200초 이전으로 되돌아감
flashback table test02 to timestamp (systimestamp - interval '200' second);
 
-- 원하는 데이터 발견
select * from test02;
 
        NO
----------
         1
         2
         3



  다. drop 된 테이블 복구

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
conn scott/tiger
 
-- 테이블 생성
create table test01 (no number);
 
desc test01
 
-- 테이블 삭제
drop table test01;
 
select * from test01;
 
-- 테이블 복구
flashback table test01 to before drop;
 
select * from test01;
 
-- 테이블 완전 삭제
drop table test01 purge;
 
-- 테이블 생성
create table test02 (no number);
 
-- 테이블 삭제
drop table test02;
 
-- 휴지통 확인
 show recyclebin;
 
-- 테이블 확인(BIN$ 로 시작하는 테이블 존재 확인가능)
select * from tab;
 
-- 휴지통에서 원하는 테이블만 삭제
purge table test02;
 
-- 휴지통에서 삭제됐는지 확인
show recyclebin
 
-- 휴지통에 있는 모든 테이블 삭제
purge recyclebin;
 
-- 휴지통 확인
show recyclebin
 
-- 현재 세션에서 휴지통 기능 비활성화
alter session set recyclebin=off;

 

참고 : 휴지통(recyclebin)은 사용자마다 할당되며, 다른사용자의 휴지통은 접근 할 수 없다.

  라. foreign key 제약조건(consraint)으로 묶인 테이블의 삭제 및 복구
     foreign key로 묶인 테이블을 drop 후 flashback 하게 되면, 수동으로 다시 제약조건을 생성해 줘야 한다.



4. Database Level Flashback 예제


  가. 필요시점
    - truncate table 장애 복구 시
    - 특정 시점으로 전체 데이터베이스 되돌릴 때
  나. 전통방식의 백업/복구와의 비교
    - 전통방식에 비해 복구 속도가 빠름(datafile을 restore 하는 과정이 없음)
    - 전통방식이 백업데이터, archivelog, redolog 파일을 이용하지만, flashback는 flashback log 사용
    - 전통방식의 복구의 경우 특정시점으로 복구하였으나 원하는 결과가 나타나지 않아 다른시점으로 변경해야 하는 경우 모든 작업을 처음부터 다시해줘야 했으나, flashback 방식은 언제라도 원하는 시점으로 되돌아 갈 수 있음  
  다. 사전 환경설정
    - parameter 파일에 db_flashback_retention_target 설정
    - mount 단계에서 flashback on 설정

$ vi $ORACLE_HOME/dbs/inittest.ora

db_flashback_retention_target=30

 

1
2
3
4
5
6
7
8
9
startup mount
 
alter database archivelog;
 
alter database flashback on;
 
select flashback_on from v$database;
 
alter database open;



  라. truncate table 된 데이터 복구

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
conn scott/tiger
 
create table test03 (no number);
 
insert into test03 values (1);
 
commit;
 
insert into test03 values (2);
 
commit;
 
insert into test03 values (3);
 
commit;
 
select * from test03;
 
-- 잘못된 truncate 명령어 발생
truncate table test03;
 
select * from test03;
 
-- 복구시작
conn /as sysdba
 
shutdown immediate
 
startup mount
 
flashback database to timestamp (systimestamp - interval '5' minute);
 
alter database open;
 
alter database open resetlogs;
 
select * from scott.test03;
 
-- 원하는 데이터가 없어 다른 시점으로 재시도
shutdown immediate;
 
startup mount
 
flashback database to timestamp (systimestamp - interval '10' minute);
 
alter database open resetlogs;
 
select * from scott.test03;



  마. 업데이트를 통한 복구

1
2
3
4
5
6
7
8
9
10
11
-- 업데이트 전 시간을 지정하여 변경 전 데이터를 확인
SELECT *
  FROM TABLE_NAME
       VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2015-02-25 16:10:00', 'YYYY-MM-DD HH24:MI:SS')
                              AND TO_TIMESTAMP('2015-02-25 16:11:00', 'YYYY-MM-DD HH24:MI:SS')
 WHERE ID = 'test';
 
-- 변경 전 데이터로 업데이트
UPDATE TABLE_NAME
      SET COL1= '변경전 데이터'
 WHERE ID = 'test';

 

참고 :Flashback Data Archive
11g의 새로운 기능으로 Undo segment의 commit 데이터를 특정 테이블스페이스에 archive한다. 
10g이하 버전에서는 다른사용자에 의해 undo segment가 덮어 쓰여지면 flashback 할 수 없는 상황이 발생하였으나, 11g에서는 이 기능을 통해 undo segment가 덮어 쓰여지기전 해당 undo segment를 별도의 파일에 archive 함으로써, 복구를 원하는 시점으로 데이터를 flashback 할 수 있게 되었다.

 

 

 


***. 추가정보***

The following script creates a new tablespace, then creates two flashback data archives using the CREATE FLASHBACK ARCHIVE command. The first is limited in size to 10Gig with a retention period of 1 year, while the second has an unlimited quota and a retention period of 2 years.

CREATE TABLESPACE fda_ts
  DATAFILE '/u01/app/oracle/oradata/DB11G/fda1_01.dbf'
  SIZE 1M AUTOEXTEND ON NEXT 1M;

CREATE FLASHBACK ARCHIVE DEFAULT fda_1year TABLESPACE fda_ts
  QUOTA 10G RETENTION 1 YEAR;

CREATE FLASHBACK ARCHIVE fda_2year TABLESPACE fda_ts
  RETENTION 2 YEAR;

Management of flashback archives falls into three distinct categories.

  • Tablespace management.
    -- Set as default FBA
    ALTER FLASHBACK ARCHIVE fba_name SET DEFAULT;
    
    -- Add up to 10G of the specified tablespace to the specified flashback archive.
    ALTER FLASHBACK ARCHIVE fba_name ADD TABLESPACE ts_name QUOTA 10G;
    
    -- Add an unlimited quota of the specified tablespace to the specified flashback archive.
    ALTER FLASHBACK ARCHIVE fba_name ADD TABLESPACE ts_name;
    
    -- Change the tablespace quota to 20G.
    ALTER FLASHBACK ARCHIVE fba_name MODIFY TABLESPACE ts_name QUOTA 20G;
    
    -- Change the tablespace quota to unlimited.
    ALTER FLASHBACK ARCHIVE fba_name MODIFY TABLESPACE ts_name;
    
    -- Remove the specified tablespace from the archive.
    ALTER FLASHBACK ARCHIVE fba_name REMOVE TABLESPACE ts_name;
  • Modifying the retention period.
    ALTER FLASHBACK ARCHIVE fba_name MODIFY RETENTION 2 YEAR;
  • Purging data.
    -- Remove all historical data.
    ALTER FLASHBACK ARCHIVE fba_name PURGE ALL;
    
    -- Remove all data before the specified time.
    ALTER FLASHBACK ARCHIVE fba_name PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
    
    -- Remove all data before the specified SCN.
    ALTER FLASHBACK ARCHIVE fba_name PURGE BEFORE SCN 728969;

Archives are removed using the DROP FLASHBACK ARCHIVE command, which drops the archive and all its historical data, but doesn't drop the associated tablespace.

DROP FLASHBACK ARCHIVE fba_name;

To enable flashback archiving on a specific table the user must have the FLASHBACK ARCHIVE object privilege on the specific flashback archive used. To try this out create a test user and grant the object privilege on the first flashback archive created earlier.

CONN sys/password AS SYSDBA

CREATE USER fda_test_user IDENTIFIED BY fda_test_user QUOTA UNLIMITED ON users;

GRANT CONNECT, CREATE TABLE TO fda_test_user;
GRANT FLASHBACK ARCHIVE ON fda_1year TO fda_test_user;

If we connect to the test user we are able to create a table and associate it with the default flashback archive as follows.

CONN fda_test_user/fda_test_user

CREATE TABLE test_tab_1 (
  id          NUMBER,
  desription  VARCHAR2(50),
  CONSTRAINT test_tab_1_pk PRIMARY KEY (id)
)
FLASHBACK ARCHIVE;

If we try to create a similar table, but point it at the second archive it fails, as we have no privileges on it.

CONN fda_test_user/fda_test_user

CREATE TABLE test_tab_2 (
  id          NUMBER,
  desription  VARCHAR2(50),
  CONSTRAINT test_tab_2_pk PRIMARY KEY (id)
)
FLASHBACK ARCHIVE fda_2year;
CREATE TABLE test_tab_2 (
*
ERROR at line 1:
ORA-55620: No privilege to use Flashback Archive


SQL>

The ALTER TABLE command allows existing tables to have flashback archiving switched on or off.

-- Enable using the default FBDA.
ALTER TABLE table_name FLASHBACK ARCHIVE;

-- Enable using specific FBDA.
ALTER TABLE table_name FLASHBACK ARCHIVE fda_name;

-- Disable flashback archiving.
ALTER TABLE table_name NO FLASHBACK ARCHIVE;
 

 

320x100
반응형