Page tree
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 16 Next »

Введение

После запуска АСР «Гидра» в промышленную эксплуатацию необходимо в обязательном порядке настроить мониторинг экземпляра БД АСР «Гидра».

Контроль должен отслеживать следующие группы параметров:

  • Базовые параметры сервера АСР (load avg, использование CPU и RAM, I/O массива, количество процессов).
  • Показатели экземпляра БД (количество сессий, текущая нагрузка, состояние SGA и т.д.).
  • Состояние заданий АСР «Гидра».
  • Контроль количества нетарифицированных CDR и дату последней загрузки.
  • Количество строк в жизненноважных таблицах EX_CALL_DATA_REC, EX_DATA_COLLECT, EX_TRAFFIC_COLLECT_C, SD_GOOD_MOVES.

Для мониторинга АСР «Гидра» можно использовать любую распространенную систему, которая позволяет получать данные с помощью скриптов, запускаемых из командной строки. Наиболее популярными системами мониторинга среди российских операторов связи являются бесплатные Zabbix и Nagios.

Для мониторинга показателей экземпляра БД можно использовать скрипты (раздел Oracle), разработанные для Zabbix.

Контроль выполнения заданий системы

Чтобы настроить контроль выполнения заданий АСР «Гидра», можно воспользоваться одним из специально разработанных скриптов (1) либо hydra_monitoring.sh

hydra_job_monitoring.sh
#!/bin/sh
 
source /etc/profile
 
rval=0
 
ORA_USER="AIS_NET"
ORA_PASS="mypass"
SQLPLUS_PATH="$ORACLE_HOME/bin/sqlplus"

if [ -n "$3" ]; then
       ORA_SID="$3"
       export ORACLE_SID=$ORA_SID
fi
 
sql=""
 
case $1 in
 
'job_state')
	if [ -n "$2" ]; then
		echo "
		SELECT to_char(N_JOB_STATE_ID, 'FM99999999999999990') FROM SS_V_JOBS WHERE N_JOB_ID=$2;
		" | ${SQLPLUS_PATH} -s ${ORA_USER}/${ORA_PASS}@${ORACLE_SID} |
		awk '{  if ($1 == 2034) print "Running" 
			else if($1 == 1034) print "Waiting"
			else if($1 == 3034) print "Starting"
			else if($1 == 4034) print "Locked"
			else if($1 == 5034) print "Deleted"
			else if($1 == 6034) print "Error"
			else if($1 == 7034) print "Cant Start"
		}'
	else
		rval=1
		echo "No JOB_ID" >&2
	fi
	;;
'job_last_start')
	if [ -n "$2" ]; then
		sql="
		SELECT to_char((sysdate - D_LAST_START) * (86400), 'FM99999999999999990') FROM SS_V_JOBS WHERE N_JOB_ID=$2;
		"
	else
		rval=1
		echo "No JOB_ID" >&2
	fi
	;;
*)
	echo "Hydra monitoring tool"
	echo "usage:"
	echo "    $0 job_state <JOB_ID> [SID]  -- Check job status."
	echo "    $0 job_last_start <JOB_ID> [SID]  -- Check job last start date/time."
	rval=1
	exit $rval
	;;
esac
 
if [ -n "$sql" ]; then
       echo "$sql" | ${SQLPLUS_PATH} -s ${ORA_USER}/${ORA_PASS}@${ORACLE_SID}
fi
rval=$?

exit $rval
 

Различаются 7 состояний:

КодСостояниеНорма
1034В ожиданииД
2034ВыполняетсяД
3034К запускуД
4034БлокированоН
5034УдаленоН
6034Ошибка запускаН
7034Не запущеноД

Не нормальными являются состояния, помеченные буквой Н. Исключение: задание, заблокированное принудительно.

Перечень заданий и их ID следует брать со страницы АСР "Администрирование - Задания - Назначенные задания".
Контроль рекомендуется вести по всем заданиям системы.

