Введение

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

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

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

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

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

Чтобы настроить контроль выполнения заданий , можно воспользоваться одним из специально разработанных скриптов (1) либо hydra_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 может быть больше объема доступного дискового пространства. Процент свободного места (Pct. Free) расчитывается на основании фактически выделенного места (Total 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_RECCDR и PPP-сессии15 миллионов
EX_DATA_COLLECTТрафик по PPP-сессиям

среднее количество завершенных PPP-сессий в месяц, умноженное на количество классов трафика.

Например, для 500 тыс. сессий в месяц и 4-х классов трафика, участвующих в сборе статистики (локальный трафик вх. и исх., интернет-трафик вх. и исх.), порог будет равен: 500 тыс. * 4 = 2 млн.

EX_TRAFFIC_COLLECT_CНеучтенный трафик2 миллиона
SD_GOOD_MOVESСостав инвойсов и счетов15 миллионов

SD_GOOD_MOVES

В данной таблице содержатся строки состава инвойсов и счетов.
При превышении порогового значения необходимо настроить в системе агрегацию и архивацию данных. См. руководство пользователя: раздел "Работа с системой" -> "Администрирование" -> "Задания" -> "Стандартные задания" -> "Архивация инвойсов".

EX_DATA_COLLECT

В данной таблице содержится статистика по трафику PPP-сессий. При превышении порогового значения в настройках заданий по удалению старых CDR необходимо уменьшить значение параметра Срок давности для удаления отработанных записей EX_DATA_COLLECT с кумулятивным обновлением.

EX_CALL_DATA_REC

В данной таблице содержатся данные о CDR и PPP-сессиям.

При ее переполнении необходимо: 
  1. Определить, с помощью следующего скрипта, данных какого типа большинство 

    SQL> SELECT SI_REF_PKG_S.GET_NAME_BY_ID(N_CDR_TYPE_ID) VC_CDR_NAME,
           COUNT(*)
    FROM   EX_CALL_DATA_REC
    GROUP BY N_CDR_TYPE_ID;
    
    VC_CDR_NAME              COUNT(*)
    ------------------------------------------------------------------------
    Телефонный звонок       107552
    PPP-сессия (без тарификации)  3774012
  2. В случае большого количества CDR (телефонный звонок) обратиться в техподдержку для выгрузки CDR в файл.
  3. В случае большого количества PPP-сессий необходимо уменьшить значение параметра Таймаут удаления старых CDR на форме редактирования сетевых служб, по которым создаются PPP-сессии.

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

Данный скрипт необходимо выполнять из под пользователя SYS

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 SELECT ON V_$PARAMETER 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 SELECT ON SS_V_JOB_SEANCES TO &&username;
GRANT SELECT ON SS_V_MANAGER_JOBS 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;