개발자 친화적인 대안, DB2 Express-C


Grant Hutchison│Product Manager, IBM

요즘 무료 RDBMS (관계형 데이터베이스 관리 시스템) 옵션들이 많이 있다. 이 중 몇몇은 오픈 소스이고, 어떤 것은 상용이지만 무료로 사용할 수 있다. C/C++, Java™, .NET, PHP를 사용하여 애플리케이션을 개발하고 있고 혁신적인 기술과 탄탄한 개발자 커뮤니티 기반을 갖춘 믿을 수 있는 데이터 서버를 찾고 있다면, 새로운 DB2 Express-C를 주목하기 바란다. 이 글에서 DB2 Express-C를 사용하는 방법을 설명하고 애플리케이션 최적화를 위한 자동화 및 튜닝 시나리오를 제공한다.

왜 DB2 Express-C 인가?

DB2 Express-C는 DB2 Universal Database™ (UDB) Express Edition V8.2.2와 같은 핵심 기술에 기반하고 있다. DB2 Express-C는 리눅스와 Windows 플랫폼 (32-bit와 64-bit)에서 사용 가능하며 IBM에서 무료 다운로드를 제공한다. IBM은 DB2 Universal Database Express Edition (DB2 Express) 버전인 DB2 Universal Database Express Edition (DB2 Express)을 2006년 1월 30일 발표했다. C/C++, 자바, .NET, PHP 등 모든 애플리케이션들을 구현하고 전개할 수 있는 강력한 기반을 제공한다.

IBM Cloudscape™와 Express-C는 이제 IBM에서 무료 라이센스로 사용할 수 있으며 애플리케이션 개발과 전개에 사용될 수 있다. 이 두 개의 데이터베이스 서버 모두 SQL과 JDBC 같은 오픈 표준에 기반한 것이기 때문에 두 데이터 서버 간에 자바 애플리케이션과 데이터베이스를 마이그레이션 하기도 편하다. Cloudscape나 Apache Derby를 사용하고 있다면 무료 유틸리티인 Cloudscape Workbench를 사용하여 데이터베이스를 DB2로 마이그레이션 하고 새로운 DB2 Express-C를 실행시킬 수 있다. DB2 Express-C는 Cloudscape 보다 더 큰 다운로드와 디스크 풋프린트를 갖고 있지만 DB2 Express는 더 많은 툴들을 제공한다. 또한, .NET 애플리케이션도 완전히 지원하고 PHP 애플리케이션에는 이상적이다. DB2 Express-C는 최대 두 개의 CPU와 4GB 메모리 까지 활용할 수 있고 데이터베이스의 크기는 제한이 없다. DB2는 많은 디스크에 걸쳐 데이터베이스를 분산하여 확장성과 퍼포먼스를 높이고 있다.

DB2 Express-C는 제품화 준비가 된 데이터베이스 서버로서 매 새로운 릴리스 마다 향상된 혁신적인 기술에 기반하고 있다. DB2는 1995년 이후 Windows에서, 1999년 부터는 리눅스에서 사용 가능하다. DB2의 역사를 알고싶다면 "The Big Picture: IBM DB2 Information Management Software and DB2 Universal Database" (developerWorks, 2003년 1월)을 읽어보기 바란다.

"만약 내 데이터베이스 서버가 4GB 메모리와 2 CPU 이상을 필요로 한다면?" 리눅스, Windows, UNIX용 UDB Enterprise Server Edition (ESE)으로 바꾸면 된다. DB2 ESE는 테라바이트의 데이터를 지원할 수 있는 입증된 플랫폼이다. DB2 ESE는 Database Partitioning Feature (DPF)를 추가하여 데이터베이스 병렬 연산을 수행할 수 있다. DB2 Express-C에서 다른 DB2 에디션으로 전향하는 일은 간단하다. 핵심 데이터베이스 엔진이 같기 때문이다.

DB2 Express-C의 등장과 함께 IBM DB2 전문가들로 구성된 새로운 포럼이 만들어졌다. 이 포럼은 이 새로운 무료의 데이터 서버에 대한 궁금증을 해소할 수 있는 좋은 장소이다. DB2 Express-C는 완벽한 매뉴얼도 갖추고 있고, PDF 포맷이나 DB2 Information Center에서 검색도 가능하다. DB2 Information Center는 온라인 상에서 지속적으로 업데이트 되며 최신 버전을 다운로드 할 수 있고 전용 서버에 설치할 수도 있다. DB2 UDB 제품 매뉴얼 모두 사용할 수 있다. DB2 Information Center는 리눅스, UNIX, Windows용 DB2 UDB의 모든 에디션 공통이기 때문에, Database Partitioning Feature (DPF) 같은 고급 기능들은 DB2 Express-C 환경에는 적용할 수 없다.

리눅스에서 DB2 Express-C를 사용하려면 검증된 최신 리눅스 배포판을 점검해보는 것이 좋다. 리눅스용 DB2에 대한 좋은 참고자료로는 DB2 Universal Database Version 8.2 for 리눅스 HOWTO가 있다.

설치와 실행

DB2 Express-C 설치하기

DB2 Express-C의 최소 메모리 조건은 그래픽 툴이 없는 256MB 또는 그래픽 툴을 가진 512MB이다. 이 글에서 설명하는 머신은 2GB 메모리에 적합하다. 나는 Windows(32-bit)용 DB2 Express-C를 다운로드 했다. 다운로드는 391MB였고 설치는 매우 간단했다. ZIP 파일의 압축이 풀리면(내 시스템 상에서 압축이 풀린 디렉토리는 그렇게 크지 않은 412MB에 불과하다.) setup 실행파일을 실행한다. 이렇게 되면DB2 Express Launchpad가 시작한다. (그림 1) 그래픽 설치자가 DB2 Express-C를 설치할 장소와 DB2 Administration Server의 사용자 아이디와 패스워드를 묻는다. 나는 전형적인 설치작업을 수행했다. 개발 툴과 라이브러리를 포함시켰다. 총 설치 시간은 4분 이내였다.

설치를 계속해 나가다 보면 새로운 윈도우(그림 2)가 디스플레이 된다. 계속 진행하여 첫 번째 DB2 데이터베이스를 만든다. SAMPLE이라고 하는 DB2 Express-C에서 제공하는 샘플 데이터베이스가 있다. DB2 Express-C에서 제공하는 툴을 사용하여 제품 환경에 SAMPLE 데이터베이스를 설정하고, 백만 개 이상의 열을 가진 데이터 테이블의 퍼포먼스 문제들도 다룰 것이다.

DB2 Express-C는 관리하기 수월한 데이터 베이스이다. 완벽한 그래픽 툴과 명령행 툴이 데이터베이스 관리자(DBA)를 돕는다. 가장 일반적으로 사용되는 그래픽 툴은 DB2 Control Center이고 가장 많이 사용되는 명령행 툴은 DB2 CLP(Command Line Processor)이다. 툴 이름을 보면 특징적인 것은 없지만 매력적인 기능을 갖고 있다.

DB2 Express-C에서 제공하는 그래픽 툴은 다양한 범주로 나뉜다. (그림3) General Administration Tools 목록에 DB2 Control Center가 있다. 대부분의 다른 그래픽 툴들은 DB2 Control Center내에서 접근할 수 있다.

DB2 Control Center( 그림 4)는 DBA에게 데이터베이스의 운영 상황을 제공한다. 이 예제를 보면, SAMPLE 데이터베이스 크기는 25MB이고 아직 백업되지 않았다. 자동 관리 역시 설정되지 않았다.

DB2 그래픽 툴 위자드로는 DB2의 일반적인 관리 작업들을 수행하는 방법을 빠르게 배울 수 있다. DB2 Control Center의 각 객체는 객체 트리의 객체를 오른쪽 클릭하여 조작한다. 많은 위자드들은 새로운 DB2 DBA가 백업 데이터베이스 이미지를 만들고 이전 이미지들을 복구하는 등의 일반적인 태스크를 수행할 때 쓰인다. (그림 5)

그림 6을 보면, SAMPLE 데이터베이스가 537MB로 늘어났다. 이 데이터베이스에는 백업 자동화와 관리가 설정되었다. DB2 Express-C가 규정한 alert 상황이 있다. ( 그림 6) 이제 이 상황을 파악하고 해결하는 방법을 알아보자.

