DB2 관련 테스트 작업을 하다 DB2 설치 이미지 내부를 살펴보면서 V9.7에서도 쉘을 이용하여 tsa 버전을 확인하는 법을 알게 되었다.

설치 이미지의 압축을 풀면 server/db2/운영체제/install 이라는 디렉토리가 존재한다.

하위에 db2chktsa 라는 쉘이 존재한다. 이 shell을 통해 시스템 내에 설치된 버전 및 db2 설치 이미지에 있는 버전을 확인할 수 있다.

설치된 tsa 버전 확인

명령어
#>./db2chktsa -m

결과
TSAMP_VERSION=3.2.1.1 

설치 이미지에 있는 tsa 버전 확인

명령어
#>./db2chktsa -c

결과
TSAMP_VERSION=3.2.1.1 

설치를 하지 않았는데도 설치 버전이 나온다.

M옵션은 “라이센스를 갖고 있는 시스템 내에 설치된 SA MP” 그리고 “미디어 내에 try & buy 라이센스를 갖는 SAMP” 를 확인하는 옵션으로 기술되어 있다. (설치된 것 이외에도 미디어에 있는 버전도 보여 준다는 의미인 듯.)

C옵션은 “미디어에 있는 SA MP 및 설치 사전 조건"”을 확인하는 옵션으로 기술되어 있다.

차후 HADR등등의 이중화 구성된 DB2 환경에서는 위와 같은 방법으로 버전 확인할 수 있다.

종종 이기종간의 데이터 마이그레이션을 할 때 우리는 다양한 툴들을 사용하고 있다.
물론 툴들의 기본 내부적인 구조를 보면 DB2의 Command Line을 통하여 움직이고 있으며
데이터 마이그레이션 시 기본적으로 export , load 의 방법을 많이 사용하고 있다.

일반적으로 DB2의 Federation 기법을 사용하여 데이터의 마이그레이션을 손쉽게 할 수는 있으나
때로는 까다로운 혹은 보안이 심하게 걸려있는 고객의 사이트의 경우 직접 떨궈준 SAM파일을 이용해 데이터를 loading 하는 경우도 종종 있다.

DB2에서 제공되는 export 툴의 기능은 심플하며 다양한 기능들을 가지고 있다.
여러가지 modification 옵션을 가지고 있으며 상당히 직관적이고 심플하다.

아래는 일반적으로 데이터의 컬럼 구분자를 명시하는 방법이다.
기본적으로 구분자는 (,) 쉼표로 구분되어 지며 사용자의 특이한 데이터 상황을 고려하여
아래와 같이 변형을 가할 수 있다.

db2 "export to staff.del of del modified by coldel! select * from staff"

이는 구분자를 (!) 로 하겠다는 이야기 이다.

물론 특수 문자(예를 들면 | , '',Tab) 같은 것들은 아스키 코드의 변형으로 가능하다.
아래는 Tab 구분자를 아스키코드로 변환하여 구분자를 주는 것이다.

db2 "export to staff.del of del modified by coldel0x09 select * from staff"

위와 같이 아스키 코드를 이용하여 export 는 물론 Load옵션에도 줄 수 있다.

쓰고자 하는 내용이 DB2 아키텍처에 해당될 수 도 있을 것 같은데, 고객사의 자바로 실행되는 프로시저관련 기술지원하면서 찾아본 내용들을 정리해 본다.

프로시저를 작성하게 되면 FENCED, NOT FENCED 옵션을 선언하게 된다. DB2 내에서 자체적으로 제공되는 내장(built-in) 루틴(함수, 프로시저, 패키지, 모듈)은 not fenced 옵션으로 실행이 되지만, 일반 사용자(개발자)등이 생성하는 루틴은  fenced로 선언을 한다.

함수나 프로시저에서 선언되는 fenced라는 것은 DB2 인스턴스를 생성할 때 지정하게 되는 분리사용자(fence user)와 관계가 깊다.

하나의 프로그램이 실행되는 것은 process (혹은 daemon)가 실행되어 짐을 의미하고, 이것은 다시 계정하고도 매핑이 된다. 즉 OS 상의 자원은 소유자에 의해서 할당되어 실행이 되어진다고 할 수 있겠다.

