Last Updated on 1월 21, 2024 by Jade(정현호)
Datapump / ORA-01555
오라클 의 데이터를 unload 를 위해서 datapump(expdp) 시 간혹 ORA-01555 Snapshot too old 에러가 발생되는 경우가 있습니다.
보통의 데이터를 datapump 시에 발생될 경우 undo 용량을 늘리거나 undo_autotune=false 로 해서 undo_retention 을 늘리는 등의 undo retention 을 늘리는 형태를 하게 됩니다.
그런데 이렇게 사이즈 나 retention 을 조정하여도 발생되는 경우가 발생될 수 있습니다. 그 대표적인 예가 lob이 포함되어 있는 세그먼트를 datapump 를 수행할 경우 발생되게 됩니다.
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 을 따르게 됩니다.
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 의 Default 값
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.
Reference
Reference MOS Note
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)
연관된 다른 글
예전에 11gR2(11.2.0.1) 의 New Feature 로 RAC ONE NODE 가 Release 되었고 블로그에서도 자세하게 다룬적이 있었습니다. 11gR2 NF(New Features) - RAC ONE NODE 11gR2 New Feature 인 RAC ONE NODE 기술문서입니다.
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io