UNDO verisi nedir? öncelikle ondan bahsedelim, UNDO verisi Oracle veritabanında çalışan Komutlarının sonucunda değişen dataların değişmenden önceki haline denir ve UNDO Tablespace içerisinde tutulur. Bu bilgi nerede ve ne için kullanılır dersek, Henüz tamamlanmamış Transaction ların yarıda kesilmesi durumunda buradan Rollback yapılması sağlanır, bazı durumlarda recover işlemleri için kullanılabilir, Flashback query için kullanılır.
Bu UNDO_MANAGEMENT kısmında ise Manuel ve Auto olarak iki seçeneğimiz vardır, genel olarak AUTO diyerek Oracle tarafında bunu bırakabiliriz, ancak bazı restore , recover ve tutarsız veritabanını açma ihtiyaçlarında MANUEL olarak set edilerek yaptığımız durumlar oluyor , onun dışında genelde AUTO olarak kullanılmaktadır.
Bir veritabanında birden falza UNDO Tablespace oluşturulabilir ancak her bir insatnce için bir tanesi varsayılan olarak atanacaktır, bunun için ise UNDO_TABLESPACE parametresi vardır. Diğer bir UNDO parametreside UNDO_RETENTION parametresidir, UNDO_RETENTION parametresi , Retention süresi bir Transaction undo bilgisinin ne kadar süre ile saklanacağını bize belirtir , bu süre veritabanı karakteristiğine göre değişir ve hesaplamak için bazı yöntemler vardır. Yani disk kullanımı bizim için kiritk ve minimum değerleri hesaplamak istiyorsak aşağıdaki gibi bir formül kullanabiliriz.
OPTIMAL UNDO_RETENTION=ACTUAL UNDO SIZE/ (DB_BLOCK_SIZE X UNDO_BLOCK_PER_SEC)
Formülü ile Hesaplanır, Aşağıdaki sorgular ile V$UNDOSTAT istatistik bilgileri kullanarak bakabiliriz;
--UNDO SIZE
SELECT SUM(a.bytes) "UNDO_SIZE"
FROM v$datafile a,
v$tablespace b,
dba_tablespaces c
WHERE c.contents = 'UNDO'
AND c.status = 'ONLINE'
AND b.name = c.tablespace_name
AND a.ts# = b.ts#;
UNDO_SIZE
------------
2120438317056
--UNDO_BLOCK_PER_SEC
SQL> SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
"UNDO_BLOCK_PER_SEC"
FROM v$undostat; 2 3
UNDO_BLOCK_PER_SEC
------------------
5071,35333
--DB_BLOCK_SIZE
SQL> SELECT TO_NUMBER(value) "DB_BLOCK_SIZE [KByte]"
FROM v$parameter
WHERE name = 'db_block_size'; 2 3
DB_BLOCK_SIZE [KByte]
---------------------
32768
Optimal Undo Retention --> 2120438317056 /(5071,35333 X 32768)=12760 Saniye
Aşağıdaki sorgu ile Tüm değerleri birlikte görebilirsiniz;
column UNDO_RETENTION format a45
column ACTUAL_UNDO_SIZE format a30
SELECT to_char(d.undo_size/(1024*1024*1024)) "ACTUAL_UNDO_SIZE",
SUBSTR(e.value,1,25) "UNDO_RETENTION",
(TO_NUMBER(e.value) * TO_NUMBER(f.value) *
g.undo_block_per_sec) / (1024*1024*1024)
"NEEDED UNDO SIZE"
FROM (
SELECT SUM(a.bytes) undo_size
FROM v$datafile a,
v$tablespace b,
dba_tablespaces c
WHERE c.contents = 'UNDO'
AND c.status = 'ONLINE'
AND b.name = c.tablespace_name
AND a.ts# = b.ts#
) d,
v$parameter e,
v$parameter f,
(
SELECT MAX(undoblks/((end_time-begin_time)*3600*24))
undo_block_per_sec
FROM v$undostat
) g
WHERE e.name = 'undo_retention'
AND f.name = 'db_block_size'
/
ACTUAL_UNDO_SIZE UNDO_RETENTION NEEDED UNDO SIZE
----------------------- ------------------------ ----------------
1974,81207275390625 7200 1114,31104
Yukardaki hesaplamaya göre , ihtiyaç olan Undo size Gerçek Undo dan daha küçük ise ihtiyaçtan fazla Undo kullanıyor olabilirsiniz veya Undo Retention değeriniz gerekenden küçük olabilir, bu durumda retention sürenizi uzatmayı düşünebilirsiniz. Bir önceki örnekte retention süresini hesaplmış ve mevcut değerden daha büyük bir değer olduğunu görmüştük.
Retention değitirmek için
SQL> alter system set undo_retention=12760 scope=both;
Bir yanıt yazın