클라이언트 애플리케이션에서 데이터베이스 시스템 상태 스냅샷 캡처

C 또는 C++ 애플리케이션에서 스냅샷 모니터 API를 사용하여 시스템 상태 스냅샷을 캡처할 수 있습니다. db2GetSnapshot API에서 매개변수를 지정하여 다양한 시스템 상태 스냅샷 요청 유형에 액세스할 수 있습니다.

중요: 시스템 상태 모니터, 시스템 상태 표시기 및 관련 구성요소는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 수 있습니다. Health Monitor는 Db2® pureScale® 환경에서 지원되지 않습니다. 자세한 정보는 시스템 상태 모니터가 더 이상 사용되지 않음을 참조하십시오.

시작하기 전에

시스템 상태 스냅샷을 캡처하려면 인스턴스에 접속해야 합니다. 인스턴스에 대한 접속이 없는 경우에는 기본 인스턴스 접속이 작성됩니다. 원격 인스턴스의 스냅샷을 얻으려면 먼저 해당 인스턴스에 접속해야 합니다.

프로시저

  1. 코드에 sqlmon.h 및 db2ApiDf.h 라이브러리를 포함시키십시오. 이러한 라이브러리는 sqllib\include 디렉토리에 있습니다.
     
    #include <db2ApiDf.h>
    #include <sqlmon.h>
    
  2. 스냅샷 버퍼 단위 크기를 50KB로 설정하십시오.
    #define SNAPSHOT_BUFFER_UNIT_SZ 51200
    
  3. sqlma, sqlca, sqlm_collected 및 db2GetSnapshotData 구조를 선언하십시오.
    struct sqlma *pRequestedDataGroups;
    struct sqlca sqlca;
    memset (&sqlca, '\0', sizeof(struct sqlca));
    struct sqlm_collected collectedData;
    memset (&sqlm_collected, '\0', sizeof(struct sqlm_collected));
    db2GetSnapshotData getSnapshotParam;
    memset(&db2GetSnapshotData, '\0', sizeof(db2GetSnapshotData));
    
  4. 스냅샷 버퍼를 포함하고, 버퍼의 크기를 설정하기 위한 포인터를 초기화하십시오.
     
    static sqluint32 snapshotBufferSize = SNAPSHOT_BUFFER_UNIT_SZ;
    sqluint32 outputFormat;
    char *snapshotBuffer;
    
  5. sqlma 구조를 초기화하고 캡처할 스냅샷이 데이터베이스 관리자 레벨 정보의 스냅샷임을 지정하십시오.
    pRequestedDataGroups = (struct sqlma *)malloc(SQLMASIZE(1));
    memset(&pRequestedDataGroups, '\0', sizeof(struct pRequestedDataGroups));
    pRequestedDataGroups->obj_num = 1;
    pRequestedDataGroups->obj_var[0].obj_type = SQLMA_DB2;
    
  6. 스냅샷 출력을 보유할 버퍼를 초기화하십시오.
    snapshotBuffer = (char *)malloc(snapshotBufferSize);
    memset (&snapshotBuffer, '\0', sizeof(snapshotBuffer));
    
  7. db2GetSnapshotData 구조를 스냅샷 요청 유형(sqlma 구조에서 제공), 버퍼 정보 및 스냅샷 캡처에 필요한 기타 정보로 채우십시오.
    getSnapshotParam.piSqlmaData = pRequestedDataGroups;
    getSnapshotParam.poCollectedData = &collectedData;
    getSnapshotParam.poBuffer = snapshotBuffer;
    getSnapshotParam.iVersion = SQLM_DBMON_VERSION9_5;
    getSnapshotParam.iBufferSize = snapshotBufferSize;
    getSnapshotParam.iStoreResult = 0;
    getSnapshotParam.iNodeNumber = SQLM_CURRENT_NODE;
    getSnapshotParam.poOutputFormat = &outputFormat;
    getSnapshotParam.iSnapshotClass = SQLM_CLASS_HEALTH;
    
  8. 시스템 상태 스냅샷을 캡처하십시오. 다음 매개변수를 전달하십시오.
    • 스냅샷을 캡처하는 데 필요한 정보를 포함하는 db2GetSnapshotData 구조
    • 스냅샷 출력을 보낼 버퍼에 대한 참조
    db2GetSnapshot(db2Version810, &getSnapshotParam, &sqlca);
    
  9. 버퍼 오버플로우를 처리할 논리를 포함시키십시오. 스냅샷을 가져오면, 버퍼 오버플로우에 대해 sqlcode를 검사합니다. 버퍼 오버플로우가 발생한 경우 버퍼는 지워지고 다시 초기화되며, 스냅샷도 다시 가져옵니다.
    while (sqlca.sqlcode == 1606)
    {
      free(snapshotBuffer);
      snapshotBufferSize += SNAPSHOT_BUFFER_UNIT_SZ;
      snapshotBuffer = (char *)malloc(snapshotBufferSize);
      if (snapshotBuffer == NULL)
      {
        printf("\nMemory allocation error.\n");
        return;
      }
     
      getSnapshotParam.iBufferSize = snapshotBufferSize;
      getSnapshotParam.poBuffer = snapshotBuffer;
      db2GetSnapshot(db2Version810, &getSnapshotParam, &sqlca);
    }
    
  10. 스냅샷 모니터 데이터 스트림을 처리하십시오. 이 단계 다음에 있는 그림을 참조하여 스냅샷 모니터 데이터 스트림을 참조하십시오.
  11. 버퍼를 지우십시오.
    free(snapshotBuffer);
    free(pRequestedDataGroups);
    

