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';
Etiketler :
Oracle Troubleshooting