DB2 구축 작업을 하면, 동시접속자수를 고려하여 maxuproc(AIX) 등의 OS 레벨의 변수 값을 검토하게 된다.

DB2 인스턴스 레벨에서는 MAX_COORDAGENTS 변수의 값으로 조정을 하게 되는데, 현재는 기본 값이 Automatic 이기 때문에 크게 고려할 필요가 없게 되었다.

 

그런데 pureScale 환경에서는 동시접속 관련하여 고려해야 될 변수가 있다.

클라이언트 친화성(Client Affinity) 방식 및 자동 워크로드 밸런싱(WLB) 방식 중 어느 방식이 pureScale 이중화 구성에 권장되는지는 알 수 없지만 WLB 방식인 경우 dsdriver 설정 파일에 maxTransports 값을 고려해야 된다.

 

V10.1 FixPack 0 (GA) 버전에서는 기본 값이 80 이였고, FixPack 1에서는 기본 값이 1000으로 변경되었다.

 

만일 설정 값 보다 접속 수가 초과하는 경우 –4210 에러 메시지(SQLSTATE=57033)를 Application에서 받게 되고, 진단로그(db2diag.log)에는 접속이 강제로 끊어지는 메시지(Detected client termination, ZRC=0x00000036=54)가 기록된다.

 

현재로서는 어느 정도 설정하고 쓰는지 알 수 없으나, maxTransports 변수 값은 WAS 및 업무 담당자와 협의를 통해서 설정되어져야 하겠다.

 

진단로그 오류메시지

2013-03-20-17.53.00.994278+540 I79184627A574        LEVEL: Error
PID     : 12190138             TID : 51181          PROC : db2sysc 1
FUNCTION: DB2 UDB, common communication, sqlcctcptest, probe:11
MESSAGE : Detected client termination
DATA #1 : Hexdump, 2 bytes
0x070000035ABEE222 : 0036 


2013-03-20-17.56.04.862158+540 I79264650A547        LEVEL: Error
PID     : 40108300             TID : 51479          PROC : db2sysc 0
FUNCTION: DB2 UDB, base sys utilities, sqeAgent::AgentBreathingPoint, probe:10
CALLED  : DB2 UDB, common communication, sqlcctest
RETCODE : ZRC=0x00000036=54

 

참고 문서

1. IBM APAR ( http://www-01.ibm.com/support/docview.wss?uid=swg1IC80398)

IC80398: INTERMITTENT -4210 ERRORS FOR TRANSPORT TIMEOUT WHEN MAXTRANSPORTS EXCEEDS MAX CONCURRENT APPLICATION CONNECTIONS.

 

2. IBM DeveloperWorks (AIX 기반 DB2 튜닝 사항)

  http://www.ibm.com/developerworks/aix/library/au-DB2AIXPERF.html 

 

3. 정보센터 참고 문서

http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/index.jsp?topic=%2Fcom.ibm.db2.luw.apdv.cli.doc%2Fdoc%2Fc0056065.html&resultof%3D%2522%256d%2561%2578%2554%2572%2561%256e%2573%2570%256f%2572%2574%2573%2522%2520%2522%256d%2561%2578%2574%2572%2561%256e%2573%2570%256f%2572%2574%2573%2522%2520

 

http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/index.jsp?topic=%2Fcom.ibm.db2.luw.wn.doc%2Fdoc%2Fi0060385.html&lang%3Dko

가끔씩이기는 하지만 파트너 사 아니면 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 권한에 개선이 있었으면 하는 바램을 가져 본다.

db2 “? sql30090n”

SQL30090N  조작이 응용프로그램 실행 환경에 대해 유효하지 않습니다. 이유 코드 = "<reason-code>".

설명:

조작이 응용프로그램 실행 환경에 대해 유효하지 않습니다.  예를 들어, 명령문 또는 API에 대해 특별한 제한사항이 있는 응용프로그램(CICS와 같은 XA분산 트랜잭션 처리 환경에서 실행되는 응용프로그램,CONNECT 유형 2 연결설정으로 실행되는 응용프로그램 또는 페더레이티드 시스템 기능을 사용하여 여러 데이터 소스를 갱신하는 응용프로그램)의 조작이 유효하지 않을 수 있습니다. 조작이 거부되었습니다.

 

DB2 V9.X 에서 Oracle로의 Federation 설정할 때는 발생하지 않았었는데, V10.1에서는 Wrapper 생성 시 Linux에서는 위와 같은 오류가 발생한다.

 

나름 웹 상의 문서를 찾으면서 해결방법을 찾아보니 다음과 같이 해결이 가능하다.

 

db2set DB2LIBPATH=$LD_LIBRARY_PATH
db2set DB2ENVLIST=DB2LIBPATH

db2stop
db2start

db2 connect to 데이터베이스

db2 "create wrapper net8"

 

LD_LIBRARY_PATH는 .profile 에 설정되어야 하는 ORACLE 환경 변수이며,  운영체제에 따라 해당 변수는 다르다.

AIX 경우는 LIBPATH, HP-UX 경우는 SHLIB_PATH, Solaris와 Linux 경우는 위 변수를 사용하면 된다.

DBMS의 기능 요건을 살피면 “사용자 실수에 의한 트랜잭션 복구” 요건을 보게 되곤 한다.

해당 요건은 ORACLE의 Flashback 기능을 이용한 “행 레벨”, “테이블 레벨” 혹은 “DB 레벨”의 시점 복구를 의미한다.

 

SQL 수행을 잘못해서 취소를 하고자 할 경우 oracle은 flashback을 통해서 SQL 수행 전 시점으로 되돌 릴 수 있다.

현재에도 DB2 에서는 해당되는 기능이 없는 것으로 알고 있기에  “어떤 대안이 있을까” 하는 고민을 하게 된다.

 

테이블공간 생성 시 (현재는 기본 옵션이지만) “삭제된 테이블 복구” 옵션을 주는 경우 삭제된 테이블의 DDL 추출과 백업 이미지를 통하여 데이터를 추출해 내어 복구 작업을 할 수 있다.

이외 Optim HPU(High Performance unload) 유틸리티를 통해서도 백업 이미지에서 특정 데이터를 추출이 가능해서 지워진 데이터 복구가 백업 시점까지는 가능하다.

 

만일 DB2에서 데이터가 변경된 시점의 데이터를 원래대로 되돌리고 싶다면?

데이터 변경 SQL 작업 시 변경 데이터를 별도로 저장을 하거나, V10에서 제공하는 시간 테이블을 통하여 데이터를 추출해서 변경하는 방법이 있을 듯 하다. 단, 명령어 한 줄로 간단히 수행이 아닌,  건건이 update, insert 문을 통해서 작업을 해야 되기 때문에 많이 번잡스러울 것 같다.

 

1) SQL를 통한 로그 작업

    데이터 변경 SQL에 대해서는 다음과 같이 SQL을 사용하여 “데이터 변경 이력”을 관리할 수 있을 것이다.

 

