Cattura di un'istantanea di integrità del database da un'applicazione client

È possibile catturare le istantanee di integrità utilizzando l'API di monitoraggio istantanee in un'applicazione C o C + +. È possibile accedere a diversi tipi di richiesta di istantanea di stato specificando i parametri nell'API db2GetSnapshot .

Importante: il controllo dello stato, gli indicatori di stato e i componenti correlati sono obsoleti e potrebbero essere rimossi in una release futura. Il controllo dello stato non è supportato negli ambienti Db2® pureScale® . Per ulteriori informazioni, vedere Health Monitor è obsoleto.

Informazioni preliminari

Devi essere collegato a un'istanza per catturare un'istantanea di integrità. Se non è presente un allegato a un'istanza, viene creato un allegato dell'istanza predefinito. Per ottenere un'istantanea di una istanza remota, è necessario prima collegarsi a tale istanza.

Procedura

  1. Includi le librerie sqlmon.h e db2ApiDf.h nel tuo codice. Queste librerie si trovano nella directory sqllib\include .
     
    #include <db2ApiDf.h>
    #include <sqlmon.h>
    
  2. Impostare la dimensione dell'unità buffer dell'istantanea su 50 KB.
    #define SNAPSHOT_BUFFER_UNIT_SZ 51200
    
  3. Dichiarare le strutture sqlma, sqlca, sqlm_collected e 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. Inizializza un puntatore per contenere il buffer di snapshot e per stabilire la dimensione del buffer.
     
    static sqluint32 snapshotBufferSize = SNAPSHOT_BUFFER_UNIT_SZ;
    sqluint32 outputFormat;
    char *snapshotBuffer;
    
  5. Inizializzare la struttura sqlma e specificare che l'istantanea che si sta catturando è di informazioni a livello di gestore database.
    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. Inizializza il buffer, che conterrà l'output dell'istantanea.
    snapshotBuffer = (char *)malloc(snapshotBufferSize);
    memset (&snapshotBuffer, '\0', sizeof(snapshotBuffer));
    
  7. popolare la struttura db2GetSnapshotData con il tipo di richiesta dell'istantanea (dalla struttura sqlma), le informazioni sul buffer e altre informazioni richieste per catturare un'istantanea.
    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. Acquisire l'istantanea di integrità. Passare i seguenti parametri:
    • struttura db2GetSnapshotData , che contiene le informazioni necessarie per catturare un'istantanea
    • Un riferimento al buffer a cui è indirizzato l'output dell'istantanea.
    db2GetSnapshot(db2Version810, &getSnapshotParam, &sqlca);
    
  9. Includi logica per gestire l'overflow del buffer. Dopo aver eseguito un'istantanea, viene eseguito il controllo di sqlcode per un overflow del buffer. Se si verifica un overflow del buffer, il buffer viene cancellato, reinizializzato e l'istantanea viene ripresa di nuovo.
    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. Elaborare lo stream di dati di monitoraggio istantanea. Fare riferimento alla figura che segue per visualizzare il flusso di dati del monitoraggio istantanee.
  11. Eliminare il buffer.
    free(snapshotBuffer);
    free(pRequestedDataGroups);
    

Risultati

Dopo aver catturato un'istantanea di integrità con l'API db2GetSnapshot , l'API restituisce l'output di istantanea di integrità come flusso di dati di autodescrizione.

Il seguente esempio mostra la struttura del flusso di dati:
Figura 1. Flusso di dati di autodescrizione dell'istantanea di stato
Flusso di dati di autodescrizione dell'istantanea di stato
Legenda:
  1. Disponibile solo quando viene utilizzata la classe di istantanee SQLM_CLASS_HEALTH_WITH_DETAIL.
  2. Disponibile solo in Db2 Enterprise Server Edition. Altrimenti, segue il flusso del contenitore del tablespace.

Le seguenti gerarchie mostrano gli elementi specifici nello stream di dati di autodescrizione dell'istantanea di stato.

La gerarchia di elementi in 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
La gerarchia degli elementi in SQLM_ELM_HI_HTSI, disponibile solo con la classe di istantanee 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
La gerarchia di elementi sotto 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
La gerarchia degli elementi in SQLM_ELM_OBJ_LIST_HIST, disponibile solo con la classe di istantanee 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