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