V9.5부터 DB2는 multi-thread 방식의 아키텍처로 변경되었고, 인스턴스를 기동하면 OS상에서 db2sysc(system controller)라는 프로세스가  db2 인스턴스 계정으로 실행이 된다.

이 db2sysc라는 프로세스 하위에는 (v9.1 이하에서는 프로세스로 존재했던) db2agent라는 thread가 존재한다. (이외 instance 및 db 레벨에서 실행되는 여러 프로세스들이 다 db2sysc 하위의 thread로 포함되었다)

db2agent가 하는 역할은 원격에서 접속이 되면 db2agent가 생성이 되고, 작업 요청을 db2agent가 받아서 db 내부로 던져주는 역할을 한다. db 내에서 응답을 주면 원격에 다시 그 결과를 통보해 주는 통로 역할을 한다. (어찌 보면  client 접속에 대해 전체적인 트랜잭션을 관리해 주는 관리자 프로세스라고 할 수 있겠다.)

db2agent로 인스턴스 계정의 소유로 자원을 받아 실행이 되며, db2sysc와도 관련을 갖고 행동하기 때문에, 작업에 대해 예외가 발생하여 db2agent 한 개가 crash가 되는 경우 db2sysc 까지 영향을 미쳐, 인스턴스가 비정상적으로 종료가 되는 상황이 발생한다.

인스턴스 계정으로 소유된 자원들이기에 하위의 프로세스, 쓰레드는 어느 하나가 문제가 발생해도 전체가 다 죽는 상황이 발생을 하게 된다.

DB2는 사용자 정의 함수(UDF)나 프로시저등의 사용자가 작성해서 사용하는 object들에 대해서는 인스턴스 소유로 실행되지 않도록 db2fmp라는 별도의 프로세스를 통해 처리되도록 설계를 하였고, 이 db2fmp 프로세스는 (db2 인스턴스를 생성할 때 필요한 분리사용자 계정) fence 계정 소유로 실행된다.

따라서, UDF나 Procedure가 들어있는 트랜잭션을 db2agent가 받게 되면 이것을 db2fmp에서 처리되도록 전달한다. db2fmp는 들어온 트랜잭션을 db쪽에 요청하여 작업 처리를 하고 결과를 db2agent에 전달하는 식으로 하여 작업 처리를 하게 된다.

DB2 V9.7 fixpack 2~3에 포함된 IBM JDK에 버그가 발생해서 자바기반의 UDF나 Procedure가 실행되면 db2fmp 프로세스가 CPU 90% 이상을 잡아 먹는 상황이 발생을 하였었다. (해결책은 IBM JDK 최신 버전을 받아 설치해서 DB2가 사용하도록 하면 된다.)

db2fmp에서 어떤 작업들이 실행되었는지는 db2pd –fmp 를 실행함으로 확인해 볼 수 있다.

명령어: db2pd –fmp

결과:

FmpPid     Bit   Flags      ActiveThrd PooledThrd ForcedThrd Active
966858     64    0x00000000 0          0          0          Yes   
 
   Active Threads:
     EduPid : 15455     ThreadId : 0     

FMP Process:
FmpPid     Bit   Flags      ActiveThrd PooledThrd ForcedThrd Active
 950308     64    0x00000003 1          0          0          Yes   
 
   Active Threads:
     EduPid : 14427     ThreadId : 2314     
        Routine ID     Timestamp
        65974          2010-11-11-17.26.19.274874

 

명령어: db2pd -fmpe pid=950308 genquery

결과:

FMP Process:
Address            FmpPid     Bit   Flags      ActiveThrd PooledThrd ForcedThrd Active IPCList
0x0780000000DDBD40 766078     64    0x00000003 5          1          0          Yes    0x0780000000E6EFC0
 
   Active Threads:
   Address            FmpPid     EduPid     ThreadId 
   0x0780000000E6D880 766078     25189      3342     
   0x0780000000DDFE00 766078     17736      3085     
   0x0780000000DDF240 766078     17479      2828     
   0x0780000000DDD500 766078     16708      2571     
   0x0780000000DDC7C0 766078     16451      2314     
 

