web-dev-qa-db-ja.com

新しいまたは別のテーブルスペースへのスキーマのインポート

データが生成された場所とは異なる単一または新しいテーブルスペースを使用して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を使用することをお勧めします。

13
Roy

Oracle impユーティリティを使用してインポートする場合、実際には別のテーブルスペースを指定することはできません。ただし、回避策として、ROWS=NUSERSテーブルスペースにインポートし、次に各テーブルの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
15
Philᵀᴹ

下記の手順に従ってください:-

  • ユーザーをエクスポートする
  • コマンドを使用してインポートを実行します
    imp system/manager file=export.dmp indexfile=newfile.sql
    これにより、データがインポートされ、すべての定義がnewfile.sqlに保存されます。
  • 必要なオブジェクトをドロップします。
  • テーブルスペースを変更した後、スクリプトnewfile.sqlを実行します。
  • 必要なオブジェクトのバックアップからインポートします。
0
Md Wasi