DB2만의 유일한 기능은 환경을 실시간으로 모니터링하고 DBA에게 비정상적인 상황들을 공지하는 기능이다. 그림 7에서, DB2가 SAMPLE 데이터베이스에서 시간 당 많은 잠금(lock) 에스컬레이션을 탐지했다. DB2는 데이터베이스 객체에 대한 잠금을 사용하여 트랜잭션 일관성을 보장한다. 이 예제에서 DB2는 한 시간 내에 1150 잠금 에스컬레이션을 수행했다. DB2는 DB2 서버에 할당된 메모리를 가지고 그렇게 많은 잠금 열을 관리할 수 없었다. 이 상황은 잠금 관리용 DB2 서버 메모리를 늘려서 쉽게 해결될 수 있다. DBA가 직접 수정하거나 자동화 처리된다. DB2의 상태 모니터링 기능은 규모가 큰 DB2 Enterprise Server Edition (ESE)을 통해서 DB2 Express-C에도 적용된다. DB2 Express-C가 여러분의 애플리케이션의 트랜잭션 일관성을 보장할 것이다. 각 트랜잭션은 기록되어 데이터베이스 내의 데이터 무결성을 보장한다.

분석 시나리오

데이터베이스 애플리케이션 퍼포먼스는 고객의 솔루션 만족도에 직접적인 영향을 미친다. 최적의 퍼포먼스를 이룩하는 것은 거의 예술의 경지로 취급 받는다. DB2 Express-C는 완벽한 툴(그래픽과 비 그래픽)을 제공하여 고성능의 신뢰성 있는 애플리케이션을 만들 수 있도록 한다. 이 시나리오에서 우리는 우리 회사에서 가장 봉급을 많이 받는 부서를 결정할 것이다. 최적의 퍼포먼스를 이룩하기 위해 DB2 Express-C에서 제공하는 툴 조합을 사용할 것이다.

이 시나리오에서 사용되는 툴은 다음과 같다.

  • db2batch
  • Visual Explain
  • Design Advisor
  • Activity Monitor

db2batch 유틸리티는 쿼리의 런타임 퍼포먼스를 분석하는데 적합한 툴이다. 이 시나리오에서 다음과 같은 SQL 문장을 사용하여 분석을 수행한다.

SELECT DECIMAL(AVG(salary),12,2) as average_sal, location, deptname FROM staff a, org b WHERE b.deptnumb=a.dept GROUP BY dept,location, deptname ORDER BY average_sal DESC

STAFF 테이블은 백만 개 이상의 레코드로 늘어났고 쿼리에 드는 시간도 늘어났다. 그림 8에서, 이 쿼리의 경과 시간은 18초이다. (뉴욕 본사가 최고로 많이 걸렸다. 예상했던 결과이다.)

그림 9는 값비싼 테이블 스캔이 STAFF 테이블에 대해 수행되고 Hash Join 연산이 ORG와 STAFF 테이블의 데이터에 근거하여 수행되었다는 것을 보여주고 있다. 이 테이블에 대한 인덱스가 없기 때문에 DB2는 쿼리 실행 중에 사용할 것이다. 우리는 DB2 Design Advisor를 사용할 것이고 DB2에게 적절한 새로운 인덱스를 ORG와 STAFF 테이블에 붙여서 쿼리 퍼포먼스를 높일 것을 요청한다.

그림 10은 DB2 Design Advisor로부터 온 피드백이다. DEPT와 SALARY 칼럼을 사용하여 STAFF 테이블에 인덱스를 생성할 것을 권고하고 있다. Design Advisor용 쿼리 워크로드는 파일에 제공되거나 애플리케이션 실행 중에 캡쳐될 수 있다.

그림 11은 이 인덱스가 쿼리 실행에 도움이 되었다는 것을 보여주고 있다. 쿼리의 경과 시간이 현격하게 향상되었다. 이제는 7초 밖에 안 걸린다.

그림 12는 STAFF 테이블의 새로운 인덱스가 쿼리 액세스 계획에 사용되고 있다는 것을 확인하는 모습이다. 쿼리의 실행 비용 역시 줄어든다.

마지막으로, 이 쿼리의 실행 중에 사용될 전체 시스템 리소스를 결정하는 방법도 궁금할 것이다. DB2 UDB V8.2에 추가된 새로운 툴인 Activity Monitor는 다양한 SQL 함수와 프로시저를 사용하여 실행 시스템에 대한 퍼포먼스 데이터를 가져온다. 그림 13을 보면, 쿼리가 두 개의 소트를 수행하는데 걸리는 시간이 12초 미만이라는 것을 알 수 있다. Activity Monitor에는 DB2 Express-C 환경을 분석하는데 사용할 수 있는 리포트가 많이 있다.

개발자, 개발자, 개발자

전형적인 DB2 Express-C는 C/C++, 자바, .NET 애플리케이션을 개발할 때 사용할 필수 드라이버와 인터페이스를 제공한다. PHP나 Perl 애플리케이션을 개발하는 것에 관심이 있다면 여기에 사용할 수 있는 드라이버가 있다. PHP와 Perl 인터페이스가 개발되어 DB2 팀 내 엔지니어들이 관리한다. DB2는 저장 프로시저, 트리거, 함수(테이블과 스칼라)를 포함하여 많은 서버측 프로그래밍 언어를 지원한다. DB2 저장 프로시저는 C/C++, COBOL, Java (JDBC 또는 SQLJ), .NET (CLR 호환 언어), SQL Procedure Language (SQL PL)를 사용하여 작성될 수 있다. 저장 프로시저 언어에 따라 선택은 다양하지만 가장 일반적으로 사용되는 언어는 자바와 SQL PL이다.

SQL Procedure Language (SQL PL) 저장 프로시저는 원시 프로시저로 간주된다. 리눅스와 Windows 상의 DB2 데이터베이스 내의 객체로서 저장되기 때문이다. SQL PL은 유일한 ANSI SQL 표준 기반의 저장 객체 언어로서 진화해 왔다. SQL PL은 전체 DB2 데이터베이스 서버 제품군에서 지원된다. (리눅스, UNIX, Windows, iSeries, z/OS 용). DB2 Express-C는 매우 유용한 그래픽 툴인 Development Center를 제공하여 자바와 SQL PL 프로시저를 비롯하여 SQL 저장 프로시저의 개발, 테스트, 전개를 관리한다. 그림 14 는 SQL PL 프로시저의 구현, 테스트, 전개에 사용되는 DB2 Development Center의 모습이다. 이 그림에서 보이는 프로시저는 high_rollers이고 DB2 Express-C 내에서 저장 및 실행된다. 저장 프로시저 실행은 DB2 내에서 엄격히 제어되기 때문에 DB2 데이터로의 액세스를 보안화 하는 기술이라고 할 수 있다.

자바

DB2에서 자바 애플리케이션을 개발하기는 쉽다. 모든 DB2 클라이언트와 서버가 JDBC 3 순응 (type-4) 드라이버를 제공하기 때문이다. 현재 DB2에 포함된 두 개의 다른 JDBC가 있다. 원래 드라이버(db2java.zip)는 Application (type 2)과 Network (type 3) 드라이버로 알려져 있다. 새롭고 보다 유연한 JDBC 드라이버(db2jcc.jar)는 type 2 또는 type 4 모드에서 사용될 수 있고, 최신 자바 클라이언트/서버 산업 벤치마크에서 사용되었다. (SPECjAppServer 2004 with DB2 and WebSphere Application Server ? 참고자료). JDBC (db2jcc.jar)용 DB2 드라이버는 DB2 런타임 클라이언트에 번들 된다. 애플리케이션이 순수 자바이면 CLASSPATH에 db2jcc_license_cu.jar와 db2jcc.jar를 삽입할 수 있다. 이 파일들은 <DB2 Installation location>\SQLLIB\java 디렉토리에 있다. IBM WebSphere Application Server와 DB2 데이터 서버 같은 Java 2 Platform Enterprise Edition (J2EE)서버는 확장성 있는 애플리케이션을 실행할 분산 애플리케이션 인프라를 제공한다.

PHP

