BLOBオブジェクトを含む大きなテーブルと、他のテーブルからこのテーブルへの参照がいくつかあります。本番環境からexpdp(データポンプ)を作成し、開発/テストホストでデータを匿名化することにより、アプリの開発およびテストスキーマを準備します。問題は、BLOBを含むこのテーブルが非常に大きいため、本番環境からテスト/開発にダンプファイルをコピーしてからインポートするのに時間がかかることです...
テーブルにいくつかの列なしでSCHEMAをエクスポートするための解決策はありますか(すべてのBLOBを空のBLOBまたはNULLで置き換えるいくつかのフィルター)。
また、「BLOBスキーマのみ」を作成して本番スキーマにリンクし、まったくエクスポートしないことも検討しますが、これによりパフォーマンスの問題が発生する可能性があります。
Oracle 11gR2では、expdp
と REMAP_DATA
オプションを使用してそれを行うことができます。
null
(または空のblob)を返す関数パッケージ内を作成します。通常どおり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;
完了したら、外部ローダーテーブルを削除します。