Flashback Data Archive (FDA) Enhancements in Oracle Database 12c Release 1 (12.1)
Check out the latest enhancements to flashback data archive (FDA) in Oracle Database 12c Release 1 (12.1).
oracle 12cconfigurationintermediate
by OracleDba
15 views
Check out the latest enhancements to flashback data archive (FDA) in Oracle Database 12c Release 1 (12.1).
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
CONN sys@pdb1 AS SYSDBA
CREATE TABLESPACE fda_ts DATAFILE SIZE 1M AUTOEXTEND ON NEXT 1M;
ALTER USER test QUOTA UNLIMITED ON fda_ts;
CREATE FLASHBACK ARCHIVE DEFAULT fda_1year TABLESPACE fda_ts
QUOTA 10G RETENTION 1 YEAR;
GRANT FLASHBACK ARCHIVE ON fda_1year TO test;
GRANT FLASHBACK ARCHIVE ADMINISTER TO test;
GRANT EXECUTE ON DBMS_FLASHBACK_ARCHIVE TO test;
GRANT CREATE ANY CONTEXT TO test;
SET LINESIZE 150
COLUMN owner_name FORMAT A20
COLUMN flashback_archive_name FORMAT A22
COLUMN create_time FORMAT A20
COLUMN last_purge_time FORMAT A20
SELECT owner_name,
flashback_archive_name,
flashback_archive#,
retention_in_days,
TO_CHAR(create_time, 'DD-MON-YYYY HH24:MI:SS') AS create_time,
TO_CHAR(last_purge_time, 'DD-MON-YYYY HH24:MI:SS') AS last_purge_time,
status
FROM dba_flashback_archive
ORDER BY owner_name, flashback_archive_name;
OWNER_NAME FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# RETENTION_IN_DAYS CREATE_TIME LAST_PURGE_TIME STATUS
-------------------- ---------------------- ------------------ ----------------- -------------------- -------------------- -------
SYS FDA_1YEAR 1 365 06-JAN-2015 19:30:57 06-JAN-2015 19:30:57 DEFAULT
SQL>
SET LINESIZE 150
COLUMN flashback_archive_name FORMAT A22
COLUMN tablespace_name FORMAT A20
COLUMN quota_in_mb FORMAT A11
SELECT flashback_archive_name,
flashback_archive#,
tablespace_name,
quota_in_mb
FROM dba_flashback_archive_ts
ORDER BY flashback_archive_name;
FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# TABLESPACE_NAME QUOTA_IN_MB
---------------------- ------------------ -------------------- -----------
FDA_1YEAR 1 FDA_TS 10240
SQL>
CONN test/test@pdb1
DROP TABLE tab1 PURGE;
CREATE TABLE tab1 (
id NUMBER,
description VARCHAR2(50),
CONSTRAINT tab_1_pk PRIMARY KEY (id)
) FLASHBACK ARCHIVE fda_1year;
-- Use ALTER TABLE to associate an existing table.
-- ALTER TABLE tab1 FLASHBACK ARCHIVE fda_1year;
SET LINESIZE 150
COLUMN owner_name FORMAT A20
COLUMN table_name FORMAT A20
COLUMN flashback_archive_name FORMAT A22
COLUMN archive_table_name FORMAT A20
SELECT owner_name,
table_name,
flashback_archive_name,
archive_table_name,
status
FROM dba_flashback_archive_tables
ORDER BY owner_name, table_name;
OWNER_NAME TABLE_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME STATUS
-------------------- -------------------- ---------------------- -------------------- -------------
TEST TAB1 FDA_1YEAR SYS_FBA_HIST_95999 ENABLED
SQL>
CONN sys@pdb1 AS SYSDBA
EXEC DBMS_FLASHBACK_ARCHIVE.set_context_level('ALL');
CONN test/test@pdb1
CREATE OR REPLACE CONTEXT test_context USING test_ctx_api;
CREATE OR REPLACE PACKAGE test_ctx_api AS
PROCEDURE set_value (p_name IN VARCHAR2,
p_value IN VARCHAR2);
END test_ctx_api;
/
CREATE OR REPLACE PACKAGE BODY test_ctx_api AS
PROCEDURE set_value (p_name IN VARCHAR2,
p_value IN VARCHAR2) AS
BEGIN
DBMS_SESSION.set_context('test_context', LOWER(p_name), p_value);
END;
END test_ctx_api;
/
CONN test/test@pdb1
EXEC DBMS_SESSION.set_identifier('Peter Pan');
EXEC test.test_ctx_api.set_value('my_attribute','First Action');
INSERT INTO tab1 VALUES (1, 'ONE');
COMMIT;
EXEC DBMS_SESSION.set_identifier('Peter Parker');
EXEC test_ctx_api.set_value('my_attribute','Second Action');
UPDATE tab1
SET description = 'TWO'
WHERE id = 1;
COMMIT;
EXEC DBMS_SESSION.set_identifier('Peter Rabbit');
EXEC test_ctx_api.set_value('my_attribute','Third Action');
UPDATE tab1
SET description = 'THREE'
WHERE id = 1;
COMMIT;
CONN test/test@pdb1
COLUMN versions_startscn FORMAT 99999999999999999
COLUMN versions_starttime FORMAT A24
COLUMN versions_endscn FORMAT 99999999999999999
COLUMN versions_endtime FORMAT A24
COLUMN versions_xid FORMAT A16
COLUMN versions_operation FORMAT A1
COLUMN description FORMAT A11
COLUMN session_user FORMAT A20
COLUMN client_identifier FORMAT A20
COLUMN my_attribute FORMAT A20
SET LINESIZE 200
SELECT versions_startscn,
--versions_starttime,
versions_endscn,
--versions_endtime,
versions_xid,
versions_operation,
description,
DBMS_FLASHBACK_ARCHIVE.get_sys_context(versions_xid, 'USERENV','SESSION_USER') AS session_user,
DBMS_FLASHBACK_ARCHIVE.get_sys_context(versions_xid, 'USERENV','CLIENT_IDENTIFIER') AS client_identifier,
DBMS_FLASHBACK_ARCHIVE.get_sys_context(versions_xid, 'test_context','my_attribute') AS my_attribute
FROM tab1
VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP-(1/24/60) AND SYSTIMESTAMP
WHERE id = 1
ORDER BY versions_startscn;
VERSIONS_STARTSCN VERSIONS_ENDSCN VERSIONS_XID V DESCRIPTION SESSION_USER CLIENT_IDENTIFIER MY_ATTRIBUTE
------------------ ------------------ ---------------- - ----------- -------------------- -------------------- --------------------
2536699 2536792 060010000B0A0000 I ONE TEST Peter Pan First Action
2536792 2536826 0A00110076060000 U TWO TEST Peter Parker Second Action
2536826 020003005B080000 U THREE TEST Peter Rabbit Third Action
SQL>
CONN sys@pdb1 AS SYSDBA
ALTER TABLE test.tab1 NO FLASHBACK ARCHIVE;
DROP TABLE test.tab1 PURGE;1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
SET LINESIZE 150
COLUMN owner_name FORMAT A20
COLUMN table_name FORMAT A20
COLUMN flashback_archive_name FORMAT A22
COLUMN archive_table_name FORMAT A20
SELECT owner_name,
table_name,
flashback_archive_name,
archive_table_name,
status
FROM dba_flashback_archive_tables
ORDER BY owner_name, table_name;
OWNER_NAME TABLE_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME STATUS
-------------------- -------------------- ---------------------- -------------------- -------------
TEST TAB1 FDA_1YEAR SYS_FBA_HIST_77672 ENABLED
SQL>
CONN test/test@pdb1
BEGIN
DBMS_FLASHBACK_ARCHIVE.create_temp_history_table(
owner_name1 => 'TEST',
table_name1 => 'TAB1');
END;
/
DESC temp_history
Name Null? Type
----------------------------------------------------- -------- ------------------------------------
RID VARCHAR2(4000)
STARTSCN NUMBER
ENDSCN NUMBER
XID RAW(8)
OPERATION VARCHAR2(1)
ID NUMBER
DESCRIPTION VARCHAR2(50)
SQL>
INSERT /*+ APPEND */ INTO temp_history
SELECT * FROM SYS_FBA_HIST_77672;
COMMIT;
BEGIN
DBMS_FLASHBACK_ARCHIVE.import_history (
owner_name1 => 'TEST',
table_name1 => 'TAB1',
temp_history_name => 'TEMP_HISTORY', -- Default Setting.
options => DBMS_FLASHBACK_ARCHIVE.NODELETE); -- Allowable values: NODROP, NOCOMMIT, NODELETE
END;
/123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
CONN test/test@pdb1
CREATE TABLE app_tab1 AS
SELECT level AS id,
'Description for ' || level AS description
FROM dual
CONNECT BY level <= 5;
ALTER TABLE app_tab1 ADD CONSTRAINT app_tab1_pk PRIMARY KEY (id);
CREATE TABLE app_tab2 AS
SELECT level AS id,
'Description for ' || level AS description
FROM dual
CONNECT BY level <= 5;
ALTER TABLE app_tab2 ADD CONSTRAINT app_tab2_pk PRIMARY KEY (id);
CONN test/test@pdb1
BEGIN
DBMS_FLASHBACK_ARCHIVE.register_application(
application_name => 'MY_APP',
flashback_archive_name => 'FDA_1YEAR');
END;
/
CONN sys@pdb1 AS SYSDBA
COLUMN appname FORMAT A20
COLUMN faname FORMAT A20
SELECT a.appname,
b.faname
FROM sys_fba_app a
JOIN sys_fba_fa b ON a.fa# = b.fa#;
APPNAME FANAME
-------------------- --------------------
MY_APP FDA_1YEAR
SQL>
CONN test/test@pdb1
BEGIN
DBMS_FLASHBACK_ARCHIVE.add_table_to_application (
application_name => 'MY_APP',
table_name => 'APP_TAB1',
schema_name => 'TEST');
DBMS_FLASHBACK_ARCHIVE.add_table_to_application (
application_name => 'MY_APP',
table_name => 'APP_TAB2',
schema_name => 'TEST');
END;
/
CONN sys@pdb1 AS SYSDBA
COLUMN appname FORMAT A20
COLUMN table_owner FORMAT A20
COLUMN table_name FORMAT A20
SELECT a.appname,
c.owner AS table_owner,
c.object_name As table_name
FROM sys_fba_app a
JOIN sys_fba_app_tables b ON a.app# = b.app#
JOIN dba_objects c ON b.obj# = c.object_id
ORDER BY 1,2,3;
APPNAME TABLE_OWNER TABLE_NAME
-------------------- -------------------- --------------------
MY_APP TEST APP_TAB1
MY_APP TEST APP_TAB2
SQL>
CONN test/test@pdb1
SET LINESIZE 150
COLUMN owner_name FORMAT A20
COLUMN table_name FORMAT A20
COLUMN flashback_archive_name FORMAT A22
COLUMN archive_table_name FORMAT A20
SELECT owner_name,
table_name,
flashback_archive_name,
archive_table_name,
status
FROM dba_flashback_archive_tables
WHERE table_name LIKE 'APP_TAB%'
ORDER BY owner_name, table_name;
no rows selected
SQL>
CONN test/test@pdb1
BEGIN
DBMS_FLASHBACK_ARCHIVE.enable_application(
application_name => 'MY_APP');
END;
/
SET LINESIZE 150
COLUMN owner_name FORMAT A20
COLUMN table_name FORMAT A20
COLUMN flashback_archive_name FORMAT A22
COLUMN archive_table_name FORMAT A20
SELECT owner_name,
table_name,
flashback_archive_name,
archive_table_name,
status
FROM dba_flashback_archive_tables
WHERE table_name LIKE 'APP_TAB%'
ORDER BY owner_name, table_name;
OWNER_NAME TABLE_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME STATUS
-------------------- -------------------- ---------------------- -------------------- -------------
TEST APP_TAB1 FDA_1YEAR SYS_FBA_HIST_96008 ENABLED
TEST APP_TAB2 FDA_1YEAR SYS_FBA_HIST_96010 ENABLED
SQL>
CONN test/test@pdb1
BEGIN
DBMS_FLASHBACK_ARCHIVE.disable_application(
application_name => 'MY_APP');
END;
/
SET LINESIZE 150
COLUMN owner_name FORMAT A20
COLUMN table_name FORMAT A20
COLUMN flashback_archive_name FORMAT A22
COLUMN archive_table_name FORMAT A20
SELECT owner_name,
table_name,
flashback_archive_name,
archive_table_name,
status
FROM dba_flashback_archive_tables
WHERE table_name LIKE 'APP_TAB%'
ORDER BY owner_name, table_name;
no rows selected
SQL>
BEGIN
DBMS_FLASHBACK_ARCHIVE.remove_table_from_application(
application_name => 'MY_APP',
table_name => 'APP_TAB1',
schema_name => 'TEST');
DBMS_FLASHBACK_ARCHIVE.remove_table_from_application(
application_name => 'MY_APP',
table_name => 'APP_TAB2',
schema_name => 'TEST');
DBMS_FLASHBACK_ARCHIVE.drop_application(
application_name => 'MY_APP');
END;
/1234567891011
-- Default and equivalent optimization.
CREATE FLASHBACK ARCHIVE fda_2year_no_opt TABLESPACE fda_ts RETENTION 2 YEAR;
CREATE FLASHBACK ARCHIVE fda_3year_no_opt TABLESPACE fda_ts RETENTION 3 YEAR NO OPTIMIZE DATA;
-- Including optimization.
CREATE FLASHBACK ARCHIVE fda_4year_opt TABLESPACE fda_ts RETENTION 4 YEAR OPTIMIZE DATA;
-- Remove.
DROP FLASHBACK ARCHIVE fda_4year_opt;
DROP FLASHBACK ARCHIVE fda_3year_no_opt;
DROP FLASHBACK ARCHIVE fda_2year_no_opt;1234567891011121314151617181920212223242526272829
SELECT table_name
FROM dba_tables
WHERE owner = 'SYS'
AND table_name LIKE '%FBA%'
ORDER BY table_name;
TABLE_NAME
----------------------------
SYS_FBA_APP
SYS_FBA_APP_TABLES
SYS_FBA_BARRIERSCN
SYS_FBA_COLS
SYS_FBA_CONTEXT
SYS_FBA_CONTEXT_AUD
SYS_FBA_CONTEXT_LIST
SYS_FBA_DL
SYS_FBA_FA
SYS_FBA_PARTITIONS
SYS_FBA_PERIOD
SYS_FBA_TRACKEDTABLES
SYS_FBA_TSFA
SYS_FBA_USERS
SYS_MFBA_NCHANGE
SYS_MFBA_NROW
SYS_MFBA_NTCRV
SYS_MFBA_STAGE_RID
SYS_MFBA_TRACKED_TXN
SQL>Please to add comments
No comments yet. Be the first to comment!