29 Nisan 2014 Salı

ORA-01555 caused by SQL statement below (SQL ID: 3pb206068b3qc, Query Duration=1671 sec, SCN: 0x0013.6274b9a6):

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.

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.


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.


0 yorum:

Yorum Gönder