Введение
После запуска АСР «Гидра» в промышленную эксплуатацию необходимо в обязательном порядке настроить мониторинг экземпляра БД АСР «Гидра».
Контроль должен отслеживать следующие группы параметров:
- Базовые параметры сервера АСР (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
Различаются 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_REC | 15 миллионов |
EX_DATA_COLLECT | среднее количество завершенных PPP-сессий в месяц, умноженное на количество классов трафика. Например, для 500 тыс. сессий в месяц и 4-х классов трафика, участвующих в сборе статистики (локальный трафик вх. и исх., интернет-трафик вх. и исх.), порог будет равен: |
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-сессиям.
Определить, с помощью следующего скрипта, данных какого типа большинство
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
- В случае большого количества CDR (телефонный звонок) обратиться в техподдержку для выгрузки CDR в файл.
- В случае большого количества 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;