Oracle проверить свободное место
Понадобилось мне однажды мониторить в заббиксе свободное место на сервере Oracle. Всё бы ничего, однако простая задача усложнилась. Нужно мониторить свободное место внутри определённого tablespace. Данную задачу можно решить с помощью SQL запроса:
Осталось только научиться передавать результат 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 запрос уже есть
На месте этого запроса может быть любой другой ваш запрос.
Разрешаем пользователю 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" убеждаемся в наличие настроек:
Отключаем selinux. В файле "/etc/selinux/config" правим:
Чтобы не перезагружать сервер, отключаем selinux командой:
Пишем bash скрипт
Создаём директорию "/etc/zabbix/scripts". На всякий случай владельцем папки и содержимого я назначил пользователя oracle. Внутри папки создаём скрипт "oracle_check_tablespace.sh", не забываем дать права на выполнение. Содержимое скрипта:
Весь смысл скрипта состоит в том, чтобы от имени zabbix выполнить SQL, почистить его от лишних данных и вывести как число. В случае ошибки выводим "-1". Вместо "my_password", "my_database", "MY_TABLESPACE" установите свои значения.
Пользовательская переменная
В файле "/etc/zabbix/zabbix_agentd.conf" смотрим, где находятся пользовательские настройки:
В этой папке создаем файл "oracle.conf" с содержимым:
Zabbix-server
Дальше идём в web-интерфейс заббикс сервера, находим там наш хост (сервер) и добавляем новый item:
В поле Key вписываем нашу переменную. В поле Type information временно ставим text. В скрипте oracle_check_tablespace .sh временно комментируем проверку на число и занимаемся отладкой. Если у заббикс-агента не хватает прав на sudo, то видим ошибку:
Пакет DBMS_SPACE удобен для проверки того, сколько места занято и сколько свободного пространства осталось в различных сегментах, таких как сегменты таблиц, индексов и кластеров. Напомним, что представление словаря данных DBA_FREE_SPACE позволяет находить информацию о свободном месте в табличных пространствах и файлах данных, но не в объектах базы данных. Если пакет DBMS_SPACE не используется, сложно будет узнать, сколько свободного места есть в сегментах, выделенных различным объектам базы данных. Пакет DBMS_SPACE позволяет ответить на следующие вопросы:
- Сколько свободного пространства я могу использовать перед тем, как понадобится следующий экстент?
- Сколько блоков данных находятся выше маркера максимального уровня заполнения (high-water mark — HWM)?
Представления словаря данных DBA_EXTENTS и DBA_SEGMENTS предоставляют массу информации о месте, выделенном объектам, таким как таблицы и индексы, но вы не сможете узнать из них о том, сколько пространства занято и сколько осталось свободного. Если проанализировать таблицы, то столбец BLOCKS даст HWM — максимальный размер, которого достигала таблица. Однако если таблица подвергалась большому количеству операций вставки и удаления, то HWM не будет показательным индикатором реального использованного пространства. Пакет DBMS_SPACE идеален для нахождения использованного и свободного пространства, оставшегося в объектах.
Пакет DBMS_SPACE включает в себя три основных процедуры: процедура UNUSED_SPACE даст информацию о неиспользованном пространстве в сегменте объекта,процедура FREE_BLOCKS — информацию о количестве свободных блоков в сегменте, а процедура SPACE_USED — подробности об использованном пространстве в блоках.
Давайте внимательнее рассмотрим процедуру UNUSED_SPACE и посмотрим, как ее применять для получения детальной информации о неиспользованном пространстве.Процедура имеет три входных (IN) параметра (четвертый — параметр по умолчанию) и семь выходных (OUT) параметров. В листинге ниже показан вывод, полученный при выполнении процедуры UNUSED_SPACE.
A mandatory tablespace that consists of the data dictionary, including definitions of tables, views, and stored procedures needed by the database. Oracle Database automatically maintains information in this tablespace.
A mandatory, auxiliary system tablespace that is used by many Oracle Database features and products. This tablespace contains content that was previously stored in the DRSYS , CWMLITE , XDB , ODM , OEM_REPOSITORY , and SYSTEM tablespaces.
An user-created tablespace that consists of application data. As you create and enter data into tables, Oracle Database fills this space with your data.
A mandatory tablespace that contains temporary tables and indexes created during SQL statement processing. You may have to expand this tablespace if you run SQL statements that involve significant sorting, such as ANALYZE COMPUTE STATISTICS on a very large table, or the constructs GROUP BY , ORDER BY , or DISTINCT .
System-managed tablespaces that contain undo data for each instance. Each Oracle RAC instance uses a different value for n in the tablespace name. These tablespaces are used for automatic undo management.
A system tablespace that contains rollback segments. If you do not use automatic undo management, then you must configure the RBS tablespace. The RBS tablespace should only be used when needed for compatibility with earlier versions of Oracle Database.
Посмотреть, какие табличные пространства имеются в базе данных можно следующим запросом.
В каких файлах хранятся табличные пространства.
Табличное пространство system
В табличном пространстве system хранится «Словарь данных Oracle»
Каждая база данных Oracle содержит набор таблиц, доступных только для чтения и известных как словарь данных (data dictionary), который содержит метаданные (информацию о различных компонентах базы данных). Словарь данных Oracle – сердце системы управления базой данных.
Словарь данных создается при создании экземпляра базы данных выполнением инструкций в файле $ORACLE_HOME/rdbms/admin/catalog.sql
Oracle не позволяет обращаться к таблицам словаря данных напрямую. Он создает представления на базе этих таблиц и общедоступные синонины для тих представлений, к которым могут обращаться пользователи. Существует три набора представлений словаря данных: USER, ALL и DBA – каждый из которых содержит сходный набор представлений со сходным набором столбцов.
Посмотреть содержимое табличного пространства system
Табличное пространство sysaux
Табличное пространство sysaux служит вспомогательным табличным пространством по отношению к табличному пространству system.
Наше приложение несколько раз терпело неудачу из-за «ORA-01536: превышена квота пространства для табличного пространства», и мы хотели бы иметь возможность предотвратить это, регулярно проверяя свободное пространство в табличном пространстве и выдвигая предупреждение, когда оно опускается ниже определенного уровня. .
Есть ли способ узнать, сколько свободного места осталось в табличном пространстве?
После некоторого исследования (я не администратор базы данных) я попробовал следующее:
Но эти запросы возвращают совершенно разные результаты.
Я использую этот запрос
В приведенном выше запросе мы выбрали общий размер каждого табличного пространства, а также свободное пространство в МБ и свободное пространство в процентах от общего размера. Таким образом, вы можете использовать этот процентный столбец для отслеживания и создания предупреждения, когда процент свободного места достигает 20% или любого другого процента, который вы хотите.
Это тоже неплохо
вывод
Вот запрос, используемый Oracle SQL Developer в его представлении Tablespaces.
Вы также можете получить приблизительное представление об использовании табличного пространства, посмотрев на размер файлов на вашем диске.
Моя БД создается с максимальными размерами, и каждый файл dbf может вырасти только до 32 гигабайт, поэтому, когда последний достигает 32 гигабайт, вы знаете, что у вас скоро закончится место и вам нужно добавить еще один.
Если я не ошибаюсь, приведенный выше код не учитывает нераспределенное пространство, поэтому, если вы действительно хотите знать, когда вы достигнете жесткого предела, вам следует использовать maxbytes.
Я думаю, что приведенный ниже код делает это. Свободное пространство вычисляется как «свободное пространство» + незанятое пространство.
Следующий запрос поможет узнать свободное место табличных пространств в МБ:
Это один из самых простых запросов к тому же, с которым я столкнулся, и мы также используем его для мониторинга:
Полная статья о Oracle Tablespace: Табличное пространство
Читайте также: