38

Oracle ダンプを別のテーブルスペースにインポートしたいと考えています。

ユーザー A が使用するテーブルスペース A があります。このユーザーの DBA を取り消し、接続とリソースの付与を許可しました。次に、コマンドですべてをダンプしました

exp a/*** owner=a file=oracledump.DMP log=log.log compress=y

ここで、ユーザー B が使用するテーブルスペース B にダンプをインポートしたいので、接続とリソース (DBA なし) に対する権限を彼に与えました。次に、次のインポートを実行しました。

imp b/*** file=oracledump.DMP log=import.log fromuser=a touser=b

結果は、多くのエラーを含むログです。

IMP-00017: 次のステートメントが ORACLE エラー 20001 で失敗しました: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003: ORACLE エラー 20001 が発生しました ORA-20001: 無効または矛盾した入力値です

その後、同じインポート コマンドを試しましたが、オプション statistics=none を使用しました。これにより、次のエラーが発生しました。

ORA-00959: 表領域'A_TBLSPACE'が存在しません

これはどのように行うべきですか?

注: 多くの列は CLOB 型です。問題はそれと関係があるようです。

注 2: Oracle のバージョンは、9.2、10.1、および 10.1 XE が混在しています。しかし、バージョンとは関係ないと思います。

4

10 に答える 10

34

ここにはいくつかの問題があります。

まず、使用している Oracle のバージョンが異なることが、テーブル統計エラーの原因です。Oracle 10g データベースの一部がリリース 2 にアップグレードされたときに同じ問題が発生し、一部はまだリリース 1 であり、交換していました。それらの間の DMP ファイル。

私にとってうまくいった解決策は、同じバージョンのexpimpツールを使用して、異なるデータベース インスタンスでエクスポートとインポートを行うことでした。これは、同じ PC (または Oracle サーバー) を使用してすべてのエクスポート コマンドとインポート コマンドを発行するのが最も簡単でした。

次に、本格的な Oracle データベースから .DMP ファイルを 10g Express Edition (XE) データベースにインポートしようとしているためORA-00959: tablespace 'A_TBLSPACE' does not existに、.DMP ファイルを取得していると思われます。USERSあなた。

その場合は、次の手順を実行する必要があります。

  1. .DMP ファイルを使用して、構造 (テーブル) を含む SQL ファイルを作成します。

    imp <xe_username>/<password>@XE file=<filename.dmp> indexfile=index.sql full=y

  2. ファイル全体を検索および置換できるテキスト エディタでインデックス ファイル (index.sql) を開き、次の検索および置換ステートメントを順番に発行します (一重引用符は無視してください.. ')。

    Find: 'REM<space>' Replace: <nothing>

    Find: '"<source_tablespace>"' Replace: '"USERS"'

    Find: '...' Replace: 'REM ...'

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. インデックスファイルを保存し、Oracle Express Edition アカウントに対して実行します (新しい空の XE ユーザー アカウントを作成するか、更新する場合は削除して再作成するのが最善だと思います)。

    sqlplus <xe_username>/<password>@XE @index.sql

  4. 最後に、インデックスファイルを作成したのと同じ .DMP ファイルを同じアカウントに対して実行して、データ、ストアド プロシージャ、ビューなどをインポートします。

    imp <xe_username>/<password>@XE file=<filename.dmp> fromuser=<original_username> touser=<xe_username> ignore=y

Oracle は同じデータベース識別子を使用しようとするため、データベース ジョブなどの特定のオブジェクトを作成しようとすると、Oracle エラーのページが表示される場合があります。これは、別のデータベースにいるため、失敗する可能性が高くなります。

于 2008-09-16T12:47:33.950 に答える
16

Oracle 10g とデータポンプを使用している場合は、REMAP_TABLESPACE 句を使用できます。例:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
于 2008-09-15T15:15:42.543 に答える
6

私にとって、これはうまくいきます(Oracle Database 10g Express Edition Release 10.2.0.1.0):

impdp B/B full=Y dumpfile=DUMP.dmp REMAP_TABLESPACE=OLD_TABLESPACE:USERS

ただし、新しい復元には新しいテーブルスペースが必要です

PS多分役に立つhttp://www.oracle-base.com/articles/10g/OracleDataPump10g.php

于 2010-07-20T11:05:33.240 に答える
3

使用している Oracle のバージョンは何ですか? 10g 以上の場合は、とにかくインポート/エクスポートの代わりに Data Pump を使用することを検討する必要があります。このシナリオを処理できるかどうかは 100% わかりませんが、処理できると思います。

Data Pumpは、10g 以上の exp/imp を置き換えるものです。これは exp/imp と非常によく似た動作をしますが、(おそらく、私は 9i の土地で立ち往生しているので使用していません) より優れています。

ここにデータポンプのドキュメントがあります

于 2008-09-15T13:36:29.287 に答える
2

私の解決策は、GSAR ユーティリティを使用して、DUMP ファイルのテーブルスペース名を置き換えることです。置換を行うときは、スペースを追加して、ダンプ ファイルのサイズが変更されていないことを確認してください。例えば

gsar -f -s"TSDAT_OV101" -r"USERS      " rm_schema.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ ENABLE STORAGE IN ROW CHUNK 8192 RETENTION" -r"                                                                   " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ LOGGING" -r"                                  " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ " -r"                             " rm_schema.n.dump rm_schema.n1.dump
于 2012-03-08T14:53:35.277 に答える
2

異なるサーバー (データベース) の異なるテーブルスペースにいる 2 人のユーザーを改善したい

1. まず、両方のサーバー (データベース) の一時ダンプ用のディレクトリを作成します。

サーバー #1:

CREATE OR REPLACE DIRECTORY tempdump AS '/temp/old_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO old_user;

サーバー #2:

CREATE OR REPLACE DIRECTORY tempdump AS '/temp/new_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO new_user;

2. エクスポート (サーバー #1):

expdp tables=old_user.table directory=tempdump dumpfile=adump.dmp logfile=adump.log

3. インポート (サーバー #2):

impdp directory=tempdump dumpfile=adump_table.dmp logfile=bdump_table.log
REMAP_TABLESPACE=old_tablespace:new_tablespace REMAP_SCHEMA=old_user:new_user
于 2012-11-22T14:28:48.963 に答える
2

問題は CLOB 列に関係しています。imp ツールは、別のテーブルスペースを使用するように create ステートメントを書き換えることができないようです。

ソース: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:66890284723848

解決策は次のとおりです。正しいテーブルスペースに手動でスキーマを作成します。スキーマを作成するスクリプトがない場合は、imp ツールの indexfile= を使用して作成できます。

自分ですべての制約を無効にする必要があります。oracle imp ツールはそれらを無効にしません。

その後、次のコマンドでデータをインポートできます。

imp b/*** file=oracledump.dmp log=import.log fromuser=a touser=b statistics=none ignore=y

注: 他のエラーのため、まだ statistics=none が必要でした。

データポンプに関する追加情報

Oracle 10 以降、インポート/エクスポートが改善されました: データ ポンプ ツール ([ http://www.oracle-base.com/articles/10g/OracleDataPump10g.php][1] )

これを使用して、データを新しいテーブルスペースに再インポートします。

  1. まず、一時ダンプ用のディレクトリを作成します。

    ディレクトリ tempdump を「/temp/tempdump/」として作成または置換します。
    GRANT READ, WRITE ON DIRECTORY tempdump TO a;

  2. 書き出す:

    expdp a/* schemas=a directory=tempdump dumpfile=adump.dmp logfile=adump.log

  3. 輸入:

    impdp b/* ディレクトリ=tempdump ダンプファイル=adump.dmp ログファイル=bdump.log REMAP_SCHEMA=a:b

注: ダンプ ファイルは、ローカル (クライアント) ディスクではなく、サーバー ディスクに保存され、読み取られます。

于 2008-09-15T09:53:47.840 に答える
1

答えは難しいですが、実行可能です:

状況: ユーザーAと表領域X

  1. ダンプ ファイルを別のデータベースにインポートします (これは、元のファイルのコピーを保持する必要がある場合にのみ必要です)。
  2. 表領域の名前を変更

    テーブルスペースXの名前をYに変更

  3. expdp コマンド用のディレクトリを作成して権限を付与する

  4. expdp でダンプを作成する
  5. 古いユーザーと古いテーブルスペースを削除します ( Y )
  6. 新しい表領域を作成します ( Y )
  7. 新しいユーザーを (新しい名前で) 作成します (この場合はB )。権限を付与します (ステップ 3 で作成したディレクトリにも)。
  8. impdp でダンプをインポートする

    impdp B/B ディレクトリ=DIR ダンプファイル=DUMPFILE.dmp ログファイル=LOGFILE.log REMAP_SCHEMA= A : B

以上です...

于 2009-06-03T13:07:09.353 に答える