PHP("PHP: Hypertext Preprocessor")는 광범위하게 사용되는 오픈 소스의 범용 스크립팅 언어로서 웹 개발에 이상적이고 HTML에 삽입될 수 있다. PHP는 확장성 있는 웹 애플리케이션을 위한 선택으로서 전 세계적으로 빠르게 채택되고 있다. PHP의 DB2 지원은 PHP용 IBM DB2 확장(참고자료")까지 이르렀다. PHP는 수 백만 개의 웹 애플리케이션을 움직일 수 있는 오픈 소스 스크립팅 언어이고 PHP는 1995년 도입된 이래 꾸준히 진화해 오고 있다. PHP용 DB2 확장은 소스 코드로 제공된다. 코드를 컴파일 하지 않고 Windows에서 이 확장을 사용하고 싶다면 Windows용 필수 라이브러리도 있다. (참고자료)

DB2 환경을 설치 및 실행하는 가장 쉬운 방법 중 하나는 IBM과 Zend Technologies에서 개발한 무료 Zend Core™ for IBM을 다운로드 하는 것이다. Zend Core for IBM는 PHP 개발 및 제품 환경으로서 IBM Cloudscape 데이터베이스 서버와 긴밀히 통합되어 있다. 이것은 데이터베이스 기반 애플리케이션의 개발 및 전개 토대가 된다. PHP 지원 및 DB2 지원 등 전체적인 웹 스택 지원이 필요하면 지원 옵션도 사용할 수 있다. Zend Core for IBM은 Cloudscape 데이터베이스 서버와 무료 DB2 Express를 삽입하여 전개를 용이하게 한다. 나중에 전체 DB2 Express Edition 라이센스를 구매하면 DB2 Express 제품 번들에도 지원이 가능하다. 그림 15 는 DB2용 PHP 확장 모습을 보여주고 있는 Zend Core for IBM 관리 웹 콘솔 모습이다.

.NET

DB2 Express-C는 DB2 .NET 1.1 Data Provider와 Microsoft Visual Studio .NET 2003용 애드인(add-in)을 제공한다. IBM 익스플로러와 통합 DB2 도움말이 Visual Studio내에 있다. ( 그림 16) DB2 Express-C가 설치되면 Visual Studio .NET 2003의 존재 여부를 검사하고, 존재할 경우에 DB2 기능을 Visual Studio에 추가한다. 이러한 애드인으로 .NET 애플리케이션의 개발 시간이 줄어든다. DB2 UDB v8.2의 릴리스로 인해, .NET(CLR - Common Language Runtime) 저장 프로시저 지원이 새로운 옵션으로서 추가되었다.

DB2 add-ins for Visual Studio 2005 - Developer Release용 DB2 애드인을 무료로 다운로드 할 수 있다. Developer Release에는 DB2 .NET 2.0 Data Provider와 최근에 릴리스 된 Microsoft Visual Studio 2005 IDE용 애드인 세트가 포함되어 있다.

C/C++ 및 기타

DB2 Express-C는 데이터 액세스, DB2 CLI, Embedded SQL에 두 개의 기본적인 C API를 제공한다. 가장 일반적으로 사용되는 C/C++ API는 DB2 Call Level Interface (CLI)이고, 이것은 X/Open CLI 표준에 근거하고 있다. 이 API는 Windows 애플리케이션에 사용되는 Microsoft ODBC (Open Database Connectivity) API를 매우 닮아있다. DB2 데이터에 대한 Embedded SQL의 접근 방식은 애플리케이션 프로세서를 사용하여 모든 SQL 레퍼런스들을 DB2 서버에 대한 원시 액세스 인터페이스로 대체하는 것이다. Embedded SQL은 SQL 문이 잘 정의도어 있고 애플리케이션 개발 동안에 알려져 있다면 매우 큰 효력을 발휘할 수 있다. SQL은 타당성 검사를 할 수 있고 액세스 계획은 개발 동안에는 잠기기 때문에 애플리케이션 퍼포먼스가 높아진다. SQL 문은 기본적으로 역동적이고, DB2 CLI API 같은 역동적인 SQL 액세스 기술을 많이 선호하고 있다.

COBOL, Perl, Python 같은 DB2 Express-C용 옵션들이 많이 있다. Perl 드라이버는 오픈 소스 Perl 커뮤니티에서 사용할 수 있고 IBM에서 전적으로 관리 및 지원한다. SourceForge.net ( 참고자료 )에서 DB2에 사용할 수 있는 Python 드라이버가 업데이트 되어 있다. Perl, PHP, Python 드라이버 모두 전개에는 DB2 Run-time이, 컴파일과 구현에는 DB2 Application Development Client (DB2 Express-C)가 필요하다.

전개 가이드

데이터베이스 애플리케이션을 전개하려면 고려해야 할 사항들이 있다.

1. DB2 서버 설치하기
2. DB2 클라이언트 설치하기
3. 애플리케이션 전개하기
4. 데이터베이스 전개하기

DB2 서버 환경을 설치는 DB2 그래픽 인스톨러(db2setup (리눅스)/ setup (Windows))를 사용하거나 응답 파일(db2setup -R (리눅스) / setup /U <file-name> (Windows))을 사용하여 비교적 간소하게 설치할 수 있다.

DB2 Run-Time Client는 모든 애플리케이션 프로그래밍 인터페이스(API)와 네트워크 클라이언트 드라이버를 제공하여 리눅스, 유닉스, Windows 상의 DB2에 직접 액세스 한다. Windows의 경우 보다 단순한 클라이언트가 있다. (DB2 Run-Time Client Lite) 풋프린트가 더 적다. DB2 Run-Time Client Lite는 Windows Installer 기반 설치에서 사용될 수 있는 Merge Module도 제공하여 Windows 애플리케이션에서 DB2에 연결을 쉽게 삽입할 수 있다.

애플리케이션 전개 까지는 이 글에서는 설명하지 않겠다. 데이터베이스의 전개는 DB2 백업 이미지를 사용하거나 데이터베이스는 로드 파일로 추출된 데이터에서 구현될 수 있다. 저장 프로시저, 트리거, 뷰, 사용자 정의 함수 같은 애플리케이션 객체들이 알맞게 정의되고 액세스 가능한지를 확인하라.

작동 가이드

DB2 Express-C는 리눅스, 유닉스, Windows용 전체 DB2 서버와 같은 데이터베이스 서버 핵심 기술을 바탕으로 하고, DB2 UDB V8.1과 V8.2에 도입된 많은 기능들은 DBA의 관리 작업을 돕는다. DB2 DBA는 테라바이트의 DB2 시스템 또는 DB2 서버를 관리한다. DB2 Express-C에서는 자가 관리와 자가 튜닝 기능도 사용할 수 있기 때문에 최소한의 DB2 DBA의 기술로도 DB2 Express-C 데이터베이스 서버를 사용하는 애플리케이션의 가용성을 최대화 할 수 있다.

Cloudscape

Cloudscape는 순수 자바 데이터베이스 서버이고 자바 애플리케이션이나 중간 규모의 웹 애플리케이션용 임베디드 데이터베이스 엔진으로서 이상적이다. Cloudscape V10은 2004년 IBM에서 처음 릴리스 되었다. 당시에는 무료의 데이터베이스 서버 라이센스로 릴리스 되었다. 동시에 같은 코드 베이스를 가진 Apache Derby Project가 Apache Software Foundation의 인큐베이터 프로젝트로서 시작되었다. ( 참고자료 ) Cloudscape V10은 2005년 8월에 업데이트 되었다. Cloudscape V10.1 릴리스 이전에 Apache Software Foundation의 Derby Project가 인큐베이션 단계에서 벗어나서 Apache DB 프로젝트의 정식 멤버가 되었다. 매우 활동적인 커뮤니티가 있고 데이터베이스 서버는 많은 고객, 연구원, 비즈니스 파트너들이 사용하고 있다. Cloudscape V10.1은 Derby 10.1 코드 베이스에 인스톨러, 드라이버, 툴 등이 추가된 것이다. IBM은 Cloudscape V10.1 고객을 위해 지원 옵션을 제공한다.

파트너를 위한 자료

IBM Virtual Innovation Center( 그림 17)에서는 ISV(독립 소프트웨어 벤더)와 비즈니스 파트너를 위한 애플리케이션을 제공하고 있다. 솔루션에 DB2 Express Edition V8.2.2를 사용할 계획이 있다면 반드시 등록해야 한다.

요약

DB2 Express-C는 독특한 기능을 가진 데이터 서버의 새로운 대안이다. DB2 Express-C를 다운로드 하여 사용하고 DB2 사용자 커뮤니티에도 참여하기 바란다.

참고자료
교육
DB2 Universal Database Express Edition for Linux and Windows product page
DB2 Universal Database, Version 8.2 for Linux HOWTO
SPECjAppServer 2004 with DB2 and WebSphere Application Server
Apache Derby Project
• "DB2 UDB를 이용한 애플리케이션 개발 (developerWorks, November 2005)
• Interested in using DB2 for Visual Basic .NET or C# .NET applications? Read the latest articles from Sonali Surange:
○ "DB2 UDB for Visual Studio 2005 developers, Part 1: Overview of IBM Database Add-ins for Visual Studio 2005" (developerWorks, December 2005)
○ "DB2 UDB for Visual Studio 2005 developers, Part 2: Build applications and Web sites for DB2 using IBM Database Add-ins for Visual Studio 2005" (developerWorks, December 2005)
developerWorks technical events and webcasts.
developerWorks Information Management zone
Power solutions with DB2 Express to deliver Information on Demand.
제품 및 기술 얻기
DB2 Express-C
Zend Core for IBM, Zend Studio V5.1
• Extensions for PHP:
DB2 native extensions for PHP
DB2 extensions for PHP
Library for extension on Windows
Updated Python driver
IBM trial software
토론
Participate in the discussion forum.
developerWorks blogs

제공 : DB포탈사이트 DBguide.net

Tistory 태그: ,

v8 이전의 JDBC driver을 DB2 JDBC drvier라고 하고,

v8 이후에 새롭게 추가된 JDBC driver를 Universal JDBC driver라고 명명하고 설명합니다.

v8 이상에서는 Universal JDBC Driver를 사용할 것을 권장합니다.

Class files

- db2java.zip : DB2 JDBC Type 2 and Type 3 Driver

- db2jcc.jar   : Universal Type 2 and Type 4 Driver

License jar files (Universal JDBC driver를 사용할 때 필요)

- db2jcc_license_cu.jar : for connecting DB2 v8 for LUW

- db2jcc_license_cisuz.jar : for connecting DB2 for iSeries and z/OS

JDBC Drvier class name

- DB2 JDBC Type 2 Driver : COM.ibm.db2.jdbc.app.DB2Driver

- DB2 JDBC Type 3 Driver : COM.ibm.db2.jdbc.net.DB2Driver

- Universal JDBC Type 2 Driver : com.ibm.db2.jcc.DB2Driver

- Universal JDBC Type 4 Driver : com.ibm.db2.jcc.DB2Driver

JDBC url name

- DB2 JDBC Type 2 Driver : jdbc:db2:db_name

- DB2 JDBC Type 3 Driver : jdbc:db2://host_name:port_name/db_name

- Universal JDBC Type 2 Driver : jdbc:db2:sample

- Universal JDBC Type 4 Driver : jdbc:db2://host_name:port_name/db_name

Windows DB2 사용시 주의점.

JDBC Type4를 사용했을경우 SUN JDK 사용시, IBM CodeSet으로 자동변환이 안되기

때문에 DATABASE생성시 UTF-8코드로 생성해주어야 함.

p.s. IBM에서 DB2 사용시 JDBC Type2를 권장한다고 함.

JDBC Type4 SAMPLE :

import java.sql.*;

public class DbProcess {
public static void main(String[] args) throws Exception{
  Connection con = null;
     Statement stmt = null;
     ResultSet rs = null;
     String url = "jdbc:db2://localhost:50000/sample";
     String user = "admin";
     String password = "1111";
  try {
            Class.forName("com.ibm.db2.jcc.DB2Driver").newInstance();
            System.out.println("Driver Loading");
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        }
        try {
            con = DriverManager.getConnection(url, user, password);
            System.out.println("get Connection Object");
        } catch (SQLException ex) {
            ex.printStackTrace();
        }

        stmt = con.createStatement();
        System.out.println("get Statment Object");
        rs = stmt.executeQuery("select EMPNO from EMPLOYEE");
        System.out.println("get ResultSet Object");
        while(rs.next()){
         System.out.println(rs.getString(1));
        }
     rs.close();
     stmt.close();
     con.close();
}
}

Tistory 태그: ,

'IT > DB' 카테고리의 다른 글

[ORACLE] PL/SQL 정리  (0) 2008.09.20
[DB2] 개발자 친화적인 대안, DB2 Express-C  (0) 2008.09.20
[DB2] DB2 - SQL state [54048]; error code [-1585];  (0) 2008.09.20
[DB2] 명령어 모음  (0) 2008.09.20
[ORACLE] 파티션테이블  (0) 2008.09.19

SQL state [54048]; error code [-1585]; DB2 SQL error: SQLCODE: -1585, SQLSTAT
E: 54048, SQLERRMC: null; nested exception is com.ibm.db2.jcc.b.SqlException: DB
2 SQL error: SQLCODE: -1585, SQLSTATE: 54048, SQLERRMC: null
com.ibm.db2.jcc.b.SqlException: DB2 SQL error: SQLCODE: -1585, SQLSTATE: 54048,
SQLERRMC: null

//여러 개 아우터조인 했을때 발생..

쿼리문을 토드에서 날려보면..

ERROR [54048] [IBM][DB2/6000] SQL1585N  충분한 페이지 크기를 갖는 시스템 임시 테이블 스페이스가 없습니다.  SQLSTATE=54048

저런 메세지가 나온다...

아마도... 임시테이블 공간이 없나??(내가 설정한게 아니라 모르겠다.ㅠㅠ)

불필요한 값들의 컬럼을 지우고 나면 쿼리문 제대로 수행하는듯...


'IT > DB' 카테고리의 다른 글

[DB2] 개발자 친화적인 대안, DB2 Express-C  (0) 2008.09.20
[DB2] DB2에서 JDBC 연결하기  (0) 2008.09.20
[DB2] 명령어 모음  (0) 2008.09.20
[ORACLE] 파티션테이블  (0) 2008.09.19
[ORACLE] ERROR 관련  (0) 2008.09.19

DB2 명령어 모음

서버 구성 파일 db2 get dbm cfg

인스턴스 이름을 변경하거나, service name, port 등을 변경 winntsystem32driversetcservices 파일수정

인스턴스 레벨의 변수를 수정 db2 update dbm cfg using [파라미터] [값]

DB2 Start db2start

DB2 Stop db2stop

db2 deactivate db (db2 activate db 로 메모리 상주시)

db2 force application all

db2stop

DB 연결끊기 db2 terminate

DB2 확인 시작프로그램>IBM DB2>일반관리도구>제어센터

db 생성 db2 create db database명

db 연결 db2 connect to database명 user userid using password

Tablespace의 정보 db2 list tablespaces | more

db2 list tablespace show detail | more

Table의 list db2 list tables for all | more

Table의 column 정보 db2 “select tabschema, tabname, colname, typename,

length, scale, default, nulls from syscat.columns “

제어센터 이용

db 목록 db2 list db directory

tablespace(ex. GisaTBS)가 부족할 경우

# su ? root

smit에서 datavg1에 Logical Volume 64M 짜리를 하나 만듬

# cd /dev

# chown db2inst1:db2iadm1 gisalv2

$ su ? db2inst1

$ db2 connect to depsdb

$ db2 “alter tablespace GisaTBS

add (device ‘/dev/rgisalv2’ 16000)”

TableSpace가 Backup Pending 상태에 빠졌을 경우

$ db2 list tablespaces | more

$ db2 backup database depsdb tablespace GisaTBS ( ex. GisaTBS가 백업 보류 )

TableSpace가 Check Pending 상태에 빠졌을 경우

[다음은 테이블의 점검보류 상태를 조회하는 것이다.

SUBSTR은 SYSCAT.TABLES의 CONST_CHECKED 컬럼에 있는 처음 2바이트를 추출하는데 사용된다.

첫번째 바이트는 외부 키 의무 규정을 나타내고,

두번째 바이트는 점검 의무 규정을 나타낸다.]

$ db2 “ SELECT TABNAME, SUBSTR( CONST_CHECKED, 1, 1 ) AS FK_CHECKED

, SUBSTR( CONST_CHECKED, 2, 1 ) AS CC_CHECKED

FROM SYSCAT.TABLES

WHERE STATUS = 'C' “

그 다음 T1과 T2 테이블을 점검 보류 상태로 설정합니다

$ db2 SET CONSTRAINTS FOR T1, T2 OFF

다음과 같이 수행하여 T1에 대한 제한 조건을 점검하고 첫번째 위반만을 얻습니다.

$ db2 SET CONSTRAINTS FOR T1 IMMEDIATE CHECKED

T1 및 T2에 대한 제한 조건을 점검하고, 예외 테이블 E1과 E2로 위반 행을 기입한다.

$ db2 SET CONSTRAINTS FOR T1, T2 IMMEDIATE CHECKED

FOR EXCEPTION IN T1 USE E1, IN T2 USE E2

IMMEDIATE CHECKED 옵션으로 T1의 FOREIGN KEY 제한 조건 점검과 T2의 CHECK 제한 조건 점검이 무시되도록 합니다.

$ db2 SET CONSTRAINTS FOR T1 FOREIGN KEY, T2 CHECK IMMEDIATE UNCHECKED

에러 메세지 발생시 $HOME/sqllib/db2dump 디렉토리내의 db2diag.log 파일을 조사

db2 “ ? Sql0805 ” ex. db2 " ? list "

갑자기 느려졌을 경우- LOCK 상태확인 db2 get snapshot for locks on depsdb

- Index 설정 여부 dynexpln ?d depsdb “select …..” -o explain.out

손상된 데이터베이스의 강제 삭제

$HOME/instance_name$ rm -r SQL0000x 디렉토리 삭제 0000x는 디비 생성 순서, 손상된 디비의 물리적 디렉토리

runstats 명령

db2 runstats on table 테이블명 [WITH DISTRIBUTION

[AND [DETAILED] {INDEXES ALL | INDEX 색인명}] |

{AND | FOR} [DETAILED] {INDEXES ALL | INDEX 색인명}]

[SHRLEVEL {CHANGE | REFERENCE}]

db2 runstats on table inst.albums with distribution and detailed indexes all

테이블스페이스 및 테이블의 생성

$ db2 create regular tablespace dms04 managed by database using

(file '/dms/dms04' 1000) extentsize 2;

$ db2 create table test1 (partno integer, subpart integer) in DMS04

테이블스페이스 및 테이블의 상태

$ db2 list tablespaces

$ db2 list tablespaces show detail

$ db2 list tablespace containers for tblspace_id

$ db2 list tablespace containers for tblspace_id show detail

$ db2 list tables for all

$ db2 "select tbspace , definer , tbspaceid, tbspacetype,datatype

from syscat.tablespaces "

$ db2 "select tabname , tbspaceid, tbspace, index_tbspace , long_tbspace

from syscat.tables where tabname = 'SYSTABLES' "

$ du -k

테이블스페이스 및 테이블을 삭제 $ db2 drop tablespace test1space

$ db2 drop table userid.test1

DB Application 관리 $ db2 list applications show detail

$ db2 force application ( agent-id ); agent-id는 숫자5자리

Db2batch - SQL 조회에 대한 BMT용 유틸러티 $ db2batch “SQL 조회문”

Dynexpln - 동적 SQL에 대하여 db2expln을 수행

$ dynexpln [[-d <database>] [-e <statement terminator>]

[-f <input file>] [-g] [-i] [-t|

-o <output file> ] [-s <SQL statement>]

[-u <userid> <password> ] ] [ -h | -?]

// 옵션

-e <statement terminator> = SQL 구분자 (default 값은 no terminator)

-g = show optimizer plan graphs

-h 또는 -? = 도움말

-i = show operator ID numbers

-s <SQL statement> = 보고자 하는 SQL 문

-t = terminal output desired

제어센터를 실행시킨 후 해당 데이터베이스에서 오른쪽 마우스버튼을 클릭

limt 쿼리 select * from staff fetch first 5 rows only

select empno, lastname, yyt

from ( select empno, lastname, firstnme,

rownumber() over (order by empno) as yyt

from employee

) as t

where yyt between 20 and 30

ex. select empno, row_number() over() as n from employee ;

select empno, row_number() over(order by empno desc) as n from employee ;

select job, years, row_number() over(partition by job order by years) as n from staff ;

autoincrement 쿼리

CREATE TABLE TESTTB

(TEST INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE )

,NAME VARCHAR (15)

,YEAR INTEGER ) ;

