20.3 階層ストアの使用
階層ストアは、独立したファイル・システムまたはSecureFile LOBのアーカイブ・ソリューションとして使用できます。
- ファイル・システムとしての階層ストアの使用
DBMS_DBFS_CONTENTパッケージを使用して、ストア内のファイル・システム・エントリを作成、更新、読取りおよび削除します。 - SecureFiles LOBのアーカイブ・ソリューションとしての階層ストアの使用
DBMS_LOBパッケージを使用して、SecureFiles LOBをテープまたはS3ストアにアーカイブします。 - 階層ストアの削除
階層ストアを削除できます。 - 階層ストアで使用する圧縮
DBFS階層ストアは、ファイルを圧縮形式で格納できます。 - テープを使用したプログラムの例
このプログラムの例では、テープ・ストアを構成および使用します。 - Amazon S3を使用したプログラムの例
このプログラムの例では、Amazon S3ストアを構成および使用します。
親トピック: DBFS階層ストア
20.3.1 ファイル・システムとしての階層ストアの使用
DBMS_DBFS_CONTENTパッケージを使用して、ストア内のファイル・システム・エントリを作成、更新、読取りおよび削除します。
関連項目:
親トピック: 階層ストアの使用
20.3.2 SecureFiles LOBのアーカイブ・ソリューションとしての階層ストアの使用
DBMS_LOBパッケージを使用して、SecureFiles LOBをテープまたはS3ストアにアーカイブします。
DBMS_LOBパッケージを使用して、SecureFiles LOBをテープまたはS3ストアにアーカイブします。キャッシュ内の領域を解放、またはキャッシュ常駐コンテンツを外部ストレージ・デバイスに強制的に書き込むには、次のメソッドを使用します。
DBMS_DBFS_HS.storePush(store_name);
親トピック: 階層ストアの使用
20.3.3 階層ストアの削除
階層ストアを削除できます。
階層ストアを削除するには、次をコールします。
DBMS_DBFS_HS.dropStore(store_name, opt_flags);
親トピック: 階層ストアの使用
20.3.4 階層ストアで使用する圧縮
DBFS階層ストアはファイルを圧縮形式で格納できます。
DBFS階層ストアには、SETPROPERTYメソッドおよびプロパティPROPNAME_COMPRESSLVLを使用して圧縮レベルを指定し、ファイルを圧縮形式で格納する機能があります。
有効な値は次のとおりです。
-
PROPVAL_COMPLVL_NONE: 圧縮なし -
PROPVAL_COMPLVL_LOW:LOWレベルの圧縮 -
PROPVAL_COMPLVL_MEDIUM:MEDIUMレベルの圧縮 -
PROPVAL_COMPLVL_HIGH:HIGHレベルの圧縮
通常、圧縮レベルLOWを使用すると、最高のパフォーマンスを維持しながら、高い圧縮率を実現できます。圧縮レベルMEDIUMおよびHIGHでは、圧縮率が大きく向上しますが、それに対応して圧縮時間が長くなることがあります。DBFS HSストア内のファイルが頻繁に更新される場合など、書込みのパフォーマンスが重要である場合は、NONEまたはLOWを使用することをお薦めします。領域が重要であるため、できるかぎり高い圧縮率が求められる場合は、MEDIUMまたはHIGHを使用してください。
ファイルはキャッシュからステージング領域へページ・アウトされて(バックエンドのテープやS3ストレージに順番にプッシュバックされる前に)圧縮されます。したがって、圧縮によりステージング領域内に小さいファイルを格納でき、またステージング領域の使用可能な容量を効果的に増加させることができます。
親トピック: 階層ストアの使用
20.3.5 テープを使用したプログラムの例
テープ・ストアを構成および使用するプログラムの例を次に示します。
この例では、<...>で示される場所を有効な値に置き換えて、プログラムを正しく実行する必要があります。
Rem Example to configure and use a Tape store.
Rem
Rem hsuser should be a valid database user who has been granted
Rem the role dbfs_role.
connect hsuser/hsuser
Rem The following block sets up a STORETYPE_TAPE store with
Rem DBMS_DBFS_HS acting as the store provider.
declare
storename varchar2(32) ;
tblname varchar2(30) ;
tbsname varchar2(30) ;
lob_cache_quota number := 0.8 ;
cachesz number ;
ots number ;
begin
cachesz := 50 * 1048576 ;
ots := 1048576 ;
storename := 'tapestore10' ;
tblname := 'tapetbl10' ;
tbsname := '<TBS_3>' ; -- Substitute a valid tablespace name
-- Create the store.
-- Here tbsname is the tablespace used for the store,
-- tblname is the table holding all the store entities,
-- cachesz is the space used by the store to cache content
-- in the tablespace,
-- lob_cache_quota is the fraction of cachesz allocated
-- to level-1 cache and
-- ots is minimum amount of content that is accumulated
-- in level-2 cache before being stored on tape
dbms_dbfs_hs.createStore(
storename,
dbms_dbfs_hs.STORETYPE_TAPE,
tblname, tbsname, cachesz,
lob_cache_quota, ots) ;
dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_SBTLIBRARY,
'<ORACLE_HOME/work/libobkuniq.so>') ;
-- Substitute your ORACLE_HOME path
dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_MEDIAPOOL,
'<0>') ; -- Substitute valid value
dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_COMPRESSLEVEL,
'NONE') ;
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.registerstore(
storename,
'tapeprvder10',
'dbms_dbfs_hs') ;
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.mountstore(storename, 'tapemnt10') ;
end ;
/
Rem The following code block does file operations
Rem using DBMS_DBFS_CONTENT on the store configured
Rem in the previous code block
connect hsuser/hsuser
declare
path varchar2(256) ;
path_pre varchar2(256) ;
mount_point varchar2(32) ;
store_name varchar2(32) ;
prop1 dbms_dbfs_content_properties_t ;
prop2 dbms_dbfs_content_properties_t ;
mycontent blob := empty_blob() ;
buffer varchar2(1050) ;
rawbuf raw(1050) ;
outcontent blob := empty_blob() ;
itemtype integer ;
pflag integer ;
filecnt integer ;
iter integer ;
offset integer ;
rawlen integer ;
begin
mount_point := '/tapemnt10' ;
store_name := 'tapestore10' ;
path_pre := mount_point ||'/file' ;
-- We create 10 empty files in the following loop
filecnt := 0 ;
loop
exit when filecnt = 10 ;
path := path_pre || to_char(filecnt) ;
mycontent := empty_blob() ;
prop1 := null ;
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.createFile(
path, prop1, mycontent) ; -- Create the file
commit ;
filecnt := filecnt + 1 ;
end loop ;
-- We populate the newly created files with content
-- in the following loop
pflag := dbms_dbfs_content.prop_data +
dbms_dbfs_content.prop_std +
dbms_dbfs_content.prop_opt ;
buffer := 'Oracle provides an integrated management ' ||
'solution for managing Oracle database with '||
'a unique top-down application management ' ||
'approach. With new self-managing ' ||
'capabilities, Oracle eliminates time-' ||
'consuming, error-prone administrative ' ||
'tasks, so database administrators can ' ||
'focus on strategic business objectives ' ||
'instead of performance and availability ' ||
'fire drills. Oracle Management Packs for ' ||
'Database provide signifiCant cost and time-'||
'saving capabilities for managing Oracle ' ||
'Databases. Independent studies demonstrate '||
'that Oracle Database is 40 percent easier ' ||
'to manage over DB2 and 38 percent over ' ||
'SQL Server.';
rawbuf := utl_raw.cast_to_raw(buffer) ;
rawlen := utl_raw.length(rawbuf) ;
offset := 1 ;
filecnt := 0 ;
loop
exit when filecnt = 10 ;
path := path_pre || to_char(filecnt) ;
prop1 := null;
-- Append buffer to file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.putpath(
path, prop1, rawlen,
offset, rawbuf) ;
commit ;
filecnt := filecnt + 1 ;
end loop ;
-- Clear out level 1 cache
dbms_dbfs_hs.flushCache(store_name) ;
commit ;
-- Do write operation on even-numbered files.
-- Do read operation on odd-numbered files.
filecnt := 0 ;
loop
exit when filecnt = 10;
path := path_pre || to_char(filecnt) ;
if mod(filecnt, 2) = 0 then
-- Get writable file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.getPath(
path, prop2, outcontent, itemtype,
pflag, null, true) ;
buffer := 'Agile businesses want to be able to ' ||
'quickly adopt new technologies, whether '||
'operating systems, servers, or ' ||
'software, to help them stay ahead of ' ||
'the competition. However, change often ' ||
'introduces a period of instability into '||
'mission-critical IT systems. Oracle ' ||
'Real Application Testing-with Oracle ' ||
'Database 11g Enterprise Edition-allows ' ||
'businesses to quickly adopt new ' ||
'technologies while eliminating the ' ||
'risks associated with change. Oracle ' ||
'Real Application Testing combines a ' ||
'workload capture and replay feature ' ||
'with an SQL performance analyzer to ' ||
'help you test changes against real-life '||
'workloads, and then helps you fine-tune '||
'the changes before putting them into' ||
'production. Oracle Real Application ' ||
'Testing supports older versions of ' ||
'Oracle Database, so customers running ' ||
'Oracle Database 9i and Oracle Database ' ||
'10g can use it to accelerate their ' ||
'database upgrades. ';
rawbuf := utl_raw.cast_to_raw(buffer) ;
rawlen := utl_raw.length(rawbuf) ;
-- Modify file content
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_lob.write(outcontent, rawlen, 10, rawbuf);
commit ;
else
-- Read the file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.getPath(
path, prop2, outcontent, itemtype, pflag) ;
end if ;
filecnt := filecnt + 1 ;
end loop ;
-- Delete the first 2 files
filecnt := 0;
loop
exit when filecnt = 2 ;
path := path_pre || to_char(filecnt) ;
-- Delete file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.deleteFile(path) ;
commit ;
filecnt := filecnt + 1 ;
end loop ;
-- Move content staged in database to the tape store
dbms_dbfs_hs.storePush(store_name) ;
commit ;
end ;
/親トピック: 階層ストアの使用
20.3.6 Amazon S3を使用したプログラムの例
Amazon S3ストアを構成および使用するプログラムの例を次に示します。
<...>で示される場所を有効な値に置き換えて、プログラムを正しく実行する必要があります。
Rem Example to configure and use an Amazon S3 store.
Rem
Rem hsuser should be a valid database user who has been granted
Rem the role dbfs_role.
connect hsuser/hsuser
Rem The following block sets up a STORETYPE_AMAZONS3 store with
Rem DBMS_DBFS_HS acting as the store provider.
declare
storename varchar2(32) ;
tblname varchar2(30) ;
tbsname varchar2(30) ;
lob_cache_quota number := 0.8 ;
cachesz number ;
ots number ;
begin
cachesz := 50 * 1048576 ;
ots := 1048576 ;
storename := 's3store10' ;
tblname := 's3tbl10' ;
tbsname := '<TBS_3>' ; -- Substitute a valid tablespace name
-- Create the store.
-- Here tbsname is the tablespace used for the store,
-- tblname is the table holding all the store entities,
-- cachesz is the space used by the store to cache content
-- in the tablespace,
-- lob_cache_quota is the fraction of cachesz allocated
-- to level-1 cache and
-- ots is minimum amount of content that is accumulated
-- in level-2 cache before being stored in AmazonS3
dbms_dbfs_hs.createStore(
storename,
dbms_dbfs_hs.STORETYPE_AMAZONS3,
tblname, tbsname, cachesz,
lob_cache_quota, ots) ;
dbms_dbfs_hs.setstoreproperty(storename,
dbms_dbfs_hs.PROPNAME_SBTLIBRARY,
'<ORACLE_HOME/work/libosbws11.so>');
-- Substitute your ORACLE_HOME path
dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_S3HOST,
's3.amazonaws.com') ;
dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_BUCKET,
'oras3bucket10') ;
dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_WALLET,
'LOCATION=file:<ORACLE_HOME>/work/wlt CREDENTIAL_ALIAS=a_key') ;
-- Substitute your ORACLE_HOME path
dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_LICENSEID,
'<xxxxxxxxxxxxxxxx>') ; -- Substitute a valid SBT license id
dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_HTTPPROXY,
'<http://www-proxy.mycompany.com:80/>') ;
-- Substitute valid value. If a proxy is not used,
-- then this property need not be set.
dbms_dbfs_hs.setstoreproperty(
storename,
dbms_dbfs_hs.PROPNAME_COMPRESSLEVEL,
'NONE') ;
dbms_dbfs_hs.createbucket(storename) ;
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.registerstore(
storename,
's3prvder10',
'dbms_dbfs_hs') ;
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.mountstore(
storename,
's3mnt10') ;
end ;
/
Rem The following code block does file operations
Rem using DBMS_DBFS_CONTENT on the store configured
Rem in the previous code block
connect hsuser/hsuser
declare
path varchar2(256) ;
path_pre varchar2(256) ;
mount_point varchar2(32) ;
store_name varchar2(32) ;
prop1 dbms_dbfs_content_properties_t ;
prop2 dbms_dbfs_content_properties_t ;
mycontent blob := empty_blob() ;
buffer varchar2(1050) ;
rawbuf raw(1050) ;
outcontent blob := empty_blob() ;
itemtype integer ;
pflag integer ;
filecnt integer ;
iter integer ;
offset integer ;
rawlen integer ;
begin
mount_point := '/s3mnt10' ;
store_name := 's3store10' ;
path_pre := mount_point ||'/file' ;
-- We create 10 empty files in the following loop
filecnt := 0 ;
loop
exit when filecnt = 10 ;
path := path_pre || to_char(filecnt) ;
mycontent := empty_blob() ;
prop1 := null ;
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.createFile(
path, prop1, mycontent) ; -- Create the file
commit ;
filecnt := filecnt + 1 ;
end loop ;
-- We populate the newly created files with content
-- in the following loop
pflag := dbms_dbfs_content.prop_data +
dbms_dbfs_content.prop_std +
dbms_dbfs_content.prop_opt ;
buffer := 'Oracle provides an integrated management ' ||
'solution for managing Oracle database with '||
'a unique top-down application management ' ||
'approach. With new self-managing ' ||
'capabilities, Oracle eliminates time-' ||
'consuming, error-prone administrative ' ||
'tasks, so database administrators can ' ||
'focus on strategic business objectives ' ||
'instead of performance and availability ' ||
'fire drills. Oracle Management Packs for ' ||
'Database provide signifiCant cost and time-'||
'saving capabilities for managing Oracle ' ||
'Databases. Independent studies demonstrate '||
'that Oracle Database is 40 percent easier ' ||
'to manage over DB2 and 38 percent over ' ||
'SQL Server.';
rawbuf := utl_raw.cast_to_raw(buffer) ;
rawlen := utl_raw.length(rawbuf) ;
offset := 1 ;
filecnt := 0 ;
loop
exit when filecnt = 10 ;
path := path_pre || to_char(filecnt) ;
prop1 := null;
-- Append buffer to file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.putpath(
path, prop1, rawlen,
offset, rawbuf) ;
commit ;
filecnt := filecnt + 1 ;
end loop ;
-- Clear out level 1 cache
dbms_dbfs_hs.flushCache(store_name) ;
commit ;
-- Do write operation on even-numbered files.
-- Do read operation on odd-numbered files.
filecnt := 0 ;
loop
exit when filecnt = 10;
path := path_pre || to_char(filecnt) ;
if mod(filecnt, 2) = 0 then
-- Get writable file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.getPath(
path, prop2, outcontent, itemtype,
pflag, null, true) ;
buffer := 'Agile businesses want to be able to ' ||
'quickly adopt new technologies, whether '||
'operating systems, servers, or ' ||
'software, to help them stay ahead of ' ||
'the competition. However, change often ' ||
'introduces a period of instability into '||
'mission-critical IT systems. Oracle ' ||
'Real Application Testing-with Oracle ' ||
'Database 11g Enterprise Edition-allows ' ||
'businesses to quickly adopt new ' ||
'technologies while eliminating the ' ||
'risks associated with change. Oracle ' ||
'Real Application Testing combines a ' ||
'workload capture and replay feature ' ||
'with an SQL performance analyzer to ' ||
'help you test changes against real-life '||
'workloads, and then helps you fine-tune '||
'the changes before putting them into' ||
'production. Oracle Real Application ' ||
'Testing supports older versions of ' ||
'Oracle Database, so customers running ' ||
'Oracle Database 9i and Oracle Database ' ||
'10g can use it to accelerate their ' ||
'database upgrades. ';
rawbuf := utl_raw.cast_to_raw(buffer) ;
rawlen := utl_raw.length(rawbuf) ;
-- Modify file content
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_lob.write(outcontent, rawlen, 10, rawbuf);
commit ;
else
-- Read the file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.getPath(
path, prop2, outcontent, itemtype, pflag) ;
end if ;
filecnt := filecnt + 1 ;
end loop ;
-- Delete the first 2 files
filecnt := 0;
loop
exit when filecnt = 2 ;
path := path_pre || to_char(filecnt) ;
-- Delete file
-- Please refer to DBMS_DBFS_CONTENT documentation
-- for details about this method
dbms_dbfs_content.deleteFile(path) ;
commit ;
filecnt := filecnt + 1 ;
end loop ;
-- Move content staged in database to Amazon S3 store
dbms_dbfs_hs.storePush(store_name) ;
commit ;
end ;
/親トピック: 階層ストアの使用