DB2에서 백업, 아카이브 로그, 복구 히스토리는 서로 관련이 있는 시스템?들이다.

백업의 유형에 따라 아카이브 로그를 사용할 수도 있고 사용 안 할 수도 있지만, 복구 히스토리는 백업, reorg, 테이블 공간 변경, 아카이브 로그 등등에 대한 실행 기록들을 보관을 한다.

따라서 이에 대해 별 생각없이 DB 관리를 하다 보면, 복구 히스토리 파일(db2rhist.asc)은 비대해 지고, (file system에 백업을 받아 놓는 경우) 백업 이미지로 인해 disk full이 되는 상황이 발생하게 된다.

앞으로 쓰고자 할 내용은 권장을 하는 내용은 아니고, “관리를 최소화 하고자 하는 경우” 이렇게 하면 이 부분들에 대한 관리 부담을 줄일 수 있는 방법이 존재한다는 것을 참고적으로 보이고자 한다.

V9.5에서 추가된 db 구성변수로 알고 있는데 AUTO_DEL_REC_OBJ 라는 변수가 있다.

기본 값은 OFF이지만, ON으로 변경을 하게 되면 NUM_DB_BACKUP 와 REC_HIS_RETENTN 값을 초과하는 백업 이미지, 복구 히스토리 기록, 관련 archive log 들을 자동으로 삭제를 한다.

따라서 나름 업무 특성을 잘 감안해서 이런  변수에 대한 값을 설정해 두면, disk full 이나 io 성능 저하 문제를 사전에 예방할 수 있다.

NUM_DB_BACKUP의 기본값은 12개 이고, 백업 이미지 보관 개수를 12개로 한다는 것을 의미한다. 즉 13개의 백업이미지가 생기게 되면 가장 오래된 백업 이미지가 AUTO_DEC_REC_OBJ 값에 의하여 자동 삭제가 된다.

REC_HIS_RETENTN  기본값은 366일 이고, 366일 이상 기록이 발생한 경우 가장 오래된 일자의 기록들이 AUTO_DEC_REC_OBJ 값에 의하여 삭제가 된다. 이때 관련된 archive log 들도 삭제가 된다.

 

온라인 백업을 위한 설정

$ db2 get db cfg for sample | grep -i logarchmeth1
     First log archive method                 (LOGARCHMETH1) = OFF

$ db2 update db cfg for sample using logarchmeth1 disk:/database/arclog
     DB20000I  The UPDATE DATABASE CONFIGURATION command completed successfully.

$ db2 backup db sample to /database/backup
   Backup successful. The timestamp for this backup image is : 20111212143512

 

백업, 복구 히스토리 파일 자동 삭제 설정

$ db2 update db cfg for sample using num_db_backups 3 rec_his_retentn 0 auto_del_rec_obj on
  DB20000I  The UPDATE DATABASE CONFIGURATION command completed successfully.

$ db2 get db cfg for sample | egrep -i 'num_db_backups|rec_his_*|auto_del_rec_obj'

Number of database backups to retain   (NUM_DB_BACKUPS) = 3
Recovery history retention (days)     (REC_HIS_RETENTN) = 0
Auto deletion of recovery objects    (AUTO_DEL_REC_OBJ) = ON

 

아카이브 로그 및 백업 이미지 확인

$ ls -al /database/arclog/inst97/SAMPLE/NODE0000/C0000000

합계 8
drwxr-x--- 2 inst97 db2igrp 4096 12월 12 14:34 .
drwxr-x--- 3 inst97 db2igrp 4096 12월 12 14:34

$ ls -al /database/backup

-rw------- 1 12월 12 14:35 SAMPLE.0.inst97.NODE0000.CATN0000.20111212143512.001

 

온라인 백업 1회

$ db2 backup db sample online to /database/backup compress
Backup successful. The timestamp for this backup image is : 20111212144420

$ ls -al /database/arclog/inst97/SAMPLE/NODE0000/C0000000

합계 20
drwxr-x--- 2 inst97 db2igrp  4096 12월 12 14:44 .
drwxr-x--- 3 inst97 db2igrp  4096 12월 12 14:34 ..
-rw-r----- 1 inst97 db2igrp 12288 12월 12 14:44 S0000000.LOG

 

온라인 백업 2, 3회

$ db2 backup db sample online to /database/backup compress
Backup successful. The timestamp for this backup image is : 20111212144604

$ db2 backup db sample online to /database/backup compress
Backup successful. The timestamp for this backup image is : 20111212144718

$ ls -al /database/arclog/inst97/SAMPLE/NODE0000/C0000000

합계 44
drwxr-x--- 2 inst97 db2igrp  4096 12월 12 14:47 .
drwxr-x--- 3 inst97 db2igrp  4096 12월 12 14:34 ..
-rw-r----- 1 inst97 db2igrp 12288 12월 12 14:44 S0000000.LOG
-rw-r----- 1 inst97 db2igrp 12288 12월 12 14:46 S0000001.LOG
-rw-r----- 1 inst97 db2igrp 12288 12월 12 14:47 S0000002.LOG