A. Sequence 생성

① db2 connect to sample

② db2 “create sequence s1 start with 2 increment by 3 maxvalue 20 cycle”

B. NEXTVAL

① db2 “values NEXTVAL FOR s1”

② db2 “insert into myempl values (NEXTVAL FOR s1, ‘JOHN’, 50000)

C. Sequence 변경

① db2 “alter sequence s1 minvalue 1”

D. Sequence 삭제

① db2 “drop sequence s1 restrict”

auto commit 설정

db2cli.ini 파일에서 설정 또는 odbc connect 에서 설정.

명령센터>자동확약 체크

heap 크기 바꾸기 - 바꾸고난후 db2stop ; db2start;

db2 update db cfg for db이름 using APPLHEAPSZ 크기 ;

db2 update db cfg for db이름 using dbheap 크기

db2 update db cfg for db이름 using catalogcache_sz 크기

제어센타에서 칼럼을 변경하거나 삭제, 데이타 삽입

데이터 삽입은 제어센터의 아이콘들중 명령센터 프로그램을 실행 .

삭제 버튼은 처음에 테이블을 만들때만 쓰입니다. 즉 만들어진 후엔 기능을 사용할 수 없음.

현재날짜 char로 변환

SUBSTR(CHAR(CURRENT DATE,ISO),1,4) CONCAT SUBSTR(CHAR(CURRENT DATE,ISO),6,2) CONCAT SUBSTR(CHAR(CURRENT DATE, ISO),9,2)

