「Oracle10g → 11g へのデータ移行」
の記事がちょこちょこ参照されているようで、やっぱりみんなバージョン違いのImport/Exportはちょっと困ってるんだろうな、と。
なので、今回は己の備忘録も兼ねてimp/expコマンドとはまた別のやり方を。
基本的には imp/expコマンドとほとんど同じで、使うコマンドは impdp/expdp です。
以下、DBサーバ上で作業することを前提に記載します。
impdp/expdp の場合、出力するディレクトリオブジェクトを設定する必要があります。
Exportするディレクトリを「C:\db\expdata」とした場合、
以下、SQL Plus にて、
SQL> create directory [DIR_NAME] as 'C:\db\expdata'
と設定します。
[DIR_NAME]はどんな名前でもいいです。
「test1」でも「expdir」でも。
あくまでも、ディレクトリオブジェクト名なので。
その後、
SQL> host expdp [USER]/[PW] directory=[DIR_NAME] dumpfile=[TABLE_NAME_YYYYMMDD.dump] logfile=[TABLE_NAME_YYYYMMDD.log] tables=[TABLE_NAME];
とやってあげると、指定されたテーブルのDumpデータが、指定されたディレクトリに作成されます。
※テーブル単位、ユーザ単位、スキーマ単位など、そのあたりはマニュアルやら他のサイトを参照してください
ちなみに、数百万レコード単位のテーブルから、条件を指定してExportしたい、という場合、
SQL> host expdp [USER]/[PW] directory=[DIR_NAME] dumpfile=[TABLE_NAME_YYYYMMDD.dump] logfile=[TABLE_NAME_YYYYMMDD.log] tables=[TABLE_NAME] QUERY='TABLE_NAME:WHERE ID >= ''1000000''';
のように、WHERE句を付与することで抽出出来ます。
また、下位バージョンから上位バージョンへのImport/Exportは問題ないのですが、上位バージョンから下位バージョンへのImport/Exportの場合、Exportする際にバージョンを指定してあげる必要があります。
SQL> host expdp [USER]/[PW] directory=[DIR_NAME] dumpfile=[TABLE_NAME_YYYYMMDD.dump] logfile=[TABLE_NAME_YYYYMMDD.log] tables=[TABLE_NAME] VERSION=10.2.0;
次に、ExportしたファイルをImportする場合、こちらもまずはディレクトリオブジェクトを設定する必要があります。
Importするファイルが存在するディレクトリを「C:\db\impdata」とした場合、
以下、SQL Plus にて、
SQL> create directory [DIR_NAME] as 'C:\db\impdata'
と設定します。
その後、
SQL> host impdp [USER]/[PW] directory=[DIR_NAME] dumpfile=[EXPORT_FILE_NAME] tables=[TABLE_NAME];
とやってあげると、指定されたテーブルにExportしたデータがImportされます。
Import時もExport時も、create directory で作成したディレクトリオブジェクト設定は、削除しないとずっと残ってしまうので、
SQL> drop directory [DIR_NAME];
として、削除してください。
imp/expコマンドより、impdp/expdpコマンドの方が全然早いので、こっちの方がオススメです。
では。