Senhores estou com problema na execução do Housekepeer .Porém após a execução o Zabbix me retorna a seguinte informação Database Is down.
Entrei em contato com a equipe de DBA Oracle da empresa no qual acionou a Oracle e tivemos a informação abaixo.
__________________________________________________ ______________
Na verdade parece que o problema é o tamanho do mapa excluir. No caso do acidente de excluir é 2890144 bytes em uma linha, ou seja, uma linha de 2 MB de tamanho
onde temos 481.690 ids diferentes na INLIST.
Isso é demais para uma única linha no Oracle, mas estou surpreso isto dá ao ora-7445 aqui. O programa de teste que eu escrevi dá ou falha de segmentação
ou ora-2108 (o que eu preciso para depurar mais).
Em todo caso, eu aconselho a tentar reduzir o número de identificadores que são utilizados no comando delete. No caso de acidente, tivemos 481.690 ids diferentes na INLIST.
Mas quando vemos a alocação de memória em Zabbix (ver DBadd_condition_alloc abaixo) vemos os desenvolvedores Zabbix assumiu max 950 ids que é substancialmente mais baixo.
Então, você pode também verificar com o Zabbix desenvolvedores se fosse sempre a intenção de utilizar o software com tais inlists longo
__________________________________________________ _______________
Segue a sugestão da oracle para normalizar esse problema .
A minha pergunta é :
E viavel para o Zabbix 1.8.4?
__________________________________________________ _________
Name
--------
=== ODM Data Collection ===
=== ODM Data Collection ===
Generated SQL: delete from housekeeper where (housekeeperid in (27144,...
in program:
***********
char *sql = NULL;
int sql_alloc = 512, sql_offset = 0;
zbx_uint64_t *ids = NULL;
int ids_alloc = 0, ids_num = 0;
...
if (NULL != ids)
{
sql = zbx_malloc(sql, sql_alloc * sizeof(char));
zbx_snprintf_alloc(&sql, &sql_alloc, &sql_offset, 32,
"delete from housekeeper where");
DBadd_condition_alloc(&sql, &sql_alloc, &sql_offset,
"housekeeperid", ids, ids_num);
DBexecute("%s", sql);
zbx_free(sql);
zbx_free(ids);
}
in include\commons.h:
**************
#define zbx_malloc(old, size) zbx_malloc2(__FILE__, __LINE__, old, size)
void *zbx_malloc2(const char *filename, int line, void *old, size_t size);
#ifdef HAVE___VA_ARGS__
# define zbx_snprintf_alloc(str, alloc_len, offset, max_len, fmt, ...) \
__zbx_zbx_snprintf_alloc(str, alloc_len, offset, max_len, ZBX_CONST_STRING(fmt), ##__VA_ARGS__)
#else
# define zbx_snprintf_alloc __zbx_zbx_snprintf_alloc
#endif /* HAVE___VA_ARGS__ */
void __zbx_zbx_snprintf_alloc(char **str, int *alloc_len, int *offset, int max_len, const char *fmt, ...);
in libs\zxcommon\misc.c:
************************
void *zbx_malloc2(const char *filename, int line, void *old, size_t size)
{
int max_attempts;
void *ptr = NULL;
/* Old pointer must be NULL */
if (NULL != old)
{
zabbix_log(LOG_LEVEL_CRIT, "[file:%s,line:%d] zbx_malloc: allocating already allocated memory. "
"Please report this to Zabbix developers.",
filename, line);
/* Exit if defined DEBUG. Ignore otherwise. */
zbx_dbg_assert(0);
}
for (
max_attempts = 10, size = MAX(size, 1);
max_attempts > 0 && NULL == ptr;
ptr = malloc(size), max_attempts--
);
if (NULL != ptr)
return ptr;
zabbix_log(LOG_LEVEL_CRIT, "[file:%s,line:%d] zbx_malloc: out of memory. Requested %lu bytes.", filename, line, size);
exit(FAIL);
/* Program will never reach this point. */
return ptr;
}
in include\db.h:
****************
void DBadd_condition_alloc(char **sql, int *sql_alloc, int *sql_offset, const char *fieldname, const zbx_uint64_t *values, const int num);
in src\libs\zbxdbhigh\db.c:
******************************
void DBadd_condition_alloc(char **sql, int *sql_alloc, int *sql_offset, const char *fieldname, const zbx_uint64_t *values, const int num)
{
#define MAX_EXPRESSIONS 950
int i;
if (0 == num)
return;
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 2, " ");
if (num > MAX_EXPRESSIONS)
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 2, "(");
for (i = 0; i < num; i++)
{
if (0 == (i % MAX_EXPRESSIONS))
{
if (0 != i)
{
(*sql_offset)--;
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 8, ") or ");
}
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 128, "%s in (",
fieldname);
}
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 128, ZBX_FS_UI64 ",",
values[i]);
}
(*sql_offset)--;
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 2, ")");
if (num > MAX_EXPRESSIONS)
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 2, ")");
}
limits.h from quad (64Bit linux):
*************************************
/* Maximum value an `unsigned int' can hold. (Minimum is 0.) */
# define UINT_MAX 4294967295U
FileName
----------------
FileComment
----------------------
Entrei em contato com a equipe de DBA Oracle da empresa no qual acionou a Oracle e tivemos a informação abaixo.
__________________________________________________ ______________
Na verdade parece que o problema é o tamanho do mapa excluir. No caso do acidente de excluir é 2890144 bytes em uma linha, ou seja, uma linha de 2 MB de tamanho
onde temos 481.690 ids diferentes na INLIST.
Isso é demais para uma única linha no Oracle, mas estou surpreso isto dá ao ora-7445 aqui. O programa de teste que eu escrevi dá ou falha de segmentação
ou ora-2108 (o que eu preciso para depurar mais).
Em todo caso, eu aconselho a tentar reduzir o número de identificadores que são utilizados no comando delete. No caso de acidente, tivemos 481.690 ids diferentes na INLIST.
Mas quando vemos a alocação de memória em Zabbix (ver DBadd_condition_alloc abaixo) vemos os desenvolvedores Zabbix assumiu max 950 ids que é substancialmente mais baixo.
Então, você pode também verificar com o Zabbix desenvolvedores se fosse sempre a intenção de utilizar o software com tais inlists longo
__________________________________________________ _______________
Segue a sugestão da oracle para normalizar esse problema .
A minha pergunta é :
E viavel para o Zabbix 1.8.4?
__________________________________________________ _________
Name
--------
=== ODM Data Collection ===
=== ODM Data Collection ===
Generated SQL: delete from housekeeper where (housekeeperid in (27144,...
in program:
***********
char *sql = NULL;
int sql_alloc = 512, sql_offset = 0;
zbx_uint64_t *ids = NULL;
int ids_alloc = 0, ids_num = 0;
...
if (NULL != ids)
{
sql = zbx_malloc(sql, sql_alloc * sizeof(char));
zbx_snprintf_alloc(&sql, &sql_alloc, &sql_offset, 32,
"delete from housekeeper where");
DBadd_condition_alloc(&sql, &sql_alloc, &sql_offset,
"housekeeperid", ids, ids_num);
DBexecute("%s", sql);
zbx_free(sql);
zbx_free(ids);
}
in include\commons.h:
**************
#define zbx_malloc(old, size) zbx_malloc2(__FILE__, __LINE__, old, size)
void *zbx_malloc2(const char *filename, int line, void *old, size_t size);
#ifdef HAVE___VA_ARGS__
# define zbx_snprintf_alloc(str, alloc_len, offset, max_len, fmt, ...) \
__zbx_zbx_snprintf_alloc(str, alloc_len, offset, max_len, ZBX_CONST_STRING(fmt), ##__VA_ARGS__)
#else
# define zbx_snprintf_alloc __zbx_zbx_snprintf_alloc
#endif /* HAVE___VA_ARGS__ */
void __zbx_zbx_snprintf_alloc(char **str, int *alloc_len, int *offset, int max_len, const char *fmt, ...);
in libs\zxcommon\misc.c:
************************
void *zbx_malloc2(const char *filename, int line, void *old, size_t size)
{
int max_attempts;
void *ptr = NULL;
/* Old pointer must be NULL */
if (NULL != old)
{
zabbix_log(LOG_LEVEL_CRIT, "[file:%s,line:%d] zbx_malloc: allocating already allocated memory. "
"Please report this to Zabbix developers.",
filename, line);
/* Exit if defined DEBUG. Ignore otherwise. */
zbx_dbg_assert(0);
}
for (
max_attempts = 10, size = MAX(size, 1);
max_attempts > 0 && NULL == ptr;
ptr = malloc(size), max_attempts--
);
if (NULL != ptr)
return ptr;
zabbix_log(LOG_LEVEL_CRIT, "[file:%s,line:%d] zbx_malloc: out of memory. Requested %lu bytes.", filename, line, size);
exit(FAIL);
/* Program will never reach this point. */
return ptr;
}
in include\db.h:
****************
void DBadd_condition_alloc(char **sql, int *sql_alloc, int *sql_offset, const char *fieldname, const zbx_uint64_t *values, const int num);
in src\libs\zbxdbhigh\db.c:
******************************
void DBadd_condition_alloc(char **sql, int *sql_alloc, int *sql_offset, const char *fieldname, const zbx_uint64_t *values, const int num)
{
#define MAX_EXPRESSIONS 950
int i;
if (0 == num)
return;
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 2, " ");
if (num > MAX_EXPRESSIONS)
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 2, "(");
for (i = 0; i < num; i++)
{
if (0 == (i % MAX_EXPRESSIONS))
{
if (0 != i)
{
(*sql_offset)--;
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 8, ") or ");
}
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 128, "%s in (",
fieldname);
}
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 128, ZBX_FS_UI64 ",",
values[i]);
}
(*sql_offset)--;
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 2, ")");
if (num > MAX_EXPRESSIONS)
zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 2, ")");
}
limits.h from quad (64Bit linux):
*************************************
/* Maximum value an `unsigned int' can hold. (Minimum is 0.) */
# define UINT_MAX 4294967295U
FileName
----------------
FileComment
----------------------
Comment