WITH RTNHIST ( PID, TID, RTNID, RTNTIME) AS
( VALUES   ( 766078    , 3599      , 65960     , TIMESTAMP('2010-11-12-01.03.33.056630')),
           ( 766078    , 3342      , 65960     , TIMESTAMP('2010-11-12-01.02.33.762402')),
           ( 766078    , 3085      , 65974     , TIMESTAMP('2010-11-12-01.01.59.036435')),
           ( 766078    , 2828      , 67495     , TIMESTAMP('2010-11-12-01.01.58.972998')),
           ( 766078    , 2571      , 65974     , TIMESTAMP('2010-11-12-01.01.54.017851')),
           ( 766078    , 2314      , 67495     , TIMESTAMP('2010-11-12-01.01.51.854489')),
           ( 766078    , 3856      , 65960     , TIMESTAMP('2010-11-12-01.03.33.057850'))
)
SELECT R.PID, R.TID, R.RTNTIME, ROUTINESCHEMA, ROUTINENAME, SPECIFICNAME, ROUTINEID
FROM syscat.routines, RTNHIST as R
where ROUTINEID = R.RTNID
ORDER BY R.PID, R.TID, R.RTNTIME

특정 PID에 대해 어떤 SQL이 실행되었는지를 위와 같은 명령어를 통해서 확인할 수 있다.

만일 특정 루틴이 이런 문제를 발생했다면, 위와 같은 방식으로 찾아 낼 수 있지 않을까 하는 생각을 한다.

정보센터에도 자세한 내용은 나오지 않지만 flags에 대해서는 자세히 기술해 놓았다.

참고 문서: http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp

 

이외 자바 프로시저 관련해서 발생하는 오류에 대해 잘 정리가 된 문서가 있어 소개해 본다.

(자바 프로시저를 생성하고, 실행해볼 수 있도록 설명이 되었기에 자바 프로시저에 대한 기능 테스트 하기 편할 것 같다.)

참고 문서: http://www.ibm.com/developerworks/data/library/techarticle/dm-0510law/

DB2 버전이 올라갈수록 그 기능이 복잡해지면서 같이 설치되어지는 프로그램들이 있다. V9.5 부터는 Tivoli System Automation for Multiplatform(TSAMP) 라는 클러스터가 번들로 설치가 된다. 또 DB2 모니터링을 위한 Tivoli Monitoring for Database라는 제품도 설치가 된다.

여기서 살펴보고자 하는 것은 Tivoli Monitoring 제품으로 DB2 엔진 설치 시 자동적으로 설치가 된다. 삭제 또한 DB2 엔진 삭제되면서 같이 삭제가 되고 별도로 삭제하는 도구는 제공되지 않는다.

tivoli monitoring 은 db2_install_path/itma 에 설치가 된다.

다음과 같이 ps –ef 명령어를 통해서 해당 프로세스가 실행중임을 확인할 수 있다.

#> ps –ef | grep db2
inst97    5692     1  0 23:37 ?        00:00:00 /opt/ibm/db2/v9.7fp3a/itma/lx8266/ud/bin/kuddb2 localhost_inst97
dpf97     6876     1  0 23:38 ?        00:00:00 /opt/ibm/db2/v9.7fp3a/itma/lx8266/ud/bin/kuddb2 localhost_dpf97
inst95    7807     1  0 23:38 ?        00:00:00 /opt/ibm/db2/v9.5fp6a/itma/lx8266/ud/bin/kuddb2 localhost_inst95

위 실행 결과를 보면 인스턴스 별로 kuddb2 프로세스가 실행됨을 알 수 있다.

또한 이 프로세스가 하는 역할은 DataStudio Health Monitor (구, DataStudio Admin Console –DSAC 라 칭함) 를 통하여 DB2내의 자원들의 상태를 GUI로 볼 수 있도록 해주는 기능을 한다. 이 기능은 (차기 버전에서 없어질) 제어센터의 Health Monitor 기능과 동일하다 보면 되겠다.

