Часто для определенных нужд возникает необходимость выполнить команду ОС из 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
-
Что Такое Плотность Ключевых Слов?
19 Oct, 24 -
Чувак, Остановись На Пойманных Исключениях
19 Oct, 24 -
Эффект Бабочки
19 Oct, 24 -
Сапер На Дцпу-16
19 Oct, 24 -
Декоратор Cached_Property
19 Oct, 24