테스트 용 테이블

db2 "create table t1 (i integer, t timestamp, v varchar(10), c varchar(20))"

db2look -d sample -e -t t1 (테이블 DDL확인)

 

변경 전 데이터 조회

데이터 입력

db2 "insert into t1 values (4, current timestamp, 'DDD', 'final') "

데이터 변경하면서 변경 전 값 확인 (DDD –> DEF)

db2 "select * from old table (update t1 set v='DEF' where v='DDD')"

 

변경 전 값 결과

I           T                          V          C
----------- -------------------------- ---------- --------------------
          4 2013-02-14-11.05.49.619950 DDD        final

 

변경 후 데이터 조회 (DDD –> DEF)

db2 "select * from new table (update t1 set v='DEF' where v='DDD')"

 

변경 후 데이터

I           T                          V          C
----------- -------------------------- ---------- --------------------
          4 2013-02-14-11.05.49.619950 DEF        final

 

삭제된 데이터 조회

db2 "select * from old table (delete from t1 where v='DEF')"

 

결과 값

I           T                          V          C
----------- -------------------------- ---------- --------------------
          4 2013-02-14-11.05.49.619950 DEF        final

 

db2 "select * from t1"

I           T                          V          C
----------- -------------------------- ---------- --------------------
          1 2013-02-14-11.00.23.925648 AAA        before
          2 2013-02-14-11.00.28.735184 BBB        before
          3 2013-02-14-11.00.34.503851 CCC        before

  3 record(s) selected.

 

데이터 변경 이력을 관리하고자 한다면 위와 같이 SQL을 사용함으로서 가능할 듯 하다.

단 별도로 변경 이력을 관리하기 위한 저장소가 필요하므로 번잡스럽다.

 

이것을 조금 더 개선시킨 것이 V10에서 나온 Temporal Table 인 것 같다.

 

 

2) 시간 테이블을 통한 데이터 변경 이력 관리

   “시간” 중심으로 데이터 변경 이력을 관리하도록 만들어진 테이블로, “시간”을 “시스템” 혹은 “사용자 정의”  ,” 시스템+사용자 정의” 기준으로 이력 관리를 할 수 있도록 제공한다.

 

    “시스템 시간” 및 “사용자 정의 시간”(Business_Time) 은 특수 Register 변수를 통해서 설정이 가능하다.

 