개인적인 짐작이지만, 제어센터가 사라지면서 health monitor 기능을 대체하기 위해 DataStudio 추가적으로 확장된 기능이 아닌가 싶다. (DB2 기술지원하면서 Health Monitor 기능이 필요하다고 느껴본 적이 없기에 그 기능의 존재 여부는 회의적이다.)

그렇다면 이렇게 자동 실행되는 프로세스를 어떻게 중지시킬 수 있을까? 구글을 검색해서 살펴본 내용을 정리해본다.

프로세스 실행 중지 시키기

#> find -L /etc/init.d -name ITMAgents* -exec \{\} stop \;

혹은 프로세스를 영구적으로 자동 실행되지 않도록 아래 명령어를 실행하여 검색되는 파일을 삭제할 수도 있다. (2011.09.26 내용 수정함)

#> find /etc/rc.d -name S*ITMAgents*

위 작업 이후 kuddb2 프로세스가 없어짐을 확인할 수 있을 것이다.

우리는 새로운 서버의 도입으로 신규 서버에 DB를 설치 하는 경우가 있다.
물론 설치전 요구사항들을 꼼꼼히 체크하고 설치 시에 문제를 예방하지만 가끔 다음과 같은
부분을 miss 할 수 있다.

바로 비동기식 IO스위치의 Avalilable 상태이다.
이는 OS상의 커널파라미터가 DB2 설치 후 엔진의 Start 시 발생될 수 있는 에러이며
db2start 시 다음과 같은 에러 메세지를 보여준다.

db2start를 실행할 때 다음 오류가 발생할 수 있습니다.

0509-130 Symbol resolution failed for /usr/lib/threads/libc.a(aio.o)
because: 0509-136 Symbol kaio_rdwr (number 0) is not exported from dependent module /unix.
0509-136 Symbol listio (number 1) is not exported from dependent module /unix.
0509-136 Symbol acancel (number 2) is not exported from dependent module /unix.
0509-136 Symbol iosuspend (number 3) is not exported from dependent module /unix.
0509-136 Symbol aio_nwait (number 4) is not exported from
dependent module /unix.
0509-192 Examine .loader section symbols with the
'dump -Tv' command.


아래와 같은 방법으로 다음과 같은 에러를 해결 할 수 있다.

비동기 I/O를 켜려면 다음을 수행하십시오.

1. smitty chgaio를 실행하고 시스템 다시 시작 시 구성할 상태정의됨(Defined)에서 사용 가능(Avalilable) 으로 설정하십시오.


2. Enter를 누르십시오.


3. 다음 중
하나를 수행하십시오.

      시스템을 다시 시작하십시오.

db2start 명령이 작동하게 됩니다.


오늘은 PureScale 상의 Instance 생성의 Tip을 말씀드리고자 한다.
보통 일반적인 DB2상의 Instance 생성법은 설치된 모듈이 있는 instance라는 디렉토리에서
db2icrt라는 스크립트를 이용하여 생성을 한다.

아래는 일반적인 인스턴스 생성법과 PureScale상의 인스턴스 법을 설명하겠다.
-s 옵션에 따라 ESE 제품의 인스턴스를 만들지 PureScale의 인스턴스를 만들지를 지정할 수 있다.

 ./db2icrt -s ese <dsf> -u dongbucni duongbucni

시나리오 요건 중 동종 , 이기종간의 DB Federation 테스트를 진행해 보려 하였다.
한층 업그레이된 PureScale에는 어떠한 새로운 기능들이 추가 되어 있을까?
하는 기대감을 갖고 테스트에 돌입 전이었다.

하지만 이론~ DBM Update를 치자 마자 난 할말을 잃었다.
=======================================================================================
 

update dbm cfg using FEDERATE YES
 

db2 " ? SQL1419N"

Reason Code 17      

 

         The following configuration parameters are not supported in a

         DB2 pureScale environment:

 

         

         *  DYN_QUERY_MGMT - Dynamic SQL and XQuery query management

         *  AUTO_STATS_PROF - Automatic maintenance

         *  FEDERATED - Federated database system support

         *  HEALTH_MON - Health monitoring


