고객사에 지원을 하다 보면, 현재의 Database를 다른 곳으로 옮기거나 특정 tablespace의 위치를 바꿔야 하는 경우가 발생한다.

이유는 디스크 공간이 부족해서 여유있는 곳으로 옮겨야 하는 상황이 되었거나, 외장 스토리지의 IO 성능 개선 작업을 하면서 Container로 사용 중인 Raw device의 경로가 변경되거나, 사용자 실수로 데이터가 삭제되서 데이터 복구를 하고자 하는 경우 등이라 할 수 있겠다.

DB 백업 이미지로 위와 같은 작업을 하기에는 시간이 걸린다. 최종 백업을 받고 새로운 곳으로 restore를 해야 되므로 어느 정도 소요시간이 발생한다.

이런 경우 db2relocatedb 유틸리티를 사용하면 백업/복구 방법보다는 작업 시간을 단축할 수 있다.

작업은 db2 중지 후 진행한다.

db2relocatedb 수행을 위한 설정 파일

DB_NAME=데이터베이스명
DB_PATH=데이터베이스 홈 경로
INSTANCE=인스턴스명
NODENUM=0
LOG_DIR=oldDirPath,newDirPath
STORAGE_PATH=스토리지 경로
CONT_PATH=콘테이너경로

<시나리오>

데이터베이스 명 : sample –> test

데이터베이스 위치 : /instance/inst10 –> /database

트랜잭션 로그 경로 : /instance/inst10/inst10/NODE0000/SQL00001/LOGSTREAM0000/

                             -> /database/test/active/

스토리지 경로 : /instance/inst10 –> /database/test/data

 

설정 파일 (db2relo.cfg )

DB_NAME=sample,test
DB_PATH=/instance/inst10,/database
INSTANCE=inst10
NODENUM=0
LOG_DIR=/instance/inst10/inst10/NODE0000/SQL00001/LOGSTREAM0000/,

              /database/test/active/
STORAGE_PATH=/instance/inst10,/database/test/data

 

위치 변경되는 파일들을 옮긴다.

$> cp -R /instance/inst10/ins* /database
$> cp -R ./LOGSTREAM00*/ /database/test/active/NODE0000/LOGSTREAM0000/
$> cp -R NODE00* /database/test/data/inst10
$>mv /database/test/data/inst10/NODE0000/SAMPLE/
         /database/test/data/inst10/NODE0000/TEST/

DB 위치 변경

$>  db2relocatedb -f db2relo.cfg

Files and control structures were changed successfully.
Database was catalogued successfully.
DBT1000I  The tool completed successfully.

변경 확인

# db2 list db directory

System Database Directory

Number of entries in the directory = 1

Database 1 entry:

Database alias                       = TEST
Database name                        = TEST
Local database directory             = /database
Database release level               = f.00
Comment                              =
Directory entry type                 = Indirect
Catalog database partition number    = 0
Alternate server hostname            =
Alternate server port number         =


# db2 get db cfg for test | grep -i "path to log files"
Changed path to log files                  (NEWLOGPATH) =
Path to log files                                       = /database/test/active/NODE0000/LOGSTREAM0000/

 

# db2 connect to test

   Database Connection Information

Database server        = DB2/AIX64 10.1.1
SQL authorization ID   = INST10
Local database alias   = TEST

 

# db2pd -db test -storage

Storage Group Paths:
Address            SGID  PathID    PathState    PathName
0x0A00020010BC0000 0     0         InUse        /database/test/data

 

# db2 "select count(*) from emp"

1
-----------
         42

  1 record(s) selected.

 

* DB 홈 경로 및 트랜잭션 로그 경로, 스토리지 경로의 경우 DB 생성 시 DB2가 자동으로 생성하는 경로명들이 있기 때문에 번거로울 수 있다. 경우에 따라서는 파일 옮기는 작업이 복잡하기 때문에 주의가 필요하고, 특정 콘테이너 단위로 변경하는 작업 정도로 사용하는 것이 안전하다 할 수 있겠다. (위 작업 수행 시, 원본을 copy 해서 db2relocatedb 작업 후 문제없는 경우 원본을 삭제해야 할 것이다.)

 