$ ls -al /database/backup

-rw------- 1 12월 12 14:44 SAMPLE.0.inst97.NODE0000.CATN0000.20111212144420.001
-rw------- 1 12월 12 14:46 SAMPLE.0.inst97.NODE0000.CATN0000.20111212144604.001
-rw------- 1 12월 12 14:47 SAMPLE.0.inst97.NODE0000.CATN0000.20111212144718.001

최초의 백업인 (아카이브 로깅 설정에 따른) offline backup (시간소: 14시 35분) 이미지가 삭제되었다

 

온라인 백업 4회

$ db2 backup db sample online to /database/backup compress
Backup successful. The timestamp for this backup image is : 20111212145049

$ ls -al /database/arclog/inst97/SAMPLE/NODE0000/C0000000
합계 44
drwxr-x--- 2 inst97 db2igrp  4096 12월 12 14:50 .
drwxr-x--- 3 inst97 db2igrp  4096 12월 12 14:34 ..
-rw-r----- 1 inst97 db2igrp 12288 12월 12 14:46 S0000001.LOG
-rw-r----- 1 inst97 db2igrp 12288 12월 12 14:47 S0000002.LOG
-rw-r----- 1 inst97 db2igrp 12288 12월 12 14:50 S0000003.LOG

 

$ ls -al /database/backup

-rw------- 1 12월 12 14:46 SAMPLE.0.inst97.NODE0000.CATN0000.20111212144604.001
-rw------- 1 12월 12 14:47 SAMPLE.0.inst97.NODE0000.CATN0000.20111212144718.001
-rw------- 1 12월 12 14:50 SAMPLE.0.inst97.NODE0000.CATN0000.20111212145049.001

온라인 백업 1회 이미지 (시간소: 14시 44분) 와 0번 archive log가 삭제되었다

 

복구 히스토리 파일 조회

$ db2 list history all for sample

                    List History File for sample

Number of matching file entries = 6


Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
-- --- ------------------ ---- --- ------------ ------------ --------------
  X  D  20111212144501      1    D  S0000001.LOG C0000000
----------------------------------------------------------------------------

  EID: 8 Location: /database/arclog/inst97/SAMPLE/NODE0000/C0000000/S0000001.LOG


Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
-- --- ------------------ ---- --- ------------ ------------ --------------
  B  D  20111212144604001   N    D  S0000001.LOG S0000001.LOG
----------------------------------------------------------------------------
  Contains 5 tablespace(s):

----------------------------------------------------------------------------
    Comment: DB2 BACKUP SAMPLE ONLINE
Start Time: 20111212144604
   End Time: 20111212144611
     Status: A
----------------------------------------------------------------------------
  EID: 9 Location: /database/backup


Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
-- --- ------------------ ---- --- ------------ ------------ --------------
  X  D  20111212144724      1    D  S0000002.LOG C0000000
----------------------------------------------------------------------------

  EID: 10 Location: /database/arclog/inst97/SAMPLE/NODE0000/C0000000/S0000002.LOG


Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
-- --- ------------------ ---- --- ------------ ------------ --------------
  B  D  20111212144718001   N    D  S0000002.LOG S0000002.LOG
----------------------------------------------------------------------------
  Contains 5 tablespace(s):

   ----------------------------------------------------------------------------
    Comment: DB2 BACKUP SAMPLE ONLINE
Start Time: 20111212144718
   End Time: 20111212144725
     Status: A
----------------------------------------------------------------------------
  EID: 11 Location: /database/backup


Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
-- --- ------------------ ---- --- ------------ ------------ --------------
  X  D  20111212145055      1    D  S0000003.LOG C0000000
----------------------------------------------------------------------------

EID: 12 Location: /database/arclog/inst97/SAMPLE/NODE0000/C0000000/S0000003.LOG


Op Obj Timestamp+Sequence Type Dev Earliest Log Current Log  Backup ID
-- --- ------------------ ---- --- ------------ ------------ --------------
  B  D  20111212145049001   N    D  S0000003.LOG S0000003.LOG
----------------------------------------------------------------------------
  Contains 5 tablespace(s):

  ----------------------------------------------------------------------------
    Comment: DB2 BACKUP SAMPLE ONLINE
Start Time: 20111212145049
   End Time: 20111212145056
     Status: A
----------------------------------------------------------------------------
  EID: 13 Location: /database/backup

복구 히스토리 파일에는 6개의 기록이 남아있다.

온라인 백업이 발생될 때마다 트랜잭션 로그(active log) 의 백업(archive log)이 발생하기 때문에 총 6개의 기록 (log archiving 3회, online backup 3회) 남았으며,

이전에 발생된 백업 2개 ( 14시 35분, 14시 44분) 와 관련된 트랜잭션 로그 백업(log archive), 기록도 삭제되었다. 또한 물리적으로 0번 archive log도 삭제되었다.

 

