DB2에서는 수행된 SQL을 분석할 수 있는 db2 벤치마크 도구를 제공한다.

db2batch 라는 도구를 통하여 SQL이 수행된 시간, SQL이 수행되면서 사용된 bufferpool 정보들도 확인이 가능하다.

 

다양한 옵션이 많지만 장황하지 않는 선에서 다음과 같이 명령어를 정리해 본다.

db2batch -d 데이터베이스 -f SQL_파일명 -a ID/PWD -m 변수값 -z 출력_파일명 -iso cs -car cc -o r 1 p 2 e yes

 

가장 간단한 옵션은 –f 옵션까지만 주어서 SQL문을 실행시키면 된다.

원격에서 실행하는 경우 –a 옵션을 주어 접속 계정 정보를 명시적으로 지정하고, –m 변수를 통하여 동적 SQL을 수행할 수도 있다.

 

jennifer 등을 통하여 실행된 동적SQL의 변수 값이 추출 가능한데, SQL문과 변수 값 리스트가 별도로 나오기 때문에 “정적SQL”로 만드는 작업이 번거로울 수 있다.  이런 경우 –m 옵션을 통하여 동적으로 SQL 성능 분석을 편하게 할 수 있을 것 같다.

 

-z 옵션은 결과 출력 파일 지정하는 옵션이며, –iso 는 격리수준(isolation level)을 의미하며 V9.7 이후 currently committed 이 지원되므로 –car cc 옵션을 주어도 무방할 듯 하다.

 

-o 옵션에는 세부 옵션들이 다양하게 존재한다. r 옵션은 실행된 SQL의 return 값을 몇 개 반환하게 할 지를 결정하는 경우로 50건 이상 넘어가는 결과 값의 경우 샘플로 몇 개의 데이터를 확인하고자 할 때 지정하면 될 듯 하다.

p 옵션은 성능 분석을 위한 데이터 수집을 하도록 하는 옵션으로 2 인 경우는 실행된 SQL 수행시간 이외 application snapshot 정보도 수집해 준다. 숫자가 커질수록 수집되는 snapshot 정보는 많아 진다. 해당 SQL이 어떤 자원을 어떻게 사용했는지 확인하고자 한다면 (app. snapshot 정보로도 충분하다고 생각이 들지만 더욱 더 상세하게 수집하고자 하는 경우) 숫자를 조정하면 될 듯 하다.

 

e 옵션은 explain 정보를 수집하는 옵션인데, 테스트를 해 본 바 수집되지는 않았다.

 

1. Static SQL 테스트

   sample 데이터베이스의 employee 테이블을 대상으로한 select 문으로 수행하였다.

 

SQL 문

cat > sql.db2 <<EOF
select * from emp where empno > 10 ;
EOF

 

실행

db2 "CALL SYSPROC.SYSINSTALLOBJECTS('EXPLAIN','C',NULL,CURRENT SCHEMA)"
db2batch -d sample -f sql.db2 -a db2inst/db2inst -z sql1.out -iso cs -car cc -o r 1 p 2 e yes

 

결과

* Timestamp: Tue Aug 27 2013 00:43:11 KORST
---------------------------------------------

* SQL Statement Number 1:

select * from emp where empno > 10 ;

(생략) 데이터 1건 결과

* 41 row(s) fetched, 1 row(s) output.

* Elapsed Time is:       0.011069 seconds

            Monitoring Information

Instance name                                  = db2inst

(생략)

            Application Snapshot


Application handle                         = 49923
Application status                         = UOW Waiting

(생략)

* Summary Table:

Type      Number      Repetitions Total Time (s) Min Time (s)   Max Time (s)   Arithmetic Mean Geometric Mean Row(s) Fetched Row(s) Output
--------- ----------- ----------- -------------- -------------- -------------- --------------- -------------- -------------- -------------
Statement           1           1       0.011069       0.011069       0.011069        0.011069       0.011069             41             1

* Total Entries:              1
* Total Time:                 0.011069 seconds
* Minimum Time:               0.011069 seconds
* Maximum Time:               0.011069 seconds
* Arithmetic Mean Time:       0.011069 seconds
* Geometric Mean Time:        0.011069 seconds
---------------------------------------------

 

 

2. 동적SQL 예제(1)

SQL 문

cat > par.db2 <<EOF
--#PARAM 1000
--#PARAM 'M'
select * from emp where salary > ? and sex = ?;
EOF

 

실행

db2batch -d sample -f par.db2 -z par.out -iso cs -car cc -o r 5 p 2

 

 

3. 동적SQL 예제(2)

SQL 문

cat > par.ins <<EOF
1000 'M'
EOF


cat > par.db2 <<EOF
select * from emp where salary > ? and sex = ?;
EOF

 

실행

db2batch -d sample -f par.db2 -m par.ins -z par.out -iso cs -car cc -o r 5 p 2

리눅스 환경에서 DB2 설치를 하여 사용하는 경우 고려해야 되는 parameter가 존재한다.

 

