'Database/DB2'에 해당되는 글 3건

안녕하세요 피터입니다.

IBM의 DBMS인 db2에서 특정 테이블을 import 하는 방법을 소개하겠습니다.


bulkinsert 란 일반적으로 대용량 데이터를 건별로 insert 문을 이용해서 데이터를 입력하는 것은 매우 리소스 사용 측면이나 성능 측면에서 모두 비효율적이기 때문에 구조화된 데이터 (ex CSV) 파일로부터 단일 트랜잭션(transaction)으로 한번에 입력하는 방법을 말합니다.


import 명령어는 주로 대용량 데이터를 처리할 때 사용하며 export 로 추출한 데이터 파일이나 기타 형식화된 파일을 bulk 방식으로 table에 insert 할 때 사용합니다.

[DB2] 특정 테이블 export 하기



db2 계정으로 로그인 후 아래와 같이 명령어 수행

db2 connect
db2 "import from test.del of del insert into tbtest"



import가 완료되면 아래 처럼 몇 행이 처리되었는지 확인할 수 있습니다.


[db2inst2@localhost ~]$ db2 "import from test.del of del insert into tbtest"
SQL3109N  The utility is beginning to load data from file "test.del".

SQL3110N  The utility has completed processing.  "4096" rows were read from
the input file.

SQL3221W  ...Begin COMMIT WORK. Input Record Count = "4096".

SQL3222W  ...COMMIT of any database changes was successful.

SQL3149N  "4096" rows were processed from the input file.  "4096" rows were
successfully inserted into the table.  "0" rows were rejected.


Number of rows read         = 4096
Number of rows skipped      = 0
Number of rows inserted     = 4096
Number of rows updated      = 0
Number of rows rejected     = 0
Number of rows committed    = 4096

test.del 파일에서 읽은 rows 개수가 4096 이고,

tbtest 테이블에 insert 된 건수가 4096,

commit 완료된 행수가 4096 으로 확인됩니다.


중간에 포맷이 맞지 않거나 키 위반 등의 사유로 insert가 실패되면 해당 건수가 reject 항목에 표시되며 에러 로그가 출력됩니다.


때때로 파일에 존재하는 데이터가 너무 방대하여 transaction log full 이 발생할 수 있습니다.

이런 경우에는 트랜잭션 중간 중간마다 commit을 수행해주면 되는데요, commitcount 값을 지정해주면 특정 건수 마다 commit 처리할 수 있습니다.

db2 "import from test.del of del commitcount 100000 insert into tbtest"

위와같이 commitcount로 지정된 rows 마다 commit을 자동으로 수행하면서 insert 해줍니다.



- Peter의 우아한 프로그래밍

여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 남겨주시면 감사하겠습니다.

'Database > DB2' 카테고리의 다른 글

[DB2] import 로 bulkinsert 하기  (0) 2018.06.22
[DB2] DBI1309E 에러 발생 시  (0) 2018.05.17
[DB2] 특정 테이블 export 하기  (0) 2018.05.03
블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

안녕하세요 피터입니다.

DB2에서 아래와 같이 DBI1309E 에러가 발생하는 경우에는 주요 설정 파일의 권한 문제일 가능성이 높습니다.


DBI1309E  System error.

Explanation:

The tool encountered an operating system error.

User response:

A system error was encountered during registry access. Ensure that there
is enough space on the file system where the registry is located, the
correct file permissions are set, and that there is a valid LAN
connection if the registry is remote.


1. profile.env 파일 권한 확인


root@localhost ~]# ls -l /db2home/db2계정/sqllib/profile.env
-rw-rw-r-- 1 db2계정 db2iadm1 128 4월 13 09:49 /db2home/db2inst2/sqllib/profile.env

profile.env 파일의 권한이 664 가 아니거나 소유주가 db2계정이 아닌 경우에 에러가 발생될 수 있습니다.

이런 경우 chmod, chown 명령어를 이용해서 권한을 위와 같이 변경해주시면 됩니다.


2. /var/db2/global.reg 파일 권한 확인

[root@localhost ~]# ls -l /var/db2/global.reg
-rw-r--r-- 1 root root 1040 4월 12 20:07 /var/db2/global.reg

othersread 권한이 없거나 소유주가 root가 아닌 경우 에러가 발생할 수 있습니다.

위와 같이 변경해주세요.



-Peter의 우아한 프로그래밍

여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

'Database > DB2' 카테고리의 다른 글

[DB2] import 로 bulkinsert 하기  (0) 2018.06.22
[DB2] DBI1309E 에러 발생 시  (0) 2018.05.17
[DB2] 특정 테이블 export 하기  (0) 2018.05.03
블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요

안녕하세요 피터입니다.

IBM의 DBMS인 db2에서 특정 테이블을 export 하는 방법을 소개하겠습니다.


export 명령어는 주로 대용량 데이터를 처리할 때 사용하며 table의 데이터를 file로 추출하기 때문에 db2 shell 에서 작업하는 것이 일반적입니다.


db2 계정으로 로그인 후 아래와 같이 명령어 수행

db2 connect
db2 "export to test.del of del select * from tmptable"


export가 완료되면 test.del 파일에 csv형태로 데이터가 저장됩니다.

※ csv(comma seperated value): 각 값이 콤마(,) 로 구분된 데이터

문자열 데이터는 "" 로 감싸여진 형태로 되어 있고, 숫자형 데이터는 "" 없이 값이 그대로 저장되기 때문에 구분이 가능합니다.

이렇게 export의 결과물인 del 파일을 이용해서 다시 db2 명령어인 import를 하면 파일의 데이터를 데이터베이스에 저장할 수 있습니다.


특정 조건으로 데이터를 추출하고자 할 때는 select * from 구문에 where 절을 추가하면 됩니다.


ex) servertime이 2018년 5월 3일 이후인 데이터만 추출

db2 "export to test.del of del select * from tmptable 
where servertime > to_date('2018-05-03 00:00:00', 'YYYY-MM-DD HH24:MI:SS')"


export 와 import 는 일반적인 sql 쿼리 구문보다 속도가 빠르기 때문에 대용량 데이터를 처리하고자 할 때 유용하게 사용할 수 있습니다.


예를 들면 특정 테이블에 데이터가 많이 누적되어 일정 시점 이전의 로그를 삭제하고자 할 때 delete 구문을 사용하여 where 조건을 주고 실행하면 성능도 느리지만 transaction log가 대량으로 생성되어 최악의 경우 transaction log full로 인해 rollback 이 발생될 수 있습니다.

이럴 때 export 기능을 활용하면 유용합니다.

위 예제처럼 특정 기간 이후의 데이터만 export 한 후 table을 truncate 한 후에 추출한 파일을 다시 테이블에 import 하면 됩니다.

[DB2] import 로 bulkinsert 하기



- Peter의 우아한 프로그래밍

여러분의 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.

'Database > DB2' 카테고리의 다른 글

[DB2] import 로 bulkinsert 하기  (0) 2018.06.22
[DB2] DBI1309E 에러 발생 시  (0) 2018.05.17
[DB2] 특정 테이블 export 하기  (0) 2018.05.03
블로그 이미지

친절한 Peter Ahn

IT 정보 공유, 프로그래밍 지식 공유

댓글을 달아 주세요