백업을 위한 디스크 공간이 제약적이고, 온라인 백업을 위한 트랜잭션 로그 백업(archive log) 공간도 부족한 경우 위와 같이 설정함으로써 disk full 상황을 예방할 수 있다.

반면 실시간 복제를 하는 시스템 등의 경우, 경우에 따라서 archive log를 사용하는 경우가 발생하므로 업무 환경에 따라서 많은 주의를 기울이고 적용해야 될 것이다.

'Note' 카테고리의 다른 글

[관리] 데이터베이스 크기 확인  (0) 2011.12.26
[SQL] Recursive 처리 (재귀 SQL)  (0) 2011.12.19
[SQL] 익명 블록 (Anonymous Block)  (0) 2011.12.05
[SQL] 자율 트랜잭션(Autonomous Transaction)  (0) 2011.11.28
[SQL] Logon Trigger  (0) 2011.11.07

테스트 환경 구축을 위해선 가상컴퓨터 소프트웨어와 리눅스 OS가 필요한데, 다음과 같이 다양한 선택권이 있다. 

[ 가상컴퓨터 소프트웨어 ]

1. VMware

2. VirtualBox

3. VirtualPC

[ 리눅스 ]

1. Red Hat Enterprise Linux ( Oracle Enterprise Linux / CentOS )

2. SUSE Enterprise Linux ( openSUSE )

가상컴퓨터 소프트웨어는 VirtualBox나 VirtualPC와 같이 무료 소프트웨어가 있기는 하나 (개인적인 생각에는) 안정성과 편의성이 다소 떨어지는 측면이 있기 때문에, 부득이 하게 유료 소프트웨어인 VMware 을 사용할 예정이다.

물론 VMware에도 VMware Player나 VMware Server 같은 무료 제품들이 있기는 하나, 기능상의 제약이 있기 때문에 유료버전인 VMware Desktop을 이용해서 테스트 환경을 구축할 것이다.

리눅스의 경우, Red Hat과 SUSE는 상용화 되어있고, Oracle은 DB2 엔지니어 입장에서 왠지 모르게 쓰기가 싫어서... 예전부터 친숙했던 빨간 모자 계열의 리눅스인 CentOS를 사용할 계획이다.

CentOS (The Community ENTerprise Operation System) 는 RHEL (Red Hat Enterprise Linux) 의 클론버전으로써, 몇 가지 소프트웨어/드라이버를 제외하고는 RHEL와 똑같기 때문에 안정성이 뛰어난 편이어서 DB2 테스트 수행에 적격인 리눅스이다.

결론적으로, VMware Desktop으로 가상컴퓨터를 만들고 OS로는 CentOS를 설치한 후, DB2 UDB for Linux를 설치하여 테스트 베드를 구축할 예정이다.

V9.7에서 소개된 개념으로 FixPack5에서 약간 기능(locking 처리)  개선되어진 것으로 알고 있다.

이 기능이 업무 단에 실질적으로 적용될 가능성은 없을 것 같지만, 개발자 측면에서는 편의성을 제공해 주는 기능이 아닐까 싶다.

routine 을 프로그래밍 하면서, 함수나 저장 프로시저(stored procedure)의 로직 검증을 하기 위해 매번 삭제하고 컴파일하여 db에 반영(deploy)하는 작업을 거쳐야 한다. 어떤 면에서는 불필요하게 반영(deploy)하는 것을 꼭 해야하나? 하는 의문이 들 것이다.

특히 운영 시스템에 routine들을 적용해야 하는 시점에서 검증을 하기 위해 컴파일해서 반영(deploy)하는 것도 때로는 부담이 되고 번거롭게 하는 과정일 수도 있을 것이다.

이렇게 db에 반영하지 않고 로직 compile하여 실행시키는 일련의 작업만 하도록 제공하는 것이 “익명 블록”이다. PLSQL이나 SQLPL 작업 시 로직 검증은 편하게 할 수 있는 방법이 되지 않을까 싶다.

이 테스트는 DB2_COMPATIBILITY_VECTOR=ORA 적용하고 수행되었다.

익명 블록 코드 예 - 3번 반복하면서 시간소 및 반복 회수를 도출하는 로직

db2 +p -td@ -v <<EOF
connect to sample @
set serveroutput on @

declare
    ret_val integer ;
    ret_time timestamp;
   
begin
      for k in 1..3 loop
          select k, current timestamp into ret_val, ret_time from dual;
          dbms_output.put_line('count number: ' || ret_val);
          dbms_output.put_line('loop time: ' || ret_time) ;
      end loop ;
end;
@
set serveroutput off @
terminate @
EOF

 

실행 결과

블록을 컴파일하면 컴파일과 동시에 실행이 되어 진다. 로직에 대한 논리적인 이름(껍데기?)을 갖고 있지 못하기에 당연한 결과일 수 있을 것이다.

connect to sample
 
   Database Connection Information
 