1. randomize_va_space = 0

   DB2는 “자체 메모리 주소 체계”를 만들어 주소를 관리하도록 설계되어져 있다. 그래서 db2pd –osinfo 에서 "virtual memory” 라고 메모리 항목이 표현된 것을 볼 수 있다.

DB2에서 메모리 주소를 가상화해서 사용하다보니, OS 레벨에서 메모리 주소가 가상화 되어지는 것을 메모리 관리 안정성 면에서 위험할 수 있다고 보는 것 같다.

그래서 IBM TechNote에서 리눅스 운영체제에서 랜덤 주소 공간 사용을 하지 못하도록 설정을 권장하고 있다.

개인적으로 운영 서버의 경우 설정될 필요가 있다고 생각이 든다. (개발이나 테스트 용도의 경우는 별도 설정할 필요는 없을 것 같다)

 

(참고) https://www-304.ibm.com/support/docview.wss?uid=swg21365583

 

2. vm.swappingness=0

   DB2 교육 준비를 위하 자료를 찾다가 보게 된 parameter로 DB2 정보센터에는 별도 언급이 없는 것으로 알고 있다.

   물리적 메모리 가용 공간이 존재해도 어떤(?) 이유에서 SWAP 공간을 사용하는 경우가 발생하여 성능 저하가 될 수 상황을 방지하기 위하여  DB 서버 환경에서는 SWAP공간 사용을 막는 설정을 권장하는 것 같다.

   개인적으로 운영 서버 구축 시, OS 및 업무 담당자와 협의를 통하여 적용 여부를 결정하는 것이 좋을 것 같다.

 

(참고) http://seuis398.blog.me/70128624124

 

3. vm.overcommit_memory = 2 & vm.overcommit_ratio = 99

    자원이 극도로 적게 할당된 상태의 고객사 개발서버 환경에서 DB2 서버가 갑자기 죽어버리는 경우를 경험한 적이 있다. 리눅스는 OOM Killer (Out-of-Memory Killer) 라는 daemon이 작동을 하여 메모리 부족 시 메모리를 많이 잡고 있는 Application을 kill 시키도록 설계가 되어 있다.

 

    어떤 면에서는 안전 장치가 되겠지만, 중요한 업무를 수행하는 Application이라면 큰 문제를 야기할 수 있는 프로세스라고 할 수 있지 않을까 싶다.

    검색해서 본 문서를 보면 DB서버의 경우는 OOM Kill이 발생하지 않도록 메모리 overcommit을 허용하도록 설정하는 것을 권장하는 것 같다.

    실제 물리적 메모리보다 많이 가지고 있도록 설정을 해 놓아 OOM Kill에 의해 비정상적으로 죽는 것을 방지하고,  DB서버 자체적으로 메모리 부족 예외 상황을 만나 예외 처리 되도록 하는 것을 권장하는 것 같다.

 

    이 parameter도 운영 서버 구축 시에 OS 담당자 및 업무 담당자와의 협의를 통해 결정하는 것이 좋을 것 같다.

 

(참고) http://www.mimul.com/pebble/default/2013/05/10/1368171783727.html

         http://zalhae.blog.me/30150887343

'Note' 카테고리의 다른 글

[관리] db2dart 와 db2 inspect  (0) 2013.08.27
[성능] SQL 성능 분석  (0) 2013.08.26
[관리] row migration 과 row chain  (0) 2013.06.26
[설치] 비루트 설치  (0) 2013.06.19
[관리] 테이블 상태 확인(SQL0668N)  (0) 2013.05.28

DB2의 데이터 관리는 page 단위로 이뤄진다. 그리고 지원하는 page 크기는 4K, 8K, 16K, 32K 가 존재한다.

이번 달에 출시된 V10.5 에서는 페이지 크기를 넘는 row를 기존 페이지에 관리할 수 있는 기능이 지원되었지만, 이런 page 단위의 데이터 관리는 IO 성능 관리에서 중요한 부분을 차지한다.

 

DB2에서는 여러 page에 데이터가 분리되어 들어가는 것을 허용하지 않기 때문에 데이터 단편화(?) 가 발생하지 않는다.

반면, 테이블을 생성 전 어떤 페이지 크기로 사용할 것인지 고민이 필요하다.

 

이런 데이터 단편화에 대한 의미는 2가지로 구분을 할 수 있는데, 일반적으로는 “row chain”으로 인식이 되는 것 같다.

그래서 경쟁사에 비해 DB2는 데이터 단편화가 발생하지 않는다는 말을 과거에 많이 들었고 경쟁사 대비 장점이였다.

 

그러나 DB2도 단편화는 발생한다. 이것을 DB2에서는 overflow라고 표현을 하는데  기존 record가 수정되면서 공간 부족으로 현재의 page에 저장이 되지 못하는 경우, 여유있는 페이지에 record를 저장하고 record가 저장된 위치만 현 page에 저장이 되는 현상을 말한다.

이것을 row migration 이라고 표현을 한다.

 