우리는 구성된 PureScale 시스템에 아래와 같은 테스트 시나리오를 만들었다.
그리고 하나씩 테스트를 진행 하면서 그에따른 결과를 얻어 내었다.
테스트 시나리오는 아래와 같다.(그 중 일부를 하나씩 공개 하도록 하겠다)
=====================================================================
1. Online Reorg
    -> 테스트 결과 PureScale에서는 지원되지 않는 기능이었다.

dongbucni/db2> db2 "reorg table db2.stock inplace"

SQL2216N  SQL error "-1419" occurred while reorganizing a database table or

its indexes.

보통 지원 되지 않는 기능들은 SQL1419 에러를 내며 그에 따른 Reason Code가
주르륵 딸려 나온다.
아직 Online Reorg가 지원 되지 않는 상황을 보면서 약간은 당황했다.
언제쯤 우리의 Pure는 완벽한 기능을 보유한 날이 올까?

하지만 그날을 기다리며 오늘도 난 PureScale과 함께 삽질을 하고 있다.

보통 DB2에서 현재 DB에 connection 되어 있는 application의 list 를 보려면 아래와 같이 확인을 한다.

db2 list applications <show detail>

하지만 9.8 PureScale 상의(2개의 member 가정) 의 list 조회는 member별 혹은 global 하게 list 를 조회할 수 있다

아래는 멤버별 조회를 하는 내용을 보여준다.
--------------------------------------------------------------------------------------
 member0:/dongbucni> db2 list applications at member 0 <show detail>

 

Auth Id  Application    Appl.      Application Id                                                 DB       # of

         Name           Handle                                                                    Name    Agents

-------- -------------- ---------- -------------------------------------------------------------- -------- -----

DONGBUCNI      db2bp          4658       *N0.db2.110825071212                                           DONGBU    1  

member1:/dongbucni> db2 list applications at member 1 <show detail>

Auth Id  Application    Appl.      Application Id                                                 DB       # of

         Name           Handle                                                                    Name    Agents

-------- -------------- ---------- -------------------------------------------------------------- -------- -----

DONGBUCNI      db2bp          67417      *N1.db2.110825070744                                           DONGBU    1 

member0:/dongbucni> db2 list applications global <show detail>
 

Auth Id  Application    Appl.      Application Id                                                 DB       # of

         Name           Handle                                                                    Name    Agents

-------- -------------- ---------- -------------------------------------------------------------- -------- -----

DONGBUCNI      db2bp          4658       *N0.db2.110825071212                                           DONGBU    1   

DONGBUCNI      db2bp          67417      *N1.db2.110825070744                                           DONGBU    1   

*주의점 TIP
 

db2 "force applications all" member 모두  kill하는 경우에 쓰인다.

db2 "force applications(67422)" ID 지정 멤버별로 application Kill 한다.

IBM Lab 에서 답변이 왔다.
결론은 Udapl 을 업그레이드 하라는 내용이다

아래는 Lab에서 보내온 결과이다.
 

분석 결과 발생한 현상은 AIX defect 787216 유사합니다. AIX level udapl.rte.7.1.0.15 올릴것을 권고해 드립니다.

물론 AIX level 6.1이라고 하셨지만, defect 대한 check 주십시오.

 

LAB 답변 참고하십시오.

-----------------------------------------------------------------

Reviewed the db2diag.log.

 

2011-08-10-10.50.43.929840+540 E315407A1206 LEVEL: Critical

PID : 598200 TID : 19534 PROC : db2sysc 0

INSTANCE: db2sdin1 NODE : 000

APPHDL : 0-52 APPID: *N0.db2sdin1.110810015041

AUTHID : DB2SDIN1

EDUID : 19534 EDUNAME: db2agntp 0

FUNCTION: DB2 UDB, oper system services, sqloEDUCodeTrapHandler,

probe:90

MESSAGE : ADM14011C A critical failure has caused the following type of

error:

"Trap". The DB2 database manager cannot recover from the

failure.

First Occurrence Data Capture (FODC) was invoked in the

following

mode: "Automatic". FODC diagnostic information is located in

