25 Aralık 2010 Cumartesi

Tablo Seviyesinde Yapılan Flashback Operasyonları


Flashback table ile tablonun geçmiş bir andaki durumuna dönülebilir. Bu işlem online ve çok hızlı yapıldığından dolayı, tablonun önceden alınmış olan bir backupından faydalanarak yapılması ile karşılaştırılamayacak derecede dba’ lere zaman kazandırmaktadır. Tablonun flashback drop ile tekrar kazanılması sırasında tablo üzerinde yer alan index,triggger, constraintlerde tablo ile birlikte tekrar kazanılmaktadır. Bu komutun çalıştırılabilmesi için bir takım gereksimler bulunmaktadır. Bunlar ;

• Flashback table operasyonunda da diğer flashback işlemlerinde olduğu gibi Undo tablespace’ i kullanılır.
 

• Flashback operasyonu tablodaki datalara ait rowid’ leri değiştireceğinden dolayı tablonun row movement özelliğinin enable olması gerekmektedir.
 

• Bunun yanında flashback işlemini yapacak olan kullanıcı da database seviyesinde FLASHBACK ANY TABLE yetkisine veya sadece obje için Flashback yetkisine sahip olmalıdır.
 

• Yine tablo üzerinde SELECT, INSERT, DELETE ve ALTER yetkilerine sahip olunmalıdır.
 

• Bu işlemler için Undo tablespace’ I kullanıldığını bahsettiğimize göre o zaman, gitmek istediğimiz zamana kadarki verilerinde undo tablespace’ inde tutuluyor olması gerekmektedir.
 

Buraya kadar bahsettiklerimiz Flashback table operasyonu için olması gerekenler idi. Ancak bu belirttiğimiz kriterlerin hepsi var olsada yinede kimi tablolar üzerinde bu komutu çalıştıramazsınız. Bunlardan da kısaca bahsedelim;

• Üzerinde işlem yapılacak olan object aşağıdaki kategorileri içermemelidir; Cluster table, materialized views, Advanced Queuing (AQ) tables, static data dictionary tables, system tables, remote tables, object tables, nested tables, or individual table partitions or subpartitions.
 