Database server        = DB2/LINUXX8664 9.7.4
SQL authorization ID   = ORA974
Local database alias   = SAMPLE
 
 
set serveroutput on
DB20000I  The SET SERVEROUTPUT command completed successfully.
 
declare ret_val integer ; ret_time timestamp; begin for k in 1..3 loop select k, current timestamp into ret_val, ret_time from dual; dbms_output.put_line('count number: ' || ret_val); dbms_output.put_line('loop time: ' || ret_time) ; end loop ; end;
DB20000I  The SQL command completed successfully.
 
count number: 1
loop time: 2011-10-31-00.03.21.099553
count number: 2
loop time: 2011-10-31-00.03.21.124113
count number: 3
loop time: 2011-10-31-00.03.21.124266
 
set serveroutput off
DB20000I  The SET SERVEROUTPUT command completed successfully.
 
terminate
DB20000I  The TERMINATE command completed successfully.

DB2 V9.7 FixPack3 에서 도입된 기능이다.

저장 프로시저(Stored Procedure) 내부에서 호출되는 저장 프로시저의 트랜잭션 처리를 “호출한 저장 프로시저 트랜잭션 상태”와 상관없이 DB에 반영(commit)할 수 있게 하는 기능이다.

다른 DBMS에서는 어떤 용도로 사용되는지 찾아보질 않아 모르겠지만, 곰곰이 생각해 보면 업무적으로 “특수한 요건”일 때 적용이 될 법하고, 이외는 “호출한/호출당한 저장 프로시저”의 트랜잭션 수행 기록을 남기는 용도로 사용할 수도 있지 않나 싶다.

먼가 중요한 처리를 담당하는 “저장 프로시저”인 경우, 이 저장 프로시저가 수행될 때 마다 처리한 트랜잭션들을 기록하도록 하기 위해 (commit 이던 rollback이던) “자율 트랜잭션”을 사용할 필요가 있지 않을까 하는 생각을 해본다.

테스트는 오라클 호환 벡터를 설정하고 테스트를 하였다.(오라클 관련 호환성 기능 테스트를 병행하고 있었기에..)  (DB2_COMPATIBILITY_VECTOR=ORA)

호출되는 내부 저장 프로시저 생성

db2 +p -td"@" -v << EOF
connect to sample @
drop table t1 @
create table t1(c1 timestamp) @
create or replace procedure sp2()
language sql
autonomous
begin
      insert into t1 values (current timestamp) ;
end
@
terminate @
EOF

선언부에 “Autonomous”를 명시한다.

 

호스트 저장 프로시저 생성

db2 +p -td"@" -v << EOF
connect to sample @
drop table t3@
create table t3 (c1 timestamp)@
create or replace procedure sp3()
begin
       insert into t3 values (current timestamp) ;
       call sp2();
end
@
terminate @
EOF

프로시저 sp2를 auto commit를 해제하고 수행 후, rollback을 수행함으로써 autonomous가 적용되었는지를 확인한다.

저장 프로시저 실행

$ db2 +c "call sp3()"

  Return Status = 0


$ db2 rollback

DB20000I  The SQL command completed successfully.

 

SP3프로시저의 수행 결과 확인

$ db2 "select * from t3"

C1
--------------------------

  0 record(s) selected.

SP2 프로시저의 수행 결과 확인

$ db2 "select * from t1"

C1
--------------------------
2011-10-17-17.46.39.148931

  1 record(s) selected.

DB2 HADR 구성 환경에서 Cluster를 구성하기 위해 db2haicu 를 실행하면 여러 에러들이 발생하곤 한다. xml 설정파일에 설정한 값이 잘못되었거나, 환경이 잘못되었거나 등등의 이유로 대부분 발생한다.

이 중 RSCT가 사용하는 db2 모니터링 script 관련한 오류에 대해 정리를 해 본다.

1. 진단로그(db2diag.log) 오류 메시지

2011-10-06-13.29.04.814926+540 E522666E818         LEVEL: Error
PID     : 21846                TID  : 47753254935648PROC : db2haicu
INSTANCE: hadr97               NODE : 000
FUNCTION: DB2 Common, SQLHA APIs for DB2 HA Infrastructure, sqlhaAddResource, probe:1600
MESSAGE : ECF=0x90000542=-1879046846=ECF_SQLHA_CREATE_GROUP_FAILED
          Create group failed
DATA #1 : String, 35 bytes
Error during vendor call invocation
DATA #2 : unsigned integer, 4 bytes
37
DATA #3 : String, 36 bytes
db2_hadr97_cluster2.localdomain_0-rg
DATA #4 : unsigned integer, 8 bytes
1
DATA #5 : signed integer, 4 bytes
98343
DATA #6 : String, 186 bytes
Line # : 6719---cluster2.localdomain: 2661-011
The command specified for attribute MonitorCommand is NULL, not a absolute path, does not exist or has insufficient permissions to be run.

