DBMS 2

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

데이터이동

DBMS 2
DB2 가이드
DB2 사용자 가이드
데이터이동
작성자
admin
작성일
2021-02-19 13:44
조회
1710

데이터이동

데이터 파일의 유형

①EXPORT, IMPORT, LOAD 명령어는 테이블과 파일간의 데이터 이동을 지원합니다.

db2

②5가지 유형의 데이터 파일과 CURSOR를 지원합니다.

db2

③ASC파일 유형은 에디터로 편집이 가능한 파일이며, 각 컬럼에 대응되는 데이터의 값들은 그 시 작 바이트와 종료 바이트의 위치가 동일합니다.


$ cat (데이터 파일명>.asc AAAA 312 2006-01-01 BB 4538 2006-02-01

④DEL 파일 유형도 에디터로 편집이 가능한 파일이며, 각 컬럼에 대응되는 데이터의 값들은 , (컴 마 부호)와 " (쌍따옴표 부호) 등의 구분자에 의해 구별됩니다.


$ cat (데이터 파일명>.del "AAAA", 312,"2006-01-01" "BB", 45,"2006-02-01"

⑤IXF 파일 유형은 데이터와 그 데이터에 대한 속성을 함께 가진 파일입니다. 에디터로 편집은 할 수 없으며, 새로운 테이블을 생성하고 데이터를 입력할 때 사용됩니다.

⑥CURSOR 유형은 소스 테이블에 SQL 쿼리문을 이용하여 조건에 맞는 결과 집합을 추출하여 데이터 파일을 생성하지 않은 채로 LOAD 유틸리티의 입력으로 사용하는 방법입니다.


EXPORT 유틸리티

①EXPORT 명령어에서 데이터를 추출할 SELECT문과 출력 파일명을 지정하면, SELECT문의 실 행으로 생성된 결과 집합을 지정한 출력 파일로 저장합니다.

db2

②데이터베이스에 접속하고 export 명령어로 DEL 유형의 파일에 데이터를 저장합니다.


$ db2 connect to (데이터베이스명> $ db2 "export to (출력파일명> of del messages (메시지파일명> (select문>"

③생성된 DEL 유형의 데이터 파일을 확인합니다.


$ cat (출력파일명>

④메시지 파일을 확인하여 오류가 있었는지 확인합니다.


$ cat (메시지파일명>

⑤WSF 유형의 파일은 Lotus 1-2-3과 Symphony 제품이 사용하는 파일의 형식입니다.


$ db2 "export to (출력파일명> of ixf (SELECT문>"

⑥IXF 유형의 파일로 데이터를 저장하면, 데이터와 컬럼의 속성 정보가 함께 저장되므로, 동일한 구조의 테이블을 생성하고 데이터도 함께 입력할 때 이용됩니다.


$ db2 "export to (출력파일명> of ixf (SELECT문>"

⑦EXPORT 유틸리티는 ASC 유형의 출력 파일을 지원하지 않으므로 , CLP를 이용하여 원하는 SELECT문을 실행하고, 그 결과를 출력 파일로 저장하는 간접적인 방법을 사용합니다.


$ db2 -x -o "(SELECT문>" > (출력파일명>
EXPORT 명령어

①EXPORT 명령어의 형식은 다음과 같습니다.

db2

②옵션에 대한 설명은 다음과 같습니다.

db2

③http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm. db2.luw.admin.cmd.doc/doc/r0008303.html 에서 MODIFIED BY 옵션에 사용 되는 (파일형식수정자> 정보를 확인합니다.


IMPORT 유틸리티

①데이터 파일을 준비하여 IMPORT 명령어를 실행하면 파일의 데이터를 INSERT 문으로 테이블 에 추가하거나 UPDATE 문으로 갱신합니다. IXF 유형을 사용하면 CREATE TABLE 문으로 테이블을 생성하고, INSERT 문으로 데이터를 추가합니다.

db2

②ASC 유형의 입력 파일에서 데이터를 테이블로 저장합니다. 반드시 METHOD L 옵션을 이용 하여 컬럼에 대응하는 필드의 위치를 지정해야 합니다.


$ db2 "import from 입력파일명> of asc METHOD L (시작위치 1> 종료위치 1>, 시작위치 2> 종료위치 2>, … , 시작위치 N> 종료위치 N>) messages 메시지파일명> 실행모드> into 목표테이블명>"

③DEL 유형의 입력 파일에서 데이터를 테이블로 저장합니다.


$ db2 "import from 입력파일명> of del messages 메시지파일명> 실행모드> into 목표테이블명>

④WSF 유형의 파일은 Lotus 1-2-3과 Symphony 제품이 사용하는 파일의 형식입니다. 목표 테이블에 데이터를 추가할 수 있습니다.


$ db2 "import from 입력파일명> of wsf messages 메시지파일명> 실행모드> into 목표테이블명>"

⑤IXF 유형의 파일을 이용하면 목표 테이블을 생성하고 데이터를 추가할 수 있습니다. 목표 테이블 이 이미 존재하면 데이터만 추가할 수도 있습니다.


$ db2 "import from 입력파일명> of ixf messages 메시지파일명> 실행모드> into 목표테이블명>"
IMPORT 명령어

①IMPORT 명령어의 형식은 다음과 같습니다.

db2

②옵션에 대한 설명은 다음과 같습니다.

db2

http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm. db2.luw.admin.cmd.doc/doc/r0008304.html 에서 MODIFIED BY 옵션에 사용 되는 (파일형식수정자) 정보를 확인합니다.


LOAD 유틸리티

①데이터 파일을 준비하여 LOAD 명령어를 실행하면, 입력된 데이터는 목표 테이블과 인덱스에 반영되고, 고유 인덱스를 위반한 데이터는 목표 테이블에 입력되지 않습니다. LOAD 명령어는 내부적으로 LOAD, BUILD, DELETE 과정을 실행합니다.

db2

②성공적으로 입력되지 못한 데이터는 예외 테이블에 저장합니다. 예외 테이블은 목표 테이블과 동 일한 구조로 생성하며, 예외 데이터로 처리된 이유를 저장하기 위해 2개의 컬럼이 추가로 필요합 니다.


$ db2 "create table 예외테이블> like 목표테이블>" $ db2 "alter table 예외테이블> add column ts timestamp add column msg clob(32K)"

③아카이브 로깅에서 load 명령어가 완료된 후에 목표 테이블이 속한 테이블스페이스는 '백업 보 류 (Backup Pending)' 상태가 될 수 있습니다. backup db 명령어로 해결합니다.

④load 명령어가 완료된 후에 목표 테이블에 외부키 또는 컬럼 제약 조건이 있으면, 목표 테이블 은 '점검 보류 (Check Pending)' 상태가 됩니다. set integrity 명령어로 해결합니다.


LOAD 명령어

①LOAD 명령어의 형식은 다음과 같습니다.

db2

②옵션에 대한 설명은 다음과 같습니다.

db2

http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm. db2.luw.admin.cmd.doc/doc/r0008305.html 에서 MODIFIED BY 옵션에 사용 되는 파일형식수정자> 정보를 확인합니다.


LOAD QUERY 명령어

①LOAD QUERY 명령어의 형식은 다음과 같습니다.

db2

②옵션에 대한 설명은 다음과 같습니다.

db2

③데이터베이스에 접속한 후에 load query 명령어를 실행합니다.


$ db2 connect to DB명>
$ db2 load query table 목표테이블명> TO 메시지파일명>
$ db2 load query table 목표테이블명> NOSUMMARY
$ db2 load query table 목표테이블명> SUMMARYONLY
$ db2 load query table 목표테이블명> summaryonly SHOWDELTA

db2


LOAD 단계

①입력 파일에 대해 다음과 같은 작업들을 실행합니다.

db2

②목표 테이블에 데이터를 입력하는 모드는 2가지가 있습니다.

db2

③load query table 명령어로 복사 작업의 진행 정도를 확인할 수 있습니다. 테이블스페이스 의 상태는 '로드 진행 중 (Load in Progress)' 가 됩니다.

④이 단계에서 실패하면, 목표 테이블은 '로드 보류 (Load Pending)' 상태가 됩니다. 로드 보 류 상태는 다음의 2가지 모드를 이용하여 load 명령어를 다시 실행하여 해결합니다.

db2

⑤성공적으로 완료되면, 덤프 파일과 메시지 파일을 확인합니다. 유효하지 못한 데이터로 분류되어 테이블에 추가되지 못한 데이터와 그 원인을 확인할 수 있습니다.


$ cat 메시지파일명> $ cat 덤프파일명>
BUILD 단계

①LOAD 단계에서 수집된 인덱스의 정보를 이용하여 새로 추가된 데이터를 인덱스에 반영하는 방법은 2 가지가 있습니다.

db2

②인덱스의 재생성 여부는 4가지의 INDEXING MODE 옵션에 의해 결정됩니다.

db2

③load query table 명령어로 인덱스 재생성 또는 갱신 작업의 진행 정도를 확인할 수 있습니 다. 테이블스페이스의 상태는 '로드 진행 중 (Load in Progress)' 가 됩니다.

④이 단계에서 실패하면, 목표 테이블은 '로드 보류 (Load Pending)' 상태가 됩니다. 로드 보 류 상태는 다음의 2가지 모드를 이용하여 해mg/dbguide/db2_operation_guide/111124_pro_thumb67.jpg" vspace="8">

⑤성공적으로 완료되면, 메시지 파일을 확인합니다.


$ cat 메시지파일명>
DELETE 단계

①LOAD 단계에서 복사된 데이터에 대해서 다음과 같이 점검합니다.

db2

②FOR EXCEPTION 옵션으로 고유 인덱스를 위반한 행을 저장할 예외 테이블명을 지정합니다.

db2

③load query table 명령어로 고유 인덱스 위반 행 점검 작업의 진행 정도를 확인할 수 있습 니다. 테이블스페이스의 상태는 '삭제 진행 중 (Delete in Progress)' 가 됩니다.

④이 단계에서 실패하면, 목표 테이블은 '삭제 보류 (Delete Pending)' 상태가 됩니다. 삭제 보류 상태는 RESTART 또는 TERMINATE 옵션으로 해결합니다.

db2

⑤성공적으로 완료되면, 예외 테이블을 이용하여 고유 인덱스를 위반한 행을 확인합니다.


$ db2 "select * from 예외테이블명>"
백업 보류 상태

①load 명령어의 COPY 옵션으로 제어합니다. 기본 옵션은 COPY NO 입니다.

db2

②COPY YES 옵션을 지정하면, load 명령어를 실행하는 동안 추가된 데이터에 대한 백업 이미 지를 생성하며, 완료한 후에 '백업 보류' 상태가 되지 않습니다.

COPY 옵션이 기본값인 NO 였다면, load 명령어를 완료한 후에 목표 테이블이 속한 테이블 스페이스는 '백업 보류 (Backup Pending)' 상태가 됩니다. backup db 명령어에서 TABLESPACE 옵션을 이용하여 해당 테이블스페이스를 백업하여 해결합니다.


$ db2 backup db online tablespace 목표테이블스페이스명>

④NONRECOVERABLE 옵션을 지정하면, load 명령어를 완료한 후에 '백업 보류' 상태가 되 지 않습니다. ROLLFORWARD 복구시에 rollforward db 명령어로 로그 파일을 재적용할 때, 목표 테이블에 LOAD 유틸리티로 추가한 데이터는 복구가 불가능합니다.


점검 보류 상태

①set integrity 문은 테이블의 외부키와 점검 제한 조건을 만족하지 않는 행을 검출하여 테이블 에서 삭제하고 예외 테이블에 저장합니다.

db2

②옵션에 대한 설명은 다음과 같습니다.

db2

③'점검 보류' 상태에 있는 테이블에 대해 set integrity 문을 실행합니다.


db2 "set integrity for 목표테이블명> immediate checked for exception in 목표테이블명> use 예외테이블명>"

④예외 테이블을 이용하여 외부키와 점검 제한 조건을 위반한 행을 확인합니다.


$ db2 "select * from 예외테이블명>"
LOAD 시나리오

①목표 테이블을 생성하고, 기본 데이터를 입력하는 SQL문을 작성하여, kes.sql 로 저장합니다.


$ vi kes.sql
DROP TABLE kes.empl;
DROP TABLE kes.dept;
CREATE TABLE kes.dept (
id smallint not null
, name varchar(20) not null
, budget int
) IN ts01;
ALTER TABLE kes.dept ADD
CONSTRAINT dept_pk01 PRIMARY KEY (id);
CREATE TABLE kes.empl (
id smallint not null
, name varchar(30) not null
, sex char(1)
, mydept smallint
, salary smallint
, email varchar(30) not null
, hiredate date
) in ts02;
ALTER TABLE kes.empl ADD CONSTRAINT empl_pk01
PRIMARY KEY(id);
ALTER TABLE kes.empl ADD CONSTRAINT empl_uk01
UNIQUE (email);
ALTER TABLE kes.empl ADD CONSTRAINT empl_fk01
FOREIGN KEY(mydept) REFERENCES kes.dept ;
ALTER TABLE kes.empl ADD CONSTRAINT empl_cc01
CHECK (sex = 'M' or sex ='F');
INSERT INTO kes.dept VALUES
(1,'총무팀',1000), (2,'기술지원팀', 2000) , (3,'POST팀',1500);
INSERT INTO kes.empl VALUES
(1,'KES','F',1,100,'kes@kr.ibm.com','1993-01-30')
, (2,'KHY','F',3,250,'khy@kr.ibm.com','1992-03-17')
, (3,'JHS','F',2,300,'jhs@kr.ibm.com','1997-02-03')
, (4,'JJY','M',2,280,'jjy@kr.ibm.com','1998-07-22');

②CLP를 이용하여 kes.sql 파일의 SQL문을 실행합니다.


$ db2 connect to sample $ db2 ?tvf kes.sql
LOAD 시나리오

입력 데이터를 준비하여 DEL 유형의 /work/kes.del 파일로 저장합니다.


$ vi /work/kes.del
11,"이문세","M", 1, 100, "lms@kr.ibm.com" , "2002-03-07"
11,"김경호","M", 2, 200, "kkh@kr.ibm.com", "2001-04-25"
13,"이기찬","M", 1, 300, "lkc@kr.ibm.com", "2002-02-19"
14,"김현정","F", 3, 400, "lkc@kr.ibm.com", "2002-07-17"
15,"김건모","m" ,2, 500, "kkm@kr.ibm.com", "2001-08-02"
16,"제이","F", 1, 120, "j@kr.ibm.com", "2000-05-08"
17,"양희은","F", 2, "130", "yhe@kr.ibm.com", "2002-10-20"
18, ,"M", 2, 140, "god@kr.ibm.com", "2001-11-29"
19,"신화","M", 4 , 150, "sh@kr.ibm.com", "2001-04-07"
"20","엄정화","F", 1, 160, "ejw@kr.ibm.com", "2001-04-28"

추가되지 못한 행들을 확인하기 위해 예외 테이블인 kes.emplexcp를 미리 생성합니다.


$ db2 "CREATE TABLE kes.emplexcp LIKE kes.empl"
$ db2 "ALTER TABLE kes.emplexcp ADD COLUMN ts timestamp"
$ db2 "ALTER TABLE kes.emplexcp ADD COLUMN msg clob(32K)"

목표 테이블의 인덱스를 확인합니다.

db2

목표 테이블의 현재 데이터를 확인합니다.

db2


LOAD 시나리오

⑦kes.del 파일에서 kes.empl 테이블로 데이터를 저장할 load 명령어를 작성하여 kes.db2 라는 파일에 저장합니다.


$ vi kes.db2
LOAD FROM /work/kes.del OF DEL
MODIFIED BY dumpfile=/work/kes.dmp
SAVECOUNT 10000
MESSAGES /work/kes.msgs
INSERT INTO kes.empl
FOR EXCEPTION kes.emplexcp;

⑧CLP를 이용하여 kes.db2 파일의 load 명령어를 실행합니다.


$ db2 ?stvf kes.db2

⑨다른 세션을 열고, load query 명령어를 이용하여 load 명령어의 진행 상태를 확인합니다.

db2


LOAD 시나리오

⑩load 명령어가 완료되면, 메시지 파일을 확인하여 유효하지 못한 데이터로 분류되어 테이블에 추가되지 못한 데이터와 그 이유를 확인합니다.

db2


LOAD 시나리오

⑪덤프 파일을 확인하면 유효하지 못한 데이터가 저장된 것을 확인합니다.

db2

⑫예외 테이블을 이용하여 고유 인덱스를 위반한 행이 입력되었는지 확인합니다.

db2

⑬load 명령어를 실행 도중에 오류가 발생하면, RESTART 옵션으로 마지막 실패 지점 이후부터 계속할 수 있습니다. kes.db2 파일에서 INSERT옵션을 RESTART 옵션으로 변경하여 다시 실 행합니다.


$ vi kes.db2
LOAD FROM /work/kes.del OF DEL
SAVECOUNT 10000
MODIFIED BY dumpfile /work/kes.dmp
MESSAGES /work/kes.msgs
RESTART INTO kes.empl
FOR EXCEPTION kes.emplexcp;
$ db2 ?stvf kes.db2

⑭load 명령어를 실행 도중에 오류가 발생하면, TERMINATE 옵션으로 load 명령어를 취소할 수 있습니다. kes.db2 파일에서 INSERT옵션을 TERMINATE 옵션으로 변경하여 다시 실행 합니다. 테이블의 데이터는 load 명령어를 실행하기 전으로 복구됩니다.


$ vi kes.db2
LOAD FROM /work/kes.del OF DEL
SAVECOUNT 10000
MODIFIED BY dumpfile /work/kes.dmp
MESSAGES /work/kes.msgs
TERMINATE INTO kes.empl
FOR EXCEPTION kes.emplexcp;
$ db2 ?svtf kes.db2
LOAD 시나리오

(15)목표 테이블이 속한 테이블스페이스의 상태를 확인합니다.

db2

(16)'백업 보류' 상태를 해결하려면, BACKUP DB 명령어로 테이블스페이스 ts02를 백업합니다.

db2

(17)BACKUP DB 명령어를 실행한 세션의 데이터베이스 접속은 자동적으로 해제됩니다. 다시 데 이터베이스에 접속합니다.

db2

(18)목표 테이블의 데이터를 확인합니다.

db2


LOAD 시나리오

(19)SQL0668N 은 '점검 보류' 상태를 의미합니다. 정확한 에러 메시지를 확인합니다.

db2

(20)시스템 카탈로그에서 테이블에 대한 정보를 확인하면, 테이블에 대한 제한 조건이 점검되지 않았 다는 것을 확인할 수 있습니다.

db2

(21)'점검 보류' 상태를 해결하려면, SET INTEGRITY 명령어로 외부키와 점검 제한 조건을 위반한 행을 점검합니다. 위반한 행은 예외 테이블에 저장됩니다.

db2

(22)예외 테이블을 이용하여 외부키와 점검 제한 조건을 위반한 행이 입력되었는지 확인합니다.

db2


LOAD 시나리오

목표 테이블의 최종 데이터를 확인합니다.

db2


Cursor Load

①먼저 사용자 정의 커서를 선언한 후, Cursor로부터 데이터를 로드합니다.


$cat cursorload.sql
DECLARE cur1 CURSOR for select * from ORA10.CUSTOMER WITH UR;
LOAD FROM cur1 OF CURSOR INSERT INTO DB2.CUSTOMER;
DECLARE cur2 CURSOR for select * from ORA10.ORDERS WITH UR;
LOAD FROM cur2 OF CURSOR INSERT INTO DB2.ORDERS;
DECLARE cur3 CURSOR for select * from ORA10.CUSTOMER WITH UR;
LOAD FROM cur3 OF CURSOR INSERT INTO DB2.CUSTOMER;
DECLARE cur4 CURSOR for select * from ORA10.CUSTOMER WITH UR;
LOAD FROM cur4 OF CURSOR INSERT INTO DB2.CUSTOMER;
$db2 ?stvf cursorload.sql

②이 기종 데이터베이스로부터 데이터를 이관하고자 하는 경우에는 Federation을 구성하고, 미리 사용될 테이블들에 대해 아래와 같이 Nickname을 정의합니다.


$cat createnick.sql
CREATE NICKNAME ORA10.CUSTOMER for ora10.DBOWN.CUSTOMER;
CREATE NICKNAME ORA10.ORDER for ora10.DBOWN.ORDERS;
CREATE NICKNAME ORA10.PRODUCT for ora10.DBOWN.PRODUCT;
CREATE NICKNAME ORA10.LINEITEM for ora10.DBOWN.LINEITEM;
$db2 ?stvf createnick.sql