나름 엄격한 데이터 관리 방식으로 데이터 단편화를 현상을 원천 봉쇄를 하지만, 수정된 데이터에 대해서는 row migration은 발생할 수 있고

syscat.tables 뷰의 overflow 컬럼을 통하여 migration된 페이지를 확인할 수 있다.

이 수치가 커지는 경우 table reorg 및 index reorg 작업이 수행될 필요가 있다.

 

DB2 V9.5 (Viper II) 부터 root 이외 계정으로 설치가 가능해졌다.

특정 고객사 설치 작업 시, root가 필요한 사유를 작성해야 되는 경우가 있었으니, non root 설치 방식 지원은 업무 진행에 도움이 될 것이다.

 

비루트 설치의 제약사항은 DB2 설치 시 인스턴스 구성이 된다는 점이다. (1 엔진에 1 인스턴스 구성만 가능)

어떤 의미에서는 엔진과 인스턴스가 붙어있다고 말할 수 있을 것 같다.

 

설치 후를 비교하면 다음과 같은 차이가 있다.

1. root로 수행되는 프로세스의 소유자

# root 설치 인스턴스

$> db2_ps

    UID          CMD
db2inst          - 113:50 db2sysc 0 
   root          - 0:00 db2ckpwd 0 
   root          - 0:00 db2ckpwd 0
db2inst          - 0:00 db2vend (PD Vendor Process - 258) 
   root          - 0:00 db2ckpwd 0

 

# non root 설치 (인스턴스명: test)

UID       CMD
test       db2sysc 0
test       db2ckpwd 0
test       db2ckpwd 0
test       db2ckpwd 0

 

2. fence (루틴 소유자)

   인스턴스 계정과 fence 계정을 동일하게 하는 것은 개발환경에서만 권장하고, 운영시스템에서는 권장하지 않는 것으로 알고 있다.

   non-root 설치의 경우는 fence 계정과 인스턴스 계정이 동일해지는 점을 유의하고, 비루트 설치 시의 차이점을 고객에게 인지시켜야겠다.

 

# root 설치

$ db2pd -fmp

FMP:
Pool Size:       0
Max Pool Size:   200 ( Automatic )
Keep FMP:        YES
Initialized:     YES
Trusted Path:    /instance/inst10/sqllib/function/unfenced
Fenced User:     db2fenc
Shared Memory:   0x0000000201AE0420
IPC Pool:        0x0000000201AE0480



# non root 설치 (인스턴스명: test)

$ db2pd -fmp

FMP:
Pool Size:       0
Max Pool Size:   200 ( Automatic )
Keep FMP:        YES
Initialized:     YES
Trusted Path:    /instance/test/sqllib/function/unfenced
Fenced User:     test
Shared Memory:   0x0000000201AE0420
IPC Pool:        0x0000000201AE0480

 

3. fixpack 적용 시의 downtime

  비루트 방식의 설치는 엔진과 인스턴스가 동시에 진행되기 때문에 root 설치 방식의 fixpack 작업과는 조금 달라질 수 있다.

  개인적으로 fixpack을 적용하는 경우 사용 중인 엔진과 별도의 경로에 설치 후, 인스턴스를 update 해야 할 때만 운영중인 인스턴스를 중단한다.

  그러나 이런 방식의 fixpack은 비루트 방식에서는 불가능하다. (db2stop 후 fixpack 설치 작업 진행 함)

 

4. 기타

    root 설치의 경우 사용자 자원 제약(ulimit) 값을 설정하지 않는다, 그러나 비루트 설치의 경우 ulimit 값을 설정해야 한다.

DB2계정  hard  data     unlimited
DB2계정  hard  nofile  65536
DB2계정  hard  fsize    unlimited
DB2계정  soft  data     unlimited
DB2계정  soft  nofile  65536
DB2계정  soft  fsize    unlimited

 

     이외 OS기반 DB2 사용자 인증처리를 하도록 root 권한으로 설정작업이 필요하다.

#> cp ~/sqllib/cfg/db2rfe.cfg.sample db2rfe.cfg

INSTANCENAME=test
ENABLE_DB2_ACS=NO
ENABLE_HA=YES
ENABLE_OS_AUTHENTICATION=YES
RESERVE_REMOTE_CONNECTION=YES
SVCENAME=db2c_test
SVCEPORT=50001
RESERVE_TEXT_SEARCH_CONNECTION=NO

 

#> ~/sqllib/instance/db2rfe -f db2rfe.cfg

DBI1213I  Root feature HA has been enabled successfully.

DBI1213I  Root feature OS_AUTHENTICATION has been enabled successfully.

 

테스트해 본 바, SVCENAME, SVCEPORT 설정은 되지 않았다.

응답파일을 통한 비루트 설치 시, 인스턴스 DBM CFG의 SVCENAME 값은 포트번호로 설정이 되었다.

테이블 구조가 변경되거나, 정규화가 되어 RI가 존재하는 테이블을 사용하고 주기적으로 LOAD 작업이 발생한다면 SQL0668N 에러 메시지를 받게 될 것이다.

 

