블로그 이미지
좋은느낌/원철
이것저것 필요한 것을 모아보렵니다.. 방문해 주셔서 감사합니다..

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

    2008. 6. 25. 17:05 개발/DB2

    32-bit AIX에서 데이터베이스 공유 메모리를 할당할 때의 일반적인 문제들

    데이터베이스 공유 메모리를 적절히 초기화 하지 못하면 다음과 같은 문제가 생긴다.

    • 데이터베이스 시작 시 (데이터베이스를 실행하거나 데이터베이스를 처음 연결할 때) - SQL1478W, SQL0987C, SQL1084C
    • 런타임 시 - SQL10003N, SQL1042C

    다음은 문제로 이어질 수 있는 부적절한 설정 예제들이다.

    예제 1

    다음 설정을 생각해 보자. (모든 페이지 크기가 4KB이다.)

    • 싱글 파티션, 집중장치 실행 안됨, INTRA_PARALLEL OFF, DB2_MMAP_READ=NO, DB2_MMAP_WRITE=NO, fenced 함수나 프로시저 없음.
    • IBMDEFAULTBP 450,000 pages
    • UTILHEAP 17,500 pages
    • DBHEAP 10,000 pages
    • LOCKLIST 1000 pages
    • PCKCACHE 5000 pages
    • CATALOGCACHE 2500 pages

    한계: 이 설정에서 데이터베이스 공유 메모리의 한계는 2GB 이거나 8 세그먼트이다.

    계산: 다음 공식을 사용하여 데이터베이스 공유 메모리를 계산한다.
    Database shared memory = (Total of 486,000 pages x 4KB per page) x 1.1 (account for 10% overhead) = ~2.1GB = 9 segments

    주: 이 계산에서 네 개의 숨겨진 버퍼 풀을 남겨두었다. 너무 작아서 차이를 보이지도 않는다.

    문제: 이것은 2GB의 한계를 초과한다. 데이터베이스를 실행하거나 데이터베이스에 처음으로 연결할 때 다음과 같은 경고를 받는다.
    SQL1478W The defined buffer pools could not be started. Instead, one small buffer pool for each page size supported by DB2 has been started. SQLSTATE=01626

    db2diag.log에서 DB2가 숨겨진 버퍼 풀 없이 시작할 것이라는 메시지를 보게 될 것이다. 이 문제를 해결하려면 메인 버퍼 풀의 크기를 줄인다.

    예제 2

    다음과 같은 설정을 생각해 보자. (모든 페이지의 크기가 4K이다.)

    • 싱글 파티션, Fenced 함수나 프로시저 없음, INTRA_PARALLEL=ON
    • IBMDEFAULTBP 300,000 pages
    • UTILHEAP 17,500 pages
    • DBHEAP 10,000 pages
    • SHEAPTHRES_SHR 50,000 pages
    • LOCKLIST 1000 pages
    • PCKCACHE 5000 pages
    • CATALOGCACHE 2500 pages

    한계: 1.5GB (6 세그먼트). 한 개의 세그먼트가 애플리케이션 그룹 메모리에 사용된다. INTRA_PARALLEL이 ON이기 때문이다. 또 다른 세그먼트는 로컬 연결에 사용된다. DB2_MMAP_READ와 DB2_MMAP_WRITE가 YES로 설정되기 때문이다. (디폴트)

    계산:
    Database shared memory = (Total of 386,000 pages x 4KB per page) x 1.1 = ~1.67GB = 7 segments

    문제: 이것은 1.5GB 한계를 초과한다. 데이터베이스를 활성화 하거나 데이터베이스에 처음 연결할 때 다음과 같은 에러 메시지를 받게 된다.
    SQL1042C An unexpected system error occurred. SQLSTATE=58004

    이 문제를 해결하려면:

    • db2set를 사용하여 DB2_MMAP_READ와 DB2_MMAP_WRITE를 NO로 설정한다. 이로서 DB2는 로컬 커넥션에 세그먼트 E를 사용하게 되고 데이터베이스 공유 메모리에 한 개의 세그먼트가 남게 된다.

    예제 3

    다음과 같은 설정을 생각해 보자. (모든 페이지 크기가 4K 이다.)

    • IBMDEFAULTBP 250,000 pages
    • INTRA_PARALLEL=ON
    • UTILHEAP 17,500 pages
    • DBHEAP 10,000 pages
    • SHEAPTHRES_SHR 20,000 pages
    • LOCKLIST 1000 pages
    • PCKCACHE 5000 pages
    • CATALOGCACHE 2500 pages
    • Fenced UDF exists

    한계: 다음 항목들이 한 개의 세그먼트를 취한다: Intra-parallel ON, 로컬 커넥션, fenced UDFB. 데이터베이스 공유 메모리에 5 세그먼트나 1.25G를 남겨둔다.

    계산:
    Database shared memory = (Total of 306,000 pages x 4KB per page) x 1.1% = ~1.35GB = 6 segments

    문제: fenced UDF를 참조하는 쿼리가 sql10003C로 실패한다. 이 문제를 해결하려면, unfenced 모드에서 UDF를 실행하거나 데이터베이스 공유 메모리를 줄여 5 세그먼트가 넘지 않도록 한다.

    posted by 좋은느낌/원철