16 LOBの管理: データベース管理
LOBを含むデータベースを設定、メンテナンスおよび使用するには、様々な管理作業を実行する必要があります。
内容は次のとおりです。
ノート:
コンテナ・データベースのルートおよびプラガブル・データベースが異なる文字セットである場合、LOBはサポートされません。詳細は、CREATE PLUGGABLE DATABASEを使用したPDBの再配置を参照してください。16.1 データをLOBにロードするためのデータベース・ユーティリティ
データベースの設定またはメンテナンス作業の一環としてデータをLOB列にバルク・ロードするには、特定のユーティリティの使用をお薦めします。
データベースのセットアップまたはメンテナンス・タスクの一環としてデータをLOB列にバルク・ロードするには、次のユーティリティの使用をお薦めします。
-
SQL*Loader
-
Oracle Data Pump
ノート:
アプリケーション開発者: アプリケーションでLOBにデータをロードするには、LOB APIの使用をお薦めします。「LOB APIの使用」を参照してください。
16.1.1 SQL*Loaderを使用したLOBのロードについて
SQL*Loaderを使用してデータをLOBにロードするには、次の2つの一般的な方法があります
次の方法により、SQL*Loaderを使用してデータをLOBにロードできます。
-
プライマリ・データファイルからのデータのロード
-
LOBファイルを使用したセカンダリ・データファイルからのロード
SQL*Loaderを使用してLOBをロードする場合には、次の考慮事項があります。
-
SQL*Loaderの従来型パスによるロードでは、特定のLOBのロードに失敗しても、そのLOBを含むレコードが拒否されることはありません。ただし、そのレコードには空のLOBが含まれます。
SQL*Loaderのダイレクト・パス・ロードでは、LOBが空になったり、切り捨てられる可能性があります。LOBは、ロード時にピース単位でサーバーに送信されます。LOBピースにエラーがある場合、そのピースは廃棄され、そのLOBの残りはロードされません。エラーのあるLOB全体が最初のピースに含まれる場合、LOB列は空になるか、切り捨てられます。
-
LOBファイル
からロードする場合は、LOB型の列に対応するフィールドの最大長を指定します。最大長を指定すると、メモリー使用量の最適化のヒントとして使用されます。最大長の指定では、実際の最大長を過少評価しないしないでください。 -
SQL*Loaderのダイレクト・パス・ロードを使用する場合、LOBのロードに大量のメモリーが使用されます。LOBのロード時に、メッセージ「SQL*Loader-00700: 必須割当て中にメモリー不足が発生しました[number]」(numberには数値が入ります)が表示された場合、内部コードによってロードのコール1回当たりにバッチされる行の数が、オペレーティング・システムおよびプロセス・メモリーのサポートする数を超えている可能性があります。この問題を回避するには、ROWSオプションを使用して、データ・セーブ1回当たりに読み取る行数を少なくします。
-
ダイレクト・パスAPIを使用して、LOBをロードすることもできます。
-
CLOB
列またはXMLType
列にXMLデータを含む列をロードする場合は、LOBファイル
を使用することをお薦めします。ダイレクト・パス・ロード、またはSQL*Loaderを使用した従来型パスによるロードのどちらを使用するかを決定する際に、次のXML文書の検証基準を考慮します。-
XML文書の検証が不要な場合、またはXML文書が妥当であるとみなしても問題がない場合は、ダイレクト・パス・ロードを実行できます。XML検証によるオーバーヘッドを回避できるため、ダイレクト・パス・ロードを使用する方がパフォーマンスが向上します。
conventional path loadは、SQL
INSERT
文を実行して、表をOracleデータベースに移入します。ダイレクト・パス・ロードは、Oracleデータ・ブロックをフォーマットし、データ・ブロックを直接データベース・ファイルに書き込むことによって、Oracleデータベースのオーバーヘッドの大半を排除します。また、データベース・リソースに対して他のユーザーとの競合が発生しないため、ディスク速度に近い速度でデータをロードできます。ダイレクト・パス・ロード固有の問題(制限、セキュリティ、バックアップなど)は、『Oracle Databaseユーティリティ』で説明しています。
-
データをロードする表はデータベース中に存在している必要があります。SQL*Loaderでは、表は作成されません。データが含まれているか、または空である既存の表にロードされます。
-
ロードには次の権限が必要です。
-
ロードする表についての
INSERT
権限。 -
ロードされる表に関する
DELETE
権限(同じ場所に新規のデータをロードする前に、REPLACE
またはTRUNCATE
オプションを使用して以前のデータを空にする場合)。関連項目:
-
ダイレクト・パスAPIの詳細は、Oracle Call Interfaceプログラマーズ・ガイドを参照してください
-
SQL*Loaderを使用したLOBのロードの詳細は、Oracle Databaseユーティリティを参照してください
-
-
16.1.2 SQL*Loaderを使用したBFILE列への移入について
ファイルシステム内のファイルからBFILE
列にデータをロードできます。
ファイルシステム内のファイルからBFILE
列にデータをロードできます。
関連項目:
BFILE
データ型では、非構造化バイナリ・データはデータベース外のオペレーティング・システム・ファイルに格納されることに注意してください。BFILE
列または属性には、データを含むサーバー側外部ファイルを示すロケータが格納されます。
ノート:
BFILE
としてロードされるファイルは、ロード時に実際に存在する必要はありません。
SQL*Loaderでは、必要なディレクトリ・オブジェクトは作成済であるとみなされます。
関連項目:
ディレクトリ・オブジェクトの作成方法は、「ディレクトリ・オブジェクト」およびそれに続く各項を参照してください
BFILE
列に対応する制御ファイル・フィールドは、列名およびそれに続くBFILE
ディレクティブで構成されます。
BFILE
ディレクティブは、DIRECTORY
オブジェクト名およびそれに続けてBFILE
名を引数としてとります。これらは、文字列定数として指定するか、その他のフィールドを介して動的にソース名を指定できます。
関連項目:
SQL*Loader構文の詳細は、『Oracle Databaseユーティリティ』を参照してください。
次の2つの例では、BFILE
のロードを示します。
ノート:
一部の例は、次のようなデータ構造を設定しないと機能しない場合があります(パスワードの入力を求められます)。
CONNECT system Enter password: Connected. GRANT CREATE ANY DIRECTORY to samp; CONNECT samp Enter password: Connected. CREATE OR REPLACE DIRECTORY adgraphic_photo as '/tmp'; CREATE OR REPLACE DIRECTORY adgraphic_dir as '/tmp';
「LOBの例の表: PMスキーマのprint_media表」に基づく次の例では、ファイル名のみが動的に指定されます。
制御ファイル:
LOAD DATA INFILE sample9.dat INTO TABLE Print_media FIELDS TERMINATED BY ',' (product_id INTEGER EXTERNAL(6), FileName FILLER CHAR(30), ad_graphic BFILE(CONSTANT "modem_graphic_2268_21001", FileName))
データ・ファイル:
007, modem_2268.jpg, 008, monitor_3060.jpg, 009, keyboard_2056.jpg,
ノート:
product_ID
はサイズが指定されていない場合はデフォルトで(255)に設定されます。データファイルのファイル名にマップされます。ADGRAPHIC_PHOTO
はすべてのファイルが格納されているディレクトリです。ADGRAPHIC_DIR
は事前に作成されたDIRECTORY
オブジェクトです。
次の例では、BFILE
およびディレクトリ・オブジェクトが動的に指定されます。
制御ファイル:
LOAD DATA INFILE sample10.dat INTO TABLE Print_media FIELDS TERMINATED BY ',' ( product_id INTEGER EXTERNAL(6), ad_graphic BFILE (DirName, FileName), FileName FILLER CHAR(30), DirName FILLER CHAR(30) )
データ・ファイル:
007,monitor_3060.jpg,ADGRAPHIC_PHOTO, 008,modem_2268.jpg,ADGRAPHIC_PHOTO, 009,keyboard_2056.jpg,ADGRAPHIC_DIR,
ノート:
DirName
FILLER
CHAR
(30)
は、ロードされるファイルに対応するディレクトリ名を含むデータファイル・フィールドにマップされます。
16.1.3 Oracle Data Pumpを使用したLOBデータの転送について
Oracle Data Pumpを使用すると、あるデータベースから別のデータベースにLOBデータを転送できます。
Oracle Data Pumpを使用すると、あるデータベースから別のデータベースにLOBデータを転送できます。
Oracle Database 12c以降、データ・ポンプにはすべてのLOB列をSecureFiles LOBとして作成するオプションがあります。
関連項目:
SecureFiles LOBの概要は、「SecureFiles LOB記憶域」を参照してください
ただし、Data Pumpで表を再作成する場合は、これらはデフォルトでソース・データベースに存在するため再作成されます。このため、LOB列がソース・データベースでBasicFiles LOBであった場合、データ・ポンプではインポート先のデータベースのBasicFiles LOBとして再作成が試みられます。コマンドラインでTRANSFORM
パラメータを使用するか、DBMS_DATAPUMP
およびDBMS_METADATA
パッケージでLOB_STORAGE
パラメータを使用することで、再作成される表でSecureFiles LOBとしてLOBを作成するよう強制できます。
ノート:
トランスポータブル・インポートでは名前の変換は無効です。
16.2 一時LOB管理
データベースは各セッションの一時LOBを追跡しており、アプリケーションは、どのユーザーが一時LOBを所有しているかをセッションIDから判断できます。
データベースには、v$temporary_lobs
と呼ばれるv$
ビューが用意されています。データベース管理者は、監視のため、および一時LOBが使用している一時領域の緊急クリーン・アップのガイドとして、このビューを使用できます。
一時LOBデータは、一時表領域に格納されます。データベース管理者は、一時表領域に対するユーザー・アクセスを制御し、様々な一時表領域を作成して、一時LOBデータに使用されるデータ記憶域リソースを制御します。
16.3 BFILE管理
BFILE
を含むデータベースを管理するには、様々な管理作業を実行する必要があります。
内容は次のとおりです。
16.3.1 ディレクトリ・オブジェクトおよびBFILEの使用規則
次の条件が満たされている場合、ディレクトリ・オブジェクトまたはBFILE
オブジェクトを作成できます。
ディレクトリ・オブジェクトまたはBFILE
オブジェクトを作成する場合、次の条件が満たされている必要があります。
-
オペレーティング・システム・ファイルが、シンボリック・リンクまたはハード・リンクではないこと。
-
Oracleディレクトリ・オブジェクトに指定されているオペレーティング・システム・ディレクトリ・パスが、既存のオペレーティング・システム・ディレクトリ・パスであること。
-
Oracleディレクトリ・オブジェクトに指定されているオペレーティング・システム・ディレクトリ・パスのコンポーネントに、シンボリック・リンクが含まれていないこと。
16.3.2 オープンできるBFILE数の上限の設定
1回のセッションで同時にオープンが可能なBFILE
の数には制限があります。
初期化パラメータSESSION_MAX_OPEN_FILES
は、1回のセッションで同時にオープンできるファイル数の上限を定義します。
デフォルト値は10です。このデフォルト値を使用して、1回のセッションにつき10個までのファイルを同時にオープンできます。この制限を変更するには、データベース管理者がinit.ora
ファイルのパラメータ値を変更する必要があります。次に例を示します。
SESSION_MAX_OPEN_FILES=20
クローズされていないファイル数がSESSION_MAX_OPEN_FILES
値を超えると、そのセッションでは、それ以上のファイルをオープンできなくなります。すべてのオープンしているファイルをクローズするには、DBMS_LOB.FILECLOSEALL
コールを使用します。
16.4 LOB表領域の記憶域の変更
データベース管理者は、LOBのデフォルト記憶域を変更するために特定の技術を使用します。
データベース管理者は、表の作成後に次の方法でLOBのデフォルト記憶域を変更できます。
-
ALTER TABLE... MODIFYの使用: LOB表領域の記憶域を次のように変更できます。
ALTER TABLE test MODIFY LOB (lob1) STORAGE ( NEXT 4M MAXEXTENTS 100 PCTINCREASE 50 )
ノート:
既存のLOB列を変更するためのALTER TABLE
構文には、LOB...STORE AS
句ではなく、MODIFY LOB
句を使用します。LOB...STORE AS
句は、新しく追加されたLOB列に対してのみ使用されます。
LOB記憶域句には、LOB_storage_clause
およびmodify_LOB_storage_clause
の2種類があります。ALTER TABLE MODIFY LOB
文では、modify_LOB_storage_clause
のみを指定できます。
-
ALTER TABLE... MOVEの使用: LOB表領域の記憶域を変更するために
ALTER
TABLE
文のMOVE
句も使用できます。次に例を示します。
ALTER TABLE test MOVE TABLESPACE tbs1 LOB (lob1, lob2) STORE AS ( TABLESPACE tbs2 DISABLE STORAGE IN ROW);