2011-10-06-13.29.04.815548+540 E523485E365         LEVEL: Error
PID     : 21846                TID  : 47753254935648PROC : db2haicu
INSTANCE: hadr97               NODE : 000
FUNCTION: DB2 Common, SQLHA APIs for DB2 HA Infrastructure, sqlhaCreateDB2Partition, probe:80
RETCODE : ECF=0x90000542=-1879046846=ECF_SQLHA_CREATE_GROUP_FAILED
          Create group failed

2. 원인

   db2haicu 를 실행하여 cluster를 구성할 때, db2 모니터링 script가 실행이 된다. 그런데 해당 위치에 script가 존재하지 않아 위와같이 에러가 발생하게 된다.

3. 해결책

    script가 존재하는지 확인 후, 없으면 db2cptsa를 이용하여 script를 해당 경로에 생성해 준다.

명령어
#> ls –al /usr/sbin/rsct/sapolicies/db2

결과


명령어
#> 엔진_설치_위치/install/tsamp/db2cptsa

확인
#> ls –al /usr/sbin/rsct/sapolicies/db2

결과

-r-xr-xr-x 1 root root  3183  4월  1  2011 db2V97_monitor.ksh
-r-xr-xr-x 1 root root  6227  4월  1  2011 db2V97_start.ksh
-r-xr-xr-x 1 root root  4566  4월  1  2011 db2V97_stop.ksh
-r-xr-xr-x 1 root root  1114  4월  1  2011 forceAllApps
-r-xr-xr-x 1 root root 13980  4월  1  2011 hadrV97_monitor.ksh
-r-xr-xr-x 1 root root  5517  4월  1  2011 hadrV97_start.ksh
-r-xr-xr-x 1 root root  4255  4월  1  2011 hadrV97_stop.ksh
-r-xr-xr-x 1 root root  7121  4월  1  2011 mountV97_monitor.ksh
-r-xr-xr-x 1 root root  7087  4월  1  2011 mountV97_start.ksh
-r-xr-xr-x 1 root root  7948  4월  1  2011 mountV97_stop.ksh
-r-xr-xr-x 1 root root  7101  4월  1  2011 nfsserverctrl-server
-r-xr-xr-x 1 root root  5554  4월  1  2011 rovingV97_failover.ksh

DB2 V9.7 FixPack3 부터는 로그온 트리거라는 기능을 지원한다. 오라클이나 MS-SQL에서는 트리거라는 이름으로 작성을 하지만, DB2에서는 procedure를 통하여 기능 구현하여 실행을 시킨다.

기능을 테스트해보면서 그 기능이 제약적이다라는 느낌이 들었지만, “기본 스키마 이름”를 변경하거나 “기본 library 경로”등을 세션단위로 설정하고자 할 경우에 도움이 될 듯 하다. 아마도 버전 upgrade되면서 보다 다양하게 활용되도록 개선되지 않을까 싶다.

DB의 구성변수에 CONNECT_PROC 라는 변수에 실행시키고자 하는 stored procedure를 설정하면 사용자가 “접속 하는 순간” 실행이 되어진다.

테스트 시나리오는 사용자가 접속할 때, 접속 계정 명, 접속 시간을 기록하도록 하는 것으로 정의하였다.

생성 스크립트

db2 +p -td"@" -v << EOF
connect to sample @

CREATE TABLE SECURITY.AUDIT(userid VARCHAR(20), event VARCHAR(20), tstamp TIMESTAMP)@

CREATE OR REPLACE PROCEDURE ENVIRONMENT.CONNECTION_SETUP_DBMOD()
BEGIN 
       INSERT INTO SECURITY.AUDIT VALUES(USER, 'CONNECT', CURRENT TIMESTAMP);
END
@

update db cfg using connect_proc ENVIRONMENT.CONNECTION_SETUP_DBMOD @

EOF

접속 전 Audit 테이블 조회

SQL 실행

db2 "select * from security.audit"

실행 결과

USERID               EVENT                TSTAMP
-------------------- -------------------- --------------------------

  0 record(s) selected.

 

접속 시도

db2 connect to sample

 

Audit 테이블 조회

SQL 실행

db2 "select * from security.audit"

실행 결과

USERID               EVENT                TSTAMP
-------------------- -------------------- --------------------------
ORA974               CONNECT              2011-10-19-17.55.20.485295

1. db2haicu 실행 중 에러 발생

(명령어)
db2haicu –f hadr.xml

(실행 결과)

Welcome to the DB2 High Availability Instance Configuration Utility (db2haicu).

You can find detailed diagnostic information in the DB2 server diagnostic log file called db2diag.log. Also, you can use the utility called db2pd to query the status of the cluster domains you create.

For more information about configuring your clustered environment using db2haicu, see the topic called 'DB2 High Availability Instance Configuration Utility (db2haicu)' in the DB2 Information Center.

db2haicu determined the current DB2 database manager instance is hadr97. The cluster configuration that follows will apply to this instance.

