Pages

7 Mart 2012 Çarşamba

Oracle 11.2.0.2 sürümünde Flashback Transaction Query

Flashback Transaction Query, işlem seviyesinde veritabanında yapılan değişiklikleri göstermeyi sağlayan kullanışlı bir Oracle aracıdır. Flashback Transaction Query, bir işlem tarafından yapılan tüm değişikliklerin görülmesini sağlayan bir SQL eklentisidir. Örneğin;

SELECT UNDO_SQL
FROM FLASHBACK_TRANSACTION_QUERY
WHERE XID = '000200030000002D';

Yukardaki komut bu işlemde sonuçlanan tüm değişiklikleri göstermektedir. İlaveten,  yerini dolduran tüm SQL komutlarıda döner ve bu işlem tarafından tüm satırlara yapılan değişiklikler geri alınabilir.  Flashback Transaction Query gibi hassas bir araç kullanarak, veritabanı yöneticileri ve uygulama geliştiriciler veritabanı veya uygulamadaki mantıksal problemleri kesin olarak teşhis edip gerekli düzeltmeleri yapabilirler.  

Bunu bir örnekle açıklamak gerekirse; IK müdürünün, veritabanı yöneticisini arayarak bir çalışanın maaşında çelişkili bir durum olduğunu rapor ettiğini düşünelim. Örneğin; sabah 9.00 öncesinde Ahmet adlı çalışanın maaşı 5,000TL ye yükseltilmiş, IK departmanı bu işlemin nasıl meydana geldiğinden emin değil ve bu çalışanın maaşının ne zaman değiştirildiğini bilmek istiyor. İlaveten, IK müdürü departman çalışanlarına bu kişinin maaşının önceki haline değiştirilmesini talep ediyor. Bu işlemde sabah 09.20 civarında gerçekleşiyor.

Aşağıdaki adımlar bu probleme nasıl yaklaşılacağını adım adım göstermektedir;

1.    Önce problem değelendirilir. İyiki IK müdürü değişikliğin ne zaman yapıldığı ile bilgi vermiştir. İşlem saat 09.00 sıralarında olduğundan Flashback Query aracı ile sorgu çekilir ve saat 9.00 itibariyle AHMET adlı çalışanın maaşının 5000 TL olduğu teyit edilir

SELECT EMP_NO, EMP_NAME, EMP_SAL
FROM EMP_TBL
AS OF TIMESTAMP TO_DATE('28-JAN-12 09:00','dd-Mon-yy hh24:mi')
WHERE EMP_NAME = 'AHMET';

EMP_NO      EMP_NAME    EMP_SAL
---------- ---------- ----------
243          AHMET      5000

2.    Verinin önceki versiyonları ve önceki satırlarına sorgu çekilerek işlem bilgisi elde edilir. Buna rağmen, satır versiyon bilgisini belirli bir tarih veya SCN aralığı ile kısıtlamakta mümkündür.  Flashback Version Query kullanılarak AHMET adlı çalışan için uygun olan tüm satır bilgilerini aşağıdaki gibi elde etmekte mümkündür.

SELECT EMP_NO, EMP_NAME, EMP_SAL, VERSIONS_STARTTIME, VERSIONS_ENDTIME, VERSIONS_XID
FROM EMP_TBL
VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
WHERE EMPNO = 243
ORDER BY NVL(VERSIONS_STARTSCN,1);



EMP_NO EMP_NAME  EMP_SAL VERSIONS_STARTTIME  VERSIONS_ENDTIME VERSIONS_XID
-----  ------ --- ------------------- ------------------    --------------
243  AHMET 2200 28-JAN-12 08.48.43AM 28-JAN-12 08.56.45AM 0006000800000086
243 WARD 5000 28-JAN-12 08.56.35AM 28-JAN-12 09.20.05AM 0009000500000089
243 WARD 2200 28-JAN-12 09.10.09AM                      000800050000008B

Yukarda görüldüğü üzere çalışanın maaşı saat 08.56 da 5000 TL sına artırılmış, daha sonra aynı gün saat 09.20 de ise yeniden 2200 TL sına getirilmiştir. Ayrıca, çalışanın maaşını 5000TL’ya artıran hatalı işlemin ID side görülmektedir(0009000500000089).

3.    Şimdi hatalı işleme ve bunun etkisinin kapsamına sorgu çekilecektir. İşlem bilgisi ile (VERSIONS_XID takmakolonu ile), Flashback Transaction Query kullanılarak işlem kapsamını belirlemek için veritabanına sorgu çekilecektir.  

SELECT UNDO_SQL
FROM FLASHBACK_TRANSACTION_QUERY
WHERE XID = HEXTORAW('0009000500000089');

UNDO_SQL
----------------------------------------------------------------------------
update "IK"."EMP_TBL" set "SAL" = '1800' where ROWID = 'AAACV4AAFAAAAKtAAL';
update "IK"."EMP_TBL" set "SAL" = '2400' where ROWID = 'AAACV4AAFAAAAKtAAJ';
update "IK"."EMP_TBL" set "SAL" = '5000' where ROWID = 'AAACV4AAFAAAAKtAAF';
update "IK"."EMP_TBL" set "SAL" = '2200' where ROWID = 'AAACV4AAFAAAAKtAAE';
update "IK"."EMP_TBL" set "SAL" = '2100' where ROWID = 'AAACV4AAFAAAAKtAAB';
6 rows selected.

Yukarda görüldüğü üzere bu işlem içinde meydana gelen tek değişiklik AHMET adlı çalışanın maaş değişikliği değildir. Bu noktada, IK müdürüne diğer dört çalışanın maaş değişikliklerininde gözden geçirilmesi için bilgilendirme yapmak iyi olacaktır.

4.    Düzeltici komutların çalıştırılıp çalıştırılmayacağı belirlenmelidir. Eğer IK müdürü UNDO_SQL kolonu tarafından tavsiye edilen düzeltici değişikliklerinin doğruluğuna karar verirse, bu durumda veritabanı yöneticisi bu düzeltici komutları bireysel olarak çalıştırabilir.

5.    FLASHBACK_TRANSACTION_QUERY görünümüne sorgu çekilerek ilave işlem bilgisi görüntülenebilir. Örneğin; hatalı UPDATE işlemini yapan kullanıcının belirlenmesi için aşağıdaki sorgu kullanılabilir. Aşağıda görüldüğü üzere bu hatalı güncelleme işlemini DENIZ adlı kullanıcı yapmıştır.  

SELECT LOGON_USER FROM FLASHBACK_TRANSACTION_QUERY
WHERE XID = HEXTORAW('0009000500000089');

LOGON_USER
----------------------------
DENIZ

0 yorum:

Yorum Gönder