Data Pump Export işleminin ORA-31693 ORA-02354 ve ORA-01555 hataları ile sonlanması
Expdp ile yedek alınırken lob alanı olan bir tabloya geldiğinde ORA-31693 ORA-02354 ve ORA-01555 hataları ile sonlanabilmektedir. Bunun iki temel sebebi bulunmaktadır.
- İlgili tablodaki LOB alanında corruption olabilir.
- İlgili tablonun LOB tetention değeri olması gereken gibi değildir.
Expdp işlemi aşağıdaki şekilde sonlanmaktadır.
ORA-31693: Table data object "KULLANICI"."TABLO" failed to load/unload and is being skipped due to error: ORA-02354: error in exporting/importing data ORA-01555: snapshot too old: rollback segment number 154 with name "_SYSSMU154_1434655980$" too small
1. durumda ilgili corruption’ın düzeltilmesi gerekmektedir. Sonrasında hatasız tamamlanacaktır.
2. durumda ise ilgili tablodaki lob alanının retention değeri ve sistemin undo_retention değeri yeteri kadar arttırılmalıdır.
Öncelikle mevcut durumdaki undo_retention değerini bulalım.
SQL> show parameter undo; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO undo_retention integer 900 undo_tablespace
En uzun süren sorgunun ne kadar sürdüğünü bulalım.
SQL> select max(maxquerylen) from v$undostat; MAX(MAXQUERYLEN) ---------------- 15429
Sorun yaratan tablonun lob retention değerini tespit edelim.
SQL> select retention from dba_lobs where owner='KULLANICI' and table_name='TABLO'; RETENTION ---------- 900
Yukarıdaki örnekte en uzun süren sorgu 15429 saniye iken , tablonun lob retention değeri ve undo_retention 900 saniye (15 dakika) şeklindedir.
Bu durumda hem undo_retention arttırılmalı hemde tablonun lob retention değeri eşitlenmelidir.
Undo_retention değişikliği :
Undo retention değeri en uzun sorgunun çalıştığı süreden daha fazla verilmelidir. Ayrıca verilecek undo_retention değeri için yeteri kadar undo tablespace olduğundan emin olun.
SQL>ALTER SYSTEM SET UNDO_RETENTION = 15500 scope=both sid='*';
Tablonun lob retention değişikliği :
Bu değişiklik ile sistemin undo retention değeri ile tablonun lob retention değeri eşitlenmektedir.
SQL> alter table KULLANICI.TABLO modify lob(LOB_KOLON_ADI) (pctversion 5); Table altered. SQL> alter table KULLANICI.TABLO modify lob(LOB_KOLON_ADI) (retention); Table altered.
Tablonun mevcut lob retention değerini sorguladığımızda undo_retention ile aynı olmalıdır.
SQL> select retention from dba_lobs where owner='KULLANICI' and table_name='TABLO'; RETENTION ---------- 15500
Bu işlemler sonrasın export işlemi sorunsuz tamamlanacaktır.