db2haicu is collecting information on your current setup. This step may take some time as db2haicu will need to activate all databases for the instance to discover all paths ...
Creating domain db2hadr in the cluster ...
Creating domain db2hadr in the cluster was successful.
Configuring quorum device for domain db2hadr ...
Configuring quorum device for domain db2hadr was successful.
Adding network interface card eth0 on cluster node cluster1 to the network db2_public_network_0 ...
Adding network interface card eth0 on cluster node cluster1 to the network db2_public_network_0 was successful.
Adding network interface card eth0 on cluster node cluster2 to the network db2_public_network_0 ...
Adding network interface card eth0 on cluster node cluster2 to the network db2_public_network_0 was successful.
Adding network interface card eth1 on cluster node cluster1 to the network db2_private_network_0 ...
Adding network interface card eth1 on cluster node cluster1 to the network db2_private_network_0 was successful.
Adding network interface card eth1 on cluster node cluster2 to the network db2_private_network_0 ...
Adding network interface card eth1 on cluster node cluster2 to the network db2_private_network_0 was successful.
Adding DB2 database partition 0 to the cluster ...                                                                                                <-------- 에러
There was an error with one of the issued cluster manager commands. Refer to db2diag.log and the DB2 Information Center for details.
There was an internal db2haicu error. Refer to db2diag.log and the DB2 Information Center for details.

2. 진단로그 에러 메시지

2011-10-06-11.03.01.142906+540 I510055E380         LEVEL: Warning
PID     : 6699                 TID  : 47063466929248PROC : db2haicu
INSTANCE: hadr97               NODE : 000
FUNCTION: DB2 Common, SQLHA APIs for DB2 HA Infrastructure, sqlhaGetPolicyTypeFromSysFile, probe:400
MESSAGE : No matching instance record ... setting policy to none
DATA #1 : unsigned integer, 4 bytes


2011-10-06-11.04.03.207153+540 E514374E546         LEVEL: Severe
PID     : 6699                 TID  : 47063466929248PROC : db2haicu
INSTANCE: hadr97               NODE : 000
FUNCTION: DB2 Common, SQLHA APIs for DB2 HA Infrastructure, handleEndElement, probe:1450
MESSAGE : Failed to create cluster resources for database partition in cluster
DATA #1 : unsigned integer, 4 bytes
0
DATA #2 : String, 6 bytes
hadr97
DATA #3 : String, 20 bytes
cluster2.localdomain
DATA #4 : unsigned integer, 4 bytes
1
DATA #5 : Pointer, 8 bytes
0x000000000854aeb0


2011-10-06-11.31.24.990724+540 E519870E520         LEVEL: Error
PID     : 11458                TID  : 47790888316000PROC : db2haicu
INSTANCE: hadr97               NODE : 000
FUNCTION: DB2 Common, SQLHA APIs for DB2 HA Infrastructure, sqlhaUICreatePartition, probe:200
RETCODE : ECF=0x90000557=-1879046825=ECF_SQLHA_CLUSTER_ERROR
          Error reported from Cluster
DATA #1 : String, 6 bytes
hadr97
DATA #2 : String, 20 bytes
cluster2.localdomain
DATA #3 : signed integer, 4 bytes
1
DATA #4 : signed integer, 4 bytes
0

 

3. 원인

     hadr.xml의 호스트 명을 잘못 적어서 생긴 문제

(명령어)  vi /etc/hosts
192.168.137.241  cluster1.localdomain    cluster1
192.168.137.242  cluster2.localdomain    cluster2

 

(명령어) vi hadr.xml

<?xml version="1.0" encoding="UTF-8"?>
<DB2Cluster xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="db2ha.xsd" clusterManagerName="TSA" version="1.0">
  <ClusterDomain domainName="db2hadr">
     <Quorum quorumDeviceProtocol="network" quorumDeviceName="192.168.137.1"/>

     <PhysicalNetwork physicalNetworkName="db2_public_network_0" physicalNetworkProtocol="ip">
      <Interface interfaceName="eth0" clusterNodeName="cluster1">
        <IPAddress baseAddress="192.168.137.241" subnetMask="255.255.255.0" networkName="db2_public_network_0"/>
      </Interface>
      <Interface interfaceName="eth0" clusterNodeName="cluster2">
        <IPAddress baseAddress="192.168.137.242" subnetMask="255.255.255.0" networkName="db2_public_network_0"/>
      </Interface>
      </PhysicalNetwork>

      <PhysicalNetwork physicalNetworkName="db2_private_network_0" physicalNetworkProtocol="ip">
      <Interface interfaceName="eth1" clusterNodeName="cluster1">
        <IPAddress baseAddress="10.10.10.1" subnetMask="255.255.255.0" networkName="db2_private_network_0"/>
      </Interface>             
      <Interface interfaceName="eth1" clusterNodeName="cluster2">
        <IPAddress baseAddress="10.10.10.2" subnetMask="255.255.255.0" networkName="db2_private_network_0"/>
      </Interface>             
     </PhysicalNetwork>

     <ClusterNode clusterNodeName="cluster1"/>
     <ClusterNode clusterNodeName="cluster2"/>
  </ClusterDomain>

 