이런 경우는 테이블 상태 체크를 신속히 파악해야 되는데, 관리 뷰(AdminTabInfo)를 통해서 작업이 가능하다.

 

SELECT CASE LOAD_STATUS

               WHEN 'PENDING' THEN 'Load Pending'

               WHEN 'IN_PROGRESS' THEN 'I' ELSE 'N' END ,

           CASE REORG_PENDING

               WHEN 'Y' THEN 'R' ELSE 'N'

FROM SYSIBMADM.ADMINTABINFO

WHERE TABSCHEMA = ‘스키마’ AND TABNAME = ‘테이블’ AND TABTYPE='T' ;

 

데이터 컬럼 속성이 변경되거나, 컬럼이 삭제되는 경우 SQL0668N Reason Code 7 에러가 반환된다.

이런 경우 sysibmadm.admintabinfo 뷰를 조회하여 “재구성 보류”(reorg pending) 상태인지 확인이 가능하다.

 

만일 load 작업이 빈번하게 일어난다면, load 작업이 완료 후 load 대상 테이블들이 “로드 보류” 상태에 놓였는지 확인해 보도록 절차를 만들 필요가 있다.

SQL0668N Reason Code3 은 블로그에 전에 언급을 했지만, 여러 이유 (Dead Lock, Load Temp 공간 부족, 작업 강제 취소 등등) 로 Load 작업이 완료되지 못해서 발생한 것이다.

 

Load Pending 상태는 Load Query 구문을 통해서도 확인 가능하지만, View를 통해서 테이블 일괄 검사하는 것이 편한 방법일 것이다.

(최근 이 문제로 AdminTabInfo 뷰를 찾으려 했는데 기억나지 않아서 load query 방식으로 고객에게 안내해 준 기억이 난다..)

 

이외에도 RI(부모-자식 테이블 관계)가 존재하거나 Check 제약조건이 있는 테이블들도 Load 작업 이후 “데이터 무결성” 확인을 하는 것이 좋다. (Integrity Pending에 놓인 테이블의 경우 SELECT 는 가능해서 쉽게 찾아내기 어려울 수 있다.)

 

SELECT VARCHAR(TABNAME,16) TABNAME,

          CASE STATUS

               WHEN 'C' THEN 'Set integrity pending'

               WHEN 'Inoperative' THEN 'X'

              ELSE 'NORMAL' END TAB_STATUS

FROM SYSCAT.TABLES

WHERE TABSCHEMA = '스키마' AND TABNAME = '테이블' AND TYPE='T' ;

(참고로 inoperative 상태는 어떤 경우에 놓이는지 재현해서 확인해 보지 못했다.)

가끔씩이기는 하지만 파트너 사 아니면 DBA 분들로부터 위 2가지 관련한 문의를 받는다.

이미 V9.1 Viper는 2012년 4월 말 End Of Service가 되었고, 내년 V9.5 Viper2가 EOS된다.

현재 가장 많이 쓰이는 버전은 V9.7 코브라라고 할 수 있고, V10.1(갈릴레오)이 최신버전이라 할 수 있겠다.

금년 여름 V10.5 케플러가 출시된다는 소식이 있으니 IBM에서 고속 성장을 하고 있는 제품이라 할 수 있겠다.

 

1. 라이센스 파일 및 Activation Code

일반적으로 DB2 Edition 유형은 WSE, ESE, AESE 정도가 일반적인데, IBM Tech Note를 보면 많은 License가 존재한다.

DB2 라이센스는 시리얼 키 값이 아닌 Activation.zip 압축 파일에 lic 확장자를 가진 파일로 존재한다.

Value Package에 가입(년 200만원 정도)되어 있으면 activation.zip 파일을 다운받을 수 있다.

 

V9.7 Edition에 따른 Activation Code는 다음 문서를 참고하면 되겠다.

Value Package에서 원하는 license파일을 코드 값으로 쉽게 검색하고자 할 때 유용할 것 같다.

http://www-01.ibm.com/support/docview.wss?uid=swg21445568

 

V10.1 Edition Activation code는 다음과 같다.

http://www-01.ibm.com/support/docview.wss?uid=swg21594835

 

위에 기술된 라이센스 파일은 V9.7 정보센터에 기술되어 있다.

http://pic.dhe.ibm.com/infocenter/db2luw/v9r7/index.jsp?topic=%2Fcom.ibm.db2.luw.qb.server.doc%2Fdoc%2Fr0006748.html

 

라이센스 파일이 어떤 제품, 어떤 기능에 대한 것인지 위 문서를 통해 확인 할 수 있을 것이다.

보통 업무에서는 db2 edition 별 라이센스 파일 (WSE, ESE) 정도만 사용이 되는 편이다. 이외의 라이센스 파일은 사용되는 경우가 드물다.

 

2. 제품 서비스 종료일

제품이 빠르게 성장하는 만큼, Major 버전 당 수명이 평균 5년 정도쯤 되는 것 같다.