dual 테이블사용

SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1

insert into문

insert into aaa (TDM_ID, FEM_NO, ST_Dimension, ST_Spring_Rate )

select '2010', FEM_NO, ST_Dimension, ST_Spring_Rate from aaa where tdm_id = '1000'

또는

insert into aaa (TDM_ID, FEM_NO, ST_Dimension, ST_Spring_Rate )

= (select '2010', FEM_NO, ST_Dimension, ST_Spring_Rate from aaa where tdm_id = '1000')

CLP바로실행하기

db2cmd -c -i -w db2

SQL파일 실행하기

db2 -svtf 파일명.sql

참조. http://database.sarang.net

'IT > DB' 카테고리의 다른 글

[DB2] DB2에서 JDBC 연결하기  (0) 2008.09.20
[DB2] DB2 - SQL state [54048]; error code [-1585];  (0) 2008.09.20
[ORACLE] 파티션테이블  (0) 2008.09.19
[ORACLE] ERROR 관련  (0) 2008.09.19
[MSSQL] 날짜 형식 변환  (0) 2007.06.29

 Heap Dump 및 Javacore 파일 분석에 대한 유용한 정보

이에 우선 AIX 서버 환경에서 운영(Runtime)환경에서 장애가 발생하였을 경우 이를 분석하여 처리할 수 있도록  다음의 파일들을 생성하여 주고 있습니다.

- Javacore 파일
- Heap Memory Dump 파일


여기에서 이 두 파일들을 분석하여 비주얼하게 SE나 개발자가 분석할 수 있도록 도와주는 툴을 소개해 드리려합니다.
이 툴들은 현재 IBM 개발자 사이트에서 제공하여 주고 있으며 상당히 버젼업이 이루어져 사용하는데 용이해 졌습니다.

각 툴들은 아래의 사이트에서 최신버젼을 다운로드 하시면됩니다.  
(별도 로그인이 필요한 관계로 첨부로 각 툴들을 첨부하였습니다.)


HeapAnalyzer for AIX
 ( 최신 버젼: 2.5)
http://www.alphaworks.ibm.com/tech/heapanalyzer


IBM Thread and Monitor Dump Analyzer for Java Technology
( 최신 버젼: 1.5)
http://www.alphaworks.ibm.com/tech/jca


위의 툴들을 다운로드 하셨으면 각 압축을 푸시면 안에 readme.zip 이 각각 있는데 이것도 풀어주시면 readme.html 이 나옵니다.
여기에 화면 캡쳐 이미지들로 사용 방법이 자세히 설명이 되어 있습니다.
대충 보셔도 대략 이해하시는데 어려움은 없으실 것입니다.

 

하지만 바로 실행을 원하시는 분들을 위하여 여기에 실행 명령어를 알려드립니다. (cmd 상에서....)

 

=> heap analyzer
     : java -Xmx1024m -jar ha25.jar
* 메모리를 분석하고자 하는 dump 파일 보다 크게 설정하여 주어야 합니다.

 

=> javacore analyzer
    : java -Xmx256m -jar jca15.jar


Solaris 상에서의 분석 가이드는 다음의 URL에 잘 설명이 되어 있습니다.
여기에서는 Heap Analysis Tool (HAT) 이라는 툴을 사용하는데 IBM에서 제공하는 툴만큼 사용하기에 용이하지는 않습니다.
(heap dump를 뜨는 것 또한 번거로운 점이 있는데 해야되면 해야 되겠지요. ^^ 자세한 사항은 아래 경로에서 확인해 주세요.)

 

사이트 경로 : http://java.sun.com/developer/onlineTraining/Programming/JDCBook/perf3.html

이 글은 스프링노트에서 작성되었습니다.

'IT > Language' 카테고리의 다른 글

[java] 객체 풀의 동작 원리  (0) 2008.09.20
[JAVA] 문자열중에 한글체크 - getType  (0) 2008.09.20
@Override annotation  (0) 2008.09.16
시간구하기  (0) 2008.09.16
java sleep (시간동안 수행)  (0) 2008.05.19

 // 파티션 테이블 생성

create table pt_test(
  NO NUMBER NOT NULL,
  NAME VARCHAR2(10) NULL
)
PARTITION BY RANGE(no)
(
     PARTITION PT_DUMMY VALUES LESS THAN (-1)
);


//파티션 테이블 추가
alter table PT_TEST ADD PARTITION PT_1 VALUES LESS THAN (5);
alter table PT_TEST ADD PARTITION PT_2 VALUES LESS THAN (11);

//TEST DATA INSERT
INSERT INTO PT_TEST VALUES (1 , 'A');
INSERT INTO PT_TEST VALUES (2 , 'B');
INSERT INTO PT_TEST VALUES (3 , 'C');
INSERT INTO PT_TEST VALUES (4 , 'D');
INSERT INTO PT_TEST VALUES (5 , 'E');
INSERT INTO PT_TEST VALUES (6 , 'F');
INSERT INTO PT_TEST VALUES (7 , 'G');
INSERT INTO PT_TEST VALUES (8 , 'H');
INSERT INTO PT_TEST VALUES (9 , 'I');
INSERT INTO PT_TEST VALUES (10 , 'J');
INSERT INTO PT_TEST VALUES (11 , 'K');

 

