문의가 와서 Oracle 10g에서 제공되기 시작한 model dimension by 에 대해 살펴보게 되었다.

DB2의 오라클 호환성이 어지간한 신택스는 다 지원된다고 생각하고 있었는데, 이런 엑셀스러운 신택스도 있는 것을 알게 된 것 같다.

 

처음보는 기능이기에 어떤 방식으로 처리되는지를 알고자 웹 검색을 해보니 “증분 누적?”(바로 전 값을 계속 누적 연산) 처리 로직정도로 이해가 되었다.

 

(참고) http://www.gurubee.net/lecture/2203

 

어떤 문서에는 common table (with 문을 통한 recursive 처리) 로의 변환이 되지 않게 쓰인 문서들도 있었는데 위의 참조된 웹 문서를 기준으로 db2 방식으로 변환을 해 보았다.

 

[예제1] 증분 누적

 

입력 값 및 결과

MM

AMT

결과 값

1

-2000

0

2

4000

4000

3

-5000

0

4

-2000

0

5

3000

3000

6

1500

4500

7

-250

4250

8

320

4570

9

-4000

570

10

10000

10570

11

-20000

0

 

변환 SQL

with

   t1(mm,amt) as

     (select * from

              (values(1,-2000),(2,4000),(3,-5000),(4,-2000),(5,3000),(6,1500),(7,-250),(8,320),(9,-4000),(10,10000),(11,-20000)) t(mm,amt)),


   tmp(c1,c2,c3) as
    (select mm, greatest(0,amt), amt from t1 where mm=1
        union all
     select c1+1,
            (select greatest(0,c2+amt) from t1 where mm=c1+1),
            (select amt from t1 where mm=c1+1)
     from tmp where c1 < (select max(mm) from t1)
    )


select c1,c3 amt, c2 result from tmp ;

 

[예제2] 행 분할 누적

 

입력값

M

AMT

1

100

5

200

6

100

9

300

 

결과

M

결과

1

100

2

100

3

100

4

100

5

200

6

100

7

100

8

100

9

300

10

300

11

300

12

300

 

변환 SQL

with
  t1(mm,amt) as

     (select * from (values(1,100),(5,200),(6,100),(9,300)) t(mm,amt)) ,


  tmp (c1,c2,c3) as
   (select t1.mm, t1.amt, t1.amt from t1 where t1.mm=1
    union all
    select c1+1,
           case when (select amt from t1 where c1+1 = mm) is null then c2
                else (select amt from t1 where c1+1 = mm) end ,
           (select amt from t1 where c1+1 = mm)
    from  tmp
    where c1 < 12 
    )


select c1, c2 from tmp
order by c1
;

 

SQL의 복잡성에 따라서 어떤 경우에는 위처럼 변환되지 않는 경우가 있을 수도 있겠다.

 

개인적으로 SQL 표현을 간소하게 하여 SQL 문을 단순화하고 직관적으로 볼 수 있는 것을 좋아하기에 SQL에 대해서는 Oracle SQL 철학을 좋아한다. (+, connect by 등)

표준 SQL을 준수하는 DB2에서는 이런 부분을 장문의 SQL로 표현을 해야 되는 번거로움을 느끼지만 common table의 미학을 느껴볼 수 있는 계기가 된 것 같다.

'Note' 카테고리의 다른 글

[관리] 메모리 부족  (0) 2014.11.21
[보안] authentication 과 srvcon_auth  (0) 2014.07.14
[보안] SSL 설정  (0) 2014.06.18
[관리] db2gcf  (0) 2014.05.19
[복구] 경로재지정 복구  (0) 2014.04.15

고객사 요청으로 기술지원을 갔다가 데이터 복구 작업을 해야 되는 경우가 있었다.

특정 테이블의 데이터 복구 작업 시 업무 영향도를 최소화하기 위해서 개발 시스템에 운영DB의 백업 이미지를 경로재지정 복구를 수행하여 필요한 데이터를 추출하는 방법으로 작업을 진행하였다.

 

문제는 개발서버의 자원이 운영시스템만큼 풍족하지 못하고, 이미 개발DB가 존재하기 때문에 복구 중 rollforward 작업이 진행되지 못하게 되었다.

