Informix에서는 CLR (continuous log restore) 를 통하여 원격지 서버에 복제 서버 구성이 가능한 것으로 알고 있다.

DB2에서는 (내가 모르고 있는 것인지 모르지만) CLR에 해당하는 기능은 없어 보인다.

HADR 설정을 통하여 DB 동기화는 가능하지만, Flash Copy 및 디스크 복제 기반의 이중화 환경에서는 실시간으로 Disk 복제를 하지 않는 이상 불가능하다.

 

한번은 고객사쪽에서 아카이브 로그만 복제 서버로 옮겨서 복구를 계속 할 수 있는지를 문의해 왔다.

즉 rollforward 작업을 한번이 아닌, 여러 번 수행 가능한지 확인이 필요한 문제였다.

아카이브 로그를 원격지 복제서버에 수동으로 옮겨주어야 하는 불편함은 있지만, 이 부분은 제외를 하고 다음과 같이 테스트를 해 보았다.

 

1. 테스트 시나리오

순서

TEST(운영 서버)

TEST1 (복제서버)

1

TEST DB 생성 및 archive log 적용

2

T1 테이블 생성

3

온라인 DB full 백업

4

TEST 온라인 백업을 TEST1 이름으로 Restore

5

T1 에 값 입력(1) 후 로그 스위치

6

아카이브 로그 복사 후 rollforward

7

T1 에 값 입력(2) 후 로그 스위치

8

아카이브 로그 복사 후 rollforward

9

Rollforward 완료 및 데이터 조회

10

데이터 조회

 

2. 테스트

 

TEST(운영 서버)

TEST1 (복제서버)

1

db2 create db test on /database

db2 update db cfg for test using logarchmeth1 disk:/database/archivelog

db2 backup db test to /dev/null

2

db2 connect to test

db2 "create table t1 (c1 int, c2 timestamp)"

3

db2 backup db test online to /database/backup

4

db2 "restore db test from /database/backup into test1"

db2 "rollforward database test1 query status"

Rollforward Status

Input database alias = test

Number of members have returned status = 1

Member ID = 0

Rollforward status = DB pending

Next log file to be read = S0000001.LOG

Log files processed = -

Last committed transaction = 2013-03-20-06.18.12.000000 UTC

5

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

ls /database/archivelog/fed10/TEST/NODE0000/

LOGSTREAM0000/C0000000

S0000000.LOG S0000001.LOG S0000002.LOG S0000003.LOG

 ls /database/archivelog/fed10/TEST/NODE0000/

LOGSTREAM0000/C0000000

S0000000.LOG S0000001.LOG S0000002.LOG S0000003.LOG S0000004.LOG S0000005.LOG

 

6

cp /database/archivelog/fed10/TEST/NODE0000/