결과

db2GetSnapshot API를 사용하여 시스템 상태 스냅샷을 캡처한 후에 API는 자체 기술적 데이터 스트림으로 시스템 상태 스냅샷 출력을 리턴합니다.

다음 예는 데이터 스트림 구조를 표시합니다.
그림 1. 시스템 상태 스냅샷 자체 기술적 데이터 스트림
시스템 상태 스냅샷 자체 기술적 데이터 스트림
범례:
  1. SQLM_CLASS_HEALTH_WITH_DETAIL 스냅샷 클래스가 사용될 경우에만 사용 가능합니다.
  2. Db2 Enterprise Server Edition에서만 사용 가능합니다. 그렇지 않으면 테이블스페이스 컨테이너 스트림이 뒤에 옵니다.

다음 계층 구조는 시스템 상태 스냅샷 자체 기술적 데이터 스트림의 특정 요소를 표시합니다.

SQLM_ELM_HI 아래의 요소 계층 구조:
  SQLM_ELM_HI
     SQLM_ELM_HI_ID
     SQLM_ELM_HI_VALUE
        SQLM_ELM_HI_TIMESTAMP
           SQLM_ELM_SECONDS
           SQLM_ELM_MICROSEC
     SQLM_ELM_HI_ALERT_STATE
SQLM_ELM_HI_HIST 아래의 요소 계층 구조로, 반드시 SQLM_CLASS_HEALTH_WITH_DETAIL 스냅샷 클래스와 함께 사용해야 합니다.
  SQLM_ELM_HI_HIST
     SQLM_ELM_HI_FORMULA
     SQLM_ELM_HI_ADDITIONAL_INFO
        SQLM_ELM_HEALTH_INDICATOR_HIST
           SQLM_ELM_HI_ID
           SQLM_ELM_HI_VALUE
              SQLM_ELM_HI_TIMESTAMP
                 SQLM_ELM_SECONDS
                 SQLM_ELM_MICROSEC
           SQLM_ELM_HI_ALERT_STATE
           SQLM_ELM_HI_FORMULA
           SQLM_ELM_HI_ADDITIONAL_INFO
SQLM_ELM_OBJ_LIST 아래의 요소 계층 구조:
  SQLM_ELM_HI_OBJ_LIST
     SQLM_ELM_HI_OBJ_NAME
     SQLM_ELM_HI_OBJ_DETAIL
     SQLM_ELM_HI_OBJ_STATE
        SQLM_ELM_HI_TIMESTAMP
           SQLM_ELM_SECONDS
           SQLM_ELM_MICROSEC
SQLM_ELM_OBJ_LIST_HIST 아래의 요소 계층 구조로, 반드시 SQLM_CLASS_HEALTH_WITH_DETAIL 스냅샷 클래스와 함께 사용해야 합니다.
  SQLM_ELM_HI_OBJ_LIST_HIST
     SQLM_ELM_HI_OBJ_NAME
     SQLM_ELM_HI_OBJ_STATE
        SQLM_ELM_HI_TIMESTAMP
           SQLM_ELM_SECONDS
           SQLM_ELM_MICROSEC