db2relocatedb 작업 중 일부가 번거로운 경우, 경로재지정 복구를 통하여 수행할 수 있다.

$> db2 backup db test to /work/backup compress
Backup successful. The timestamp for this backup image is : 20121109141428

 

경로 재지정 복구를 위한 복구 스트립트를 생성한다.

$> db2 restore db test from /work/backup taken at 20121109141428 redirect generate script db2redir.clp

 

복구 스트립트를 수정한다.

데이터베이스 명 : test –> sample

데이터베이스 위치 : /database –> /instance/inst10

트랜잭션 로그 경로 :  /database/test/active/ –> /instance/inst10/inst10/NODE0000/SQL00001/LOGSTREAM0000/

스토리지 경로 : /database/test/data –> /instance/inst10

RESTORE DATABASE TEST
FROM '/work/backup'
TAKEN AT 20121109141428
ON '/instance/inst10'
DBPATH ON '/instance/inst10'
INTO SAMPLE
NEWLOGPATH '/instance/inst10/inst10/NODE0000/SQL00001/LOGSTREAM0000/'
REDIRECT
WITHOUT ROLLING FORWARD
;
SET STOGROUP PATHS FOR IBMSTOGROUP
ON '/instance/inst10'
;

RESTORE DATABASE TEST CONTINUE;

restore 실행

$>  db2 -tvf db2redir.clp

RESTORE DATABASE TEST FROM '/work/backup' TAKEN AT 20121109141428 ON '/instance/inst10' DBPATH ON '/instance/inst10' INTO SAMPLE NEWLOGPATH '/instance/inst10/inst10/NODE0000/SQL00001/LOGSTREAM0000/' REDIRECT WITHOUT ROLLING FORWARD
SQL1277W  A redirected restore operation is being performed. During a table
space restore, only table spaces being restored can have their paths
reconfigured. During a database restore, storage group storage paths and DMS
table space containers can be reconfigured.
DB20000I  The RESTORE DATABASE command completed successfully.

SET STOGROUP PATHS FOR IBMSTOGROUP ON '/instance/inst10'
DB20000I  The SET STOGROUP PATHS command completed successfully.


RESTORE DATABASE TEST CONTINUE

DB20000I  The RESTORE DATABASE command completed successfully.

 

확인

$> db2 list db directory

Database 2 entry:

Database alias                       = SAMPLE
Database name                        = SAMPLE
Local database directory             = /instance/inst10
Database release level               = f.00
Comment                              =
Directory entry type                 = Indirect
Catalog database partition number    = 0
Alternate server hostname            =
Alternate server port number         =

$> db2 connect to sample

$> db2pd -db sample –storage

Storage Group Paths:
Address            SGID  PathID    PathState    PathName
0x0A00020010BC0000 0     0         InUse        /instance/inst10

에러라고 봐야할 지, 경고 성 메시지로 메시지를 봐야할 지 개인적으로도 아리송하지만, pureScale 환경에서 진단로그(db2diag.log)에 다음과 같음 메시지를 볼 수 있다.

2012-10-08-15.18.39.607132+540 I35440458A354 LEVEL: Error

PID : 13107340 TID : 1 PROC : db2havend

INSTANCE: db2inst1 NODE : 000

HOSTNAME: dbcni2

EDUID : 1

FUNCTION: DB2 UDB, high avail services, GPFSCluster::refreshVersionInfo, probe:5127

DATA #1 : String, 37 bytes

detected DB2_CFS_GPFS_NO_REFRESH_DATA

pureScale에 구성된 member와 CF의 상태 확인을 위해 보통 db2instance –list 명령어를 사용한다. 그런데 위 명령어가 결과를 반환하는데 약간의 시간이 걸린다. 약 3초 정도…

그래서 실행 시간을 빠르게 하기 위해 DB2_CFS_GPFS_NO_REFRESH_DATA=true 설정을 .profile에 할 수 있다.

위 변수에 대한 정보는 찾아 볼 수 없다. 다만, db2instance –list 를 수행하는 시점에 최신의 데이터를 수집해서 가져 오느냐? 아니면 이미 수집되어 있는(아마도 DB2 내부적으로 주기적으로 수집을 해 놓는 간격이 있어서) 데이터를 가져 오느냐? 의 차이로 짐작하고 있다.