//확인

SELECT * FROM PT_TEST
SELECT * FROM PT_TEST PARTITION (PT_1);
SELECT * FROM PT_TEST PARTITION (PT_2);

 

//파티션 삭제

ALTER TABLE  pt_test DROP PARTITION pt_1;

 

// 파티션 이름 변경

ALTER TABLE pt_test RENAME PARTITION pt_1 TO pt_one;

 

// 파티션 데이터 TRUNCATE

ALTER TABLE pt_test TRUNCATE PARTITION pt_1;

'IT > DB' 카테고리의 다른 글

[DB2] DB2 - SQL state [54048]; error code [-1585];  (0) 2008.09.20
[DB2] 명령어 모음  (0) 2008.09.20
[ORACLE] ERROR 관련  (0) 2008.09.19
[MSSQL] 날짜 형식 변환  (0) 2007.06.29
[ORACLE] CREATE USER  (0) 2007.03.16

 -----
현상 : ORA-1034, "ORACLE not available"
ORA-7320, "smsget: shmat error when trying to attach sga."
ORA-7429, "smsgsg: shmget() failed to get segment."
원인 : ORACLE DBA 사용자만 데이타베이스를 ACESS할수 있고 다른 사용자는 SQL*PLUS 등을 통하여
CONNECT를 하려고 할때 다음 에러가 발생 할경우
-----
현상 : TPFAILED ......................
sqlca.sqlcode ==> -1036
ORACLE에서 단독으로 실행하면 문제가 발생되지 않고 OUTPUT을 정확하게 출력하지만
TP/M와 함께 실행이 되면 SQL SELECT문을 수행하지 못하고 sqlca.sqlcode ==> -1036의
MESSAGE를 뿌리고 실행을 멈춘다.
원인 : ORACLE에서 Version간의 Segment 정의부분이 다르기 때문
조치 : makefile 혹은 proc.mk file에서
sqlcheck=semantic userid=scrjpcs/scrjpcs를 포함시킨다.
-----
현상 : ORA-1039: insufficient privileges on underlying objects of the view.
원인 : SYS user가 아닌 다른 user로 SQL Analyze에 로그인하여 SQL statement에 대한 explain plan 옵션을 사용할 때 다음과 같은 에러가 발생
조치 : 1.dictionary table/view들을 validate시켜 놓으려면 dba가 read 권한만 SQL Analyze를 수행하는 user에게 grant하면 충분하다.
2.SYS user로서 SQL explaining을 수행하는 것이다.
-----
현상 : ORA-9992 scumnt: failed to open
ORA-9993 scumnt: failed to lock
ORA-1102 cannot mount database in exclusive mode
원인 : 서로 독립적인 두개의 instance가 동일한 database file들을 동기화 (synchronisation)없이 access할 수 있기 때문에 database corruption을 유발시킬 수 있었다.
조치 : database의 db_name이 변경되면 각각의 lk file을 생성.
-----
현상 : ORA-01118: cannot add any more database files: limit of XXX exceeded
원인 : 데이타 화일의 갯수가 MAXDATAFILES 값에 도달한 경우 발생
조치 : MAXDATAFILES를 늘리기 위해서는 DB를 새로 만들어야 하며 그 이후 버젼을 사용중이라면 콘트롤
화일을 새로 만들어서 MAXDATAFILES를 늘릴 수 있다
-----
현상 : ORA-1157 : cannot identify data file 11 - file not found
ORA-1110 : data file 11 : '/user1/oracle7/dbs/user2.dbf'
원인 : OS 명령으로 DATA FILE 을 삭제한 경우
조치 : DATABASE STARTUP시 STARTUP MOUNT 단계까지 실행한 후, 문제의 데이타 화일을 OFFLINE 시킨다.
데이타베이스를 오픈한다. 단 데이타베이스 오픈이 정상적으로 수행되면 문제가 발생한 데이타
화일을 포함하고 있는 TABLESPACE를 DROP하지 않을 경우에는 DATABASE STARTUP시 항상 데이타
화일의 오픈 단계에서 에러가 발생된다. 따라서, 문제의 데이타 화일의 OFFLINE과 TABLESPACE의
DROP전에 반드시 해당 TABLESPACE를 사용하고 있는 USER의 데이타 백업을 수행해야 한다.

데이타 화일의 OFFLINE과 관련된 명령은 다음과 같다.
SQLDBA를 COMMAND LINE MODE로 기동시킨다.

$ sqldba lmode=y
SQLDBA> CONNECT INTERNAL;
SQLDBA> STARTUP MOUNT;
ORACLE instance started.
Database mounted.
SQLDBA> ALTER DATABASE DATAFILE '/user1/oracle7/dbs/user2.dbf'
OFFLINE DROP;
Statement processed.
SQLDBA> ALTER DATABASE OPEN;
Statement processed.
SQLDBA> DROP TABLESPACE tablespace_name INCLUDING CONTENTS;
Statement
-----
현상 : ORA-01237 cannot extend datafile %s
원인 : O/S 레벨에서는 file size를 1TB 이상 지원한다고 하는데, oracle datafile을 2G 이상으로 resize하려고 한다거나 tablespace에 datafile을 추가하거나 생성할 때, 2G 이상 주면 file size limit에 걸리는 현상 발생
조치 : 화일 시스템에서 large file을 사용하기 위해서는 화일 시스템을 'largefiles' option으로 mount해야 한다.
-----
현상 : ORA-1400 primary key or mandatory(NOT NULL) column is missing or NULL during insert
원인 : 어떤 필수적인 열을 위한 값을 공급하지 않은 경우
-----
현상 : ORA-1401 inserted value too large for column(열에 입력한 값이 너무 큽니다.)
원인 : 문자열을 할당하고자 할때 길이가 최대치를 초과한 경우
-----
현상 : ORA-1403 no dada found
원인 : 사실상 전혀 Error가 아니다.
-----
현상 : ORA-1405 fetched column value is NULL
원인 : ERROR 가 아니고 WARNING MESSAGE 이다.
조치 : dbms=v6 를 PRECOMPILER OPTION 에 추가해준다. dbms=v6 로 SETTING 할경우는 HOST 변수에
NULL 이 RETURN 되더라도 sqlca.sqlcode 는 0 이 된다.
-----
현상 : ORA-1407 cannot update mandatory(NOT NULL) column to NULL
원인 : 필수적인 열의 값을 NULL에 설정한 경우에 발생
-----
현상 : ORA-1408 such column list already indexed
원인 : 이미 동일한 열 List에 기초한 Index를 갖고 있는 Table에서 Index를 작성하고자 하는 경우에 발생
-----
현상 : ORA-1410 invalid ROWID
원인 : 1.적절한 Format으로 ROWID를 상술하지 않은 경우에 발생
2.지정된 ROWID가 존재하지 않은 경우에 발생
-----
현상 : ORA-01438: 지정한 정도를 초과한 값이 열에 지정되었습니다.
원인 : 지정한 자릿수를 초과한 Column이 존재한 경우에 발생
-----
현상 : ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "SYS.STANDARD", line 648
ORA-06512: at "BETH.BETH", line 6
ORA-06512: at line 1
원인 : SELECT 문에서 조건에 해당하는 row가 2건 이상
return되었을 때 발생하는 TOO_MANY_ROWS 에러와 동일한 에러이다.
조치 : 확인한 결과 DUAL table에서는 비록 2개의 ROWID를 볼 수는 없지만,
실제 2개의 row가 DUAL table에 존재하는 상황이다.
따라서, 다음 명령을 이용하여 여분의 필요없는 row를 delete해야 한다.
-----
현상 : ORA-1449 column contains NULL values; cannot alter to NOT NULL
원인 : 어떤 열을 필수적인 것으로 변경하고자 하나 적어도 테이블 내의 한 행이 그 열을 위한 NULL값을
가질 때 발생
-----
현상 : ORA-1452 cannot CREATE UNIQUE INDEX; duplicate keys found
원인 : 값이 독특하지 않은 일련의 열에서 독특한 인덱스를 작성한 경우에 발생
-----
현상 : ORA-1453 SET TRANSACTION must be first statement of transaction
원인 : 모종의 다른 SQL문 이후에 SET TRANSACTION문을 기동할 때 발생
-----
현상 : ORA-01458 Invalid length inside variable character string
원인 : DB Table field의 길이와 Host Variable의 길이 차이가 있을때 발생한다.
그러므로 Table field의 길이와 Host Variable의 길이를 비교해 본다. 혹은 Stored
Procedure의 Input Parameter가 Null 값으로 넘겨질 때도 발생한다.
조치 : DB Table field와 Host Variable의 길이를 조정한다.
Stored Procedure의 Input Parameter에 Null값을 0의 값을 채워서 넘긴다.
주의 : Stored Procedure에서 Cursor를 사용할 때
FOR ... LOOP를 사용할 때 주의를 해야한다.
FOR i IN 1..batch_size LOOP
FETCH get_emp
INTO
emp_name( i )
,job( i )
,sql( i )
;