설정 예

SET CURRENT TEMPORAL BUSINESS_TIME = CURRENT TIMESTAMP - 1 MONTH
SET CURRENT TEMPORAL BUSINESS_TIME = NULL
SET CURRENT TEMPORAL SYSTEM_TIME = CURRENT TIMESTAMP - 1 MONTH

 

위 설정으로 current date, current timestamp 값이 영향을 주지 않으면, 트잭잭션 rollback 시에도 영향을 주지 않는 것으로 정보 센터에는 언급되어 있다.

(참고) http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/index.jsp?topic=%2Fcom.ibm.db2.luw.sql.ref.doc%2Fdoc%2Fr0057360.html

 

(테스트) 시스템 시간 기준 데이터 이력 관리

db2 "create table t1 (i integer, t timestamp, v varchar(10), c varchar(20), sys_start timestamp(12) not null generated always as row begin,

sys_end timestamp(12) not null generated always as row end,

ts_id timestamp(12) not null generated always as transaction start id,

period system_time(sys_start,sys_end))"

 

이력 테이블 생성

db2 "create table t1_hist (i integer, t timestamp, v varchar(10), c varchar(20),

sys_start timestamp(12) not null,

sys_end timestamp(12) not null,

ts_id timestamp(12) not null)"

 

이력테이블 연결 작업

db2 "alter table t1 add versioning use history table t1_hist"

 

데이터 입력

db2 "insert into t1 values (1, current timestamp, 'AAA', 'before')"

(참고) 데이터 입력 후, 이력 테이블(t1_hist) 를 조회하면 값이 출력되지 않는다.

         저장된 데이터의 변경(삭제 포함) 이력만 관리하기 때문이다.

db2 "select * from t1"
I           T                          V          C                    SYS_START                        SYS_END                          TS_ID
----------- -------------------------- ---------- -------------------- -------------------------------- --------------------------------

--------------------------------
          1 2013-02-14-13.29.20.186109 AAA        before               2013-02-14-13.29.20.186107000000 9999-12-30-00.00.00.000000000000 2013-02-14-

13.29.20.186107000000

db2 "select * from t1_hist"

 

데이터 변경 (AAA –> ABC)

db2 "update t1 set v='ABC'"

db2 "select * from t1"
I           T                          V          C                    SYS_START                        SYS_END                          TS_ID
----------- -------------------------- ---------- -------------------- -------------------------------- --------------------------------

--------------------------------
          1 2013-02-14-13.29.20.186109 ABC        before               2013-02-14-13.31.03.853468000000 9999-12-30-00.00.00.000000000000 2013-02-14-

13.31.03.853468000000

db2 "select * from t1_hist"

I           T                          V          C                    SYS_START                        SYS_END                          TS_ID
----------- -------------------------- ---------- -------------------- -------------------------------- --------------------------------

--------------------------------
          1 2013-02-14-13.29.20.186109 AAA        before               2013-02-14-13.29.20.186107000000 2013-02-14-13.31.03.853468000000 2013-02-14-

13.29.20.186107000000

 "붉은 색" 글씨는 변경된 데이터 시점의 시간을 의미한다.

 

* 사용자 정의 시간 기준 이력 관리 테이블(Application-period temporal tables)

   시스템과는 다르게 “generated always” 옵션이 제외되었고, 사용자가 지정하여 시간을 넣기 때문에 중복 값이 발생하지 않도록 “고유 키” 를 생성한다.

create table 테이블명 ( 컬럼명 컬럽타입,

bus_start DATE NOT NULL,

bus_end DATE NOT NULL,

period business_time (bus_start, bus_end))

create unique index idx_테이블명

   on 테이블명 (컬럼명 컬럼타입, business_time without overlaps);

 

 

* 시스템 + 사용자 정의 시간 기준 이력 관리 (Bi-temporal table)

db2 +p -tv << EOF
create table t1 (i integer, t timestamp, v varchar(10), c varchar(20),
                 bus_start  DATE NOT NULL,
                 bus_end    DATE NOT NULL,
                 sys_start  timestamp(12) not null generated always as row begin,
                 sys_end    timestamp(12) not null generated always as row end,
                 ts_id      timestamp(12) not null generated always as transaction start id,
                 period business_time (bus_start, bus_end),
                 period system_time(sys_start,sys_end))
;

create table t1_hist like t1 ;
alter table t1 add versioning use history table t1_hist;
create unique index idx_t1 on t1(i,business_time without overlaps) ;
EOF

 

(참고) http://pic.dhe.ibm.com/infocenter/db2luw/v10r1/index.jsp?topic=%2Fcom.ibm.db2.luw.admin.dbobj.doc%2Fdoc%2Fc0058476.html

 

