DBMS 2
DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!
①EXPORT, IMPORT, LOAD 명령어는 테이블과 파일간의 데이터 이동을 지원합니다. ②5가지 유형의 데이터 파일과 CURSOR를 지원합니다. ③ASC파일 유형은 에디터로 편집이 가능한 파일이며, 각 컬럼에 대응되는 데이터의 값들은 그 시 작 바이트와 종료 바이트의 위치가 동일합니다. ④DEL 파일 유형도 에디터로 편집이 가능한 파일이며, 각 컬럼에 대응되는 데이터의 값들은 , (컴 마 부호)와 " (쌍따옴표 부호) 등의 구분자에 의해 구별됩니다. ⑤IXF 파일 유형은 데이터와 그 데이터에 대한 속성을 함께 가진 파일입니다. 에디터로 편집은 할 수 없으며, 새로운 테이블을 생성하고 데이터를 입력할 때 사용됩니다. ⑥CURSOR 유형은 소스 테이블에 SQL 쿼리문을 이용하여 조건에 맞는 결과 집합을 추출하여 데이터 파일을 생성하지 않은 채로 LOAD 유틸리티의 입력으로 사용하는 방법입니다. ①EXPORT 명령어에서 데이터를 추출할 SELECT문과 출력 파일명을 지정하면, SELECT문의 실 행으로 생성된 결과 집합을 지정한 출력 파일로 저장합니다. ②데이터베이스에 접속하고 export 명령어로 DEL 유형의 파일에 데이터를 저장합니다. ③생성된 DEL 유형의 데이터 파일을 확인합니다. ④메시지 파일을 확인하여 오류가 있었는지 확인합니다. ⑤WSF 유형의 파일은 Lotus 1-2-3과 Symphony 제품이 사용하는 파일의 형식입니다. ⑥IXF 유형의 파일로 데이터를 저장하면, 데이터와 컬럼의 속성 정보가 함께 저장되므로, 동일한 구조의 테이블을 생성하고 데이터도 함께 입력할 때 이용됩니다. ⑦EXPORT 유틸리티는 ASC 유형의 출력 파일을 지원하지 않으므로 , CLP를 이용하여 원하는 SELECT문을 실행하고, 그 결과를 출력 파일로 저장하는 간접적인 방법을 사용합니다. ①EXPORT 명령어의 형식은 다음과 같습니다. ②옵션에 대한 설명은 다음과 같습니다. ③http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm. db2.luw.admin.cmd.doc/doc/r0008303.html 에서 MODIFIED BY 옵션에 사용 되는 (파일형식수정자> 정보를 확인합니다. ①데이터 파일을 준비하여 IMPORT 명령어를 실행하면 파일의 데이터를 INSERT 문으로 테이블 에 추가하거나 UPDATE 문으로 갱신합니다. IXF 유형을 사용하면 CREATE TABLE 문으로 테이블을 생성하고, INSERT 문으로 데이터를 추가합니다. ②ASC 유형의 입력 파일에서 데이터를 테이블로 저장합니다. 반드시 METHOD L 옵션을 이용 하여 컬럼에 대응하는 필드의 위치를 지정해야 합니다. ③DEL 유형의 입력 파일에서 데이터를 테이블로 저장합니다. ④WSF 유형의 파일은 Lotus 1-2-3과 Symphony 제품이 사용하는 파일의 형식입니다. 목표 테이블에 데이터를 추가할 수 있습니다. ⑤IXF 유형의 파일을 이용하면 목표 테이블을 생성하고 데이터를 추가할 수 있습니다. 목표 테이블 이 이미 존재하면 데이터만 추가할 수도 있습니다. ①IMPORT 명령어의 형식은 다음과 같습니다. ②옵션에 대한 설명은 다음과 같습니다. http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm. db2.luw.admin.cmd.doc/doc/r0008304.html 에서 MODIFIED BY 옵션에 사용 되는 (파일형식수정자) 정보를 확인합니다. ①데이터 파일을 준비하여 LOAD 명령어를 실행하면, 입력된 데이터는 목표 테이블과 인덱스에 반영되고, 고유 인덱스를 위반한 데이터는 목표 테이블에 입력되지 않습니다. LOAD 명령어는 내부적으로 LOAD, BUILD, DELETE 과정을 실행합니다. ②성공적으로 입력되지 못한 데이터는 예외 테이블에 저장합니다. 예외 테이블은 목표 테이블과 동 일한 구조로 생성하며, 예외 데이터로 처리된 이유를 저장하기 위해 2개의 컬럼이 추가로 필요합 니다. ③아카이브 로깅에서 load 명령어가 완료된 후에 목표 테이블이 속한 테이블스페이스는 '백업 보 류 (Backup Pending)' 상태가 될 수 있습니다. backup db 명령어로 해결합니다. ④load 명령어가 완료된 후에 목표 테이블에 외부키 또는 컬럼 제약 조건이 있으면, 목표 테이블 은 '점검 보류 (Check Pending)' 상태가 됩니다. set integrity 명령어로 해결합니다. ①LOAD 명령어의 형식은 다음과 같습니다. ②옵션에 대한 설명은 다음과 같습니다. 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 명령어를 실행합니다. ①입력 파일에 대해 다음과 같은 작업들을 실행합니다. ②목표 테이블에 데이터를 입력하는 모드는 2가지가 있습니다. ③load query table 명령어로 복사 작업의 진행 정도를 확인할 수 있습니다. 테이블스페이스 의 상태는 '로드 진행 중 (Load in Progress)' 가 됩니다. ④이 단계에서 실패하면, 목표 테이블은 '로드 보류 (Load Pending)' 상태가 됩니다. 로드 보 류 상태는 다음의 2가지 모드를 이용하여 load 명령어를 다시 실행하여 해결합니다. ⑤성공적으로 완료되면, 덤프 파일과 메시지 파일을 확인합니다. 유효하지 못한 데이터로 분류되어 테이블에 추가되지 못한 데이터와 그 원인을 확인할 수 있습니다. ①LOAD 단계에서 수집된 인덱스의 정보를 이용하여 새로 추가된 데이터를 인덱스에 반영하는 방법은 2 가지가 있습니다. ②인덱스의 재생성 여부는 4가지의 INDEXING MODE 옵션에 의해 결정됩니다. ③load query table 명령어로 인덱스 재생성 또는 갱신 작업의 진행 정도를 확인할 수 있습니 다. 테이블스페이스의 상태는 '로드 진행 중 (Load in Progress)' 가 됩니다. ④이 단계에서 실패하면, 목표 테이블은 '로드 보류 (Load Pending)' 상태가 됩니다. 로드 보 류 상태는 다음의 2가지 모드를 이용하여 해mg/dbguide/db2_operation_guide/111124_pro_thumb67.jpg" vspace="8"> ⑤성공적으로 완료되면, 메시지 파일을 확인합니다. ①LOAD 단계에서 복사된 데이터에 대해서 다음과 같이 점검합니다. ②FOR EXCEPTION 옵션으로 고유 인덱스를 위반한 행을 저장할 예외 테이블명을 지정합니다. ③load query table 명령어로 고유 인덱스 위반 행 점검 작업의 진행 정도를 확인할 수 있습 니다. 테이블스페이스의 상태는 '삭제 진행 중 (Delete in Progress)' 가 됩니다. ④이 단계에서 실패하면, 목표 테이블은 '삭제 보류 (Delete Pending)' 상태가 됩니다. 삭제 보류 상태는 RESTART 또는 TERMINATE 옵션으로 해결합니다. ⑤성공적으로 완료되면, 예외 테이블을 이용하여 고유 인덱스를 위반한 행을 확인합니다. ①load 명령어의 COPY 옵션으로 제어합니다. 기본 옵션은 COPY NO 입니다. ②COPY YES 옵션을 지정하면, load 명령어를 실행하는 동안 추가된 데이터에 대한 백업 이미 지를 생성하며, 완료한 후에 '백업 보류' 상태가 되지 않습니다. COPY 옵션이 기본값인 NO 였다면, load 명령어를 완료한 후에 목표 테이블이 속한 테이블 스페이스는 '백업 보류 (Backup Pending)' 상태가 됩니다. backup db 명령어에서 TABLESPACE 옵션을 이용하여 해당 테이블스페이스를 백업하여 해결합니다. ④NONRECOVERABLE 옵션을 지정하면, load 명령어를 완료한 후에 '백업 보류' 상태가 되 지 않습니다. ROLLFORWARD 복구시에 rollforward db 명령어로 로그 파일을 재적용할 때, 목표 테이블에 LOAD 유틸리티로 추가한 데이터는 복구가 불가능합니다. ①set integrity 문은 테이블의 외부키와 점검 제한 조건을 만족하지 않는 행을 검출하여 테이블 에서 삭제하고 예외 테이블에 저장합니다. ②옵션에 대한 설명은 다음과 같습니다. ③'점검 보류' 상태에 있는 테이블에 대해 set integrity 문을 실행합니다. ④예외 테이블을 이용하여 외부키와 점검 제한 조건을 위반한 행을 확인합니다. ①목표 테이블을 생성하고, 기본 데이터를 입력하는 SQL문을 작성하여, kes.sql 로 저장합니다. ②CLP를 이용하여 kes.sql 파일의 SQL문을 실행합니다. 입력 데이터를 준비하여 DEL 유형의 /work/kes.del 파일로 저장합니다. 추가되지 못한 행들을 확인하기 위해 예외 테이블인 kes.emplexcp를 미리 생성합니다. 목표 테이블의 인덱스를 확인합니다. 목표 테이블의 현재 데이터를 확인합니다. ⑦kes.del 파일에서 kes.empl 테이블로 데이터를 저장할 load 명령어를 작성하여 kes.db2 라는 파일에 저장합니다. ⑧CLP를 이용하여 kes.db2 파일의 load 명령어를 실행합니다. ⑨다른 세션을 열고, load query 명령어를 이용하여 load 명령어의 진행 상태를 확인합니다. ⑩load 명령어가 완료되면, 메시지 파일을 확인하여 유효하지 못한 데이터로 분류되어 테이블에 추가되지 못한 데이터와 그 이유를 확인합니다. ⑪덤프 파일을 확인하면 유효하지 못한 데이터가 저장된 것을 확인합니다. ⑫예외 테이블을 이용하여 고유 인덱스를 위반한 행이 입력되었는지 확인합니다. ⑬load 명령어를 실행 도중에 오류가 발생하면, RESTART 옵션으로 마지막 실패 지점 이후부터 계속할 수 있습니다. kes.db2 파일에서 INSERT옵션을 RESTART 옵션으로 변경하여 다시 실 행합니다. ⑭load 명령어를 실행 도중에 오류가 발생하면, TERMINATE 옵션으로 load 명령어를 취소할 수 있습니다. kes.db2 파일에서 INSERT옵션을 TERMINATE 옵션으로 변경하여 다시 실행 합니다. 테이블의 데이터는 load 명령어를 실행하기 전으로 복구됩니다. (15)목표 테이블이 속한 테이블스페이스의 상태를 확인합니다. (16)'백업 보류' 상태를 해결하려면, BACKUP DB 명령어로 테이블스페이스 ts02를 백업합니다. (17)BACKUP DB 명령어를 실행한 세션의 데이터베이스 접속은 자동적으로 해제됩니다. 다시 데 이터베이스에 접속합니다. (18)목표 테이블의 데이터를 확인합니다. (19)SQL0668N 은 '점검 보류' 상태를 의미합니다. 정확한 에러 메시지를 확인합니다. (20)시스템 카탈로그에서 테이블에 대한 정보를 확인하면, 테이블에 대한 제한 조건이 점검되지 않았 다는 것을 확인할 수 있습니다. (21)'점검 보류' 상태를 해결하려면, SET INTEGRITY 명령어로 외부키와 점검 제한 조건을 위반한 행을 점검합니다. 위반한 행은 예외 테이블에 저장됩니다. (22)예외 테이블을 이용하여 외부키와 점검 제한 조건을 위반한 행이 입력되었는지 확인합니다. 목표 테이블의 최종 데이터를 확인합니다. ①먼저 사용자 정의 커서를 선언한 후, Cursor로부터 데이터를 로드합니다. ②이 기종 데이터베이스로부터 데이터를 이관하고자 하는 경우에는 Federation을 구성하고, 미리 사용될 테이블들에 대해 아래와 같이 Nickname을 정의합니다.데이터이동
데이터이동
데이터 파일의 유형
$ cat (데이터 파일명>.asc AAAA 312 2006-01-01 BB 4538 2006-02-01
$ cat (데이터 파일명>.del "AAAA", 312,"2006-01-01" "BB", 45,"2006-02-01"
EXPORT 유틸리티
$ db2 connect to (데이터베이스명> $ db2 "export to (출력파일명> of del messages (메시지파일명> (select문>"
$ cat (출력파일명>
$ cat (메시지파일명>
$ db2 "export to (출력파일명> of ixf (SELECT문>"
$ db2 "export to (출력파일명> of ixf (SELECT문>"
$ db2 -x -o "(SELECT문>" > (출력파일명>
EXPORT 명령어
IMPORT 유틸리티
$ db2 "import from 입력파일명> of asc METHOD L (시작위치 1> 종료위치 1>, 시작위치 2> 종료위치 2>, … , 시작위치 N> 종료위치 N>) messages 메시지파일명> 실행모드> into 목표테이블명>"
$ db2 "import from 입력파일명> of del messages 메시지파일명> 실행모드> into 목표테이블명>
$ db2 "import from 입력파일명> of wsf messages 메시지파일명> 실행모드> into 목표테이블명>"
$ db2 "import from 입력파일명> of ixf messages 메시지파일명> 실행모드> into 목표테이블명>"
IMPORT 명령어
LOAD 유틸리티
$ db2 "create table 예외테이블> like 목표테이블>" $ db2 "alter table 예외테이블> add column ts timestamp add column msg clob(32K)"
LOAD 명령어
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
LOAD 단계
$ cat 메시지파일명> $ cat 덤프파일명>
BUILD 단계
$ cat 메시지파일명>
DELETE 단계
$ db2 "select * from 예외테이블명>"
백업 보류 상태
$ db2 backup db online tablespace 목표테이블스페이스명>
점검 보류 상태
db2 "set integrity for 목표테이블명> immediate checked for exception in 목표테이블명> use 예외테이블명>"
$ db2 "select * from 예외테이블명>"
LOAD 시나리오
$ 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');
$ db2 connect to sample $ db2 ?tvf kes.sql
LOAD 시나리오
$ 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"
$ 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)"
LOAD 시나리오
$ 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;
$ db2 ?stvf kes.db2
LOAD 시나리오
LOAD 시나리오
$ 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
$ 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.db2LOAD 시나리오
LOAD 시나리오
LOAD 시나리오
Cursor Load
$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
$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