oracle2015

Oracle FIle Watcher について書いてみよう

なぜ、DBじゃなくて、FIle Watcherなのかって?

いまの案件で、バリバリつかってるからだ

ここから書き足す

朝までには描き上げる

そう、君へのクリスマスプレゼントだ

明日の朝になれrば、もう一度見に来て欲しい

さてと、こういったまがい物(File Watcher)などは、
Mac De さんがだいたい書いてるはずなので、Mac Deさんをググる


おやおや、ノータッチかしら?


んじゃ、そもそも、Oracle File Watcherは何なのかを書き記そう

簡単に言うと、あるフォルダー(directory)を、定期的に(たとえば1分おきとか)監視しつづけて、
新しいファイルが保存されたら、トリガーをキックしてくれるというものです

基盤は、DBMS_SCHDULERですが、ほとんど関係ありません

ORACLE PLSQL 大好きなので、ORACLE 以外で、ファイル監視を
作成するのが嫌な人には、ぴったりです

で、だいたいこんな流れ

1.Oracle File Watcherで監視

2.ファイルが届いたら、そのファイルを外部表設定して、取り込む

3.BADレコードも出せるので、BADファイルを、再度、外部表で取込

4.ファイルの取込成功可否と、ファイルの内容を、全部TABLEのレコードに格納できる

5.ファイルを移動させるのは、UTL_FILEを使う。でも、ネットワーク越しは行けないので、そこは、Windowsなら、PowerShellを使う。そうすれば、ネットワーク越しにもフィアルを移動させることができる


わかった?

わからない?

んー、困ったなー

============

ファイルが外から来るだけじゃなくて、
ORACLE 自身が生成した、エラーファイルも監視できます

だから、ORACLEのサーバーが一個あれば、いままでみたいに、ファイルを開く必要はなくて、

Oracle File Watcherで監視して、外部表で取り込んで、あとで、
ゆっくり、SELECT すればいいわけさ

しかも、この機能は、11g R2から使えるってわけだよ

毎回エラー、アラートフィアルを開くのがめんどくさい、という人。

オラクルを活用するのに、Oracle File Watcherは最適だよー


しかもだよ、しかも。 Oracle File Watcherの良い所は、
フィアルが届いたからすぐ処理する!という、せっかちな僕と違って、

そのファイルのファイルサイズが増加してないかどうかを確認してくれる

steady_state_duration => INTERVAL '10' SECOND, 

という感じ。 ファイルを感知して、10秒間増えなかったら、処理します

ってことができるのです

つまりね、

expdpで取り出したファイルを、監視して、ちゃんと出来上がったら、
とり込み開始ができるのです。

expdpで取り出したDUMPファイルを、どうやって取り込んでますか?

え、impdpに決まってるって?  ふふふ、
外部表として、DUMPファイルを取り込めます

だから、コマンドプロンプトや、シェルコマンドなしに、impdp相当の処理ができて、
ファイル監視もできるんです

この便利さを伝えたい・・・

あ、それで、HULFTなんだけど、


HULFTは、受け取ったり、取りに行ったりしたファイルを、ファイル名を変換して、
あるフォルダー(Directory)に保存することが役目です

で、そのファイルを、準備したってことを、DBに引き渡すのは、
今までは、JP1とかそういうのをつかってました

で、ここからが大事

クラウドに乗っけると、JP1とかシェルとか、制御がめんどくさい

DB側だけでなんとかならないものかと、考えるわけです

ORACLEとしても、周りにいろんなDBが出てきた

疎結合しなきゃいけない

疎結合するには、ファイルでの連携に成る

Database LInk が使えればいいのに

まあ、Glolden Gate 使えばいいけど、そこまでいらない

DBに接続してくるのを待つのではなく、DBからファイルを取りにいければ、、、

そう、そうなんです

セッションをまたずに、DBから取りに行く、それが

Oracle File Watcher !!!


さて、具体的にどうするか


まず、接続IDとパスワードを登録

BEGIN
DBMS_SCHEDULER.CREATE_CREDENTIAL (
      credential_name => 'MOTO_FILE_WATCH_CREDENTIAL',
      username => 'Administrator',
      password => 'password'
 );
END;
/


次に、
DBMS_SCHEDULER.CREATE_FILE_WATCHER
を作る

これが、FILE_WATCHERの重要な点
BEGIN
   DBMS_SCHEDULER.CREATE_FILE_WATCHER (
       file_watcher_name => 'MOTO_FILEWATCHER',
       directory_path => 'D:\MOTO_ROOT\MOTO_DIR',
       file_name => '*.csv',
       credential_name => 'MOTO_FILE_WATCH_CREDENTIAL',
       destination => NULL,
       steady_state_duration => INTERVAL '10' SECOND,
       comments => NULL,
       enabled => true);
END;
/

さて、 通常のDBMS_SCHDULERとは、どう違うのか?

それは次をみれば、わかります


プロシージャを作ります

create or replace procedure moto.pcd_fw 
  (fw_result in sys.scheduler_filewatcher_result) 
AUTHID CURRENT_USER 
後云々
そして、

   fw_result.file_timestamp タイムスタンプ
   fw_result.directory_path ディレクトリ
   fw_result.actual_file_name ファイル名
   fw_result.file_size      ファイルサイズ

がとれます

この、sys.scheduler_filewatcher_result が大事ですよ

これが、FILE WATCHERが取り入れてくれます




DBMS_SCHDULERの設定の時に

  program_action => 'pcd_fw'
  program_type => 'STORED_PROCEDURE'
  number_of_arguments => 1

を設定します

そのARGUMENTSとして、

sys.dbms_scheduler.define_metadata_argument (
   metadata_attribute => 'event_message'
   argument_position => 1


event_message

を渡します。なんじゃこりゃ? と思いましょう。

これは、自由な文言じゃなくて、きまった文言です

これを書くと、なんと、ファイルが届いたら、

かってに、オラクルが、

 procedure moto.pcd_fw  をキックしてくれます♬


なんて不思議な、今までの DBMS_SCHDULER とはちょっと違う

疎結合が必要なら、
大量なファイル処理が必要なら、

やって、損はさせません

さあ、やってみよう Oracle File Watcher 
OSは、WIndowsでも、Linuxでも、UnixでもOKです

おわり♬

明日は、

25日(木) wmo6hash さんです
諸橋さん、久しく会ってないなー

みなさまに、よき喜びがありますように

メリークリスマス 2015 !



ċ
jpoug2014.html
(16k)
Mototaka Yoshida,
2015/12/24 6:34
Comments