web-dev-qa-db-ja.com

別のテーブルスペースにOracleダンプをインポートする方法

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を検出しました:無効または一貫性のない入力値

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

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

これはどのように行う必要がありますか?

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

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

36
Michiel Overeem

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

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

私にとっては、同じバージョンのexpおよびimpツールを使用して、異なるデータベースインスタンスでエクスポートとインポートを行うことで解決しました。これは、同じPC(またはOracle Server)を使用して、すべてのエクスポートおよびインポートコマンドを発行することにより、最も簡単に実行できました。

第二に、あなたはORA-00959: tablespace 'A_TBLSPACE' does not exist .DMPファイルを本格的なOracleデータベースから10g Express Edition(XE)データベースにインポートしようとしているため、デフォルトでUSERSという名前の単一の定義済みテーブルスペースが作成されます。 。

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

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

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

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

    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エラーのページが表示される場合があります。

33
Andrew

Oracle 10gとdatapumpを使用している場合、REMAP_TABLESPACE句を使用できます。例:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
16
Neil Kodner

私にとってこの作業は大丈夫です(Oracle Database 10g Express Editionリリース10.2.0.1.0):

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

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

追伸役に立つかもしれません http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php

6

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

Data Pump は、10g以上のexp/impの代替です。 exp/impと非常によく似ていますが、(おそらく、9iの土地で立ち往生しているので使用しません)が優れています。

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

3
Matthew Watson

異なるサーバー(データベース)の異なるテーブルスペースにいる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

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

impdp directory=tempdump dumpfile=adump_table.dmp logfile=bdump_table.log
REMAP_TABLESPACE=old_tablespace:new_tablespace REMAP_SCHEMA=old_user:new_user
2
peter

私の解決策は、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
1
Dmitry

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

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

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

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

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

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. 最初に一時ダンプ用のディレクトリを作成します。

    CREATE OR REPLACE DIRECTORY tempdump AS '/ temp/tempdump /';
    ディレクトリtempdumpでの読み取り、書き込みを許可します。

  2. 輸出する:

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

  3. インポート:

    impdp b/* directory = tempdump dumpfile = adump.dmp logfile = bdump.log REMAP_SCHEMA = a:b

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

1
Michiel Overeem

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

状況:user [〜#〜] a [〜#〜]およびテーブルスペース[〜#〜] x [〜#〜]

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

    alter tablespace [〜#〜] x [〜#〜]に名前を変更[〜#〜] y [〜#〜]

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

  4. expdpでダンプを作成します
  5. 古いユーザーと古いテーブルスペースを削除します([〜#〜] y [〜#〜]
  6. 新しいテーブルスペースを作成します([〜#〜] y [〜#〜]
  7. 新しいユーザーを(新しい名前で)作成します-この場合[〜#〜] b [〜#〜]-権限を付与します(手順3で作成したディレクトリにも)
  8. impdpでダンプをインポートします

    impdp B/B directory = DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA = [〜#〜] a [〜#〜][〜#〜] b [〜 #〜]

以上です...

1
Michiel Overeem

ローカル開発データベース(18c xe)からimportedされたダンプをexport(Oracle 12.1 | 2に)したかったため、すべてのターゲットデータベースにアクセス可能なテーブルスペースがあることを知っていたためDATABASE_TABLESPACE、デフォルトのUSERS(ターゲットデータベースへのアクセス権がない)の代わりに、その名前の新しいテーブルスペースを使用するスキーマ/ユーザーを作成しました。

-- don't care about the details
CREATE TABLESPACE DATABASE_TABLESPACE
  DATAFILE 'DATABASE_TABLESPACE.dat' 
    SIZE 10M
    REUSE
    AUTOEXTEND ON NEXT 10M MAXSIZE 200M;

ALTER DATABASE DEFAULT TABLESPACE DATABASE_TABLESPACE;

CREATE USER username
  IDENTIFIED BY userpassword
  CONTAINER=all;

GRANT create session TO username;
GRANT create table TO username;
GRANT create view TO username;
GRANT create any trigger TO username;
GRANT create any procedure TO username;
GRANT create sequence TO username;
GRANT create synonym TO username;
GRANT create synonym TO username;
GRANT UNLIMITED TABLESPACE TO username;

これから作成されたexpは、ターゲットでimpを幸せにします。

0
masterxilo