ヘッダーをスキップ
Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド
11gリリース1(11.1)
E05675-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

3 LOBの管理: データベース管理

この章では、LOBを含むデータベースをセットアップ、メンテナンスおよび使用するために実行する必要のある管理作業について説明します。

この章の内容は次のとおりです。

データをLOBにロードするためのデータベース・ユーティリティ

データベースのセットアップまたはメンテナンス・タスクの一環としてデータをLOB列にバルク・ロードするには、次のユーティリティの使用をお薦めします。

SQL*Loaderを使用したLOBのロード

SQL*Loaderを使用してデータをLOBにロードするには、次の2つの一般的な方法があります。

  • プライマリ・データファイルからのデータのロード

  • LOBFILEを使用したセカンダリ・データファイルからのロード

SQL*Loaderを使用してLOBをロードする場合には、次の考慮事項があります。

  • SQL*Loaderの従来型パスによるロードでは、特定のLOBのロードに失敗しても、そのLOBを含むレコードが拒否されることはありません。ただし、そのレコードには空のLOBが含まれます。

    SQL*Loaderのダイレクト・パス・ロードでは、LOBが空になったり、切り捨てられる可能性があります。LOBは、ロード時にピース単位でサーバーに送信されます。LOBピースにエラーがある場合、そのピースは廃棄され、そのLOBの残りはロードされません。エラーのあるLOB全体が最初のピースに含まれる場合、LOB列は空になるか、切り捨てられます。

  • LOBFILEからロードする場合は、LOB型列に対応するフィールドの最大長を指定してください。最大長が指定されると、メモリー使用率を最適化する際の目安として使用されます。最大長を指定するときは、実際の最大長を低く見積もらないことが特に重要です。

  • SQL*Loaderのダイレクト・パス・ロードを使用する場合、LOBのロードに大量のメモリーが使用されます。LOBのロード時に、メッセージ「SQL*Loader-00700: 必須割当て中にメモリー不足が発生しました[number]」(numberには数値が入ります)が表示された場合、内部コードによってロードのコール1回当たりにバッチされる行の数が、OSおよびプロセス・メモリーのサポートする数を超えている可能性があります。この問題を回避するには、ROWSオプションを使用して、データ・セーブ1回当たりに読み取る行数を少なくします。

  • ダイレクト・パスAPIを使用して、LOBをロードすることもできます。

  • CLOB列またはXMLType列にXMLデータを含む列をロードする場合は、LOBFILEを使用することをお薦めします。SQL*Loaderでダイレクト・パス・ロードを実行するか、従来型パスによるロードを実行するかは、ロード時にXML文書を検証する必要があるかどうかによって異なります。

    • XML文書をロード時に検証する必要がある場合は、従来型パスによるロードを使用してください。

    • XML文書の検証が不要な場合、またはXML文書が妥当であるとみなしても問題がない場合は、ダイレクト・パス・ロードを実行できます。XML検証によるオーバーヘッドが発生するため、ダイレクト・パス・ロードを使用する方がパフォーマンスは向上します。

    従来型パスによるロードは、SQL INSERT文を実行して、表をOracleデータベースに移入します。ダイレクト・パス・ロードは、Oracleデータ・ブロックをフォーマットし、データ・ブロックを直接データベース・ファイルに書き込むことによって、Oracleデータベースのオーバーヘッドの大半を排除します。

    ダイレクト・パス・ロードでは、データベース・リソースに関して他のユーザーと競合することがないため、通常、ほぼディスク・スピードでデータをロードできます。制限事項、セキュリティおよびバックアップなどを含む、ダイレクト・パス・ロード固有の考慮事項については、『Oracle Databaseユーティリティ』を参照してください。

  • ロードされる表は、事前にデータベースに存在している必要があります。SQL*Loaderが表を作成することはありません。SQL*Loaderは、すでにデータを含んでいるか、または空である既存の表をロードします。

  • ロードには次の権限が必要です。

    • ロードされる表に関するINSERT権限

    • ロードされる表に関するDELETE権限(同じ場所に新規のデータをロードする前に、REPLACEまたはTRUNCATEオプションを使用して以前のデータを空にする場合)


      関連項目:

      SQL*Loaderを使用してLOBをロードする方法およびその他のSQL*Loaderの使用方法の詳細は、『Oracle Databaseユーティリティ』を参照してください。

