Oracleデータベースから外部ファイルを実行して、ディスク容量に関する情報を取得する

多くの場合、特定のニーズのために、Oracleデータベース内でpl / sqlまたはsqlからOSコマンドを実行することが必要になります。

使用可能なディスク容量を決定するタスクでの方法の1つとそのアプリケーションについて、以下で説明します。

提案された方法は、11.2で追加された「外部テーブルのデータの前処理」機能を使用することにあります。





したがって、オブジェクトを作成する必要があります。





必要なオブジェクトを作成する例:

-- 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') ) /
      
      





書き込み権限と実行権限の両方が必要になるため、この目的のために別のディレクトリを用意することをお勧めします。この組み合わせを誰にも与えない方が良いでしょう。

最適な使用法は、(SYSスキームではあるが)パッケージの作成です。その仕様では、OSへのアクセスを必要とする手順を記述し、実装自体をパッケージ内に残し、誰にもアクセスを許可しません。

さらに、UTIL_DIRの読み取り、書き込み、実行の権限、およびT_OS_COMMANDから選択する権限があると想定されます。



実行されるファイルを作成するには、OS上で実行するだけで十分です(はい、たとえばsshなど、より単純な方法に頼ってOSで少なくとも1回アクションを実行する必要があります)。

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





これらのコマンドは、データベースインスタンスの起動元のユーザー(またはグループメンバー)から実行する必要があります。



すべてが使用可能です。 任意のOSコマンドを実行するには、os_command.shファイルに書き込み、テーブルT_OS_COMMANDを要求する必要があります。

 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; /
      
      





ここで、スクリプトの結果を取得するには、テーブルT_OS_COMMANDでクエリを実行するだけで十分です。

df -kを実行するとき| grep /取得します
 /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
      
      







SELECT * FROM T_OS_COMMANDクエリを実行するとき
V_line
  / dev / sda2 32414672 14871076 15870428 49%/ 
  / dev / sda1 124427 18001 100002 16%/ブート 
  tmpfs 8219820 184808 8035012 3%/ dev / shm 
  / dev / sdb2 961432104 606013444 306580660 67%/ u02 




次に、OSコマンドの呼び出しを必要とするメソッドの直接実装を開始できます。



そのような実装の例は、 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メソッド





pDT-サイズを予測する日付

pBASE-予測が構築されるベースにデータが含まれる日数

pTYPE_F-予測方法-(一般)母集団の共分散、または平均変化に基づく

pTABLESPACE-予測が実行される表形式のスペース。送信されない場合はすべて

pOWNER-予測を実行するスキームの所有者、送信しない場合はすべて

pTYPE-すべてではない場合、予測が実行されるデータセグメントのタイプ

指定された基準に従って、セグメントの予想占有場所の計算を実行します。 結果はバイト単位です。



Get_Space_Statusメソッド





pFOREDAYS-予測する日数

pFREE_PRCNT-使用可能なスペースの割合(占有占有から計算

データベースの成長に使用可能なスペースの0から100までのスケールで評価します。



データベース内のファイルの増加に対する制限も考慮します。



単純な結果により、重要度のしきい値を設定して、監視システムに関数呼び出しを統合できます。



追伸 はい、実行および記録する権利を発行することにより、セキュリティ違反が発生していることを考慮します。



All Articles