以下のように、元のエクスポートユーティリティを使用してOracle 12cデータベースからスキーマオブジェクトをエクスポートしたとします。
exp userid=<export_schema_name>/<export_schema_password>@<db_string> file=<file_name>.dmp statistics=none log=<file_name>.log
export_schema_nameはデータとインデックスに異なるテーブルスペースを使用します。data_tbs_1とidx_tbs_1と呼びましょう。 export_schema_nameのすべてのテーブルは、次のように作成されます。
create table <table_name>
(
-- columns definition
)
tablespace <data_tbs_1>
/
--
alter table <table_name>
add constraint <constraint_name> primary key(<key_name>)
using index tablespace <idx_tbs_1>
次に、エクスポートしたダンプファイルを、以下のように作成した新しいスキーマにインポートします(すでに新しいデータテーブルスペースdata_tbs_2を作成しています)。
create user <import_schema_name> identified by <import_schema_password>
default tablespace <data_tbs_2>
私が使用する最も重要なコマンドは次のとおりです。
imp userid=SYSTEM/<import_system_password>@<db_string> file=<file_name>.dmp statistics=none log=<file_name>.log fromuser=<export_schema_name> touser=<import_schema_name>
私の質問は:
EXPDP(より効率的でパフォーマンスの高いツール)を手元に置いているのに、なぜEXPを使用するのでしょうか。
IMPDPを使用する
これを行うと、データとインデックスはどこに保存されますか?それらはまだdata_tbs_1とidx_tbs_1にありますか、それともすべてdata_tbs_2にありますか。
はい。インポートジョブはDDLを実行してこれらのテーブルを作成し、DDLにはTABLESPACE
句が含まれているため、ユーザーのデフォルトのテーブルスペースではなく、テーブルを作成する場所を定義します。オブジェクトは、新しいユーザーのデフォルトのテーブルスペースに関係なく、元のテーブルスペースに作成されます。
これは、ダンプファイルをSQLファイルにエクスポートすることで確認できます。 IMPDP
コマンド-
impdp system@orclpdb directory=dp_dir dumpfile=expdp_jay.dmp sqlfile=jay_ddl.sql
DDL-
以下は、SQLファイルからの抜粋です。
CREATE TABLE "JAY"."TBL1"
( "TEXT" VARCHAR2(20 BYTE)
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS" ; -- Here you can see it has defined the tablespace to create the table.
のインデックスがまだidx_tbs_1に保存されている場合、それらを新しいインデックステーブルスペース(idx_tbs_2など)に切り替えるにはどうすればよいですか?
ダンプのインポート中にREMAP_TABLESPACE
パラメータを使用できます。
これは、REMAP_TABLESPACE
句を使用してインポートされた同じテーブルのDDLです。
IMPDPコマンド-
impdp system@orclpdb directory=dp_dir dumpfile=expdp_jay.dmp sqlfile=jay2_ddl.sql remap_tablespace=USERS:DATA
DDL-
CREATE TABLE "JAY"."TBL1"
( "TEXT" VARCHAR2(20 BYTE)
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "DATA" ;
更新:
元のexpおよびimpユーティリティを引き続き使用する理由は、私の会社が以前のバージョンのOracleデータベースにそのレガシーデータをまだ持っているためです。
その場合は、同じテーブルスペースにオブジェクトをインポートし、後でALTER INDEX REBUILD TABLESPACE <new_tbs>
コマンドを使用して別のテーブルスペースに移行します。
IMPの使用
オリジナルのインポートツールを使用する必要がある場合は、
fromuser
およびtouser
パラメータ(fromuser
とtouser
の同じスキーマ名)。例:imp system@orclpdb file=dumpfile.dmp fromuser=jay touser=jay indexfile=DDL.sql
注:REM
キーワードと行数の出力を含むSQLファイルを編集するには、多少の労力が必要です。
サンプル:
[Oracle@oracdbuat fra]$ cat DDL.sql
REM CREATE TABLE "JAY"."EMP2" ("ID" NUMBER) PCTFREE 10 PCTUSED 40
REM INITRANS 1 MAXTRANS 255 TABLESPACE "DATALRG" LOGGING NOCOMPRESS ;
REM ... 0 rows
REM CREATE TABLE "JAY"."EMPLOYEE" ("ID" NUMBER) PCTFREE 10 PCTUSED 40
REM INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS
REM 1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE
REM "USERS" LOGGING NOCOMPRESS ;
REM ... 0 rows
インポートツールによって生成されたSQLファイルを編集して、オブジェクトのテーブルスペースを変更します。
SQLPLUSを使用してSQLスクリプトを実行します。
すべての制約を無効にする
パラメータIGNORE=Y
を指定してダンプファイルをインポートし、既存のオブジェクトに関する警告を無視します。
制約を有効にします。