개인적으로 체감하기에 신속한? 결과를 가져오는 것 같지는 않지만, 이 변수를 설정하고 나면 진단로그에 위와 같은 메시지가 기록이 된다. (V10.1 FixPack 0 기준)

여러 가지 테스트를 해 본 바, DB2_CFS_GPFS_NO_REFRESH_DATA 가 적용되는 시점은 db2start 시점은 아니고 db2instance –list 적용 시점에 반영이 된다.

테스트한 환경에서는 . .profile 등을 수행하여 환경 변수를 적용했을 때는 적용되지 못했고, 새롭게 인스턴스 계정으로 switch 한 경우 적용되었다.

DB2를 설치하고 WAS 담당자로 부터 JDBC Driver 요청을 받아서 전달해 줄 때 파일명에 4가 붙은 것(db2jcc4.jar)과 안붙은 것(db2jcc.jar)의 차이를 궁금해 했었다.

동기부여가 부족하기도 할 것이고, 업무로 바쁘다 보니 지나치게 되어 버리곤 했는데, 고객사에서 이것에 대해 문의가 왔다. 차이가 뭐냐고…그리고 JDBC 버전 어떻게 확인하냐고…

그래서 DB2에서 제공되는 jdbc driver관련해서 살펴보게 되었다.

DB2 서버에 접근이 가능하다면, DB2 JDBC Driver는 다음과 같은 경로에 존재한다.

(Linux/Unix) DB2설치_경로/java  혹은 instance경로/sqllib/java

(Windows) C:\Program Files\IBM\SQLLIB\java

 

WAS가 DB2 접속에 필요한 파일은 2가지이다.

- db2jcc.jar (혹은 db2jcc4.jar)

- db2jcc_license_cu.jar  (db2jcc_license_cisuz.jar 는 db2 connect 서버에서 제공되는 driver)

 

설치된 DB2 JDBC driver 버전 확인 (java 명령어가 실행되어야 함)

> java com.ibm.db2.jcc.DB2Jcc -version
IBM DB2 JDBC Universal Driver Architecture 3.62.56

 

jdbc driver 파일에 대해서 수행하여 version을 확인할 수도 있다.

java –cp 드라이버파일이름 com.ibm.db2.jcc.DB2Jcc –version

> java -cp db2jcc4.jar com.ibm.db2.jcc.DB2Jcc -version
IBM Data Server Driver for JDBC and SQLJ 4.13.127

db2jcc.jar 와 db2jcc4.jar 2개의 driver 는 DB2 V9.5에서 부터 시작되었다.

http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.db2.luw.wn.doc%2Fdoc%2Fc0051316.html

문서를 보면 JDBC 3.0 이하의 기능 호환성을 필요로 할 때는 db2jcc.jar 를

JDBC4.0 이상의 기능 호환성을 필요로 할 때는 db2jcc4.jar를 사용하도록 하였다.

SUN의 JDK 1.6 (혹은 JDK 6) 과 JDK 1.4 버전의 구분에 따라 db2 jdbc driver도 구분을 하게 된 듯 하다. (ORACLE JDK보다는 SUN JDK로 명명하는 것이 친숙하여 SUN JDK로 명명하였다.)

아마 JDK 1.4와 JDK6 에 대한 기능 차이는 자바 개발자가 더 잘 알듯하다.

 

참고로 JDBC 관련 유용 자료를 정리해 소개해 본다.

1. DB2 JDBC Drvier 관련 Developer Work 기술 문서

http://www.ibm.com/developerworks/data/library/techarticle/dm-0512kokkat/

 

2. JDBC Driver 버전 관련 IBM Tech Note

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

(참고) 빌드 번호의 의미

- sYYMMDD 이며, YY는 연도, MM은 월, DD는 일을 의미

 

3. KDUG 에 기재된 JDBC 정리 자료

http://www.kdug.kr/blog/DB2_Tips/329/3?blcode=DB2_Tips&page=3&que=1

+ Recent posts