다른 DBMS와 수명기간을 비교하기는 힘들겠지만, 개인적으로는 좀 짧다는 느낌을 갖는다. (IT시장의 변화 속도를 감안해 본다면 짧은 수명이 나쁘다고만 할 수는 없을 것 같기도 하다.)

 

IBM FixPack 사이트에서는 V8까지 download 지원을 하고 있지만, 현재 V9.1까지 서비스가 종료된 상태다.

버전 별 EOS 일자는 아래 문서를 참고하면 되겠다.

http://www-01.ibm.com/support/docview.wss?uid=swg21168270

Red Hat Enterprise Linux 및 Cent OS에서 DB2를 설치를 하려고 db2prereqcheck 를 실행하면 libstdc++.so.5 와 /lib/libpam.so 가 없다고 메시지를 준다. 특히 64bit 운영체제에서 설치하는 경우 32bit rpm을 요구를 한다.

 

만일 해당 운영체제에 64bit 라이브러리가 설치되어져 있는 경우 32bit 라이브러리를 다음과 같은 방법으로 편하게 설치할 수 있다.

 

1. libstdc++ 라이브러리

 

#> rpm -qa | grep libstdc   (설치된 library 확인)

libstdc++-4.4.7-3.el6.x86_64
compat-libstdc++-296-2.96-144.el6.i686
compat-libstdc++-33-3.2.3-69.el6.x86_64

 

#> yum install libstdc++-4.4.7-3.el6*i686  (32bit rpm 설치)

 

 

2. libpam 라이브러리

 

#> rpm -qa | grep pam

pam-1.1.1-13.el6.x86_64
pam_krb5-2.3.11-9.el6.x86_64
fprintd-pam-0.1-20.git04fd09cfa.el6.x86_64
pam_passwdqc-1.0.5-6.el6.x86_64
gnome-keyring-pam-2.28.2-8.el6_3.x86_64

 

#> yum install pam-1.1.1-13*i686

db2의 진단로그(db2diag.log) 파일은 db2diag 유틸리티와 –fmt 옵션으로 포맷을 수정할 수 있다.

이외에도 테이블 함수를 사용해서 진단로그 내용을 SQL 방식으로 조회가 가능하다.

단 문제는 MSG 컬럼의 내용이 “줄바꿈”처리 되어 있는 경우 결과 값이 흐트러져서 나오는 문제점이 있다.

이 경우는 db2diag –fmt 옵션으로 볼 때도 마찬가지로 줄이 바뀌어져서 흐트러진다.

 

테이블 함수로 “줄 바꿈”하지 않고 처리할 수 있는 방법을 생각하다가 다음과 같은 함수를 사용해서 줄바꿈처리를 못하도록 변경할 수 있었다.

 

select varchar(replace (MSG, CHR(10),’ ‘),1024) msg
from TABLE(PD_GET_DIAG_HIST(‘MAIN’,’D’,’’,CAST(NULL as timestamp), CAST(NULL as timestamp),-2)) as T

 

Carriage Return 의 아스키 값이 14와 10이 있는데 db2diag 로그의 줄바꿈은 10번 값으로 되어져 있는 듯 하다.

 

테스트

select  varchar(replace(MSG,CHR(10),' '),1024) msg
from TABLE (PD_GET_DIAG_HIST('MAIN', 'D', '', CAST (NULL AS TIMESTAMP), CAST (NULL AS TIMESTAMP), -2 ) ) AS T
where dbname='SAMPLE' AND level IN ('C','E','S','W')
and timestamp > '2013-03-21'
order by TIMESTAMP
fetch first 10 rows only;

 

결과

MSG                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
ADM4500W  A package cache overflow condition has occurred. There is no error  but this indicates that the package cache has exceeded the configured maximum  size. If this condition persists, you should perform additional monitoring to  determine if you need to change the PCKCACHESZ DB configuration parameter. You  could also set it to AUTOMATIC.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
ADM4500W  A package cache overflow condition has occurred. There is no error  but this indicates that the package cache has exceeded the configured maximum  size. If this condition persists, you should perform additional monitoring to  determine if you need to change the PCKCACHESZ DB configuration parameter. You  could also set it to AUTOMATIC.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
ADM4500W  A package cache overflow condition has occurred. There is no error  but this indicates that the package cache has exceeded the configured maximum  size. If this condition persists, you should perform additional monitoring to  determine if you need to change the PCKCACHESZ DB configuration parameter. You  could also set it to AUTOMATIC.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
ADM4500W  A package cache overflow condition has occurred. There is no error  but this indicates that the package cache has exceeded the configured maximum  size. If this condition persists, you should perform additional monitoring to  determine if you need to change the PCKCACHESZ DB configuration parameter. You  could also set it to AUTOMATIC.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
ADM4500W  A package cache overflow condition has occurred. There is no error  but this indicates that the package cache has exceeded the configured maximum  size. If this condition persists, you should perform additional monitoring to  determine if you need to change the PCKCACHESZ DB configuration parameter. You  could also set it to AUTOMATIC.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
ADM4500W  A package cache overflow condition has occurred. There is no error  but this indicates that the package cache has exceeded the configured maximum  size. If this condition persists, you should perform additional monitoring to  determine if you need to change the PCKCACHESZ DB configuration parameter. You  could also set it to AUTOMATIC.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

  10 레코드가 선택되었습니다.

 