데이터 이력관리는 “데이터 변경 작업이 발생하는” 업무적으로 중요한 테이블이 대상이 되어야 할 것이다.

속성 상, 데이터가 많이 쌓이기 때문에 데이터 저장소의 크기 관리가 중요한 관리 요건이 된다.

월 혹은 년 기준으로 파티션 테이블을 만들어서, 특정 기간 이후의 이력 데이터는 제거(purge)하는 식으로 사용한다면 데이터가 비대해지는 것은 예방할 수 있지 않을까 싶다.

db2 “? SQL3508N”

로드 또는 로드 쿼리 중에 "<file-type>" 유형의 파일 또는 경로에 액세스하는 동안 오류가 발생했습니다. 이유 코드: "<reason-code>". 경로: "<path/file>".

이유 코드 3:

파일에 기록할 수 없거나 파일 크기를 변경할 수 없습니다.

디스크가 가득찼거나 하드웨어 오류 때문일 수 있습니다. 아래의 파일 유형 목록을 참조해서 로드를 실행하기에 충분한 스페이스가
있는지 확인하거나 다른 곳을 사용하도록 지정하십시오. 로드를 재시작하거나 다시 실행하십시오.

하드웨어 오류인 경우, 적절한 조치를 취한 다음 재시작하거나 로드를 다시 실행하십시오.

 

db2 load 유틸리티를 사용해서 데이터 적재를 수행하는 경우, 적재 작업 중 임시 파일을 만들어 적재 작업을 진행한다.

따라서 임시 파일 경로를 별도로 지정하지 않아 데이터베이스 기본 경로에 임시 파일이 생성되는 경우 파일 시스템이 가득차 작업이 실패하거나, 실패한 로드 작업을 반복 수행하면서 임시 파일이 쌓여서 파일 시스템이 가득차 버리는 상황이 발생한다.

 

실패한 load 작업은 재시작을 하거나 terminate를 해서 완료를 하지 않는 이상 임시 파일은 없어지지 않으며 함부로 삭제를 해서도 안된다.

load 작업 시 임시 파일 경로는 다음과 같이 지정할 수 있다.

LOAD FROM 추출파일.DEL OF DEL MODIFIED BY
COLDEL, NOROWWARNINGS SAVECOUNT 건수 MESSAGES
로드메시지파일.msg
TEMPFILES PATH
로드임시파일.tmp restart INTO 테이블이름

(참고) load 임시 파일 기본 경로: DB홈_경로/load/DB2mmmm.PID/DB2nnnnn.OID)

 

대용량 데이터를 적재하는 경우 임시파일 경로 설정을 해서 load 작업 수행할 필요가 있다.

 

참고문서

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

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

pureScale에 구성된 인스턴스 상태를 보기 위해서 db2instance –list 를 수행하면 진단로그에 다음과 같은 메시지가 기록된다.

2012-10-02-08.34.14.156718+540 E14601321A556        LEVEL: Error
PID     : 26148990             TID : 65120          PROC : db2sysc 0

FUNCTION: DB2 UDB, high avail services, sqlhaGetInfoForClusterObject, probe:4596
RETCODE : ECF=0x9000053E=1879046850=ECF_SQLHA_RESOURCE_NOT_FOUND

              Resource not found

2012-10-02-08.34.14.158708+540 I14601878A671        LEVEL: Error
PID     : 26148990             TID : 65120          PROC : db2sysc 0


FUNCTION: DB2 UDB, high avail services, sqlhaCheckMountResourcesOnHost, probe:4115
RETCODE : ECF=0x9000053E=-1879046850=ECF_SQLHA_RESOURCE_NOT_FOUND
          Resource not found

2012-10-02-08.34.14.556145+540 E14603779A977        LEVEL: Error
PID     : 26148990             TID : 65120          PROC : db2sysc 0


FUNCTION: DB2 UDB, high avail services, sqlhaGetObjectAttribute2, probe:1200
MESSAGE : ECF=0x90000552=-1879046830=ECF_SQLHA_OBJECT_DOES_NOT_EXIST
          Cluster object does not exist

 

위의 메시지는 DB2 V10.1 FixPack0 에서 발생하였고, 고객사 환경에서만 나오는 메시지였다.

IBM LAB에서는 다음과 같은 답변을 주었다.

It indicates "not find dependencies for this resource" and it is a just information, and this message type is changed from "Error" to "Information" on V10.1fp1.

V10.1 FixPack1 에서 위의 메시지는 “Error”에서 “Info”로 변경되었으며, 위의 메시지는 무시해도 되는 메시지로확인되었다.

+ Recent posts