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 세그먼트가 넘지 않도록 한다.