Выполнение Внешнего Файла Из Базы Данных Oracle Для Получения Информации О Дисковом Пространстве.

Часто для определенных нужд возникает необходимость выполнить команду ОС из pl/sql или даже sql внутри базы данных Oracle. Ниже мы опишем один из методов и его применение в задаче определения доступного дискового пространства.

Предлагаемый метод заключается в использовании функционала «Предварительная обработка данных из внешних таблиц», добавленного в версии 11.2. Итак, нам нужно создать объекты:

  • Каталог – в нем будет находиться наш скрипт препроцессинга и таблица будет ссылаться на него
  • внешняя организационная таблица — доступ к которой вызовет выполнение скрипта
  • скрипт — сам файл, который будет выполнять требуемое нам действие в ОС
Пример создания необходимых объектов:
  
  
  
   
 /dev/sda2             32414672  14871076  15870428  49% /
Лучше всего для наших целей завести отдельный каталог ввиду того, что нам понадобятся в нем и права на запись, и на исполнение, и такую комбинацию лучше никому не раздавать.

Оптимальное использование — создать пакет (пусть и в схеме SYS), спецификация которого описывает процедуры, необходимые для доступа к ОС, а саму реализацию оставить внутри пакета и не позволять никому к ней приближаться.

Далее предполагается, что у нас есть права на чтение, запись и выполнение в UTIL_DIR, а также права на выбор из T_OS_COMMAND. Чтобы создать файл, который будет исполняться, достаточно выполнить в ОС (да, вам придется хотя бы один раз выполнить действия в ОС, прибегнув к более тривиальным методам — например ssh):

 /dev/sda1               124427     18001    100002  16% /boot
Эти команды должны выполняться от пользователя (или члена группы), от которого запускается экземпляр базы данных.

Все готово к использованию.

Чтобы выполнить произвольную команду ОС, нам следует записать ее в файл os_command.sh и сделать запрос к таблице T_OS_COMMAND.

 tmpfs                  8219820    184808   8035012   3% /dev/shm
Теперь, чтобы получить результат работы нашего скрипта, просто запустите запрос к таблице T_OS_COMMAND. При запуске команды df -k | grep / мы получим
  
  
 /dev/sdb2            961432104 606013444 306580660  67% /u02
При выполнении запроса SELECT * FROM T_OS_COMMAND
V_LINE


-- directory create or replace directory UTIL_DIR as '/u01' / -- table CREATE TABLE T_OS_COMMAND ( v_line varchar2(4000) ) ORGANIZATION external ( TYPE oracle_loader DEFAULT DIRECTORY UTIL_DIR ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE preprocessor UTIL_DIR:'os_command.sh' FIELDS TERMINATED BY "\n" LDRTRIM ) location ( 'os_command.sh') ) /



$touch /u01/os_command.sh $chmod ug+x /u01/os_command.sh



declare F1 UTL_FILE.FILE_TYPE; begin F1 := UTL_FILE.FOPEN('UTIL_DIR','os_command.sh','W', 4048); UTL_FILE.PUT_LINE (file => F1, buffer => '#!/bin/sh'); UTL_FILE.PUT_LINE (file => F1, buffer => 'export LANG=en_US.UTF-8'); UTL_FILE.PUT_LINE (file => F1, buffer => 'export PATH=$PATH:/bin'); UTL_FILE.PUT_LINE (file => F1, buffer => 'df -k | grep /'); UTL_FILE.fclose (file => F1); end; /



/dev/sda2 32414672 14870956 15870548 49% / /dev/sda1 124427 18001 100002 16% /boot tmpfs 8219820 184808 8035012 3% /dev/shm /dev/sdb2 961432104 606013444 306580660 67% /u02

Далее можно приступить к непосредственной реализации методов, требующих вызова команд ОС.

Примером такой реализации может быть пакет P_SYS_UTILITY .

Предложения по его развитию и участию в нем приветствуются.

Спецификация упаковки

