본문 바로가기

DB2

[SQL] model dimension by 문의가 와서 Oracle 10g에서 제공되기 시작한 model dimension by 에 대해 살펴보게 되었다. DB2의 오라클 호환성이 어지간한 신택스는 다 지원된다고 생각하고 있었는데, 이런 엑셀스러운 신택스도 있는 것을 알게 된 것 같다. 처음보는 기능이기에 어떤 방식으로 처리되는지를 알고자 웹 검색을 해보니 “증분 누적?”(바로 전 값을 계속 누적 연산) 처리 로직정도로 이해가 되었다. (참고) http://www.gurubee.net/lecture/2203 어떤 문서에는 common table (with 문을 통한 recursive 처리) 로의 변환이 되지 않게 쓰인 문서들도 있었는데 위의 참조된 웹 문서를 기준으로 db2 방식으로 변환을 해 보았다. [예제1] 증분 누적 입력 값 및 결과 MM.. 더보기
[관리] 메모리 부족 고객사 요청으로 기술지원을 갔다가 데이터 복구 작업을 해야 되는 경우가 있었다. 특정 테이블의 데이터 복구 작업 시 업무 영향도를 최소화하기 위해서 개발 시스템에 운영DB의 백업 이미지를 경로재지정 복구를 수행하여 필요한 데이터를 추출하는 방법으로 작업을 진행하였다. 문제는 개발서버의 자원이 운영시스템만큼 풍족하지 못하고, 이미 개발DB가 존재하기 때문에 복구 중 rollforward 작업이 진행되지 못하게 되었다. rollforward를 수행하면서 내부적으로 DB가 활성화되는 것 같은데, 개발서버의 물리적 메모리의 가용량이 DB가 필요로 하는 메모리 크기가 되지 못해서 생긴 것 같다. 마치 대저택에서 살던 사람이 사업이 망해 단칸방으로 세간살이를 옮겨야 되는 경우와 비슷한.. 인스턴스 메모리 및 DB .. 더보기
[개발] db2jcc 와 db2jcc4 의 차이 이전에 db2 jdbc driver 버전에 대해 기술한 적이 있다. JAVA 6 (JDK 1.6) 버전 관점에서 설명을 하고 버전 확인하는 법들을 설명했는데, Driver 버전이 4인 경우와 아닌 경우에 따른JAVA 연동 시의 문제점을 최근에 알게 되었다. 문제점 - JDBC 4.0 (db2jcc4.jar) 으로 DB2와 연동하는 경우 SELECT문의 “컬럼 별명"이 반영되지 않는(무시되는) 현상 원인 - jdbc 4.0 에서는 ResultSetMetaData.getColumnName 과 ResultSetMetaData.getColumnLabel 이 명확히 구분되어 ResultSetMetaData.getColumnLabel 를 사용하지 않는 이상 “컬럼 명"으로 결과 값들이 반환됨 정리 JDBC & SQ.. 더보기
[개발] Windows에서 ESQL 컴파일 및 Connect By Siblings 고객사의 connect by 관련 지원하다 C 소스 코드를 컴파일 해보는 작업을 잠시 해 보게 되었다. 윈도우 환경에서 사용되어 C 컴파일러가 필요하여 지인을 통해 무료 컴파일러인 MinGW 다운받아 설치를 했다. 그러나 bldrtn 을 이용해서 컴파일은 되지 않았다. (cl.exe 오류) 왜 오류가 날까? bldrtn을 열어보니 기본 컴파일러로 Visual Studio C++ 를 사용하도록 BLDCOMP 변수에 박여 있었다. 즉 Visual Studio를 설치해야 bldrtn을 구동할 수 있게 셋팅되어 있던 것… MinGW 및 기타 gcc 들을 설치해 봐야 “어떤 값"을 넣어 “기본 컴파일러" 설정해야 하는지 알 수 없기에 Trial version으로 VS를 설치하였다. 물론 VC++이 설치되어 있다고.. 더보기
[이중화] 로그 쉬핑(shipping)을 통한 복제서버 구성 Informix에서는 CLR (continuous log restore) 를 통하여 원격지 서버에 복제 서버 구성이 가능한 것으로 알고 있다. DB2에서는 (내가 모르고 있는 것인지 모르지만) CLR에 해당하는 기능은 없어 보인다. HADR 설정을 통하여 DB 동기화는 가능하지만, Flash Copy 및 디스크 복제 기반의 이중화 환경에서는 실시간으로 Disk 복제를 하지 않는 이상 불가능하다. 한번은 고객사쪽에서 아카이브 로그만 복제 서버로 옮겨서 복구를 계속 할 수 있는지를 문의해 왔다. 즉 rollforward 작업을 한번이 아닌, 여러 번 수행 가능한지 확인이 필요한 문제였다. 아카이브 로그를 원격지 복제서버에 수동으로 옮겨주어야 하는 불편함은 있지만, 이 부분은 제외를 하고 다음과 같이 테스트를.. 더보기
[암호화] SQL0902C (db2pfchr) 고객사 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 PI.. 더보기
[관리] db2dart 와 db2 inspect “데이터 무결성”을 확인하는 방법으로 DB2에서 제공하는 툴들이다. db2dart는 DB가 비활성화(offline)일 때 사용 가능하고, db2 inspace는 DB가 활성화된 상태에서 사용된다는 점이 사용 상 차이점일 듯 하다. 두 개의 툴이 사용되는 경우는 DB가 활성화되지 않는 상황이거나, 진단로그(db2diag.log)에 bad page 오류가 발생할 때 사용이 될 뿐 보통의 경우에는 사용하지 않는다. 필자의 경우도 많이 사용해 본 도구들은 아니다. 데이터 무결성 확인이외에도 두 개의 도구는 기능상 약간의 차이점이 있다. (1) db2dart - 데이터 추출 기능 - 테이블 공간의 고수위 마크(HWM)를 떨어뜨리는 기능 - 유효하지 않는 색인(index) 고치기 기능 (2) db2 inspect .. 더보기
[성능] SQL 성능 분석 DB2에서는 수행된 SQL을 분석할 수 있는 db2 벤치마크 도구를 제공한다. db2batch 라는 도구를 통하여 SQL이 수행된 시간, SQL이 수행되면서 사용된 bufferpool 정보들도 확인이 가능하다. 다양한 옵션이 많지만 장황하지 않는 선에서 다음과 같이 명령어를 정리해 본다. db2batch -d 데이터베이스 -f SQL_파일명 -a ID/PWD -m 변수값 -z 출력_파일명 -iso cs -car cc -o r 1 p 2 e yes 가장 간단한 옵션은 –f 옵션까지만 주어서 SQL문을 실행시키면 된다. 원격에서 실행하는 경우 –a 옵션을 주어 접속 계정 정보를 명시적으로 지정하고, –m 변수를 통하여 동적 SQL을 수행할 수도 있다. jennifer 등을 통하여 실행된 동적SQL의 변수 값.. 더보기
[설치] 리눅스 환경에서 고려해야 될 parameter 리눅스 환경에서 DB2 설치를 하여 사용하는 경우 고려해야 되는 parameter가 존재한다. 1. randomize_va_space = 0 DB2는 “자체 메모리 주소 체계”를 만들어 주소를 관리하도록 설계되어져 있다. 그래서 db2pd –osinfo 에서 "virtual memory” 라고 메모리 항목이 표현된 것을 볼 수 있다. DB2에서 메모리 주소를 가상화해서 사용하다보니, OS 레벨에서 메모리 주소가 가상화 되어지는 것을 메모리 관리 안정성 면에서 위험할 수 있다고 보는 것 같다. 그래서 IBM TechNote에서 리눅스 운영체제에서 랜덤 주소 공간 사용을 하지 못하도록 설정을 권장하고 있다. 개인적으로 운영 서버의 경우 설정될 필요가 있다고 생각이 든다. (개발이나 테스트 용도의 경우는 별도.. 더보기
[관리] Lock 모니터링 및 세션 관리 락 상태를 확인하거나 Waiting에 빠진 상태를 확인하기 위해 db2top (U옵션) 혹은 db2pd –locks wait 등의 명령어를 통해 확인을 한다. 두 명령어 모두 서버에서만 실행가능한 명령어이기 때문에 사용의 제약이 발생한다. SQL로 실행하여 lock 상태는 다음과 같이 snapshot 함수를 통해 확인 가능하다. SELECT a.locks_held, a.MEMBER, a.agent_id app_handl, substr(b.appl_name,1,20) app_name, a.APPL_CON_TIME, a.lock_wait_time, substr(b.client_nname,1,20) client_name, b.client_platform FROM SYSIBMADM.SNAPAPPL AS a, S.. 더보기