오라클 datapump - lob 세그먼트 포함시 ORA-01555 발생 - Oracle Snapshot too old

Last Updated on 6월 2, 2021 by 태랑(정현호)



1. datapump / ORA-01555

오라클의 데이터를 unload 를 위해서 datapump(expdp) 시 간혹 ORA-01555 Snapshot too old 에러가 발생되는 경우가 있습니다.

보통의 데이터를 datapump 시에 발생될 경우 undo 용량을 늘리거나 undo_autotune=false 로 해서 undo_retention 을 늘리는등의 undo retention 을 늘리는 형태를 하게 됩니다.

그런데 이렇게 사이즈 나 retention 을 조정하여도 발생되는 경우가 발생될 수 있습니다. 그 대표적인 예가 lob이 포함되어있는 세그먼트를 datapump 를 수행 할 경우 발생되게 됩니다.



2. Lob 데이터 위치

LOB 이 포함된 테이블을 datapump 를 받을때 ora-01555 가 발생되는 이유는 LOB 의 경우 변경되는 데이터를 자체 LOB Segment 에 저장되고 Lob Retention 정책을 따르기 때문입니다.

모든 경우에서 Lob Segment 에 저장하는 것은 아닙니다. Lob 컬럼 생성 옵션에서 기본값(default) 인 STORE AS ( enable storage in row ) 로 생성 하였을 경우

- LOB 컬럼 데이터가 4000bytes 미만인 경우 Table 세그먼트에 저장이 되게 되게 되고 이 경우에는 일반 테이블의 데이터와 동일하게 DB Undo를 이용하고 Undo Rentention 을 따르게 됩니다.

- LOB 컬럼 데이터가 4000 bytes 이상일 경우 변경 되는 이전 데이터를 자체 Lob Segment 에 저장하게 되고 이럴 경우 Lob retention 을 따르게 됩니다.



3. Lob retention

LOB 컬럼의 lob retention 은 버전과 Lob 종류에 따라서 설정 방법이 조금 씩 다릅니다.

• 10g 버전 BasicFiles LOB

10g(8.1.7.4~10.2.0.5) 버전은 DB에서 설정한 undo_retention 를 기준으로 적용하게 됩니다.

SQL> select retention from dba_lobs where table_name='LOBRETENTION';

RETENTION
----------
1400

SQL> show parameter undo_retention;

NAME                                  TYPE     VALUE
------------------------------------ ----------- ------------------------------
undo_retention                    integer   1400


SQL> alter system set undo_retention= 1800 scope=both;
System altered.


SQL> show parameter undo_retention;

NAME                                   TYPE    VALUE
------------------------------------ ----------- ------------------------------
undo_retention                      integer 1800


-- undo retention 을 변경 하였지만 여전히 변경되지 않고 있음
SQL> select retention from dba_lobs where table_name='LOBRETENTION';

RETENTION
----------
1400


-- undo_retention 변경 후 alter table 수행이 필요함
SQL> alter table lobretention modify lob(lobLoc) (retention);
Table altered.


SQL> select retention from dba_lobs where table_name='LOBRETENTION';

RETENTION
----------
1800



• SecureFiles LOB

SecureFiles LOB 를 사용하는 11g 버전 이상에서는 명시적으로 시간을 지정하여 설정 할 수 있습니다.

SQL> show parameter undo

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_in_memory_undo boolean TRUE
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1


SQL> alter system set undo_retention=1200;

System altered.


SQL> select TABLE_NAME,COLUMN_NAME,PCTVERSION,RETENTION,SECUREFILE,RETENTION_TYPE,RETENTION_VALUE from dba_lobs where table_name='CUST_INT';

TABLE_NAME COLUMN_NAM PCTVERSION RETENTION   SEC   RETENTION_TYPE RETENTION_VALUE
-------------------- ---------- ---------- ---------- --- ------- ---------------
CUST_INT   C_LOB                              YES   DEFAULT


SQL> alter table cust_int modify lob (c_lob) (retention);

Table altered.

 
SQL> select TABLE_NAME,COLUMN_NAME,PCTVERSION,RETENTION,SECUREFILE,RETENTION_TYPE,RETENTION_VALUE from dba_lobs where table_name='CUST_INT';

TABLE_NAME COLUMN_NAME PCTVERSION RETENTION SEC RETENTION_TYPE RETENTION_VALUE
------------------------------ ------------------------------ ---------- ----- 
CUST_INT    C_LOB                           YES DEFAULT

 
SQL> alter table cust_int modify lob (c_lob) (retention min 1200);

Table altered.


SQL> select TABLE_NAME,COLUMN_NAME,PCTVERSION,RETENTION,SECUREFILE,RETENTION_TYPE,RETENTION_VALUE from dba_lobs where table_name='CUST_INT';

TABLE_NAME COLUMN_NAME PCTVERSION RETENTION SEC RETENTION_TYPE RETENTION_VALUE
------------------------------ ------------------------------ ---------- ----------  
CUST_INT   C_LOB                            YES    MIN            1200



RETENTION 값을 많이 늘리게 된다면 그만큼 old version 데이터를 저장하기 위해 보다 많은 space가 필요할 수 도 있으므로 적절 한 값으로 설정을 해야 한다고 생각 합니다.


[참고] RETENTION AUTO 가 default 이며 의미는 아래와 같습니다.

Use the value Oracle has automatic tuning as RETENTION period. A value of AUTO tells the system to manage the space as efficiently as possible weighing both time and space needs.



Ref MOS.
Lob retention not changing when undo_retention is changed (Doc ID 563470.1)
How to change retention of securefile Lob segment (Doc ID 2175438.1)
LOBs and ORA-01555 troubleshooting (Doc ID 846079.1)



연관된 다른 글

 

 

답글 남기기