Контроль табличных пространств

Необходимо мониторить состояние табличных пространств (tablespaces) БД. Нужную информацию даёт следующий SQL-запрос:

WITH TBLSP_TOTALSPACE AS (
  SELECT TABLESPACE_NAME,
         ROUND(SUM(BYTES/(1024*1024))) TOTALSPACE,
         ROUND(SUM(DECODE(MAXBYTES, 0, BYTES, MAXBYTES))/(1024*1024)) TOTALMAXSPACE
  FROM   DBA_DATA_FILES
  GROUP BY TABLESPACE_NAME
),
TBLSP_USEDSPACE AS (
  SELECT TABLESPACE_NAME,
         ROUND(SUM(BYTES)/(1024*1024)) TOTALUSEDSPACE
  FROM   DBA_SEGMENTS
  GROUP BY TABLESPACE_NAME
)
SELECT TS.TABLESPACE_NAME "TABLESPACE",
       US.TOTALUSEDSPACE "Used MB",
      (TS.TOTALSPACE - US.TOTALUSEDSPACE) "Free MB",
       TS.TOTALSPACE "Total MB",
       TS.TOTALMAXSPACE "Total Max MB",
       ROUND(100*((TS.TOTALMAXSPACE - US.TOTALUSEDSPACE)/ TS.TOTALMAXSPACE)) "Pct. Free"
FROM   TBLSP_TOTALSPACE TS,
       TBLSP_USEDSPACE  US
WHERE  US.TABLESPACE_NAME = TS.TABLESPACE_NAME;

В результате запроса получится таблица приблизительно следующего вида:

#

TABLESPACE

Used MB

Free MB

Total MB

Total Max MB

Pct. Free

1

SYSAUX

713

32055

750

32768

98

2

HYDRA

5182

15010

8222

20192

74

3

HYDRA_INDEX

12418

11870

13150

24288

49

4

UNDOTBS1

294

32474

11450

32768

99

5

SYSTEM

768

31982

790

32768

98

Здесь особое внимание нужно уделить показателям Free MB и Pct. Free для пространств HYDRA и HYDRA_INDEX. При слишком маленьких значениях (менее 20%) необходимо автоматически информировать администратора о проблеме со свободным местом. В противном случае в БД могут остановиться важные системные задания, например, с такой ошибкой:

Ошибка при запуске JB_DATA_COLLECT_PKG.EX_DATA_COLLECT_ACCOUNTING
[ORA-01654: unable to extend index AIS_NET.EX_TRAFFIC_COL_C_FIRM_IDX by 8192
in tablespace HYDRA_INDEX]

Значение Total MB показывает фактически выделенное место под табличное пространство, а Total Max MB показывает максимально возможное место, которое СУБД разрешено захватить под данное пространство при увеличении его размера. Следует учитывать, что значение Total Max MB может быть больше объема доступного дискового пространства.

Контроль нетарифицированных телефонных звонков

Приведенный ниже запрос возвращает количество нетарифицированных телефонных звонков за текущий час:

SELECT COUNT(*)
FROM   EX_V_CDR
WHERE  N_CDR_TYPE_ID  = SYS_CONTEXT('CONST', 'CDR_TYPE_PhoneCall')
AND    N_CDR_STATE_ID = SYS_CONTEXT('CONST', 'CDR_Status_Finished')
AND    D_BEGIN_ACC   >= TRUNC(SYSDATE, 'HH')
AND   (N_SUM_A IS NULL AND N_SUM_B IS NULL);

Нормой считается 0, т.е. полное отсутствие нетарифицированных звонков.

Мониторинг даты последней загрузки CDR

Данный запрос показывает в какое время была произведена последняя загрузка CDR в АСР, его удобно использовать для анализа человеком:

SELECT DECODE(MAX(D_LOG_CREATE), NULL, 'Never',
       TO_CHAR(MAX(D_LOG_CREATE), 'DD.MM.YYYY HH24:MI:SS')) Last_Date_Load
