Найти тему

Мониторинг SQL запросов в Oracle Database через zabbix

Оглавление

Понадобилось мне однажды мониторить в заббиксе свободное место на сервере Oracle. Всё бы ничего, однако простая задача усложнилась. Нужно мониторить свободное место внутри определённого tablespace. Данную задачу можно решить с помощью SQL запроса:

SELECT trunc(sum(bytes/1024/1024/1024),0)
FROM dba_free_space
WHERE tablespace_name=MY_TABLESPACE';

Осталось только научиться передавать результат SQL запроса в zabbix.

Приступим. У нас имеется:

  • Сервер с БД Oracle и ОС Oracle Linux 7.4.
  • На сервере стоит заббикс агент.
  • Zabbix сервер 3.4.4.
  • На заббиксе уже мониторится наш сервер.

Разобьём задачу на части:

  • Создать SQL запрос для определения свободного места внутри tablespace с названием MY_TABLESPACE.
  • Разрешить пользователю zabbix, от которого работает zabbix-agent на сервере, выполнять этот SQL запрос.
  • Написать bash скрипт для получения числа — свободное место (в гигабайтах).
  • Передать результат скрипта в zabbix-agent через пользовательскую переменную.
  • Поймать на заббикс сервере это число, создать item и trigger для уведомления администратора о том, что места в tablespase осталось мало.

SQL запрос уже есть

SELECT trunc(sum(bytes/1024/1024/1024),0)
FROM dba_free_space
WHERE tablespace_name=MY_TABLESPACE';

На месте этого запроса может быть любой другой ваш запрос.

Разрешаем пользователю zabbix выполнять этот SQL запрос

В базе данных создаём юзера zabbix:

CREATE USER zabbix IDENTIFIED BY "my_password";
GRANT CREATE SESSION to zabbix;
GRANT SELECT ON dba_free_space TO zabbix;

Где "my_password" - пароль пользователя. Возможно, ещё какие-то права понадобятся, не помню.

В папке "/etc/sudoers.d" создаем файл "zabbix" с содержимым:

Defaults:zabbix !requiretty
Defaults:%zabbix !requiretty
Cmnd_Alias ZABBIX_CMD = /etc/zabbix/scripts/
zabbix ALL=(oracle) NOPASSWD: ZABBIX_CMD

В файле "/etc/sudoers" убеждаемся в наличие настроек:

Defaults requiretty
#includedir /etc/sudoers.d
oracle ALL=(ALL) NOPASSWD: ALL

Отключаем selinux. В файле "/etc/selinux/config" правим:

#SELINUX=enforcing
SELINUX=disabled

Чтобы не перезагружать сервер, отключаем selinux командой:

setenforce 0

Пишем bash скрипт

Создаём директорию "/etc/zabbix/scripts". На всякий случай владельцем папки и содержимого я назначил пользователя oracle. Внутри папки создаём скрипт "oracle_check_tablespace.sh", не забываем дать права на выполнение. Содержимое скрипта:

#!/bin/bash

. /home/oracle/.bash_profile

justconnect(){
sqlplus -s -L zabbix/"my_password"@my_database << SQL
set echo off;
set tab off;
set pagesize 0;
set feedback off;
set trimout on;
set heading off;
SELECT trunc(sum(bytes/1024/1024/1024),0)
FROM dba_free_space
WHERE tablespace_name='MY_TABLESPACE';
SQL
}
RESULT=$( justconnect );

#убираем пробелы
RESULT=`(echo ${RESULT} | fmt -su)`

#проверяем на число и точки
if [[ "${RESULT}" =~ ^[0-9\.]+$ ]]; then
:
else
RESULT="-1"
fi

echo $RESULT;
exit 0;

Весь смысл скрипта состоит в том, чтобы от имени zabbix выполнить SQL, почистить его от лишних данных и вывести как число. В случае ошибки выводим "-1". Вместо "my_password", "my_database", "MY_TABLESPACE" установите свои значения.

Пользовательская переменная

В файле "/etc/zabbix/zabbix_agentd.conf" смотрим, где находятся пользовательские настройки:

Include=/etc/zabbix/zabbix_agentd.d/

В этой папке создаем файл "oracle.conf" с содержимым:

UserParameter=oracle.check_tablespace,sudo -u oracle '/etc/zabbix/scripts/oracle_check_tablespace.sh'

Так мы создаём параметр oracle.check_tablespace и данные для него берём командой sudo -u oracle '/etc/zabbix/scripts/oracle_check_tablespace.sh'.

Zabbix-server

Дальше идём в web-интерфейс заббикс сервера, находим там наш хост (сервер) и добавляем новый item:

-2

В поле Key вписываем нашу переменную. В поле Type information временно ставим text. В скрипте oracle_check_tablespace .sh временно комментируем проверку на число и занимаемся отладкой. Если у заббикс-агента не хватает прав на sudo, то видим ошибку:

-3

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

-4

Ура! В tablespace 175 гигабайт свободного места. В скрипте oracle_check_tablespace .sh возвращаем проверку на число. Правим item:

  • Update interval ставим не такой частый, я ставлю себе 1h.
  • Type of information теперь Numeric (unsigned)
  • Units - GB

Стал появляться график:

-5

Вот теперь можно написать триггеры, которые будут срабатывать при критическом уменьшении свободного места. Например, warning при свободном месте менее 40 Гб и average при значениях меньше 20.

-6
-7

На этом всё.

Источник:
https://internet-lab.ru/zabbix_oracle_sql

Если вам понравилась статья, то ставьте 👍🏻 каналу.
Пишите комментарии, задавайте вопросы, подписывайтесь.