줄바꿈처리를 하지 않은 경우

select  varchar(MSG, 1024) msg
from TABLE (PD_GET_DIAG_HIST('MAIN', 'D', '', CAST (NULL AS TIMESTAMP), CAST (NULL AS TIMESTAMP), -2 ) ) AS T
where dbname='SAMPLE' AND level IN ('C','E','S','W')
and timestamp > '2013-03-21'
order by TIMESTAMP
fetch first 10 rows only;

 

-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
ADM4500W  A package cache overflow condition has occurred. There is no error
but this indicates that the package cache has exceeded the configured maximum
size. If this condition persists, you should perform additional monitoring to
determine if you need to change the PCKCACHESZ DB configuration parameter. You
could also set it to AUTOMATIC.
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
ADM4500W  A package cache overflow condition has occurred. There is no error
but this indicates that the package cache has exceeded the configured maximum
size. If this condition persists, you should perform additional monitoring to
determine if you need to change the PCKCACHESZ DB configuration parameter. You
could also set it to AUTOMATIC.
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
ADM4500W  A package cache overflow condition has occurred. There is no error
but this indicates that the package cache has exceeded the configured maximum
size. If this condition persists, you should perform additional monitoring to
determine if you need to change the PCKCACHESZ DB configuration parameter. You
could also set it to AUTOMATIC.
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
ADM4500W  A package cache overflow condition has occurred. There is no error
but this indicates that the package cache has exceeded the configured maximum
size. If this condition persists, you should perform additional monitoring to
determine if you need to change the PCKCACHESZ DB configuration parameter. You
could also set it to AUTOMATIC.
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
ADM4500W  A package cache overflow condition has occurred. There is no error
but this indicates that the package cache has exceeded the configured maximum
size. If this condition persists, you should perform additional monitoring to
determine if you need to change the PCKCACHESZ DB configuration parameter. You
could also set it to AUTOMATIC.
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
ADM4500W  A package cache overflow condition has occurred. There is no error
but this indicates that the package cache has exceeded the configured maximum
size. If this condition persists, you should perform additional monitoring to
determine if you need to change the PCKCACHESZ DB configuration parameter. You
could also set it to AUTOMATIC.
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
-                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

  10 레코드가 선택되었습니다.

오라클 포팅작업을 하다보니 오라클 호환성 기능에 대해 새롭게 살펴보게 되는 것 같다.

오라클에서는 숫자형으로 선언된 컬럼에 공백값(‘’)을 입력하면 NULL 값 처리가 된다. DB2에서는 공백값을 입력하면 형 변환 오류가 발생하여 입력이 실패한다. 만일 문자열로 된 숫자 값 (예: ‘1234’) 식의 값을 입력하면 자동 캐스팅 되어 입력된다.

 

iBatis에 대해서는 잘 모르지만, DBMS Migration 작업을 하다보면 XML 문서에 SQL문들을 모아 놓고 dynamic 하게 SQL을 실행하는 환경을 보게 된다. 아마도 XML문서에 값들도 동적으로 받아 처리되도록 하다보니, 매개변수의 데이터 유형이 DB에 선언된 컬럼 유형과는 다르게 지정되는 경우가 많다. (아마도 개발편의성 때문에 대부분은 VARCHAR로 일괄 선언하는 경우가 많지 않을까 싶다.)

 

이렇게 되다 보니 숫자형으로 선언된 컬럼에 문자열 값이 입력이 되다보니 DB2에서는 자동으로 형 변환을 못하고 에러를 반환하는 경우가 많다. (V9.5 이후로 오라클 호환성 기능이 나오면서 자동형변환 처리는 많이 편해진 편이다.)

 

오라클처럼 공백값(‘’)을 NULL 값으로 처리하도록 하기 위해서는 호환성 벡터 0x20 값이 적용되어야 하며, 적용 후 DB 생성 작업을 해야 된다.

참고로 DB2 정보센터 문서에는 “호환성 벡터”를 적용하는 경우 DB locale은 유니코드(utf-8)을 사용할 것을 권고하고 있다.

또한 DB2 DeveloperWorks 기술문서에 VARCHAR2 (0x20) 값은 위험할 수 있다고 권고되는 값이니 업무 상 필요한 경우에만 사용하도록 주의해야 한다.

 

공백(‘’) 테스트 (오라클)

SQL> create table t1 (c1 integer, c2 integer);
SQL> insert into t1 values (1,'');
SQL> insert into t1 values (2,'   ');
         ORA-01722:
SQL> insert into t1 values (3,NULL);

SQL> select * from t1;

        C1         C2