FROM   EX_V_CDR
WHERE  N_CDR_ID = (SELECT MAX(N_CDR_ID)
FROM   EX_V_CDR);

Результатом будет либо 

LAST_DATE_LOAD
-------------------
29.01.2013 11:05:54

либо 

LAST_DATE_LOAD
-------------------
Never

если CDR в базе не было.

В следующем примере в качестве результата выводится либо время, когда была последняя загрузка CDR (сколько секунд назад от текущего момента времени), либо -1, если загрузки CDR не было.
Его удобнее применять для обработки в системах мониторинга. 

SELECT DECODE(MAX(D_LOG_CREATE), NULL, -1,
       TO_CHAR((SYSDATE-MAX(D_LOG_CREATE))*(86400), 'FM99999999999999990')) SEC
FROM   EX_V_CDR
WHERE  N_CDR_ID = (SELECT MAX(N_CDR_ID)
FROM   EX_V_CDR);


Триггер рекомендуется настраивать в зависимости от расписания загрузки.

Контроль количества строк в таблицах

Данный контроль необходимо осуществлять, т.к. превышение пороговых значение влияет на производительность БД.
Пример запроса: 

SQL> SELECT COUNT(*)
FROM SD_GOOD_MOVES;

Таблица пороговых значений

ТаблицаПорог
EX_CALL_DATA_REC15 миллионов
EX_DATA_COLLECT5 миллионов
EX_TRAFFIC_COLLECT_C2 миллиона
SD_GOOD_MOVES15 миллионов

Приложение: скрипт для создания пользователя БД для мониторинга и выдачи ему необходимых прав

Создание пользователя для мониторинга
CREATE USER &&username PROFILE DEFAULT IDENTIFIED BY &&password
DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP
ACCOUNT UNLOCK;
/ 
GRANT SELECT ON V_$LOG_HISTORY TO &&username;
  
GRANT CONNECT TO &&username;
GRANT RESOURCE TO &&username;
  
GRANT SELECT ON SS_V_JOBS TO &&username;
GRANT SELECT ON SI_V_USERS TO &&username;
  
GRANT EXECUTE ON SI_SUBJECTS_PKG_S TO &&username;
GRANT EXECUTE ON SI_OBJECTS_PKG_S TO &&username;
GRANT EXECUTE ON SI_REF_PKG_S TO &&username;
 
-- count.cdr; count.lastcdr
GRANT SELECT ON EX_V_CDR TO &&username;
-- count.gm
GRANT SELECT ON SD_GOOD_MOVES TO &&username;
-- count.ecrd
GRANT SELECT ON EX_CALL_DATA_REC TO &&username;
-- count.edc
GRANT SELECT ON EX_DATA_COLLECT TO &&username;
-- count.etcc
GRANT SELECT ON EX_TRAFFIC_COLLECT_C TO &&username;
-- count.active
GRANT SELECT ON SI_SUBJ_GOODS TO &&username;
-- tblspace.discovery
GRANT SELECT ON DBA_SEGMENTS TO &&username;
-- tblspace.pcf
GRANT SELECT ON DBA_DATA_FILES TO &&username;
GRANT SELECT ON DBA_SEGMENTS TO &&username;
-- checkactive
GRANT SELECT ON V_$INSTANCE TO &&username;
-- rcachehit
GRANT SELECT ON V_$SYSSTAT TO &&username;
-- activeusercount
GRANT SELECT ON V_$SESSION TO &&username;
-- dbsize
GRANT SELECT ON DBA_FREE_SPACE TO &&username;
GRANT SELECT ON DBA_TABLESPACES TO &&username;
-- lastarclog
GRANT SELECT ON V_$LOG TO &&username;
-- freebufwaits
GRANT SELECT ON V_$SYSTEM_EVENT TO &&username;
GRANT SELECT ON V_$EVENT_NAME TO &&username;
/
QUIT;
  • No labels