LOGSTREAM0000/C0000000/* .

db2 "rollforward db test1 to end of logs"

Rollforward Status

Input database alias = test1

Number of members have returned status = 1

Member ID = 0

Rollforward status = DB working

Next log file to be read = S0000006.LOG

Log files processed = S0000001.LOG - S0000005.LOG

Last committed transaction = 2013-03-20-06.21.14.000000 UTC

7

db2 "insert into t1 values (2,current timestamp)"

db2 archive log for db test

S0000000.LOG S0000001.LOG S0000002.LOG S0000003.LOG S0000004.LOG S0000005.LOG S0000006.LOG

8

cp TEST/NODE0000/LOGSTREAM0000/

C0000000/S0000006.LOG .

db2 "rollforward db test1 to end of logs"

Rollforward Status

Input database alias = test1

Number of members have returned status = 1

Member ID = 0

Rollforward status = DB working

Next log file to be read = S0000007.LOG

Log files processed = S0000001.LOG - S0000006.LOG

Last committed transaction = 2013-03-20-06.26.44.000000 UTC

9

db2 "rollforward db test1 complete"

Rollforward Status

Input database alias = test1

Number of members have returned status = 1

Member ID = 0

Rollforward status = not pending

Next log file to be read =

Log files processed = S0000001.LOG - S0000006.LOG

Last committed transaction = 2013-03-20-06.26.44.000000 UTC

 

db2 connect to test1

db2 "select * from t1"

C1 C2

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

1 2013-03-20-15.21.14.698452

2 2013-03-20-15.26.44.622604

2 record(s) selected

10

db2 connect to test

db2 "select * from t1"

C1 C2

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

1 2013-03-20-15.21.14.698452

2 2013-03-20-15.26.44.622604

2 record(s) selected

 

 

고객사 DB 데이터 암호화 작업 지원 중 진단로그에 다음과 같은 오류가 발생하였다.

 

2013-08-10-12.54.51.756152+540 I75183662C377      LEVEL: Error
PID     : 630814               TID  : 1           PROC : db2pfchr 0
FUNCTION: DB2 UDB, buffer pool services, sqlbReadAndReleaseBuffers, probe:40
RETCODE : ZRC=0x870F0009=-2029060087=SQLO_EOF "the data does not exist"
          DIA8506C Unexpected end of file was reached.

2013-08-10-12.54.51.769508+540 I75184799C441      LEVEL: Error
PID     : 630814               TID  : 1           PROC : db2pfchr 0
FUNCTION: DB2 UDB, buffer pool services, sqlbReadAndReleaseBuffers, probe:50
DATA #1 : String, 162 bytes
Obj={pool:7;obj:1033;type:0} State=x27 Parent={7;1033}, EM=340480, PP0=340608 Page=0 Cont=0 Offset=113664 BlkSize=12
sqlbReadAndReleaseBuffers error: num-pages=6

2013-08-10-12.54.51.779808+540 I75187165C356      LEVEL: Error
PID     : 630814               TID  : 1           PROC : db2pfchr 0
FUNCTION: DB2 UDB, buffer pool services, sqlbPFPrefetcherEntryPoint, probe:0
DATA #1 : String, 78 bytes
Prefetcher Error rc = -2029060087 IGNORED ... err loc 0
. Request follows...

 

원시 디바이스(raw device) 콘테이너를 암호화가 설정된 원시 디바이스로 옮긴 후 테이블 조회 시, prefetcher 에러가 진단로그에 기록이 되었다.

 

해당 문제는 원시 디바이스 환경에서 암호화 작업 시 문제가 생겼으며 암호화 솔루션의 수정(patch)를 통하여 해결되었다.

“데이터 무결성”을 확인하는 방법으로 DB2에서 제공하는 툴들이다. db2dart는 DB가 비활성화(offline)일 때 사용 가능하고, db2 inspace는 DB가 활성화된 상태에서 사용된다는 점이 사용 상 차이점일 듯 하다.

 

두 개의 툴이 사용되는 경우는 DB가 활성화되지 않는 상황이거나, 진단로그(db2diag.log)에 bad page 오류가 발생할 때 사용이 될 뿐 보통의 경우에는 사용하지 않는다. 필자의 경우도 많이 사용해 본 도구들은 아니다.

 

데이터 무결성 확인이외에도 두 개의 도구는 기능상 약간의 차이점이 있다.

(1) db2dart

    - 데이터 추출 기능

    - 테이블 공간의 고수위 마크(HWM)를 떨어뜨리는 기능

    - 유효하지 않는 색인(index) 고치기 기능

 

(2) db2 inspect

    - 압축된 테이블의 “압축으로 인한 스토리지 절감률” 확인

 

 

개인적으로는 DB가 접속되지 않는 상황에서 “테이블공간 목록과 콘테이너 정보”를 확인하고 싶었던 경우가 있다.

(경로재지정 복구를 하고자 함 이였는지, 특정 테이블공간에 대한 정보를 통하여 DB rebuild 복원을 하려고 했었던 것인지는 기억나지 않지만..)

 

이런 경우 db2dart 의 옵션 /ATSC 나 /DTSF 를 사용하면 “스토리지 그룹 정보”, “테이블 공간 정보”, “콘테이너 정보”들을 확인할 수 있다.

 

사용 예 (두 도구의 실행 결과는 db2diag.log가 있는 위치에 결과 파일이 생성된다)

$> db2dart sample /DTSF

Action option: DTSF

Connecting to Buffer Pool Services...

      Storage group file (automatic storage) report phase start.

      Header version:            0
      Header flavour:            1
      Number of storage groups:  1
      Checksum:                  0x0b050154

      Storage group ID:          0
      Storage group name:        DBSTORAGE
      Flavour:                   3
      Version:                   0
      State flags:               0x0000000000000000
      Last LSN:                  0x0000000000000000
      Initial LSN:               0x0000000000000000
      Next path ID:              1
      Checksum:                  0x193a7a22

      Number of storage paths:   1
      Storage path # 0:          /db2/instance/db2inst (id = 0, state = 0x0)

      Storage group file (automatic storage) report phase end.


      Tablespace file report phase start.
      Tablespace information for current database:
      --------------------------------------------


      Number of defined tablespaces:  8
      High water mark of used pools:  7
      Number of disabled tablespaces: 0

      Individual tablespace details:
      -------------------------------

      Information for Tablespace ID: 0

      (생략)

 

$> db2dart sample /LHWM
2 48   (tablespace ID 및 페이지 크기 지정)

The requested DB2DART processing has completed successfully!
Complete DB2DART report found in:/db2/instance/db2inst/sqllib/db2dump/DART0000/SAMPLE.RPT

High water mark:  1952 pages, 61 extents (extents #0 - 60)


Lower high water mark processing - phase start.
     Current high water mark:                    60
     Desired high water mark:                    1
     Number of used extents in tablespace:       57
     Number of free extents below original HWM:  4
     Number of free extents below desired HWM:   0
     Number of free extents below current HWM:   4


Final high water mark:  Extent #56 (57 extents, 1824 pages).

** This cannot be lowered further as there are not enough free extents
   to move the object holding the high water mark.

 

$> db2 "inspect check database results keep db.inspect"
$> cd ~/sqllib/db2dump
$> db2inspf db.inspect db.db2infp -e -s –w

 

DB에 bad page 오류가 발생을 하는 경우 진단로그에 tablespace id 및 object id 들이 기록이 된다.

db가 비활성상태라면 db2dart를 통하여 tablespace id 및 object id를 지정하여 결과 파일을 통하여 page 오류를 확인할 수 있을 것이고,

db가 온라인 상태라면 db2 inspect 를 통하여 “데이터 무결성’을 점검할 수 있을 것 같다.

 

본 도구들을 많이 사용해 봤다면, 특정 주제를 가지고 설명을 했을텐데 둘러보기 식으로 해당 도구에 대한 소개를 마친다.

+ Recent posts