4. 해결 방안

   xml 파일의 설정할 때 hostname 명령어를 실행한 결과 값으로 호스트 명을 설정한다.

(명령어) hostname
(결과)  cluster1.localdomain

수정된 xml 파일

<?xml version="1.0" encoding="UTF-8"?>
<DB2Cluster xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="db2ha.xsd" clusterManagerName="TSA" version="1.0">
  <ClusterDomain domainName="db2hadr">
     <Quorum quorumDeviceProtocol="network" quorumDeviceName="192.168.137.1"/>

     <PhysicalNetwork physicalNetworkName="db2_public_network_0" physicalNetworkProtocol="ip">
      <Interface interfaceName="eth0" clusterNodeName="cluster1.localdomain">
        <IPAddress baseAddress="192.168.137.241" subnetMask="255.255.255.0" networkName="db2_public_network_0"/>
      </Interface>
      <Interface interfaceName="eth0" clusterNodeName="cluster2.localdomain">
        <IPAddress baseAddress="192.168.137.242" subnetMask="255.255.255.0" networkName="db2_public_network_0"/>
      </Interface>
      </PhysicalNetwork>

      <PhysicalNetwork physicalNetworkName="db2_private_network_0" physicalNetworkProtocol="ip">
      <Interface interfaceName="eth1" clusterNodeName="cluster1.localdomain">
        <IPAddress baseAddress="10.10.10.1" subnetMask="255.255.255.0" networkName="db2_private_network_0"/>
      </Interface>             
      <Interface interfaceName="eth1" clusterNodeName="cluster2.localdomain">
        <IPAddress baseAddress="10.10.10.2" subnetMask="255.255.255.0" networkName="db2_private_network_0"/>
      </Interface>             
     </PhysicalNetwork>

     <ClusterNode clusterNodeName="cluster1.localdomain"/>
     <ClusterNode clusterNodeName="cluster2.localdomain"/>
  </ClusterDomain>

흔히 우리가 말하는 SP(Stored Procedure),SQC,Function 등의 응용 어플리케이션을 생성하게 되면 DB상에는 Package 라는 것이 생성이 되게 된다.

DB2 Package에는 생성 당시 통계정보를 근거로 최적화된 Access Plan을 가지고 있는 Static라고 보면 된다.
이는 DB상의 Object의 변경시 통계정보를 재구성하고 이를 바탕으로 최적의 Plan을 작성하기 위해 DB2상에서는 Bind 라는 것을 실행 하게 된다.

쉽게말해 짜놓은 application 프로그램상에서 쿼리하는 부분에 최적의 Plan을 짜기 위해 필요하다는 것이다.

아래는 일반적으로 Rebind가 필요한 시점이다.

1. 통계정보 재구성 작업을 실행 하였을 때

2. 인덱스의 생성 및 재구성 작업이 있었을 때

3. Database Configuration중 아래와 같은 내용이 변경되었을 때
    1) BuffPage
    2) SortHeap
    3) Locklist
    4) MaxLocks
    5) Avg_appls

4. 프로그램 내 SQL문이 변경 되었을 때

5. Bind Option이 변경 되었을 때

6. DB2 엔진이 업그레이드 되었을때(패치적용)

7. 기타

DB2의 멀티 파티션 기능을 수행하기 위해서는 서버간 Share 할 수 있는 파일 시스템이 필요하다
파일시스템의 공유를 통하여 서버간에 DB2의 필요한 부분들을 공유 할 수 있다.

물론 이는 NFS라는 기법을 사용하여 일반적으로 구성한다.
AIX에서는 smitty 이라는 인터페이스 툴로 간단히 구성을 할 수 있다.
또한 Linux상에서도 간략한 Command Line을 통하여 NFS를 구성 할 수 있다.

Linux의 CentOS에서 NFS 설정을 해보도록 하겠습니다.
설정은 아래와 같습니다.
=======================================================================
1. 환경
  1) NFS 서버 IP : 192.168.217.128(hostname : Server1)
  2) NFS 공유 파일 시스템(디렉토리) : /Server1
  3) 클라이언트 서버 IP : 192.168.217.129(hostname : Server2)
  4) 클라이언트 마운트할 파일 시스템(디렉토리) : /Server2

2. NFS 서버쪽 설정
  1) /etc/exports 파일의 편집
    : /Server1<NFS 서버 파일시스템> 192.168.217.129<클라이언트 서버 IP>(rw)<읽기,쓰기 권한>
  2) exportfs -v 명령어로 세팅된 /etc/exports 확인 하기
    : exportfs -v

3. NFS 서비스 데몬 기동
   1) PortMap 기동
       /etc/init.d/portmap start
   2) NFS 기동
       /etc/init.d/nfs start
   3) NetFs 기동
       /etc/init.d/netfs start

4. iptables 방화벽 Port 중지
      /etc/init.d/iptables stop