the

following directory:

 

"/db2/db2sdin1/sqllib/db2dump/FODC_Trap_2011-08-10-10.50.43.614265/".

DATA #1 : Signal Number Recieved, 4 bytes

5

DATA #2 : Siginfo, 64 bytes

0x070000003BFC9430 : 0000 0005 0000 0000 0000 0008 0000 0000

.................

0x070000003BFC9440 : 0000 0000 0000 0000 0900 0000 1042 2EF8

..............B..

0x070000003BFC9450 : 0000 0000 0000 0000 0000 0000 0000 0000

.................

0x070000003BFC9460 : 0000 0000 0000 0000 0000 0000 0000 0000

.................

 

Trap shows

 

0x0900000010422EF8 GxlQpPostSend + 0x418

0x0900000010408CA0 IbQpPostSend + 0x780

0x09000000103ACF0C dapls_ib_post_send + 0x24C

0x09000000103AA9F4 dapl_ep_post_send_req + 0x194

0x09000000103C0BA4 dapl_ep_post_rdma_write + 0x84

0x0900000010387788 dat_ep_post_rdma_write + 0xA8

0x090000001042CA30 cmd_send + 0xBD0

0x090000000DD6AA64 readlsc + 0x104

0x090000000DD6EF3C list_get_status + 0x1C

0x090000000DD864B8 CAGetStatus + 0x7D8

0x09000000074EECC8

sqleCaCeStructureStatus__23SQLE_CA_CONN_ENTRY_DATAFPv27SAL_STRUCTURE_STA

TUS_ACTIONP20SAL_STRUCTURE_STATUS + 0x104

0x09000000074EE9F4

SAL_StructureStatus__20SAL_CA_STRUCT_HANDLEFCUiRUlPPcC27SAL_STRUCTURE_ST

ATUS_ACTION + 0x260

0x0900000006195A10

SAL_IsStructInPeer__20SAL_CA_STRUCT_HANDLEFCUiPPcPbRUlCb + 0xB4

0x0900000006194D04 SAL_IsSAInPeer__13SAL_SA_HANDLEFCUiPbRUlCb + 0x24

0x090000000637EB24 SAL_IsSAInPeer__13SAL_SA_HANDLEFCUiPbRUlCb@glue2BB +

0x7C

0x090000000637E228

SAL_ConnectStruct__13SAL_SA_HANDLEFC24SAL_ENCODED_CA_INDEX_SETCUiCUl +

0x414

0x0900000006F48FB8

SAL_OpenSAHandle__13SAL_SA_HANDLEFPP13SAL_SA_HANDLEP16sqeLocalDatabaseCU

l + 0x24C

0x0900000006F48CF8 SA_HANDLE_Initialize__9SA_HANDLEFCP16sqeLocalDatabase

+ 0x38

0x0900000006F48C5C sqleSmartArrayInit + 0x88

0x0900000006F49E34

@78@sqledint__FP8sqeAgentP16sqeLocalDatabaseP5sqlcacPciPb + 0x3C8

0x0900000006F353E0

FirstConnect__16sqeLocalDatabaseFP8SQLE_BWARcP8sqeAgentP8sqlo_gmtiT5Pb +

0x1560

0x090000000704B6C8

StartUsingLocalDatabase__8sqeDBMgrFP8SQLE_BWAP8sqeAgentRccP8sqlo_gmtPb +

0x3C8

0x0900000007047BDC

AppStartUsing__14sqeApplicationFP8SQLE_BWAP8sqeAgentcT3P5sqlcaPc + 0x514

0x0900000007F43010

@78@sqleStartDb__FsP8SQLE_BWAP10sqledbdescP13sqledbdescextT1PcT2iT1lUl +

0x6A0

0x0900000008A5D784

sqleCreateDb__FsP8SQLE_BWAP10sqledbdescP13sqledbdescextPcT5T1N25T2iT1T11

_P13SQLE_CFG_RECSP5sqlca + 0x11F4

 

The above stacks looks similar to AIX Defect 787216. The recommonded AIX level is udapl.rte.7.1.0.15.

+ Recent posts