ORA-01555 snapshot too old

Oracle Undo, veritabanı yönetim sisteminin (Oracle Database) bir bileşenidir ve veritabanı işlemlerinin tutarlılığını sağlamak için kullanılır. Undo, veritabanında gerçekleştirilen işlemlerin geçmişini kaydeden ve geri alma işlemleri için gerekli olan bilgileri içeren bir mekanizmadır. 
Undo alanı, yürütülen her SQL işlemi için geçici bir bellek alanıdır. Her işlem başladığında, işlem tarafından yapılacak değişiklikler geçici olarak undo alanında saklanır. Bu, veritabanı için geri alma işlemlerinin gerçekleştirilebilmesini sağlar. Örneğin, bir işlem hata verirse veya bir geri alma işlemi gerektiğinde, undo bilgisi kullanılarak veritabanı önceki bir duruma geri dönebilir.

Veritabanında yapacağınız işlemlerin süresine ve veri büyüklüğüne bağlı olarak UNDO RETENTION ve UNDO SIZE 'değerlerini ve UNDO tablespace 'ini belirlemeniz gerekir aksi durumda " ORA-01555  snapshot too old " hatası alırsınız. 
-- OPTIMUM_UNDO_RETENTION
SELECT d.undo_size/(1024*1024) as UNDO_SIZE,
SUBSTR(e.value,1,25) as UNDO_RETENTION,
ROUND((d.undo_size / (to_number(f.value) *
g.undo_block_per_sec))) as OPTIMUM_UNDO_RETENTION
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';

-- SET OPTIMUM_UNDO_RETENTION
ALTER SYSTEM SET UNDO_RETENTION= SCOPE=BOTH;

-- OPTIMUM_UNDO_SIZE
SELECT d.undo_size/(1024*1024) as UNDO_SIZE,
SUBSTR(e.value,1,25) as UNDO_RETENTION,
(TO_NUMBER(e.value) * TO_NUMBER(f.value) *
g.undo_block_per_sec) / (1024*1024)
as 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';

Yorum Gönder

Daha yeni Daha eski