Oracle Blob數據欄位中可以存放二進制數據,
有一段時間, 備份數據增長異常,備份時間也拖長到幾小時. 經分析發現,開發人員設計了存blob的Table,
將圖片,pdf,xls,email等存進來.
系統已經交付,在正常運作,怎麼處理才能影響最小,又能達到同樣效果?
我的解決思路是這樣子的.
1.新增一個bfile欄位bfiledata
2.用utl_file將超過一段時間的blob轉到bfiledata,用排程自動處理.
3.建立bfile轉blob函數
4.修改客戶端查詢代碼, 用nvl(filebin,pkg_lob_data.get_blob(bfiledata)) 替換直接select filebin
新增,修改部份不動.
相關代碼實現很簡單
2. blob保存到file
点击(此处)折叠或打开
-
procedure to_file(src in blob, location varchar2, filename varchar2 )
-
is
-
t_fh utl_file.file_type;
-
t_len pls_integer := 32767;
-
begin
-
t_fh := utl_file.fopen(location, filename, 'wb' );
-
for i in 0 .. trunc( ( dbms_lob.getlength( src ) - 1 ) / t_len )
-
loop
-
utl_file.put_raw( t_fh
-
, dbms_lob.substr( src , t_len , i * t_len + 1 )
-
);
-
end loop;
-
utl_file.fclose( t_fh );
-
end;
3.
-
function get_blob(src in bfile ) return blob is
-
dest blob ;
-
bfile_loc bfile :=src;
-
begin
-
if src is null then
-
return null;
-
end if ;
-
dbms_lob.createtemporary(dest, true, dbms_lob.call) ;
-
dbms_lob.open(bfile_loc, dbms_lob.lob_readonly);
-
dbms_lob.loadfromfile(dest, bfile_loc, dbms_lob.getlength(bfile_loc) ) ;
-
dbms_lob.close(bfile_loc) ;
-
return dest ;
-
end ;
抓取測試.
点击(此处)折叠或打开
-
select nvl(filebin,pkg_lob_data.get_blob(bfiledata)) aa
-
from y3_outapld_files_chris
-
where rownum <5
問題1.
bfile指明文件名時可以用子目錄,但utl_file不支持子目錄. 文件過多時不方便管理
解答:在utl_file寫時臨時create directory目錄,處理後刪除. bfilename使用同一個目錄.
以上為個人在dba工作中的一點處理經驗.
阿飛
2015/04/28
阅读(2896) | 评论(1) | 转发(0) |