rollforward를 수행하면서 내부적으로 DB가 활성화되는 것 같은데, 개발서버의 물리적 메모리의 가용량이 DB가 필요로 하는 메모리 크기가 되지 못해서 생긴 것 같다.  마치 대저택에서 살던 사람이 사업이 망해 단칸방으로 세간살이를 옮겨야 되는 경우와 비슷한..

 

인스턴스 메모리 및 DB 메모리를 변경해도 이 문제는 해결되지 않았다. STMM이 수행되어도 DB내 설정된 버퍼풀의 크기를 충족하지 못해 DB가 활성화되지 못하는..

 

해결 방안을 얻고자 자료들을 찾아보니, Registry 변수에서 버퍼풀 크기를 강제로 제어하는 변수를 알게 되었다.

DB2_OVERRIDE_BPF=버퍼풀ID,페이지수;버퍼풀ID,페이지수

 

운영DB를 통해서 가장 큰 (페이지수가 많은) 버퍼풀ID와 페이지 수를 확인을 하고 크기를 줄여나갔다.

 

이 변수를 적용하고 나서 rollforward 작업 진행되어 데이터 복구 작업을 완료할 수 있었다.

 

이후 언젠가 블로그 글을 살펴보면서 같이 일했던 동료분이 “실수로 bufferpool 크기를 과도하게 설정한 경우 해결하는 방법”으로 글이 적혀둔걸 보게 되었다. (남의 경험이 공유되어도 직접 비슷한 경험을 하지 않는 이상 급박한 상황에서 해결안을 쉽게 찾아내긴 어려운 법 같다.)

고객사 시스템에 직접 터미널로 붙어서 작업하는 환경이 없어져서 장애관련 정보를 수집하고 메모하는 것이 어려워진다. 그저 기억속으로만 간직해야 되는

 

'Note' 카테고리의 다른 글

[SQL] model dimension by  (0) 2015.01.08
[보안] authentication 과 srvcon_auth  (0) 2014.07.14
[보안] SSL 설정  (0) 2014.06.18
[관리] db2gcf  (0) 2014.05.19
[복구] 경로재지정 복구  (0) 2014.04.15

DBM 구성변수에서 지원하는 보안 관련 변수에는 authentication과 srvcon_auth 가 있다.

정보센터를 통해서 보면 동일한 기능을 하는 것처럼 보이는데, 변수를 2개나 제공을 하고 있다.

 

내용을 면밀히 읽어보면, authentication 설정 값보다 srvcon_auth 값이 우선한다고 하는 정도의 차이점이 있겠다.

 

1. server 쪽 DBM CFG 설정

$ db2 update dbm cfg using authentication data_encrypt
$ db2 update dbm cfg using srvcon_auth server

$ db2 get dbm cfg | grep AUTH
Server Connection Authentication          (SRVCON_AUTH) = SERVER
Database manager authentication        (AUTHENTICATION) = DATA_ENCRYPT

 

 

2. client 쪽 catalog 설정

$ db2 catalog db sample at node inst97 authentication data_encrypt

 

3. 접속 결과

$ db2 connect to sample user inst97 using inst97

SQL30082N  이유 "17"("UNSUPPORTED FUNCTION")(으)로 인해 보안 처리에 실패했습니다.  SQLSTATE=08001

 

4. client쪽 catalog 설정

$ db2 catalog db sample at node inst97 authentication server

 

5. 접속 결과

$ db2 connect to sample user inst97 using inst97

  Database Connection Information

Database server        = DB2/AIX64 9.7.2
SQL authorization ID   = INST97
Local database alias   = SAMPLE

 

두 변수의 설정 값이 다른 경우 srvcon_auth 설정값으로 접속이 됨을 확인할 수 있다.

srvcon_auth 값이 설정되지 않는 경우 authentication 값이 적용이 된다.

 

보안관련하여 위 변수들의 값을 data_encrypt 등으로 변경하는 경우 client side에서도 관련하여 설정 작업이 필요하다.

WAS의 경우는 다음과 같은 TechNote를 참고하면 도움이 될 듯 하다.

 

Configure DB2 authorization encryption algorithm

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

'Note' 카테고리의 다른 글

[SQL] model dimension by  (0) 2015.01.08
[관리] 메모리 부족  (0) 2014.11.21
[보안] SSL 설정  (0) 2014.06.18
[관리] db2gcf  (0) 2014.05.19
[복구] 경로재지정 복구  (0) 2014.04.15

+ Recent posts