利用數據庫效用給UNIX命名管道
2024-07-21 02:33:28
供稿:網友
大多數Oracle效用,比如導出,導入和SQL*裝入程序,但是我們通常會直接使用標準的輸入和輸出。這個是UNIX 的一個問題,因為大多數時候UNIX都默認或者通過非凡選擇答應你使用標準的輸入或者輸出。
為了接受標準的輸入輸出,答應你使用鏈式命令,比如:
tar cvf - dir gzip > file.tar.gz
gunzip < file.tar.gz tar -xvf –
這些命令不需要中介文件因為管道的讀或者寫數據都在不同的線程中。
一個管道事實上只是一個記憶的緩沖器,它接受兩個不同進程的讀寫,這兩個進程答應它們從前到后的傳送數據。記憶緩沖器通常會限制大小;當它滿的時候它會阻止寫進程,當它空的時候,它回限制讀進程。
它們的優勢就是永遠不會把內存使用光也不會需要任何磁盤存儲。當你沒有空間存儲非壓縮版本的時候,上面的例子將答應你存儲一個文檔的壓縮版本。
Oracle的導出和導入不能直接引用標準的輸出和輸入。但是,一個命名的小竅門答應你完成這個命令。一個命名的管道是一個UNIX文件的操作它影射到操作系統的管道中。
為了創造命名管道,你可以使用p選項來執行mknod命令。習慣上我們可以這么寫:mknod -p <pipename>;另外,在Linux中,我們這么書寫:mknod <pipename> p.大多數的系統效用中,管道的結果就似乎順序文件,比如,壓縮用戶的導出文件:
mknod /tmp/mypipe p
eXP userid=scott/tiger file=/tmp/mypipe &
gzip < /tmp/mypipe > exp.dat.gz
rm /tmp/mypipe
根據我的測試,壓縮導出文件只是普通大小的八分之一:
mknod /tmp/mypipe p
imp userid=scott/tiger file=/tmp/mypipe &
gunzip < exp.dat.gz > /tmp/mypipe
rm /tmp/mypipe
SQL*的裝載程序是另外一個效用,它可以使用這個技巧。SQL*裝入程序可以接受輸入輸出的數據。比如,你可以創建一個表格捕捉輸出:
drop table lsout;
create table lsout
(
attrs char(10),
links integer,
owner varchar2(8),
grpname varchar2(8),
filesize integer,
crdate date,
filename varchar2(256)
);
為了檢測輸出,可以使用SQL*裝入程序控制文件:
load data
truncate
into table lsout
(
attrs position(01:10),
links position(12:15),
owner position(17:24),
grpname position(26:34),
filesize position(36:42),
crdate position(44:55) DATE "Mon DD HH24:MI",
filename position(57:300)
)
現在,創建一個命名管道,在背景線程中創建SQL*裝入程序:
#!/bin/csh
mknod /tmp/mypipe p
sqlldr userid=scott/tiger control=lsout.ctl data=/tmp/mypipe skip=1 &
ls -l > /tmp/mypipe
wait
cat lsout.log
rm /tmp/mypipe
SQL*裝入程序可以裝入一個文件到CLOB中,因為命名管道就似乎是文件一樣,你可以定義命名管道的名字來代替一個文件名并裝入輸出管道到數據庫的CLOB中。
下面來看個例子:
create table xml_repository(doc clob);
現在,你需要創建SQL*裝入程序來控制文件:
load data infile *
truncate into table xml_repository
fields terminated by whitespace
(
pipe filler,
doc lobfile(pipe) terminated by eof
)
begindata
/tmp/mypipe
為了更具體的展示這個技術,這里有一個簡單的腳本。
這個腳本將把最新的文檔進行命名:
#!/bin/csh
mknod /tmp/mypipe p
wget NOTRACK http://myrss.com/f/c/n/cnnGf9z390.rss -O /tmp/mypipe &
sqlldr userid=scott/tiger control=xmlload.ctl
cat xmlload.log
rm /tmp/mypipe
一旦XML文檔在CLOB中,你可以使用任何新的XML導航函數。你可以利用它來做其他的工作。