5. 클라이언트 서버쪽 설정
     mount -t nfs 192.168.217.128:/Server1 /Server2
    : NFS 서버쪽의 IP, NFS 서버 쪽 파일 시스템, 클라이언트 서버 Mount 파일 시스템

6. Mount 된 NFS 확인

# 참조(서버의 hostname 변경하기)
 1) echo "Server1" > /proc/sys/kernel/hostname
 
2) vi /etc/hosts 에서 아래와 같이 편집
    
192.168.217.129  Server2
 3) vi /etc/sysconfig/network
     NETWORKING=yes
     NETWORKING_IPV6=yes
     HOSTNAME=Server2
     GATEWAY=192.168.192.2

정보 센터를 통해서 db2iprune으로 불필요한 설치 파일을 없앨 수 있다는 것을 읽은 적이 있다. 그러나 db2iprune가 어디 있는지 몰라 확인을 못하고 넘어 갔었다.

설치 이미지 내부를 뒤지다 db2iprune이 존재하는 위치를 알게 되었다.

많이 활용할 기회가 있을지 없을지 모르겠지만, db2 설치하면서 불필요하게 설치되는 것들은 사전에 제거할 수 있으니 의미가 있을 것도 같다.

개인적으로는 itma 기능은 없애서 깔면 좋겠다 하는 생각을 했다.

설치 이미지 압축을 풀면 server 디렉토리가 생긴다. 그 기준에서

위치: server/db2/운영체제/utilities/db2iprune

db2iprune라는 쉘과 db2server.prn 이라는 설정 파일이 존재한다.

db2server.prn에 주석처리(*) 되어 있는 기능 중 제거하고자 하는 기능의 주석을 풀어 db2iprune를 실행하면 (설치 전) 설치 이미지에서 해당 기능이 제거되어 설치에서 제외 시킬 수 있다.

(경우에 따라서는 설치 이미지 크기를 줄여서 가볍게 설치 파일을 이동시킬 수도 있겠다.)

참고로 설치 이미지 내의 samples(위치:server/db2/운영체제/samples)에 각각 설치 버전에 따른 response file이 있다.

이 파일을 설정해서 db2 설치부터 db생성까지, 변수 값 설정까지 자동화할 수도 있다. (설정 작업이 만만치는 않겠지만.. 동일한 설정으로 많은 시스템에 설치를 해서 사용하는 경우는 편할 수 있겠다.)

명령어
#>./db2iprune –r db2server.prn –o 제거된_새설치이미지_위치

실행 후 /tmp/db2iprune.log 파일의 내용엔 다음과 같이 기록되었다.

DB2 설치 프로그램 로그 파일 시작 시간:  Fri Sep 23 10:16:21 2011 KST
============================================================
운영 체제 정보: Linux 2.6.18-238.el5.#1 SMP Thu Jan 13 15:51:15 EST 2011 x86_64
프룬하려는 선택된 제품:
    IBM DB2 Express Edition
    DB2 Workgroup Server Edition
    DB2 Advanced Enterprise Server Edition
    DB2 Personal Edition
    DB2 Connect Server


프룬하려는 선택된 구성요소:
    DB2 LDAP 지원
    통합 플래시 복사 지원
    Spatial Extender 클라이언트
    DB2 텍스트 검색
    Informix 데이터 소스 지원


프룬하려는 선택된 언어:


대상 디렉토리:                             /work/db2v97prune
SA MP 프룬:                                아니오
IBM Tivoli Monitoring for Databases 프룬:    예


"INFORMIX_DATA_SOURCE_SUPPORT : Informix 데이터 소스 지원 "용 파일 제거 중.


"TEXT_SEARCH : DB2 텍스트 검색 "용 파일 제거 중.


"WSE_PRODUCT_SIGNATURE : DB2 Workgroup Server Edition용 제품 서명 "용 파일 제거중.


"PE_PRODUCT_SIGNATURE : DB2 Personal Edition용 제품 서명 "용 파일 제거 중.

"SPATIAL_EXTENDER_CLIENT_SUPPORT : Spatial Extender 클라이언트 "용 파일 제거 중.

"EXPRESS_PRODUCT_SIGNATURE : DB2 Express Server Edition용 제품 서명 "용 파일제거 중.


"AESE_PRODUCT_SIGNATURE"용 파일 제거 중.


"ACS : 통합 플래시 복사 지원 "용 파일 제거 중.


"LDAP_EXPLOITATION : DB2 LDAP 지원 "용 파일 제거 중.


"CONSV_PRODUCT_SIGNATURE : DB2 Connect Server용 제품 서명 "용 파일 제거 중.

"RELATIONAL_WRAPPERS_COMMON : 일반 관계 랩퍼 "용 파일 제거 중.


DB2 파일 세트 프룬 :.......성공
IBM Tivoli Monitoring for Databases 프룬 :.......성공


DB2 프룬 로그 파일 완료 시간:  2011년 09월 23일 (금) 오전 10시 17분 03초
============================================================

+ Recent posts