현상
참고
발생 버전 : Tibero6 FS07 / Oracle 11g + SunOS / TableMigrator 262224
Source(Oracle)의 XML type이 존재하는 테이블을 TableMigrator를 통하여 이관 시, Source(Oracle) 측에 PGA 메모리가 점유되는 현상이 발생합니다.
시나리오
1. Source 에 생성
SQL > create table t322393(
ROWCNT number
, C1 number
, C2 varchar2(100)
, C3 char(10)
, C4 date not null
, C5 timestamp
, C6 interval day to second
, C7 interval year to month
, C8 raw(16)
, C9 nchar(15)
, C10 nvarchar2(10)
, C11 varchar(10)
, C12 blob
, c13 xmltype
)
TABLESPACE ts322393
PCTFREE 10
PCTUSED 0
INITRANS 1
MAXTRANS 255
LOGGING
NOCOMPRESS
DISABLE ROW MOVEMENT
NOPARALLEL;
SQL
복사
2. Sample Data Insert
SQL > insert into t322393
( rowcnt
, C1
, C2
, C3
, C4
, C5
, C6
, C7
, C8
, C9
, C10
, C11
, C12
, c13
)
(
select
level
,level+1
,to_date(to_char(trunc(dbms_random.value(2000,2010)))||'0101','yyyymmdd')+trunc(dbms_random.value(1,365))
,to_date(to_char(trunc(dbms_random.value(2000,2100)))||'0101','yyyymmdd')+trunc(dbms_random.value(1,365))
,sysdate
,sysdate
,INTERVAL '30' MINUTE
, INTERVAL '01-02' YEAR TO MONTH
,SYS_GUID()
,'test'
,'test'
,'2000'
,lpad('A',4000,'A')
, '
이름
이름2
이름
이름2
'
from dual connect by level <= 200000);
SQL > commit;
SQL
복사
3. Target에서 TableMigrator를 통해 해당 테이블 이관
4. 아래 쿼리를 통해 Source(Oracle)에서 Memory 확인
SQL > select s.sid,s.pid, s.PROG_NAME, round(s.PGA_USED_MEM/1024/1024/1024, 2) ||' GB' PGA from v$session s where s.PROG_NAME= 'Table Migrator[1]';
SQL
복사
원인
메모리 누수의 구체적인 과정은 아래와 같습니다.
1.
Table Migrator 사용 시, XMLTYPE 컬럼의 데이터를 getClobVal() 함수를 통해 조회하게 됩니다.
2.
이 과정에서 Oracle 내부적으로 Temp LOB이 생성됩니다.
3.
하지만 해당 Temp LOB에 대한 정리가 제대로 이루어지지 않아, 해당 세션이 종료될 때까지 PGA 사용량이 증가하게 됩니다.
따라서, 이러한 문제를 방지하기 위해서는 개선된 버전의 T-up 바이너리 사용이 필요합니다.
해결
개선된 패치가 적용된 T-up 바이너리를 사용하여 해결합니다. (개선 패치 : FS01_2404a_tup)
주의
티맥스티베로에서 제공하는 기술지원을 통해 패치를 적용합니다.