Vous pouvez capturer des instantanés de base de données à l'aide de l'API de surveillance des instantanés dans une application C, C++ ou COBOL. En C et C++, plusieurs types de requêtes de capture d'écran sont accessibles en spécifiant certains paramètres dans db2GetSnapshot( ).
Avant de commencer
Vous devez disposer de l'autorité SYSADM, SYSCTRL, SYSMAINT ou SYSMON pour utiliser l'API db2MonitorSwitches.Vous devez avoir une instance attachée pour capturer un instantané de la base de données. S'il n'y a pas de pièce jointe à une instance, une pièce jointe par défaut est créée. Pour obtenir un instantané d'une instance distante, vous devez d'abord vous attacher à cette instance.
Procédure
- En option : Régler et vérifier l'état des interrupteurs du moniteur.
- Inclure les bibliothèques de base de données sqlmon.h et db2ApiDf.h, qui se trouvent dans le sous-répertoire include sous sqllib.
#include <db2ApiDf.h>
#include <sqlmon.h>
- Définissez la taille de l'unité de tampon d'instantané à 100 Ko.
#define SNAPSHOT_BUFFER_UNIT_SZ 102400
- Déclarez les structures sqlca, sqlma, db2GetSnapshotData et sqlm_collected. Il faut également initialiser un pointeur pour contenir le tampon d'instantané et établir la taille du tampon.
struct sqlma *pRequestedDataGroups;
struct sqlca sqlca;
memset (&sqlca, '\0', sizeof(struct sqlca));
struct sqlm_collected collectedData;
memset (&collectedData, '\0', sizeof(collectedData));
db2GetSnapshotData getSnapshotParam;
memset (&getSnapshotParam, '\0', sizeof(getSnapshotParam));
static sqluint32 snapshotBufferSize = SNAPSHOT_BUFFER_UNIT_SZ;
sqluint32 outputFormat;
char *snapshotBuffer;
- Initialiser la structure sqlma et spécifier que l'instantané à capturer est une information de niveau gestionnaire de base de données.
pRequestedDataGroups = (struct sqlma *)malloc(SQLMASIZE(1));
memset(pRequestedDataGroups, '\0', SQLMASIZE(1));
pRequestedDataGroups->obj_num = 1;
pRequestedDataGroups->obj_var[0].obj_type = SQLMA_DB2;
- Initialiser le tampon qui doit contenir la sortie de l'instantané.
snapshotBuffer = (char *)malloc(snapshotBufferSize);
memset (snapshotBuffer, '\0', snapshotBufferSize);
- Remplir la structure db2GetSnapshotData avec le type de demande d'instantané (provenant de la structure sqlma), les informations sur la mémoire tampon et d'autres informations nécessaires à la capture d'un instantané.
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_DEFAULT;
- Capturez l'instantané. Transmet la structure db2GetSnapshotData, qui contient les informations nécessaires à la capture d'un instantané, ainsi qu'une référence au tampon dans lequel la sortie de l'instantané doit être dirigée.
db2GetSnapshot(db2Version810, &getSnapshotParam, &sqlca);
- Vérifiez que l'instantané a été pris avec succès. Si l'API db2GetSnapshotData renvoie un sqlcode négatif ou un code de retour non nul, l'instantané a échoué. Vérifier la réponse de l'utilisateur pour l'erreur et prendre les mesures correctives appropriées.
- Inclure une logique pour gérer le dépassement de la mémoire tampon. Après la prise d'un instantané, le code SQL est vérifié pour détecter un dépassement de mémoire tampon. En cas de dépassement de la mémoire tampon, celle-ci est effacée et réinitialisée, et l'instantané est pris à nouveau.
while (sqlca.sqlcode == 1606)
{
free(snapshotBuffer);
snapshotBufferSize = snapshotBufferSize +
SNAPSHOT_BUFFER_UNIT_SZ;
snapshotBuffer = (char *)malloc(snapshotBufferSize);
if (snapshotBuffer == NULL)
{
printf("\nMemory allocation error.\n");
return 1;
}
getSnapshotParam.iBufferSize = snapshotBufferSize;
getSnapshotParam.poBuffer = snapshotBuffer;
db2GetSnapshot(db2Version810, &getSnapshotParam, &sqlca);
}
- Traiter le flux de données du moniteur d'instantanés.
- Effacer la mémoire tampon.
free(snapshotBuffer);
free(pRequestedDataGroups);