データが生成された場所とは異なる単一または新しいテーブルスペースを使用してOracle 11gR2にスキーマをインポートする便利な方法はありますか?
例として、すべてのユーザーデータがUSERSテーブルスペースに格納されているOLDDBからBLOG_DATAをエクスポートしました。
NEWDBでは、BLOG_DATAスキーマをインポートしますが、このユーザー専用に作成されたBLOG_DATAテーブルスペースにユーザーオブジェクトを保存します。
BLOG_DATAユーザーを作成し、BLOG_DATAテーブルスペースを作成して、そのユーザーのデフォルトのテーブルスペースとして設定し、適切な無制限の割り当てを追加しました。
CREATE TABLESPACE blog_data DATAFILE SIZE 1G;
CREATE USER blog_data IDENTIFIED BY secretpassword DEFAULT TABLESPACE blog_data QUOTA UNLIMITED ON blog_data;
GRANT connect,resource TO blog_data
スキーマはOLDDBから次のようにエクスポートされました
exp blog_data/secretpassword@OLDDB file=blog_data.dmp
下記のフィルの優れた答えを読んだ後、私は不思議に思いました:
データにはデフォルトのテーブルスペース以外に行く場所がないので、ユーザーが割り当てを持っている唯一のテーブルスペースです-これにより、実質的にすべてのユーザーオブジェクトをデフォルトのテーブルスペースに配置するように強制されますか?
imp blog_data/secretpassword@NEWDB file=blog_data.dmp
これで、blog_dataスキーマ全体がNEWDBのblog_dataテーブルスペースに配置されますか?これが機能しない理由や、特定のオブジェクトなどで問題が発生する理由はありますか?
更新:
私は簡単なテストを行ったところ、これが事実であることがわかりました。 Imp
は、オブジェクトを元のテーブルスペースに配置できない場合(たとえば、テーブルスペースが存在しない場合)、そのユーザーのデフォルトのテーブルスペースにオブジェクトを配置します。詳細な説明: http://www.dolicapax.org/?p=57
それでも、PhilのようにData Pumpを使用することをお勧めします。
Oracle imp
ユーティリティを使用してインポートする場合、実際には別のテーブルスペースを指定することはできません。ただし、回避策として、ROWS=N
をUSERS
テーブルスペースにインポートし、次に各テーブルのalter table mytable move tablespace BLOG_DATA;
を実行して新しいテーブルスペースに移動することで、テーブルを事前に作成できます。 IGNORE=Y
パラメータを指定してインポートを再度実行し、テーブル作成エラーを無視してすべてのデータをインポートします。
データがData Pump(expdp
)を使用してエクスポートされた場合(余談ですが、最近では、古いレガシーexp
/imp
ユーティリティではなく、誰もがこれを使用する必要があります) REMAP_TABLESPACE
パラメータを使用して、別のテーブルスペースに簡単にインポートできます。
例えば:
impdp scott/tiger@ZOMG file=blog_data.dmp directory=mydir remap_tablespace=USERS:BLOG_DATA
下記の手順に従ってください:-
imp system/manager file=export.dmp indexfile=newfile.sql
newfile.sql
に保存されます。newfile.sql
を実行します。