Database Alert logunda aşağıdaki hataya farklı zaman aralıklarıyla farklı sql'ler için rastlayabilirsiniz.
Bu hata ilgili hatanın undo tablespace'ı kullanımında undo'da yer kalmaması durumunda ya da parametrelerin optimizasyonun gereken biçimde yapılmamış olmasından kaynaklanmaktadır.
Undo tablespace'inizde gerektiği kadar yer olduğu halde bu hatayı alıyorsak undo retention parametresiyle ilgili bir optimizasyon yapmamız gerekmektedir.
undo retention parametresi'nin optimum değeri aşağıdaki formülle hesaplanır.
UNDO RETENTION TIME=(UNDO SIZE) / (DB BLOCK SIZE × UNDO BLOCK PER SECOND)
Bu değerleri aşağıdaki sql'i çalıştırarak öğrenebiliriz.
SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]",
SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
ROUND((d.undo_size / (to_number(f.value) *
g.undo_block_per_sec))) "OPTIMAL UNDO RETENTION [Sec]"
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'
Bu sql'in çıktısı bize undosize'ımızı mevcut durumdaki undo retention değerimizi ve olması gereken optimum retention değerini verecektir.
Bu sorgu sonucunda aldığımız değere göre undo retention parametresini aşağıdaki gibi set ediyoruz.
SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]",
SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
(TO_NUMBER(e.value) * TO_NUMBER(f.value) *
g.undo_block_per_sec) / (1024*1024)
"NEEDED UNDO SIZE [MByte]"
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'
Yine bu script de bize undo tablespace'in şu anki büyüklüğünü ve olması gereken optimal büyüklüğü verecektir.
Kolay gelsin. İyi Çalışmalar.
Bu hata ilgili hatanın undo tablespace'ı kullanımında undo'da yer kalmaması durumunda ya da parametrelerin optimizasyonun gereken biçimde yapılmamış olmasından kaynaklanmaktadır.
Undo tablespace'inizde gerektiği kadar yer olduğu halde bu hatayı alıyorsak undo retention parametresiyle ilgili bir optimizasyon yapmamız gerekmektedir.
undo retention parametresi'nin optimum değeri aşağıdaki formülle hesaplanır.
UNDO RETENTION TIME=(UNDO SIZE) / (DB BLOCK SIZE × UNDO BLOCK PER SECOND)
Bu değerleri aşağıdaki sql'i çalıştırarak öğrenebiliriz.
SELECT d.undo_size/(1024*1024) "ACTUAL UNDO SIZE [MByte]",
SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
ROUND((d.undo_size / (to_number(f.value) *
g.undo_block_per_sec))) "OPTIMAL UNDO RETENTION [Sec]"
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'
Bu sql'in çıktısı bize undosize'ımızı mevcut durumdaki undo retention değerimizi ve olması gereken optimum retention değerini verecektir.
Bu sorgu sonucunda aldığımız değere göre undo retention parametresini aşağıdaki gibi set ediyoruz.
ALTER SYSTEM SET UNDO_RETENTION =8536 scope=both;
show parameter undo;
undo_management
string AUTO
undo_retention
integer 8536
undo_tablespace
string APPS_UNDOTS1
Diğer ihtimalde; yani undo tablespace'in dolduğu ve yetmediği durumlarda Undo Tablespace'in size'ını hesaplarken aşağıdaki gibi bir script kullanabiliriz.
SUBSTR(e.value,1,25) "UNDO RETENTION [Sec]",
(TO_NUMBER(e.value) * TO_NUMBER(f.value) *
g.undo_block_per_sec) / (1024*1024)
"NEEDED UNDO SIZE [MByte]"
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'
Yine bu script de bize undo tablespace'in şu anki büyüklüğünü ve olması gereken optimal büyüklüğü verecektir.
Kolay gelsin. İyi Çalışmalar.