• Tablonun yapısı flashback table ile dönülecek zaman aralığı içerisinde değişmemiş olması gerekmektedir. (Tablonun yapısını değiştiren DDL işlemleri; upgrading, moving, or truncating a table; adding a constraint to a table, adding a table to a cluster; modifying or dropping a column; adding, dropping, merging, splitting, coalescing, or truncating a partition or subpartition (with the exception of adding a range partition)

• Üzerinde çalıştığınız uygulama tablodaki kayıtların rowid’ lerine bağımlı ise, flashback table kullanmamalısınız. (Flashback table operasyonu sonrasında towid’ ler değiştiğinden dolayı)
 

• Undo tablespace’ inde datayı tutmak için yeterince yer olmalıdır. Undo tablespace’ indeki Undo datası, datanın değişmeden önceki halini tutar. Flashback table minumum tutulan undo datasına undo retention time’ e bakarak karar verir. Undo_retention parametresi için Oracle’ ın önerdiği değer 1 gün yani 86400 saniyedir.
 

Konuyu örneklendirmeden aslında database’ de flashback modu nasıl açarız, hangi parametreleri var ne anlama geliyor gibi konulara biraz değinelim, zira sürekli olarak flashback komutlarından bahsediyoruz ama database nasıl flashback moda alınacak bundan hiç konuşmadık.
 

Database’ in falshback modda olup olmadığını aşağıdaki şekilde kontrol edebiliriz.
 

select flashback_on from v$database ;
 

FLASHBACK_ON
 
-----------------
YES
 
1 row selected.

Olduğunu görmeliyiz, sorgu sonucu NO olarak dönüyor ise database’ iniz flashback modda değildir demektir. Flashback moda almak için önce database’ i kapatıyoruz, mount modda açıyoruz. Burada unutulmaması gereken flashback modu açmak için database mutlaka archive modda olması gerektiğidir.
 

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup mount
ORACLE instance started.
Total System Global Area 419430400 bytes
Fixed Size 1249368 bytes
Variable Size 83890088 bytes
Database Buffers 327155712 bytes
Redo Buffers 7135232 bytes
Database mounted.

SQL> select log_mode from v$database ;
LOG_MODE
------------
ARCHIVELOG

Database’ imiz archive modda, flashback için gerekli parametreleri tanımlamaya başlayabiliriz. Burada önemli olan 3 tane parametremiz var; Kaç dakika geriye gidebileceğimizi belirtten,
 
DB_FLASHBACK_RETENTION_TARGET parametresi, Flashback loglarının birikeceği alanın boyutunun ne olacağını belirttiğimiz DB_RECOVERY_FILE_DEST_SIZE velogların nereye yazılacağının tanımlandığı DB_RECOVERY_FILE_DEST parametresidir. Disk üzerinde kullanılan alanların takibi bizler için ciddi önem taşır, dolayısıyla burda DB_RECOVERY_FILE_DEST_SIZE parametresi çok önemli diye düşünüyorum çünkü bu parametre ile logların toplam size’ ının belli bir boyutunu geçmesini engelleyebilirsiniz. Burada retention target ile dest_size parametreleri çakışabilir, orda şu kural geçerli olur, belirtiğiniz size dolana kadar log üretir bu arada retention_target değerine ulaşılmamış olsada en eski logdan başlayarak ezerek yazamaya devam eder. Yani retention_target değerine ulaşılamadı diye size’ I belirtmiş olduğunuz değerin üstüne çekemez. Şimdi bu parametreleri set edelim. Sample değerlerimiz;
 

Retention_target = 24 saat,
 
Dest_size = 10 gb,
 
Dest_size = D:\oracle\flashback_area olsun.
 

SQL> ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=1440 scope=BOTH
System altered.

SQL> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=10G scope=BOTH;
System altered.

SQL> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST=' D:\oracle\flashback_area\' scope=BOTH;
System altered.

Bazen path’ i belirtirken aşağıdaki gibi bir hata mesajı alabilirsiniz bu durumda, archive lokasyonunu önce sıfırlayıp sonra tekrar set etmek gerekebiliyor.
 

ORA-02097: parameter cannot be modified because specified value is invalid
ORA-16018: cannot use LOG_ARCHIVE_DEST with LOG_ARCHIVE_DEST_n or DB_RECOVERY_FILE_DEST

SQL> ALTER SYSTEM SET log_archive_dest='';
System altered.

SQL> ALTER SYSTEM SET DB_RECOVERY_FILE_DEST=' D:\oracle\flashback_area\' scope=BOTH;
System altered.

SQL> ALTER SYSTEM SET log_archive_dest_1='LOCATION=d:\oracle\arch\';

Gerekli değisiklikleri yaptıktan sonra, asağıdaki ifadeyi çalıstırıp, ayarları kontrol edebilirsiniz:
Tüm bu ön ayarlamaları yaptıkdan sonra Flashback özelliğini aktif hale getirebiliriz ;
 

SQL> ALTER DATABASE FLASHBACK ON;
Database altered.

Database’ imizi açıyoruz;
 

SQL> ALTER DATABASE OPEN;
Database altered.

Tüm bu işlemlerden sonra Oracle’ ın aşağıda linkini de belirtiğim sayfasında yer alan örnekle devam edebiliriz ;
 

Öncelikle sistemin şu anki SCN numberını öğrenmekle başlayalım;

SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
10824010
1 row selected.

Sonra önceden alınmış olan bir restore point noktası olup olmadığını kontrol edelim ;
 

SELECT NAME, SCN, TIME FROM V$RESTORE_POINT;
No rows.
 

Undo_retentition time değerini kontrol edelim.
 

SELECT NAME, VALUE/60 MINUTES_RETAINED  FROM V$PARAMETER
 
WHERE NAME = 'undo_retention';

NAME MINUTES_RETAINED
undo_retention 1440
1 row selected.

Tablo üzerindeki rowid’ lerin değişebilmesini sağlamak için tablomuzun row movement özelliğini açalım.
 

SQL>ALTER TABLE kamil.flashback_table_test ENABLE ROW MOVEMENT;
Table altered.

Sonrasında tüm tablonun delete edildiğini varsayalım.
 

SQL>delete kamil.FLASHBACK_TABLE_TEST
5018 rows deleted.

SQL>commit;
Commit complete.

select count (*) from kamil.FLASHBACK_TABLE_TEST;
 
COUNT(*)
----------
0
1 row selected.

SQL>FLASHBACK TABLE kamil.FLASHBACK_TABLE_TEST TO TIMESTAMP TO_TIMESTAMP('2010-12-25 16:35:00', 'YYYY-MM-DD HH24:MI:SS');
Flashbacktable successfully completed.

SQL>select count (*) from kamil.FLASHBACK_TABLE_TEST;
COUNT(*)
----------
5018
1 row selected.

Diğer flashback table komutu ile ilgili örnekler ;
 
FLASHBACK TABLE kamil.FLASHBACK_TABLE_TEST TO TIMESTAMP TO_TIMESTAMP('2010-12-25 16:35:00', 'YYYY-MM-DD HH24:MI:SS');

FLASHBACK TABLE kamil.FLASHBACK_TABLE_TEST TO TIMESTAMP TO_TIMESTAMP('2010-12-25 16:35:00', 'YYYY-MM-DD HH24:MI:SS') ENABLE TRIGGERS;
 

FLASHBACK TABLE kamil.FLASHBACK_TABLE_TEST TO scn 10824900;
 

Flashback işlemi sırasında tablo üzerindeki trigger’lar default olarak disable halde gelirler. İşlemi gerçekleştirirken tablo üzerindeki trigger’ların da aktif durumda olmasını istiyorsak flashback komutumuzun sonuna Enbale Triggers parametresini eklememiz yeterli olacaktır.
 

FLASHBACK TABLE kamil.FLASHBACK_TABLE_TEST TO TIMESTAMP TO_TIMESTAMP('2010-12-25 16:35:00', 'YYYY-MM-DD HH24:MI:SS') ENABLE TRIGGERS ;
 

Kaynak;
 
http://download.oracle.com/docs/cd/E11882_01/backup.112/e10642/rcmflash.htm#BRADV81517

Bir sonraki yazıma Flashback drop ile devam edeceğim.
 
Görüşmek üzere …


Kamil TÜRKYILMAZ 

Hiç yorum yok: