Oracle 11g Flashback Data Archive (FDA) Know-how


FDA is a database object that stores historical information in one or more tablespaces and
keeps track of history of one or more tables.

A background process named "FBDA" starts with the database;

 

SQL> select paddr,pserial#,name,description,error
from v$bgprocess
where name = 'FBDA';
>>
PADDR                            PSERIAL#  NAME    DESCRIPTION                                ERROR
------------------------   -----------   -------  ------------------------------------   ----------
000000017768D230   134             FBDA   Flashback Data Archiver Process   0


1. Test Data Preparation

SQL> create table fda_test_tab
(id number(10),
balance number(10),
lastmodified timestamp
) compress;


SQL> insert into fda_test_tab(id,balance,lastmodified)
values(100,0,systimestamp);

SQL> insert into fda_test_tab(id,balance,lastmodified)
values(200,0,systimestamp);

SQL> COMMIT;

SQL> col lastmodified format a30
SQL> select * from fda_test_tab;
>>
ID BALANCE LASTMODIFIED
---------- ---------- ------------------------------
100 0 13-JAN-14 05.39.24.065001 PM
200 0 13-JAN-14 05.39.24.066529 PM

 

2. Create a tablespace to store FDA
-- conn as SYS
-- Create a Bigfile tablespace for flashback data archive:

SQL> create bigfile tablespace LOG_ARCHIVE_TBS
datafile size 1G autoextend on next 100M;


3. Create a Flasback data archive object
SQL> create flashback archive DATA_FBA
tablespace LOG_ARCHIVE_TBS
quota 1G
retention 3 MONTH;


4. alter table to allow flashback archive:
-- conn as SYS
SQL> grant flashback archive on DATA_FBA to testuser;

-- conn as TESTUSER
SQL> col FLASHBACK_ARCHIVE_NAME format a22
SQL> col TABLESPACE_NAME format a20
SQL> col QUOTA_IN_MB format a20
SQL> select * from dba_flashback_archive_ts;
>>
FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# TABLESPACE_NAME QUOTA_IN_MB
---------------------- ------------------ -------------------- --------------------
DATA_FBA 1 LOG_ARCHIVE_TBS 1024


SQL> alter table fda_test_tab flashback archive DATA_FBA;

SQL> col TABLE_NAME format a12
SQL> col OWNER_NAME format a12
SQL> col FLASHBACK_ARCHIVE_NAME format a20
SQL> col ARCHIVE_TABLE_NAME format a20
SQL> col STATUS format a10
SQL> select * from dba_flashback_archive_tables;
>>
TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME STATUS
------------ ------------ ---------------------- -------------------- ----------
FDA_TEST_TAB TESTUSER DATA_FBA SYS_FBA_HIST_91526 ENABLED

 

select owner_name,flashback_archive_name,retention_in_days
from dba_flashback_archive;
OWNER_NAME   FLASHBACK_ARCHIVE_NAME  RETENTION_IN_DAYS
-----------------   ----------------------------------- ----------------------------
SYS                             DATA_FBA                                    90


5. Perform Testing

begin
for i in 1..10 loop
     update fda_test_tab
     set balance=balance+10,lastmodified=systimestamp
     where id = 100;
     dbms_lock.sleep(1); -- suspend for 1 second
     COMMIT;
end loop;
end;
/

SQL> select * from fda_test_tab;

ID              BALANCE     LASTMODIFIED
---------- -------------- -------------------------------------
100            100             13-JAN-14 05.40.34.951210 PM
200                0              13-JAN-14 05.39.24.066529 PM

 

SQL> select id,balance,lastmodified from fda_test_tab
VERSIONS BETWEEN TIMESTAMP
to_timestamp('2014-01-13 17:39:24','yyyy-mm-dd hh24:mi:ss') and
to_timestamp('2014-01-13 17:40:36','yyyy-mm-dd hh24:mi:ss')
where id = 100
order by 3 asc;
>>
ID             BALANCE LASTMODIFIED
---------- ----------  ------------------------------------
100              0             13-JAN-14 05.39.24.065001 PM
100            10            13-JAN-14 05.40.25.937514 PM
100            20            13-JAN-14 05.40.26.938685 PM
100            30            13-JAN-14 05.40.27.940716 PM
100            40            13-JAN-14 05.40.28.942853 PM
100            50            13-JAN-14 05.40.29.944081 PM
100            60            13-JAN-14 05.40.30.945295 PM
100            70            13-JAN-14 05.40.31.946534 PM
100            80            13-JAN-14 05.40.32.947736 PM
100            90            13-JAN-14 05.40.33.950055 PM
100          100            13-JAN-14 05.40.34.951210 PM




SQL> select startscn,endscn,id,balance,lastmodified from SYS_FBA_HIST_91526
order by 5 asc;
>>
STARTSCN  ENDSCN                   ID       BALANCE    LASTMODIFIED
----------    ----------             ---------- ---- ------ ------------------------------
                   21906901                100      0              13-JAN-14 05.39.24.065001 PM
21906901 21906903                100    10              13-JAN-14 05.40.25.937514 PM
21906903 21906906                100    20              13-JAN-14 05.40.26.938685 PM
21906906 21906909                100    30              13-JAN-14 05.40.27.940716 PM
21906909 21906912                100    40              13-JAN-14 05.40.28.942853 PM
21906912 21906915                100    50              13-JAN-14 05.40.29.944081 PM
21906915 21906918                100    60              13-JAN-14 05.40.30.945295 PM
21906918 21906924                100    70              13-JAN-14 05.40.31.946534 PM
21906924 21906930                100    80              13-JAN-14 05.40.32.947736 PM
21906930 21906933                100    90              13-JAN-14 05.40.33.950055 PM

 

** [Note] **

 To disable flashback archive for particular table, using the follow SQL statement:
 (Be caution, once disabled, the archived history data is gone as well)

Connect as SYS or Archive Administrator (who has been granted FLASHBACK ARCHIVE ADMINISTER system privilege)

SQL> alter table testuser.fda_test_tab NO FLASHBACK ARCHIVE;
SQL> select * from dba_flashback_archive_tables;

no rows selected

SQL> alter table testuser.fda_test_tab FLASHBACK ARCHIVE DATA_FBA;

SQL> col TABLE_NAME format a12
SQL> col OWNER_NAME format a12
SQL> col FLASHBACK_ARCHIVE_NAME format a20
SQL> col ARCHIVE_TABLE_NAME format a20
SQL> col STATUS format a10
SQL> select * from dba_flashback_archive_tables;

TABLE_NAME     OWNER_    NAME                      FLASHBACK_ARCHIVE_TABLE_NAME STATUS
-----------------  ------------ -------------------- -----------------------------------------  ----------
FDA_TEST_TAB TESTUSER  DATA_FBA               SYS_FBA_HIST_91526                      ENABLED

SQL> select count(*) from SYS_FBA_HIST_91526;
ERROR at line 1:
ORA-00942: table or view does not exist

=> Because once disabled, the archived history data were lost

 

 

 

arrow
arrow
    全站熱搜

    DanBrother 發表在 痞客邦 留言(0) 人氣()