---------- ----------
         1
         3

 

 

공백(‘’) 테스트 (DB2 – 호환성 적용 전)

db2 "create table t1(c1 int, c2 int)"
db2 “insert into t1 values (1,'')

SQL0420N  함수 "INTEGER"의 문자열 인수에 유효하지 않은 문자가 있습니다.

db2 “insert into t1 values (2,'   ')

SQL0420N  함수 "INTEGER"의 문자열 인수에 유효하지 않은 문자가 있습니다.


db2 "insert into t1 values (3,'1234')"
DB20000I  The SQL command completed successfully.

db2 "insert into t1 values (4,NULL)"
DB20000I  The SQL command completed successfully.

db2 "select * from t1"

C1          C2
----------- -----------
          3        1234
          4           -

  2 record(s) selected.


 

공백(‘’) 테스트 (DB2 – 호환성 적용 후)

db2set DB2_COMPATIBILITY_VECTOR=20
db2stop force
db2start
db2 create db test
db2 connect to test
db2 "create table t1(c1 int, c2 int)"
db2 “insert into t1 values (1,'')
DB20000I  The SQL command completed successfully.

db2 "insert into t1 values (2,'   ')"

SQL0420N  Invalid character found in a character string argument of the function "INTEGER".

 

db2 "select * from t1"

C1          C2
----------- -----------
          1           -

  1 record(s) selected.

 

참고로 0x20 값 적용하고 DB 생성 후, 0x20 값을 제거해도 공백(‘’)은 NULL 값으로 인식된다.

 

참고

1) developerWorks 오라클 호환성 기술문서

https://www.ibm.com/developerworks/mydeveloperworks/blogs/SQLTips4DB2LUW/entry/about_the_db2_compatibility_vector_and_what_not_to_say_at_the_dinner_table282?lang=en

 

2) 호환성 벡터 값

http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/index.jsp?topic=%2Fcom.ibm.db2.luw.apdv.porting.doc%2Fdoc%2Fr0052867.html

DB2는 OS 사용자를 대상으로 권한/특권 부여하여 관리한다. 따라서 계정 인증처리는 db2ckpwd 프로세스를 통하여 처리된다.

권한/특권 부여는 인스턴스 레벨 (OS 그룹을 dbm cfg 구성 변수에 설정), DB 레벨, 테이블 공간 등의 하위 object 레벨로 이뤄진다.

대부분은 DB 레벨에서만 권한 관리하는 방식으로 고객에게 제시를 하는 편이여서, 하위 object에 대한 특권 관리를 자세히 보지는 않았었다.

 

고객으로부터 특정 사용자가 테이블 생성, DML, LOAD 정도만 되도록 권한 관리 방안을 요청해 와서 살펴 보았다.

V10.1에서는 V9보다 조금 더 DB레벨 권한 종류가 다양해졌다.

모든 권한을 다 테스트해 본 것은 아니지만, DATAACCESS 권한이 상당히 비중이 큰 권한이라는 것을 이번 테스트를 통해서 알게 된 것 같다.

 

테스트 시나리오는 다음과 같다. (CentOS 6.2, V10.1 FixPack1)

데이터베이스 명 test
인스턴스 이름 inst10
사용자 명 db2user
스토리지 그룹 명 IBMSTOGROUP
테이블 공간 명 TS_DATA
TS_IDX
TS_LOB
버퍼풀 IBMDEFAULTBP
페이지 단위 4K
테이블 이름 t1

 

<데이터베이스 생성>

$ locale
LANG=ko_KR.UTF-8

$ db2 "create db test restrictive"

 

(참고) restrictive 옵션은 DB의 PUBLIC 그룹에 권한 부여를 하지 않아 권한없는 OS 사용자가 테이블 접근을 하지 못하도록 하겠다는 것을 의미한다.

         작년 한 고객사에서 보안 강화 작업을 한다고 하여, DB 레벨의 PUBLIC 접속 권한 회수하면서 접속 장애가 발생한 적이 있었다. 명시적으로 권한부여되지 않는 OS 계정으로 업무 처리를 하도록 되어 있었기 때문이였다.

 

<테이블공간 생성>

db2 +p -tv << EOF
connect to test ;
create large tablespace TS_DATA pagesize 4K managed by automatic storage using stogroup IBMSTOGROUP extentsize 16 bufferpool IBMDEFAULTBP ;
create large tablespace TS_IDX pagesize 4K managed by automatic storage using stogroup IBMSTOGROUP extentsize 16 bufferpool IBMDEFAULTBP ;
create large tablespace TS_LOB pagesize 4K managed by automatic storage using stogroup IBMSTOGROUP extentsize 16 bufferpool IBMDEFAULTBP ;
terminate ;
EOF

 

<권한 및 특권 부여>

db2 +p -tv << EOF
connect to test ;
grant CONNECT,CREATETAB,EXPLAIN,LOAD on database to user db2user ;    
grant USE of tablespace TS_DATA to user db2user ;
grant USE of tablespace TS_IDX to user db2user ;
grant USE of tablespace TS_LOB to user db2user ;
grant usage on workload sysdefaultuserworkload to user db2user ;
terminate ;
EOF

 

