안녕하세요.초보자 사슴사랑입니다.
이번에 프로젝트중 한 부분이 인포믹스 9.1을 오라클 8i로 마이그레이션하는겁니다.
오라클에서 나온 work bench프로그램도 써봤는데요. CLOB,BLOB,... type등 지원안해주는 type이 많고
테이블당 자료를 불러올수 있는게 아니고 DB를 통째로만 가져올 수 있기 때문에 불가능했습니다.
또 한가지는 실시간 돌고 있는 DB에서만 스키마를 가져올수 있더라고요. -_-;;
오라클 기술직원한테 물어보니 스키마를 클라이언트 pc에 이미지 형태로 저장한다고 합니다.
인포믹스에서 예를들어 TEST란 DB를 export 하면 인포믹스에서는 TEST.EXP라는 폴더를 만들고 그 안에 파일로 저장을 하게 됩니다.
데이타파일은 "테이블명XXX.unl" 이런 파일형식의 파일로 저장이 됩니다.
긴 텍스트 컬럼(즉, 엔터를 쳐 가면서 입력한 컬럼)은 엔터친 부분에 \ 기호가 들어가게됩니다.
아래는 제가 만든 control.sql 파일입니다.
***************************** control.sql 시작*******************************************************
set echo off set heading off set verify off set feedback off set show off set trim off set pages 0 set concat on set lines 300 set trimspool on set trimout on
spool d:\temp1\&1..ctl ------------->컨트롤파일 생성시 저장되는 경로
select 'LOAD DATA'||chr (10)|| 'INFILE '''||lower (table_name)||'.unl'''||chr (10)|| 'INTO TABLE '||table_name||chr (10)|| 'FIELDS TERMINATED BY ''|'''||chr (10)|| 'TRAILING NULLCOLS'||chr (10)||'(' from all_tables where table_name = upper ('&1');
select decode (rownum, 1, ' ', ' , ')|| rpad (column_name, 33, ' ')|| decode (data_type, 'VARCHAR2', 'CHAR NULLIF ('||column_name||'=BLANKS)', 'FLOAT', 'DECIMAL EXTERNAL NULLIF('||column_name||'=BLANKS)', 'NUMBER', decode (data_precision, 0, 'INTEGER EXTERNAL NULLIF ('||column_name|| '=BLANKS)', decode (data_scale, 0, 'INTEGER EXTERNAL NULLIF ('|| column_name||'=BLANKS)', 'DECIMAL EXTERNAL NULLIF ('|| column_name||'=BLANKS)')), 'DATE', 'DATE "YYYY-MM-DD" NULLIF ('||column_name||'=BLANKS)', 'CLOB', 'LOBFILE(CONSTANT ''&1..clob'') char terminated by "<endlob>"', 'BLOB', 'LOBFILE(CONSTANT ''&1..blob'') char terminated by "<endlob>"', null) from user_tab_columns where table_name = upper ('&1') order by column_id;
select ')' from sys.dual; spool off
***************************** control.sql 끝*************************************************************
전 이같이 컨트롤 파일을 우선 생성한 후에
sql/plus 를 열고
edit control
@control "test" <---------DB에 test라는 테이블이 미리 존재해야 됩니다.
이렇게 하고 나면 D:\temp1 폴더에 test.ctl 이라는 파일이 생성됩니다.
다음은 test.ctl 파일입니다.
*****************************************test.ctl 시작**************************************************
LOAD DATA INFILE 'D:\temp1\test.unl' "Str X'7c0a'" <-------"Str X'7c0a'" 가 바로 긴텍스트를 처리하는 부분입니다. INTO TABLE TEST FIELDS TERMINATED BY '|' TRAILING NULLCOLS (
SER_NO DECIMAL EXTERNAL NULLIF (SER_NO=BLANKS) , TITLE CHAR NULLIF (TITLE=BLANKS) , REG_USER CHAR NULLIF (REG_USER=BLANKS) , PASSWORD CHAR NULLIF (PASSWORD=BLANKS) , EMAIL CHAR NULLIF (EMAIL=BLANKS) , ADDR CHAR NULLIF (ADDR=BLANKS) , TEL CHAR NULLIF (TEL=BLANKS) , JOB CHAR NULLIF (JOB=BLANKS) , FIELD , SYNOPSIS CHAR(10000) NULLIF (SYNOPSIS=BLANKS) <-----긴텍스트 컬럼의 길이를 길게해줌 , REG_DATE DATE "YYYY-MM-DD" NULLIF (REG_DATE=BLANKS) , COUNTER DECIMAL EXTERNAL NULLIF (COUNTER=BLANKS) )
*****************************************test.ctl 끝*****************************************************
이렇게 고치고 나서
다시 sql/plus 에서
sqlldr 계정/비번 입력후
control = "test" 를 입력하면 test.unl에 있는 데이터들이 오라클 TEST테이블로 들어가게 됩니다.
그다음에는 데이터가 잘들어갔는지 test.log파일을 확인해 봅니다.
다음은 test.log파일입니다.
***************************************test.log 시작**************************************************8
SQL*Loader: Release 8.1.6.0.0 - Production on Wed Oct 15 19:32:56 2003
(c) Copyright 1999 Oracle Corporation. All rights reserved.
Control File: test.ctl Data File: D:\temp1\test.unl File processing option string: "Str X'7c0a'" Bad File: test.bad Discard File: none specified (Allow all discards)
Number to load: ALL Number to skip: 0 Errors allowed: 50 Bind array: 64 rows, maximum of 65536 bytes Continuation: none specified Path used: Conventional
Table TEST, loaded from every logical record. Insert option in effect for this table: INSERT TRAILING NULLCOLS option in effect
Column Name Position Len Term Encl Datatype ------------------------------ ---------- ----- ---- ---- --------------------- SER_NO FIRST * | CHARACTER NULL if SER_NO = BLANKS TITLE NEXT * | CHARACTER NULL if TITLE = BLANKS REG_USER NEXT * | CHARACTER NULL if REG_USER = BLANKS PASSWORD NEXT * | CHARACTER NULL if PASSWORD = BLANKS EMAIL NEXT * | CHARACTER NULL if EMAIL = BLANKS ADDR NEXT * | CHARACTER NULL if ADDR = BLANKS TEL NEXT * | CHARACTER NULL if TEL = BLANKS JOB NEXT * | CHARACTER NULL if JOB = BLANKS FIELD NEXT * | CHARACTER SYNOPSIS NEXT 10000 | CHARACTER NULL if SYNOPSIS = BLANKS REG_DATE NEXT * | DATE YYYY-MM-DD NULL if REG_DATE = BLANKS COUNTER NEXT * | CHARACTER NULL if COUNTER = BLANKS
Table TEST: 102 Rows successfully loaded. 0 Rows not loaded due to data errors. 0 Rows not loaded because all WHEN clauses were failed. 0 Rows not loaded because all fields were null.
Space allocated for bind array: 64200 bytes(5 rows) Space allocated for memory besides bind array: 0 bytes
Total logical records skipped: 0 Total logical records read: 102 Total logical records rejected: 0 Total logical records discarded: 0
Run began on Wed Oct 15 19:32:56 2003 Run ended on Wed Oct 15 19:33:00 2003
Elapsed time was: 00:00:04.16 CPU time was: 00:00:00.11
***************************************test.log 끝**************************************************
이렇게 이상없으면 잘 들어간겁니다.
제가 한거는 여기까지고요.
잘 안돼는부분이 바로 CLOB,BLOB 필드문제입니다.
export파일중에 DB명.sql 파일에는 모든 스키마정보가 다 들어있습니다.
(create문,alter문,insert문,스토어드프로시져, 함수 등등)
예를 들면 wowen.sql 파일이 있고, 그 안에 아래처럼 되 있습니다.
{ TABLE "informix".wonews row size = 536 number of columns = 14 index size = 12 } { unload file name = wonew00402.unl number of rows = 3425 }
create table "informix".wonews ( ser_no integer not null constraint "informix".n1750_6098, code1 char(3), title varchar(200), context clob, inp_date char(10), writer varchar(50), ck1 char(1), ck2 char(1), ck3 char(1), inq_cnt integer, cu_date datetime year to second, filename varchar(50), filetype varchar(50), whole blob, primary key (ser_no) constraint "informix".u1750_6097 )
밑줄친 wonew00402.unl 파일을 보면 데이터 들이 이렇게 들어가 있습니다.
3|010|'Women's Studies Forum' (Vol. 16) 발간|0,121,clob5c84.acd|2001.02.01|| | | |100|||||
컬럼 구분은 "|"로 보시면 됩니다. 여기서 문제가 되는 0,121,clob5c84.acd 부분이 있습니다.
0,121 이라는 숫자는 clob5c84.acd 라는 파일에서 0번째 바이트부터 121번째 바이트까지의 데이터를 가리킵니다.
전 이부분을 해결하고 싶은데요. 고수님들 좀 알려주시면 감사드리겠습니다.
마이그레이션이 이렇게 힘든지 정말 몰랐습니다.
제발 저에게 구원의 손길을 부탁드립니다.
추신 : blob type도 clob type과 같은 방법으로 해결될 수 있을까요?
수고하세요.
|