IF get_emp%NOTFOUND THEN -- if no row was found
CLOSE get_emp;
done_fetch := 100; -- indicate all none
EXIT;
ELSE
done_fetch := 900; -- indicate all none
found := found + 1; -- count row
END IF;
END LOOP;
에서 Fetch Array의 0번째에 Data를 저장할 때 문제가 생긴다.
그러므로, emp_name( 0 )이라고 하면 Error를 발생한다.
-----
현상 : ORA-01476: divisor is equal to zero
원인 : Zero값으로 임의의 수를 나누었을때 발생
-----
현상 : ORA-01480: trailing null missing from STR bind value
원인 : 1.해당 Column의 Size 보다 더 큰 값이 들어온 경우에 발생
2.Character Type(CHAR, VARCHAR)의 Host variable인 경우 변수 선언시 Table의 Column size 만큼의 변수길이를 선언한 경우 발생
조치 : 1.해당 Column의 Size와 해당값을 확인
2.Character Type(CHAR, VARCHAR)의 Host variable인 경우 변수 선언시 Table의 Column size에 1를 더해 주어야 한다.
(데이터의 마지막에 NULL 문자를 포함해야 하기 때문에)
-----
현상 : ORA-1481 invalid number format model
원인 : 어떤 숫자 Format Model이 미정의 문자를 포함한 경우에 발생
-----
현상 : ORA-1547 : Failed to allocate extent of size 'num' in tablespace 'TOOLS
원인 : TABLESPACE가 에러에 명시된 ORACLE block 수 만큼의 요청된 EXTENT를 할당할 충분한 FREE
SPACE를 갖고있지 못할 경우에 발생
조치 : 1.해당 TABLESPACE내에서 연속된 영역의 ORACLE block 할당할 수 있도록 데이타 화일을 추가
2.TABLE의 STORAGE PARAMETER에서 INITIAL EXTENT, NEXT EXTENT의 크기를 조정하여 TABLE을
재구축
3.다음의 방법으로는 관련 TABLESPACE를 재구성하는 것
-----
현상 : ORA-1552 (CANNOT USE SYSTEM ROLLBACK SEGMENT FOR NON-SYSTEM TABLESPACE '%S')
원인 : SYSTEM TABLESPACE 이외의 TABLESPACE를 포함한 OPERATION을 위하여 SYSTEM TABLESPACE의
ROLLBACK SEGMENT를 사용할 경우에 발생
조치 : SYSTEM TABLESPACE에 하나 이상의 ROLLBACK SEGMENT를 추가한 다음, 데이타베이스 오브젝트를
생성
-----
현상 : ORA-1555 Snapshot Too Old
원인 : 1.데이타의 변경이 심한 데이타베이스에서 롤백 세그먼트의 갯수와 크기가 작을 경우에 발생
2.롤백 세그먼트가 손상되어 읽을 수 없게 된 경우
3.Fetch Across Commit(테이블에 대하여 Query가 커서를 열고 루프 내에서 데이타를 Fetch
하고 변경하고 커밋하는 과정에서 발생)
4.Delayed Block Clean Out(데이타 블럭이 변경되고 커밋되면 오라클은 롤백세그먼트 헤더에
그 트랜잭션이 커밋되었다고 기록하지만 데이타 블럭을 바로 변경하지는 않는다 (Fast
Commit). 그리고 다음 트랜잭션이 변경된 블럭을 요구할 때야 비로소 변경 시키는것
조치 : 1.커서가 Open된 상태에서는 커밋을 자주하지 않고 롤백 세그먼트 크기를 키워 나가도록
2.커서를 사용하기 전에 Full Table Scan을 해주면 예방이 가능
-----
현상 : ORA-1562(Failed to extend rollback segment(id = %s))
원인 : 1.사용중인 ACTIVE 상태의 ROLLBACK SEGMENT가 다음 EXTENT를 할당하고자 할 경우
2.해당 ROLLBACK SEGMENT에 대하여 발생 가능한 최대 EXTENT 수를 초과할때 발생
조치 : ROLLBACK SEGMENT의 재생성
-----
현상 : ORA-01578: ORACLE data block corrupted (file # 6, block # 3)
ORA-01110: data file 6: '/tmp/ts_corrupt.dbf'
원인 :
조치 : 해당 objects를 drop하고 recreate하여 처리
-----
현상 : ORA-01578
원인 : data block 에 corruption 이 생긴 경우에 발생.
조치 : 1.최선의 해결책은 backup 받아둔 file 을 restore 한 후 recover 작업을 하는 것이다.
2.backup datafile 을 restore 하고 recover 하지 않을 것이라면 우선, 어떤 object 에서 corruption 이 발생하였는지 확인해야 한다.
3.해당 segment 가 non-data dictionary index 라면, 해당 index 를 drop 한 후 재생성한다.
4.해당 segment 가 table 이라면, corruption 이 발생한 block 의 data 는 소실된 것이다.
5.만약 해당 table 에 대한 최근의 export dump file 이 존재한다면, 해당 table 을 drop 한 후 import 함으로써 복구할 수 있다.
6.corruption 이 발생한 non-clustered table 에서 corrupted block 을
access 하지 않고 나머지 data 들을 select 할 수 있도록 ROWID 를 이용할
수 있다.
7.만약 data dictionary 에 속하는 table, index 또는 rollback segment에
corrupted block 이 발생하였다면 Oracle Support 의 지원을 받는다.
8.일반적으로, ORA-1578 은 hardware 의 문제때문에 유발된다. 하지만 만약에
ORA-600[3374] 가 발생한다면 memory 상에서 corruption 이 발생한
경우이다. 이 경우 database 를 restartup 하면 문제가 해결될 수 있다.
-----
현상 : ORA-1591(Pending Transaction의 처리)
원인 : 분산 트랜잭션의 경우 2 phase commit수행 단계중에 fail이 발생하게 되면 관여된 일부 database에서는 rollback 혹은 commit이 되고, 일부는 distributed lock이 걸린 상태로 계속 지속될 수 있다.
이렇게 pending된 transaction에 대해서는 기본적으로 Oracle의 background process인 RECO process가 자동으로 정리하여 주나, 경우에 따라 자동으로 정리가 되지 못하는 상황이 발생
조치 : STEP 1: alert.log file을 check한다.
STEP 2: network 환경을 확인한다.
STEP 3: RECO process가 떠 있는지 확인한다.
STEP 4: DBA_2PC_PENDING을 조회해 본다.
STEP 5: DBA_2PC_NEIGHBORS view를 조회해 본다.
STEP 6: commit point site를 확인한다.
STEP 7: DBA_2PC_PENDING의 MIXED column을 확인한다.
STEP 8: DBA_2PC_PENDING의 STATE column의 값을 확인한다.
STEP 9: 불일치 사항을 파악하고 DBA_2PC_PENDING을 정리한다.

2PC에서 1st phase commit(xa_prepare)이 정상적으로 종료되면 Oracle의 dba_pending_transaction에 해당
Transaction에 대한 정보가 나타난다.

formatid 40
globalid 636861656A750000000000000000000000000000000000
5B5103A6BEC9900000DE8
branchid 0000006600000065

이 상태에서 일정한 시간 내에 2nd phase commit(xa_commit)에 끝나지 않으면 dba_2pc_pending에도 이
Transaction이 나타난다.

local_tran_id 4.24.3026
global_tran_id 40.636861656A750000000000000000000000000000000000
5B5103A6BEC9900000DE8
state prepared
mixed no
advice
tran_comment
fail_time
force_time
retry_time
os_user jun
os_termina
host chaeju
db_user
commit# 5332231

위에서 "일정한 시간"이란 용어를 사용했는데 Oracle의 문서에는 이에 관한 정확한 언급은 없다.
다만, 다른 Transaction에서 해당 레코드를 참조하려고 할 때 이미 lock이 걸려 있으므로 대기하는
시간에 대해서는 init.ora에서 지정하는 distributed_lock_timeout에 대해서만 언급하고 있다. 그런데
oracle 8.1.7에서는 distributed_lock_timeout을 설정하면 obsolete로 나온다.

이 시간 동안에 해당 레코드에 대한 lock이 풀리지 않으면 아래와 같은 에러를 만난다.

ORA-02049: time-out: distributed transaction waiting for lock

위의 에러가 발생한 이후에 이 레코드를 참조하려고 하면 1591 에러가 나타난다.

ORA-01591: lock held by in-doubt distributed transaction '4.24.3026'

보는 것처럼 ORA-01591 에러 메시지에는 local_tran_id가 있다. 이를 이용하여 dba_2pc_pending에서
global_tran_id를 조회하고, 이 데이터는 dba_pending_transaction의 formatid와 globalid로 이루어져
있으므로 이를 이용하여 dba_pending_transaction에서 branchid도 얻을 수 있다.

이들로 부타 아래와 같이 XID를 얻을 수 있다.

xid.formatid = dba_pending_transactions.formatid
xid.gtrid_length = len(dba_pending_transactions.globalid)
xid.bqual_length = len(dba_pending_transactions.branchid)
xid.data = dba_pending_transactions.globalid + dba_pending_transactions.branchid

여기까지는 Oracle로 부터 XID를 얻는 과정이다.

tpconvert(str, (char *)&xid, TPTOSTRING | TPCONVXID)를 이용하여 XID의 string 표현을 얻을 수 있고
이값을 이용하여 .TMIB 서비스를 호출하면 아래와 같은 정보를 얻을 수 있다.

TA_ERROR 0
TA_MORE 0
TA_OCCURS 1
TA_GRPCOUNT 2
TA_GRPINDEX 0
TA_GRPNO 102
TA_GRPNO 101
TA_TIMEOUT 9
TA_COORDGRPNO 102
TA_CLASS T_TRANSACTION
TA_STATE READY
TA_COORDLMID SITE1
TA_GSTATE READY
TA_GSTATE READY
TA_TPTRANID 0x0 0x3a6bec99 0xde8 0x28 0x0 0x0
TA_XID 0x0 0x3a6bec99 0xde8 0x28 0x66
TA_COORDSRVGRP APPGRP2
TA_LMID SITE1
TA_SRVGRP APPGRP2
TA_SRVGRP APPGRP1

위의 경우에는 아직 Tuxedo가 transaction에 대한 정보를 가지고 있기 때문에 별다른 조치가 필요없다.
하지만, Oracle의 dba_2pc_pending에는 있는데 Tuxedo에서 해당 Transaction에 대한 정보를 가지고
있지 않은 경우에는 Oracle에서 rollback force나 commit force를 이용하여 pending transaction을
정리해 주어야만 lock이 풀린다.
-----
현상 : ORA-1628, 00000, "max # extents (%s) reached for rollback segment %s"
ORA-1630, 00000, "max # extents (%s) reached in temp segment in tablespace %s"
ORA-1631, 00000, "max # extents (%s) reached in table %s.%s"
ORA-1632, 00000, "max # extents (%s) reached in index %s.%s"
원인 : 오브젝트의 익스텐트가 MAX # 에 도달 했기 때문에 발생되며 오브젝트의 MAXEXTENTS는
STORAGE 의 MAXEXTENTS 파라미터에 의해 결정
조치 : ALTER TABLE .. STORAGE (MAXEXTENTS n)를 사용하여 최대 MAXEXTENTS 값보다 작은 수로
MAXEXTENTS를 늘려준다.
-----
현상 : ORA-1652, 00000, "unable to extend temp segment by 6144 in tablespace "VESSEL"
원인 : 테이블이나 인덱스 등을 만들 때 자신의 TEMP TABLESPACE 가 아닌 곳에서 ORA-1652(temp
tablespace가 부족함) 에러가 발생
조치 : 에러메시지에서 보여주는 대로 해당 테이블스페이스에 Temporary Segment 가 생성될 만한
연속된 공간을 마련하여 주는 것
-----
현상 : ORA-1653
원인 : 특정 tablespace 에 space 가 부족해서 table의 extent가 일어나지 못해서 발생
조치 : user의 default tablespace 를 변환한 후, 이 default tablespace
안에 create table을 다시 한 후 sql*loader 를 실행한다
-----
현상 : ORA-1654 ERROR ON INDEX SEGMENT
원인 : tablespace가 적어 extent 영역을 할당할 수 없어서 발생
조치 : datafile을 추가 시 이전값 이상의 사이즈를 추가해야 함.
-----
현상 : ORA-1722 invalid number
원인 : 수치값이 불법일 경우
-----
현상 : ORA-1747 열명을 올바르게 지정해 주십시요.
원인 : 열명이 다른 경우(SQL문장 기술시 첫번째 열명 앞에 Comma를 삽입한 경우)
-----
현상 : tb_ra315 insert error ORA-02291: integrity constraint (SCRJAPPR.A315_E007_FK)
violated - parent ....
원인 : Table과 관련된 Reference 관계로 parent table의 data가 없는 관계로 data 입력불가
조치 : Reference 관계를 끈어주든지 아니면 관계된 Table에 Data를 모두 입력하는 방법.
-----
현상 : ORA-02303: cannot drop or replace a type with type or table dependents
원인 : Type이나 table의 dependency가 있는 type을 drop하거나 replace하고자 할 때 발생.
조치 : SQL Reference guide에 의하면 DROP TYPE FORCE 옵션은 recommend하지 않는다.
왜냐하면 이 옵션을 쓰게 되면 복구가 불가능하고 dependency가 있던 table들은
access하지 못하는 결과를 초래한다.


'IT > DB' 카테고리의 다른 글

[DB2] DB2 - SQL state [54048]; error code [-1585];  (0) 2008.09.20
[DB2] 명령어 모음  (0) 2008.09.20
[ORACLE] 파티션테이블  (0) 2008.09.19
[MSSQL] 날짜 형식 변환  (0) 2007.06.29
[ORACLE] CREATE USER  (0) 2007.03.16

 

Annotation은 Java code만으로 전달할 수 없는 부가적인 정보를 컴파일러나 개발툴로 전달할 수 있다. @Override annotationsuper classinterface의method를 override하고 있음을 명시한다. 하지만, 사소한 syntax 실수 등으로 orverride가 구현되지 않는경우가 있는데, 이는 runtime 레벨에서 오작동 등으로 드러나게 되므로 그 원인을 찾기가 쉽지 않다. 여기에@Override annotation을 사용하면 compile 레벨에서 상위 메소드를 정확히 구현하고 있는지를 체크할 수 있다.@Override annotation이 컴파일러에게 Override method임을 알려주기 때문이다.

하지만, @Override annotation을 사용했을 때, must override a superclass method라는 에러가 발생한다면, 컴파일러의 버전을 의심할 필요가 있다. J2Se 5.0, 그러니까 JDK 1.5는 @Overrider annotation을 지원하지만, super class에 대해서 지원할뿐, Interface에 대해서는 지원하지 않는다. Interface에 대한 지원은 JDK 1.6을 사용할 때 가능하다.

Interface의 method를 override하는 경우 @Override annotation을 사용하고 싶다면, JDK 1.6버전(J2SE 6.0)을 사용하도록 하라. 그렇지 않으면, annotation을 지우는 수 밖에.

이 글은 스프링노트에서 작성되었습니다.

'IT > Language' 카테고리의 다른 글

[JAVA] 문자열중에 한글체크 - getType  (0) 2008.09.20
javacore&heapdump  (0) 2008.09.19
시간구하기  (0) 2008.09.16
java sleep (시간동안 수행)  (0) 2008.05.19
EBCDIC 변환  (0) 2008.05.19

#include <time.h>

 

struct tm *today;

 

time(&ltime);

today = localtime(&ltime);

printf("%04d-%02d-%02d %02d:%02d:%02d\n",
today->tm_year + 1900,   // tm_year는 1900을 더해야 서기 연도가 됨
today->tm_mon + 1, // tm_mon은 1월이 0, 2월이 1... 식으로 되어 있음 
today->tm_mday,
today->tm_hour,
today->tm_min,
today->tm_sec);

이 글은 스프링노트에서 작성되었습니다.

'IT > Language' 카테고리의 다른 글

javacore&heapdump  (0) 2008.09.19
@Override annotation  (0) 2008.09.16
java sleep (시간동안 수행)  (0) 2008.05.19
EBCDIC 변환  (0) 2008.05.19
JDK Bit 확인  (0) 2008.02.11

 // 이 함수를 시 delayTime 밀리 초 후에 이 함수를 무사히 빠져나온다..  1000 -> 1초
   public void MatrixTime(int delayTime){

       long saveTime = System.currentTimeMillis();
       long currTime = 0;

       while( currTime - saveTime < delayTime){
           currTime = System.currentTimeMillis();
       }
   }

이 글은 스프링노트에서 작성되었습니다.

'IT > Language' 카테고리의 다른 글

@Override annotation  (0) 2008.09.16
시간구하기  (0) 2008.09.16
EBCDIC 변환  (0) 2008.05.19
JDK Bit 확인  (0) 2008.02.11
[JAVA] 숫자,날짜 포메팅하는 방법  (0) 2007.06.29

+ Recent posts