SQL*Loaderを使用したBFILE列への移入

この項では、ファイル・システム内のファイルからBFILE列にデータをロードする方法について説明します。

BFILEデータ型では、非構造化バイナリ・データはデータベース外のOSファイルに格納されることに注意してください。BFILE列またはBFILE属性には、データを含んでいるサーバー側の外部ファイルを指すロケータが格納されます。


注意:

BFILEとしてロードされるファイルは、ロード時に実際に存在する必要はありません。

SQL*Loaderでは、必要なディレクトリ・オブジェクトはすでに作成済であるとみなされます。


関連項目:

ディレクトリ・オブジェクトの作成方法は、「ディレクトリ・オブジェクト」およびそれに続く各項を参照してください。

BFILE列に対応する制御ファイル・フィールドは、列名およびそれに続くBFILEディレクティブで構成されます。

BFILEディレクティブは、ディレクトリ・オブジェクト名およびそれに続けてBFILE名を引数としてとります。ディレクトリ・オブジェクト名およびBFILE名は、文字列定数として指定するか、その他のフィールドを介して動的にソース名を指定できます。


関連項目:

SQL*Loader構文の詳細は、『Oracle Databaseユーティリティ』を参照してください。

次の2つの例では、BFILESのロードを示します。


注意:

一部の例は、次のようなデータ構造を設定しないと機能しない場合があります(パスワードの入力を求められます)。
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';

次の例では、ファイル名のみが動的に指定されます。

制御ファイル

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は、事前に作成されたディレクトリ・オブジェクトです。

次の例では、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)は、ロードされるファイルに対応するディレクトリ名を含むデータファイル・フィールドにマップされます。

Oracle Data Pumpを使用したLOBデータの転送

Oracle Data Pumpを使用すると、あるデータベースから別のデータベースにLOBデータを転送できます。


関連項目:

Oracle Data Pumpの使用方法の詳細は、『Oracle Databaseユーティリティ』を参照してください。

一時LOBの管理

データベースは一時LOBをセッションごとに追跡しており、v$temporary_lobsというv$ビューを提供します。アプリケーションは、どのユーザーが一時LOBを所有しているかをセッションから判断できます。データベース管理者は、監視のため、および一時LOBが使用している一時領域の緊急クリーン・アップのガイドとして、このビューを使用できます。

一時LOB用の一時表領域の管理

一時表領域を使用して、一時LOBデータが格納されます。データベース管理者は、一時表領域に対するユーザー・アクセスを制御し、様々な一時表領域を作成して、一時LOBデータに使用されるデータ記憶域リソースを制御します。


関連項目:

一時表領域の管理の詳細は、『Oracle Database管理者ガイド』を参照してください。

BFILEの管理

この項では、BFILEを含むデータベースの管理作業について説明します。

ディレクトリ・オブジェクトおよびBFILEの使用規則

ディレクトリ・オブジェクトまたはBFILEを作成する場合、次の条件が満たされている必要があります。

  • OSファイルが、シンボリック・リンクまたはハード・リンクではないこと。

  • Oracleディレクトリ・オブジェクトに指定されているオペレーティング・システム・ディレクトリ・パスが、既存のオペレーティング・システム・ディレクトリ・パスであること。

  • Oracleディレクトリ・オブジェクトに指定されているOSディレクトリ・パスのコンポーネントに、シンボリック・リンクが含まれていないこと。

オープンできる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コールを使用します。

LOB表領域の記憶域の変更

データベース管理者は、表の作成後に次の方法でLOBのデフォルト記憶域を変更できます。

ALTER TABLE test MODIFY
  LOB (lob1)
    STORAGE  (
    NEXT         4M
    MAXEXTENTS   100
    PCTINCREASE  50
            )
ALTER TABLE test MOVE
    TABLESPACE tbs1
    LOB (lob1, lob2)
    STORE AS (
          TABLESPACE tbs2
          DISABLE STORAGE IN ROW);