create or replace package P_SYS_UTILITY is -- Author : ALEXEY -- Created : 23.08.2013 -- Purpose : Get system info (*nix versions) /* Get on file or folder name its device or ASM group and used/free space on it * raw devices not supported */ procedure Get_Disk_Usage ( p_file_name in varchar2, -- file name (also accept only path) o_mount_dev out nocopy varchar2, -- device or ASM group o_used_space out number, -- used space o_free_space out number); -- free space -- Collect space USAGE in BD -- Recomended evry day schedule run procedure Collect_Usage; -- Get Forecast on space usage -- Recomended base from 10 collects function Get_Forecast ( pDT in date, -- date for forecast pBASE in integer default 188, -- base days in calculate forecast pTYPE_F in varchar2 default 'SLOPE', -- type forecast: SLOPE | AVG pTABLESPACE in varchar2 default null, -- tablespace ( null = all ) pOWNER in varchar2 default null, -- user ( null = all ) pTYPE in varchar2 default null ) -- segment type ( null = all ), allow like return number; -- size in bytes on date pDT -- Get score of space usage and availability -- Can be used in external monitoring tool : Nagios, etc function Get_Space_Status ( pFOREDAYS in number default 60, -- days after that pFREE_PRCNT in number default 25 ) -- free cpace greater than return number; -- 0 - Space free enough .

100 - not enough free space end P_SYS_UTILITY;



Метод Get_Disk_Usage

p_file_name — имя файла или папки, для расположения которых будет производиться расчет. Позволяет передавать имена, относящиеся к группам дисков ASM. o_mount_dev — имя устройства в системе, на котором смонтировано указанное место, определяется из вывода команды df. Для ASM будет возвращено имя группы дисков.

o_used_space — количество байтов, занятых на устройстве/группе дисков o_free_space — количество байтов, доступных на устройстве/группе дисков Вызывает df, передавая имя файла в качестве параметра, или вызывает v$asm_diskgroup, если имя файла начинается с " + ".



Метод Collect_Usage

Собирает информацию об использовании пространства в базе данных.

Группируется по табличным пространствам, владельцам и типам сегментов.

Не учитывает такие сегменты, как отмена и темп.

Сохраняет полученную информацию в таблицу T_SPACE_USAGE. Рекомендуется для ежедневного использования.

Структура T_SPACE_USAGE

create table T_SPACE_USAGE ( dt$ date, owner$ varchar2(30), tablespace$ varchar2(30), type$ varchar2(18), bytes$ number, blocks$ number); create index INDX_T_SPACE_USAGE_DT on T_SPACE_USAGE (dt$); comment on table T_SPACE_USAGE is 'Store archive data of usage space in RDBMS'; comment on column T_SPACE_USAGE.DT$ is 'Date collect space usage'; comment on column T_SPACE_USAGE.OWNER$ is 'Segment owner - user in BD'; comment on column T_SPACE_USAGE.TABLESPACE$ is 'Name of tablespace in BD'; comment on column T_SPACE_USAGE.TYPE$ is 'Segment type'; comment on column T_SPACE_USAGE.BYTES$ is 'Size in bytes'; comment on column T_SPACE_USAGE.BLOCKS$ is 'Size in blocks';



Метод Get_Forecast

Тихоокеанское летнее время - дата, на которую следует прогнозировать размер pBASE — количество дней, за которые данные будут включены в базу данных, на которой будет строиться прогноз pTYPE_F - метод прогнозирования - либо на основе ковариации генеральной совокупности, либо на основе среднего изменения pTABLESPACE — табличное пространство, по которому производится прогнозирование если не передается, то по всем ВЛАДЕЛЕЦ — владелец схемы, по которой прогнозирование если не передается, то для всех pТИП — тип сегментов данных, для которых производится прогноз если не передается, то для всех Вычисляет прогнозируемое занятое пространство сегментов в соответствии с указанными критериями.

Результат в байтах.



Метод Get_Space_Status

pFOREDAYS — количество дней для прогноза pFREE_PRCNT — процент доступного пространства (отсчитывается от прогнозируемого занятого пространства) Оценивает по шкале от 0 до 100 пространство, доступное для роста базы данных.

Также учитываются ограничения на рост файлов внутри базы данных.

Простой результат позволяет интегрировать вызов функции в системы мониторинга с установкой порогов критичности.

пс.

и да, мы учитываем, что выдавая права на исполнение и запись мы создаём дыру в безопасности.

Теги: #oracle #внешняя таблица #мониторинг пространства #oracle

Вместе с данным постом часто просматривают: