web-dev-qa-db-ja.com

Oracle Data Pump Exportファイル内のスキーマを決定する方法

  • Expdpで作成されたOracleデータベースのバックアップファイル(.dmp)があります。
  • .dmpファイルは、データベース全体のエクスポートです。
  • このダンプファイル内からスキーマの1つを復元する必要があります。
  • このダンプファイル内のスキーマの名前はわかりません。
  • Impdpを使用してデータをインポートするには、読み込むスキーマの名前が必要です。

だから、私は.dmpファイルを調べて、その中のすべてのスキーマをリストする必要があります、どうすればいいですか?


更新(2008-09-18 13:02)-詳細情報:

私が現在使用しているimpdpコマンドは次のとおりです。

impdp user/password@database directory=DPUMP_DIR 
      dumpfile=EXPORT.DMP logfile=IMPORT.LOG  

そして、DPUMP_DIRが正しく構成されています。

SQL> SELECT directory_path
2  FROM dba_directories
3  WHERE directory_name = 'DPUMP_DIR';

DIRECTORY_PATH
-------------------------
D:\directory_path\dpump_dir\

はい、EXPORT.DMPファイルはそのフォルダー内にあります。

Impdpコマンドの実行時に表示されるエラーメッセージは次のとおりです。

Connected to: Oracle Database 10g Enterprise Edition ...
ORA-31655: no data or metadata objects selected for job
ORA-39154: Objects from foreign schemas have been removed from import

このエラーメッセージはほとんど予想されます。 impdpコマンドが必要です:

impdp user/password@database directory=DPUMP_DIR dumpfile=EXPORT.DMP 
      SCHEMAS=SOURCE_SCHEMA REMAP_SCHEMA=SOURCE_SCHEMA:MY_SCHEMA

しかし、それを行うには、ソーススキーマが必要です。

37
KyleLanser

大きなファイルを処理できるエディターでDMPファイルを開くと、スキーマ名が記載されている領域を見つけることができる場合があります。何も変更しないでください。元のダンプのコピーを開いた方が良いでしょう。

12
Petros

impdpパラメーター を使用すると、dmpSQLFILEバックアップのDDLをファイルにエクスポートします。たとえば、これをテキストファイルに入れます

impdp '/ as sysdba' dumpfile=<your .dmp file> logfile=import_log.txt sqlfile=ddl_dump.txt

次に、ddl_dump.txtバックアップ内の表領域、ユーザー、およびスキーマ。

ドキュメントによると、これは実際にはデータベースを変更しません:

SQLは実際には実行されず、ターゲットシステムは変更されません。

80
Factor Mystic

更新(2008-09-19 10:05)-解決策:

私の解決策:ソーシャルエンジニアリング、私は本当に一生懸命掘り、スキーマ名を知っている人を見つけました。
技術的解決策: .dmpファイルの検索didスキーマ名を取得します。
スキーマ名がわかったら、ダンプファイルを検索し、どこにあるかを学びました。

.dmpファイルで、スキーマ名が表示された場所:

  • <OWNER_NAME>SOURCE_SCHEMA</OWNER_NAME>これは、各テーブル名/定義の前に見られました。

  • SCHEMA_LIST 'SOURCE_SCHEMA'これは.dmpの終わり近くで見られました。

興味深いことに、SCHEMA_LIST 'SOURCE_SCHEMA'セクションには、ダンプの作成に使用されるコマンドライン、使用されるディレクトリ、使用されるparファイル、実行されるWindowsバージョン、およびセッション設定(言語、日付形式)のエクスポートも含まれていました。

だから、問題は解決しました:)

10
KyleLanser

最初にファイルを生成したexpdpジョブのログファイルがないと仮定すると、おそらく最も簡単なオプションは SQLFILEパラメーター を使用してimpdpがDDLのファイルを生成することです(ベース完全なインポートで)。その後、そのファイルからスキーマ名を取得できます。もちろん、理想的ではありません。impdpはDDLを抽出するためにダンプファイル全体を読み取ってから、目的のスキーマに再度アクセスする必要があり、さまざまなCREATE USERステートメントを検索するためにテキストファイルを少し実行する必要があるため、しかしそれは実行可能でなければなりません。

6
Justin Cave

Impdpコマンドを実行してsqlfileを生成するには、DATAPUMP_IMP_FULL_DATABASEロールを持つユーザーとして実行する必要があります。

または...特権の低いユーザーとして実行し、MASTER_ONLY = YESオプションを使用して、マスターテーブルを検査します。例えば.

select value_t 
from SYS_IMPORT_TABLE_01 
where name = 'CLIENT_COMMAND' 
and process_order = -59;

col object_name for a30
col processing_status head STATUS for a6
col processing_state head STATE for a5
select distinct
  object_schema,
  object_name,
  object_type,
  object_tablespace,
  process_order,
  duplicate,
  processing_status,
  processing_state
from sys_import_table_01
where process_order > 0
and object_name is not null
order by object_schema, object_name
/

http://download.Oracle.com/otndocs/products/database/enterprise_edition/utilities/pdf/oow2011_dp_mastering.pdf

4
Peter Wiseman

ステップ1:これは1つの簡単な例です。 SQLFILEオプションを使用して、ダンプファイルからSQLファイルを作成する必要があります。

ステップ2:CREATE USER生成されたSQLファイル(ここではtables.sql)

ここの例:

$ impdp directory=exp_dir dumpfile=exp_user1_all_tab.dmp  logfile=imp_exp_user1_tab sqlfile=tables.sql

インポート:リリース11.2.0.3.0-2013年4月26日金曜日の生産08:29:06 2013

Copyright(c)1982、2011、Oracleおよび/またはその関連会社。全著作権所有。

ユーザー名:/ sysdbaとして

オブジェクトタイプSCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMAの処理ジョブ "SYS"。 "SYS_SQL_FILE_FULL_01"は08:29:12に正常に完了しました

$ grep "CREATE USER" tables.sql

値「S:270D559F9B97C05EA50F78507CD6EAC6AD63969E5E; BBE7786A5F9103」で識別されるユーザー「USER1」を作成

ここで説明されている多くのデータポンプオプション http://www.acehints.com/p/site-map.html

4
DBA

私の解決策(KyleLanserの答えに似ています)(Unixボックス上):

strings dumpfile.dmp | grep SCHEMA_LIST
2
slafs

OWNER_NAMEを検索する必要があります。

cat -v dumpfile.dmp | grep -o '<OWNER_NAME>.*</OWNER_NAME>' | uniq -u

cat -vは、ダンプファイルを可視テキストに変換します。

grep -oは一致のみを表示するため、実際には長い行は表示されません

uniq -uは重複行を削除するため、出力が少なくなります。

これは、大きなダンプファイルでも非常にうまく機能し、スクリプトで使用するために微調整することができます。

2
Aldur