이 상태에서 테이블을 생성하면 에러 메시지가 발생한다.

SQL0551N  "DB2USER" does not have the required authorization or privilege to perform operation "EXECUTE" on object "NULLID.SQLC2J23".

SQL3015N  An SQL error "" occurred during processing.

 

위와 같이 에러가 발생한 이유는 object 관리를 위한 시스템(메타) object에 대한 특권이 부족해서 발생한다. 그래서 시스템 object 에 대한 접근특권을 부여해 주어야 한다.

 

 

다음과 같이 shell script 롤 SYSPROC, SYSIBMADM, SYSCAT, SYSIBM,NULLID 에 속한 object의 실행 및 조회특권을 부여한다. 이 작업을 하지 않고 가능하게 하는 방법은 DATAACCESS 권한을 부여하는 것이다.

단, 타인이 생성한 object에 대해서도 DML이 가능해진다.

db2 connect to test
USER=db2user

db2 -x "select rtrim(varchar(PKGSCHEMA,10))|| '.' || varchar(PKGNAME,50) packname from syscat.packages where PKGSCHEMA='NULLID'" > pack.lst
db2 -x "select rtrim(varchar(a.TABSCHEMA,10))|| '.' || varchar(a.TABNAME,50) tabname from syscat.tables a, (values ('SYSIBMADM'),('SYSCAT'),('SYSIBM')) as b(sname) where a.TABSCHEMA=b.sname" > tab.lst
#db2 -x "select rtrim(varchar(PROCSCHEMA,10))|| '.' || varchar(SPECIFICNAME,50) procname from syscat.procedures where PROCSCHEMA='SYSPROC'" > proc.lst
db2 -x "select rtrim(varchar(ROUTINESCHEMA,10))|| '.' || varchar(SPECIFICNAME,50) funcname from syscat.routines where ROUTINESCHEMA='SYSPROC' AND ROUTINETYPE='F'" > func.lst

exec < pack.lst
while read PACKNAME
do
  db2 -v "grant execute on package ${PACKNAME} to user ${USER}"
done
rm -f pack.lst

exec < tab.lst
while read TABNAME
do
  db2 -v "grant select on table ${TABNAME} to user ${USER}"
done
rm -f tab.lst

#exec < proc.lst
#while read PROCNAME
#do
# db2 -v "grant execute on specific procedure ${PROCNAME} to user ${USER}"
#done
#rm -f proc.lst


exec < func.lst
while read FNAME
do
  db2 -v "grant execute on specific function ${FNAME} to user ${USER}"
done
rm -f func.lst

db2 terminate

 

<테이블 생성>

db2 +p -tv << EOF
connect to test user db2user using db2user ;
create schema db2user ;
create table t1 (c1 varchar(10), c2 clob(1k)) IN TS_DATA INDEX IN TS_IDX LONG IN TS_LOB ;
insert into t1 values ('가나다','가가가'),('라마바','라라라') ;
terminate ;
EOF

 

<데이터 import>

db2 connect to test user db2user
db2 "import from t1.ixf of ixf lobs from /instance/inst10/lobs commitcount automatic  messages t1.imp.msg insert into t1"

 

db2 "select c1, varchar(c2,10) c2 from t1"

C1         C2
---------- ----------
가나다     가가가
라마바     라라라
가나다     가가가
라마바     라라라

  4 record(s) selected.

 

<데이터 load>

db2 "load from t1.ixf of ixf lobs from /instance/inst10/lobs messages t1.imp.msg insert into t1"

db2 "select c1, varchar(c2,10) c2 from t1"


C1         C2
---------- ----------
가나다     가가가
라마바     라라라
가나다     가가가
라마바     라라라
가나다     가가가
라마바     라라라

  6 record(s) selected.

 

인스턴스 계정으로 생성된 테이블 조회

db2 "select * from inst10.t1"
SQL0551N "DB2USER" does not have the required authorization or privilege to perform operation "SELECT" on object "INST10.T1". SQLSTATE=42501
db2 “terminate”

 

테스트를 해보면서 DATAACCESS 권한이 내가 생각한 것과는 달라서 실망을 했었다.

“CREATETAB 권한만 있어도 테이블 생성은 되도록 해야 하는데, 이게 뭐냐?”

나름 이유가 있었겠지만, 하위 object에 대해서 특권을 부여해야만 테이블 생성이 제대로 되니 작업이 많아 진 것은 안타깝다.

 

개인적으로 DATAACCESS 권한을 시스템 object 접근하는 것으로 한정한다면,

테이블 생성 작업은 위처럼 번잡스럽지 않을 것이고, 또한 타 계정의 object는 건들지 못하므로 보안적인 측면도 좋을 것이고..

 

개인적으로 DATAACCESS 권한에 개선이 있었으면 하는 바램을 가져 본다.

+ Recent posts