2019/02/27

Oracle Flashback Data Archive

Bu yazımda Oracle Flashback data archive konusundan uygulamalı bir şekilde bahsetmeye çalışacağım. Konu hakkında kısa bir bilgi vererek hemen uygulama kısmına geçelim.

Flashback Data Archive istenilen kritik olduğu düşünülen tablolar üzerinde DML işlemlerimizi tablespace üzerinde tutulmasını sağlayan bir teknolojidir. Bu şekilde DML işlemlerini tespit etme , düzeltme ve raporlama şansımız vardır.


Yukarıda da bahsettiğim gibi bu işlemler için öncelikle bir tane tablespace oluşturuyoruz.

SQL> create tablespace fda_tablespace datafile '/u01/app/oracle/oradata/orcl/fda_datafile.dbf' size 1024M autoextend on next 100M maxsize 10000M;


Oluşturmuş olduğumuz bu tablespace'i kullanarak artık arşiv dosyalarını oluşturalım ve QUOTA ve RETENTION parametrelerini ekleyerek ne kadar boyutta ve ne kadar süre saklamamız gerektiğini bildirelim.

SQL> create FLASHBACK ARCHIVE fda_data_archive tablespace fda_tablespace QUOTA 10g retention 1 year;


Bu işlemi de yaptığımıza göre  FLASBACK DATA ARCHIVE ile ilgili bilgilerimizi kontrol edelim.

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_DATA_ARCHIVE                                    1                             365          27-FEB-2019 13:28:45         27-FEB-2019 13:28:45
                 

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_DATA_ARCHIVE                                    1 FDA_TABLESPACE       10240

Şimdi ise bu yaptıklarımızı bir tablo oluşturarak test edelim.

SQL> CREATE TABLE fda_table_test(
                id number,
                 name VARCHAR2(20),
                 surname VARCHAR2(20),
                 age number);

Flashback data archive hangi tabloyu eklemek istiyorsak aşağıdaki sql'i kullanabiliriz.

SQL > ALTER TABLE fda_table_test FLASHBACK ARCHIVE fda_data_archive;

Aşagıdaki sql'ile de hangi tablolar flashback data archive eklenmiş görebiliriz.

SET LINESIZE 150
COLUMN owner_name 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
-------------------- -------------------- ---------------------- -------------------- -------------
SYS                            FDA_TABLE_TEST         FDA_DATA_ARCHIVE    SYS_FBA_HIST_73542   ENABLED

Bu işlemi de kontrol ettikden sonra artık test işlemlerimize tam anlamıyla devam edebiliriz. Öncelikli olarak tablomuza birkaç insert yapalım daha sonra update ve delete işlemleri yaparak önceki ve sonraki halini görmeye çalışalım tablomuzun.


SQL> INSERT INTO fda_table_test VALUES(1,'ENSAR','ERDOĞAN',29);
SQL> INSERT INTO fda_table_test VALUES(2,'MUSTAFA','TEPE',29);
SQL> INSERT INTO fda_table_test VALUES(3,'VEYSEL','YUKSEL',30);
SQL> INSERT INTO fda_table_test VALUES(4,'OZGUR','VURGUN',34);
SQL> INSERT INTO fda_table_test VALUES(5,'MURAT','TOKMAN',29);
SQL> INSERT INTO fda_table_test VALUES(6,'ONUR','CEYLAN',32);
SQL> INSERT INTO fda_table_test VALUES(7,'HAYDAR','ACER',31);
SQL> commit;

SQL> select * from fda_table_test;

               ID NAME                            SURNAME                             AGE
---------- -------------------- -------------------- ----------
                1 ENSAR                            ERDO?AN                               29
                2 MUSTAFA                      TEPE                                        29
                3 VEYSEL                           YUKSEL                                    30
                4 OZGUR                           VURGUN                                               34
                5 MURAT                          TOKMAN                                               29
                6 ONUR                            CEYLAN                                   32
                7 HAYDAR                         ACER                                        31

7 rows selected.

SQL> UPDATE fda_table_test SET AGE=30 WHERE AGE=29;
SQL> commit;

SQL> DELETE fda_table_test where ID=6;
SQL>commit;

SQL> SELECT * FROM fda_table_test;

               ID NAME                            SURNAME                             AGE
---------- -------------------- -------------------- ----------
                1 ENSAR                            ERDO?AN                               30
                2 MUSTAFA                      TEPE                                        30
                3 VEYSEL                           YUKSEL                                    30
                4 OZGUR                           VURGUN                                               34
                5 MURAT                          TOKMAN                                               30
                7 HAYDAR                         ACER                                        31

6 rows selected.

Yukarıda yaptıgımız işlemlere baktığımız da tablomuzda bazı değişiklikler olduğu ğözlemiştir. Yaşı 29 olanlar 30 olarak değiştirilmiş ve id si 6 olan ise silinmiştir.

Aşağıdaki sql sayesinde ise  bu tablo üzerinde yapılan tüm işlemleri görebiliriz.

SQL> SELECT * FROM flashback_transaction_query where table_name=upper('fda_table_test');

Tablomuzu istenilen zaman aralığındaki haline bakabiliriz.

SQL> SELECT * FROM fda_table_test  AS OF TIMESTAMP to_timestamp('27-02-2019 13:55:00','DD-MM-YYYY HH24:MI:SS');

Tablomuzdaki yapılan tüm işlemlerin önceki ve sonraki halini birlikte gösterir.

SQL> SELECT * FROM fda_table_test VERSIONS BETWEEN SCN minvalue AND maxvalue;

Belirtilen zaman aralığı ve yapılan tüm işlemler arasındaki değişen verileri gösterir.

SQL> SELECT * FROM fda_table_test VERSIONS BETWEEN SCN minvalue AND maxvalue
     MINUS
     SELECT * FROM fda_table_test  AS OF TIMESTAMP to_timestamp('27-02-2019 13:58:00','DD-MM-YYYY HH24:MI:SS');

 flashback data archie içersinde verilere ihtiyaç kalmadığında silebiliriz.

SQL> ALTER FLASHBACK ARCHIVE fda_data_archive PURGE ALL;

istediğimiz scn numarasından önceki verileri silebiliriz.

SQL> ALTER FLASHBACK ARCHIVE fda_data_archive PURGE BEFORE SCN XXXXXXX;

Flashback data archive süresini uzatabilmek için;

SQL> ALTER FLASHBACK ARCHIVE fda_data_archive MODIFY RETENTION 2 YEAR;

 Archive üretimini durdurmak için;

SQL> ALTER table  fda_table_test NO FLASHBACK ARCHIVE;

 Flashback archive drop edebilmek için;

SQL> DROP FLASHBACK ARCHIVE fda_data_archive;


Yararlı olması dileğiyle,
İyi Çalışmalar.

Referans : https://oracle-base.com/articles/12c/flashback-data-archive-fda-enhancements-12cr1
Referans: http://www.mustafabektastepe.com/
Referans : http://www.kamilturkyilmaz.com/


Hiç yorum yok:

Yorum Gönder