web-dev-qa-db-ja.com

BLOB列のないテーブルのエクスポート

BLOBオブジェクトを含む大きなテーブルと、他のテーブルからこのテーブルへの参照がいくつかあります。本番環境からexpdp(データポンプ)を作成し、開発/テストホストでデータを匿名化することにより、アプリの開発およびテストスキーマを準備します。問題は、BLOBを含むこのテーブルが非常に大きいため、本番環境からテスト/開発にダンプファイルをコピーしてからインポートするのに時間がかかることです...

テーブルにいくつかの列なしでSCHEMAをエクスポートするための解決策はありますか(すべてのBLOBを空のBLOBまたはNULLで置き換えるいくつかのフィルター)。

また、「BLOBスキーマのみ」を作成して本番スキーマにリンクし、まったくエクスポートしないことも検討しますが、これによりパフォーマンスの問題が発生する可能性があります。

5
konradkg

Oracle 11gR2では、expdpREMAP_DATA オプションを使用してそれを行うことができます。

  1. Blobを引数として取り、null(または空のblob)を返す関数パッケージ内を作成します。
  2. 通常どおりexpdpを呼び出して、以下を追加します。

    REMAP_DATA=SCHEMA.TAB.BLOB_COLUM:SCHEMA.PACKAGE.YOUR_FUNCTION
    

短い例(スキーマ:mat):

create or replace 
package remap as 
  function null_lob(col blob) return blob;
end remap;
/

create or replace
package body remap as
  function null_lob(col blob)
    return blob is
    eblob blob;
  begin
    return null;
  end null_lob;
end remap;
/

create table foo(a number, b blob);
-- insert a line with a 10M blob, commit

select a, length(b) from foo;

     A  LENGTH(B)
---------- ----------
     1   10485760

プレーンエクスポート:

$ expdp mat/*** DIRECTORY=EXP_DIR TABLES=MAT.FOO 
...
Total estimation using BLOCKS method: 11.06 MB
...
. . exported "MAT"."FOO"                                 10.00 MB       1 rows
...

ダンプファイルは〜11Mです。

データを再マップすると:

$ expdp mat/*** DIRECTORY=EXP_DIR TABLES=MAT.FOO \
                REMAP_DATA=MAT.FOO.B:MAT.remap.null_lob
...
Total estimation using BLOCKS method: 11.06 MB
...
. . exported "MAT"."FOO"                                 5.398 KB       1 rows
...

ダンプファイルは〜100kです。そのダンプをインポートすると、実際に列にnullがインポートされます。


別のオプションは、Oracle_DATAPUMPドライバーを使用してロード/アンロードを実行するために外部テーブルを使用することです(これは10gで導入されたと思います。 外部テーブルの概念 を参照してください)。

アンロードには、次のようなものを使用します。

create table foo_unload
  organization external (
    type Oracle_datapump
    default directory exp_dir
    location ('foo.dmp')
  )
as select a, empty_blob() b from foo;

(外部テーブルを作成した直後にドロップできます。デフォルトでは、ダンプファイルは削除されません。)

次に、foo.dmpファイルをターゲットサーバーとディレクトリに移動し、そこに外部テーブルを作成します。

create table foo_load (a number, b blob)
  organization external
    type Oracle_datapump
    default directory exp_dir
    location ('foo.dmp')
  );

そして最後にターゲットテーブルをロードします(CTASまたはtruncate ...; insert /*+ append */ ...など):

create table foo as select * from foo_load;

完了したら、外部ローダーテーブルを削除します。

11
Mat