DB V10.5 케플러가 출시된 올해, V9.7 코브라는 이제 오래된 제품처럼 여겨진다.

얘기하고자 하는 내용은 V9.7 때 있었기 때문에 지금은 달라졌을 수도 있다고 생각한다.

 

샘플 데이터

db2 +p –tv << EOF
create table t1 (c1 int);
insert into t1 values (1),(2);
select * from t1;

EOF

 

테스트 SQL

select c1, case when c1=1 then '1234'

            else '12' end c1_string,

            length( case when c1=1 then '1234' else '12' end) c1_length

from t1

 

(Case 1) 오라클 호환성 없는 환경

C1       C1_STRING        C1_LENGTH
---       -------------       ---------------
1          1234                4
2          12                  
2

 

(Case 2) 오라클 호환성 켜지 않고 생성된 DB에 ORA값을 적용한 경우

C1 C1_STRING C1_LENGTH
--- ------------- ---------------
1    1234          4
2    12             4

 

위 2개의 사례로 보면 “오라클 호환성”을 적용함으로서 데이터 길이가 틀리게 인식됨을 확인할 수 있다.

 

IBM Lab에서는 다음과 같이 정리해서 답변을 주었다.

case1) ORA mode + DB2_COMPATIBILITY_VECTOR=

case2) ORA mode + DB2_COMPATIBILITY_VECTOR=ORA

case3) Non ORA mode + DB2_COMPATIBILITY_VECTOR=

C1 C1_STRING C1_LENGTH
--- ------------- ---------------
1   1234          4
2   12            
2

 

case4) Non ORA mode + DB2_COMPATIBILITY_VECTOR=ORA

C1 C1_STRING C1_LENGTH
--- ------------- ---------------
1    1234          4
2    12            
4

 

ORA mode 는 “호환성 변수를 적용하고 DB 생성”함을 의미한다.

 

결론은 “호환성 모드가 아닌 DB에 ORA 값을 적용한 경우, 문자열이 CHAR로 변환”이 된다는 점이다.

즉  출력되어야 문자열 중 “가장 긴 길이를 기준”으로 문자열 길이가 정해져서, 짧은 문자열이 출력되어도 패딩처리되어 문자열 길이는 동일하게 처리되는 것이다. (varchar로 인식이 되었다면 이런 문제는 발생하지 않았을 것이다.)

 

Trace 분석 결과 (0x20은 ASCII에서 공백문자를 의미함)

10509 data DB2 UDB runtime interpreter sqlri_trace_bno_zvals fnc (3.3.112.1463.0.0)

pid 3436680 tid 2829 cpid 2711578 node 0 sec 4 nsec 200418531 probe 0

bytes 17

Data1 (PD_TYPE_DEFAULT,12) Hexdump:

6161 6161 6161 2020 2020 2020 aaaaaa

 

개인적으로 오라클 호환성 변수 사용을 권장하지는 않지만, 사용을 해야 되는 경우 F 정도까지는 무난하지 않나 싶다.

오라클 호환성 옵션 사용 시 검토할 기술문서를 소개하고 마무리 해 본다.

 

https://www.ibm.com/developerworks/mydeveloperworks/blogs/SQLTips4DB2LUW/entry/about_the_db2_compatibility_vector_and_what_not_to_say_at_the_dinner_table282?lang=en

 

 preprpnode 오류 내용 

Error
2632-044 The domain cannot be created due to the following errors that were detected while harvesting information from the target nodes:
svr2: 2632-068 This node has the same internal identifier as svr1 and cannot be included

 원인

preprpnode svr1 svr2 명령으로 2대의 서버 (svr1, svr2)를 한 도메인에 등록시킬 때, 각각의 서버는 서로 다른 RSCT(Reliable Scalable Cluster Technology) ID를 가지고 있어야 하는데, 어떠한 이유에서 (주로 VMware로 구축할 경우, svr1의 이미지를 그대로 복사하여 svr2를 만든 경우) RSCT ID가 동일해서 발생하는 오류임!

 조치

다음의 명령을 두 서버 중 하나에서 실행시켜 RSCT ID를 재 설정한 후, preprpnode 명령을 재 실행 함.

/usr/sbin/rsct/install/bin/recfgct

preprpnode svr1 svr2

 

국가에서 정책적으로 보안 기능을 요구하면서 많은 고객사들이 데이터 보안 프로젝트를 진행하고 있다.

지원하고 있는 한 고객사에서도 보안 기능을 적용하기 위하여 보안 컨설팅을 받은 결과 DB2의 보안 취약점 중 하나로 DB2 서버와 클라이언트 간의 통신 시 사용자 정보의 암호화 되지 않는 점이 지적사항으로 도출되었다.

 

DB2 인스턴스 구성 시 authentication의 기본 값은 SERVER 로 설정된다. 이것은 인증처리가 DB2 서버 쪽에서 처리됨을 의미한다.

정보센터에서 authentication의 값에 대해 찾아 보면 SERVER_ENCRYPT 값은 통신 시 사용자 ID와 비밀번호가 암호화되어 되어진다고 기술되어 있다. 이외에도 GSSPLUGIN 등을 사용한 암호화 방식도 있지만, 개인적으로 DB2내에서 통신 패킷의 사용자 정보 암호화는 SERVER_ENCRYPT 값으로 해도 충분하지 않나 싶다.

 

SERVER_ENCRYPT로 설정한 후 DB2 client를 통해 접속 테스트를 해 본바, 별다른 특이 사항이 발생하지는 않았다.

차후 DB2 설치 작업 시, 보안 측면에서 SERVER_ENCRYPT 값으로 authentication 구성변수를 설정하는 것을 고려해 볼 필요가 있겠다.

+ Recent posts